diff --git a/.gitignore b/.gitignore
index 3f72cc73..23f21656 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,17 +1,14 @@
composer.phar
/vendor/
.idea
-/demo/demo1/docs/
-/demo/demo1/__cache/
-/demo/demo2-templates-generation/__cache/
-/demo/demo2-templates-generation/docs/
-/demo/demo3-add-missing-doc-blocks/__cache/
-/demo/demo4-generating-readme-file/__cache/
-/demo/demo4-generating-readme-file/docs/
-/demo/demo4-generating-readme-file/templates/
+/.bumbleDocGenCache/
/last_run.log
/.phpunit.result.cache
+/demo/*/__cache/
+/demo/*/.cache/
+/demo/*/docs/
+/demo/*/last_run.log
+
+/demo/demo1/docs/
/demo/demo2-templates-generation/templates/
-/.bumbleDocGenCache/
-/demo/demo5-config-array/docs/
-/demo/demo5-config-array/.cache/
+/demo/demo3-generating-readme-file/templates/
diff --git a/SECURITY.md b/SECURITY.md
index fa44755b..4473957c 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -8,11 +8,12 @@ Security updates will be applied to certain versions of our software. Please ref
| Version | Supported | Notes |
|---------|--------------------|----------------------------------------|
-| 1.4.x | :white_check_mark: | Current version, fully supported. |
-| 1.3.x | :x: | Not supported, please upgrade to 1.4.x |
-| 1.2.x | :x: | Not supported, please upgrade to 1.4.x |
-| 1.1.x | :x: | Not supported, please upgrade to 1.4.x |
-| 1.0.x | :x: | Not supported, please upgrade to 1.4.x |
+| 1.5.x | :white_check_mark: | Current version, fully supported. |
+| 1.4.x | :x: | Not supported, please upgrade to 1.5.x |
+| 1.3.x | :x: | Not supported, please upgrade to 1.5.x |
+| 1.2.x | :x: | Not supported, please upgrade to 1.5.x |
+| 1.1.x | :x: | Not supported, please upgrade to 1.5.x |
+| 1.0.x | :x: | Not supported, please upgrade to 1.5.x |
## Reporting a Vulnerability
diff --git a/captainhook.json b/captainhook.json
index 665aed09..98faea5d 100644
--- a/captainhook.json
+++ b/captainhook.json
@@ -5,8 +5,8 @@
{
"action": "\\CaptainHook\\App\\Hook\\Message\\Action\\Beams",
"options": {
- "subjectLength": 50,
- "bodyLineLength": 72
+ "subjectLength": 100,
+ "bodyLineLength": 200
}
}
]
diff --git a/composer.json b/composer.json
index 865e2794..effb2fce 100644
--- a/composer.json
+++ b/composer.json
@@ -33,11 +33,11 @@
"php-di/php-di": "^7.0",
"symfony/yaml": "^6.0",
"hassankhan/config": "^3.1",
- "tectalic/openai": "^1.5",
- "guzzlehttp/guzzle": "^7.7",
+ "guzzlehttp/guzzle": "^7.8",
"symfony/filesystem": "^6.0"
},
"require-dev": {
+ "roave/security-advisories": "dev-latest",
"phpunit/phpunit": "^9.5",
"dg/bypass-finals": "^1.4",
"squizlabs/php_codesniffer": "3.*",
diff --git a/composer.lock b/composer.lock
index dd65f70b..3bac40c4 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "edc0d594bf655060ddb4128634082d53",
+ "content-hash": "86a6a7f6923c44c4dc1e5190ec5a3510",
"packages": [
{
"name": "bramus/ansi-php",
@@ -96,72 +96,6 @@
},
"time": "2021-12-05T09:10:49+00:00"
},
- {
- "name": "clue/stream-filter",
- "version": "v1.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/clue/stream-filter.git",
- "reference": "d6169430c7731d8509da7aecd0af756a5747b78e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e",
- "reference": "d6169430c7731d8509da7aecd0af756a5747b78e",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/functions_include.php"
- ],
- "psr-4": {
- "Clue\\StreamFilter\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering"
- }
- ],
- "description": "A simple and modern approach to stream filtering in PHP",
- "homepage": "https://github.com/clue/php-stream-filter",
- "keywords": [
- "bucket brigade",
- "callback",
- "filter",
- "php_user_filter",
- "stream",
- "stream_filter_append",
- "stream_filter_register"
- ],
- "support": {
- "issues": "https://github.com/clue/stream-filter/issues",
- "source": "https://github.com/clue/stream-filter/tree/v1.6.0"
- },
- "funding": [
- {
- "url": "https://clue.engineering/support",
- "type": "custom"
- },
- {
- "url": "https://github.com/clue",
- "type": "github"
- }
- ],
- "time": "2022-02-21T13:15:14+00:00"
- },
{
"name": "doctrine/annotations",
"version": "1.14.3",
@@ -1171,84 +1105,6 @@
},
"time": "2023-08-13T19:53:39+00:00"
},
- {
- "name": "nyholm/psr7",
- "version": "1.8.0",
- "source": {
- "type": "git",
- "url": "https://github.com/Nyholm/psr7.git",
- "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be",
- "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2",
- "psr/http-factory": "^1.0",
- "psr/http-message": "^1.1 || ^2.0"
- },
- "provide": {
- "php-http/message-factory-implementation": "1.0",
- "psr/http-factory-implementation": "1.0",
- "psr/http-message-implementation": "1.0"
- },
- "require-dev": {
- "http-interop/http-factory-tests": "^0.9",
- "php-http/message-factory": "^1.0",
- "php-http/psr7-integration-tests": "^1.0",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4",
- "symfony/error-handler": "^4.4"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.8-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Nyholm\\Psr7\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Tobias Nyholm",
- "email": "tobias.nyholm@gmail.com"
- },
- {
- "name": "Martijn van der Ven",
- "email": "martijn@vanderven.se"
- }
- ],
- "description": "A fast PHP7 implementation of PSR-7",
- "homepage": "https://tnyholm.se",
- "keywords": [
- "psr-17",
- "psr-7"
- ],
- "support": {
- "issues": "https://github.com/Nyholm/psr7/issues",
- "source": "https://github.com/Nyholm/psr7/tree/1.8.0"
- },
- "funding": [
- {
- "url": "https://github.com/Zegnat",
- "type": "github"
- },
- {
- "url": "https://github.com/nyholm",
- "type": "github"
- }
- ],
- "time": "2023-05-02T11:26:24+00:00"
- },
{
"name": "php-di/invoker",
"version": "2.3.4",
@@ -1377,209 +1233,6 @@
],
"time": "2023-08-10T14:57:56+00:00"
},
- {
- "name": "php-http/discovery",
- "version": "1.19.1",
- "source": {
- "type": "git",
- "url": "https://github.com/php-http/discovery.git",
- "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e",
- "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e",
- "shasum": ""
- },
- "require": {
- "composer-plugin-api": "^1.0|^2.0",
- "php": "^7.1 || ^8.0"
- },
- "conflict": {
- "nyholm/psr7": "<1.0",
- "zendframework/zend-diactoros": "*"
- },
- "provide": {
- "php-http/async-client-implementation": "*",
- "php-http/client-implementation": "*",
- "psr/http-client-implementation": "*",
- "psr/http-factory-implementation": "*",
- "psr/http-message-implementation": "*"
- },
- "require-dev": {
- "composer/composer": "^1.0.2|^2.0",
- "graham-campbell/phpspec-skip-example-extension": "^5.0",
- "php-http/httplug": "^1.0 || ^2.0",
- "php-http/message-factory": "^1.0",
- "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
- "symfony/phpunit-bridge": "^6.2"
- },
- "type": "composer-plugin",
- "extra": {
- "class": "Http\\Discovery\\Composer\\Plugin",
- "plugin-optional": true
- },
- "autoload": {
- "psr-4": {
- "Http\\Discovery\\": "src/"
- },
- "exclude-from-classmap": [
- "src/Composer/Plugin.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com"
- }
- ],
- "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
- "homepage": "http://php-http.org",
- "keywords": [
- "adapter",
- "client",
- "discovery",
- "factory",
- "http",
- "message",
- "psr17",
- "psr7"
- ],
- "support": {
- "issues": "https://github.com/php-http/discovery/issues",
- "source": "https://github.com/php-http/discovery/tree/1.19.1"
- },
- "time": "2023-07-11T07:02:26+00:00"
- },
- {
- "name": "php-http/message",
- "version": "1.16.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-http/message.git",
- "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd",
- "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd",
- "shasum": ""
- },
- "require": {
- "clue/stream-filter": "^1.5",
- "php": "^7.2 || ^8.0",
- "psr/http-message": "^1.1 || ^2.0"
- },
- "provide": {
- "php-http/message-factory-implementation": "1.0"
- },
- "require-dev": {
- "ergebnis/composer-normalize": "^2.6",
- "ext-zlib": "*",
- "guzzlehttp/psr7": "^1.0 || ^2.0",
- "laminas/laminas-diactoros": "^2.0 || ^3.0",
- "php-http/message-factory": "^1.0.2",
- "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
- "slim/slim": "^3.0"
- },
- "suggest": {
- "ext-zlib": "Used with compressor/decompressor streams",
- "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
- "laminas/laminas-diactoros": "Used with Diactoros Factories",
- "slim/slim": "Used with Slim Framework PSR-7 implementation"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/filters.php"
- ],
- "psr-4": {
- "Http\\Message\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com"
- }
- ],
- "description": "HTTP Message related tools",
- "homepage": "http://php-http.org",
- "keywords": [
- "http",
- "message",
- "psr-7"
- ],
- "support": {
- "issues": "https://github.com/php-http/message/issues",
- "source": "https://github.com/php-http/message/tree/1.16.0"
- },
- "time": "2023-05-17T06:43:38+00:00"
- },
- {
- "name": "php-http/multipart-stream-builder",
- "version": "1.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-http/multipart-stream-builder.git",
- "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a",
- "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a",
- "shasum": ""
- },
- "require": {
- "php": "^7.1 || ^8.0",
- "php-http/discovery": "^1.15",
- "psr/http-factory-implementation": "^1.0"
- },
- "require-dev": {
- "nyholm/psr7": "^1.0",
- "php-http/message": "^1.5",
- "php-http/message-factory": "^1.0.2",
- "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Http\\Message\\MultipartStream\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Tobias Nyholm",
- "email": "tobias.nyholm@gmail.com"
- }
- ],
- "description": "A builder class that help you create a multipart stream",
- "homepage": "http://php-http.org",
- "keywords": [
- "factory",
- "http",
- "message",
- "multipart stream",
- "stream"
- ],
- "support": {
- "issues": "https://github.com/php-http/multipart-stream-builder/issues",
- "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0"
- },
- "time": "2023-04-28T14:10:22+00:00"
- },
{
"name": "phpdocumentor/reflection-common",
"version": "2.2.0",
@@ -2315,68 +1968,6 @@
},
"time": "2022-10-10T08:44:53+00:00"
},
- {
- "name": "spatie/data-transfer-object",
- "version": "1.14.1",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/data-transfer-object.git",
- "reference": "12c25e15f08684f1c57c88ccfb3a38a677a11314"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/data-transfer-object/zipball/12c25e15f08684f1c57c88ccfb3a38a677a11314",
- "reference": "12c25e15f08684f1c57c88ccfb3a38a677a11314",
- "shasum": ""
- },
- "require": {
- "php": "^7.1|^8.0"
- },
- "require-dev": {
- "larapack/dd": "^1.1",
- "phpunit/phpunit": "^7.0|^9.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Spatie\\DataTransferObject\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Brent Roose",
- "email": "brent@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- }
- ],
- "description": "Data transfer objects with batteries included",
- "homepage": "https://github.com/spatie/data-transfer-object",
- "keywords": [
- "data-transfer-object",
- "spatie"
- ],
- "support": {
- "issues": "https://github.com/spatie/data-transfer-object/issues",
- "source": "https://github.com/spatie/data-transfer-object/tree/1.14.1"
- },
- "funding": [
- {
- "url": "https://spatie.be/open-source/support-us",
- "type": "custom"
- },
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "abandoned": "spatie/laravel-data",
- "time": "2021-12-15T07:25:06+00:00"
- },
{
"name": "symfony/cache",
"version": "v6.0.19",
@@ -3640,81 +3231,6 @@
],
"time": "2023-01-11T11:50:03+00:00"
},
- {
- "name": "tectalic/openai",
- "version": "v1.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/tectalichq/public-openai-client-php.git",
- "reference": "aa321d55bdd01511515e7b3436c092325fa651f4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/tectalichq/public-openai-client-php/zipball/aa321d55bdd01511515e7b3436c092325fa651f4",
- "reference": "aa321d55bdd01511515e7b3436c092325fa651f4",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "nyholm/psr7": "^1.4",
- "php": "^7.2.5 || ^8.0",
- "php-http/message": "^1.11",
- "php-http/multipart-stream-builder": "^1.2",
- "psr/http-client": "^1.0.1",
- "spatie/data-transfer-object": "^1.14"
- },
- "conflict": {
- "cebe/php-openapi": "<1.7",
- "riverline/multipart-parser": "<2.0.9",
- "symfony/yaml": "<3.4.31 || >4.0 <4.3.4"
- },
- "require-dev": {
- "league/openapi-psr7-validator": "^0.17.0",
- "mikey179/vfsstream": "^1.6.10",
- "php-http/mock-client": "^1.5",
- "phpstan/phpstan": "^1.4",
- "phpunit/phpunit": "^8.5.14 || ^9.5 || ^10.0",
- "squizlabs/php_codesniffer": "^3.6",
- "symfony/http-client": "^5.3"
- },
- "suggest": {
- "php-http/mock-client": "Simplify testing by using a mock HTTP client"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Tectalic\\OpenAi\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "An OpenAI REST API Client with support for ChatGPT, GPT-4, GPT-3.5, GPT-3, Codex, DALL·E, Whisper, Embeddings, Fine-Tuning and Moderation models. Includes fully typed Data Transfer Objects (DTOs) for all requests and responses and IDE autocomplete support.",
- "homepage": "https://tectalic.com/apis/openai",
- "keywords": [
- "ChatGpt",
- "GPT-3",
- "ai",
- "api",
- "dall-e",
- "dalle",
- "fine-tuning",
- "gpt-3.5",
- "gpt-4",
- "gpt3",
- "gpt3.5",
- "gpt4",
- "openai",
- "rest",
- "tectalic",
- "whisper"
- ],
- "support": {
- "source": "https://github.com/tectalichq/public-openai-client-php/tree/v1.6.0"
- },
- "time": "2023-09-06T02:15:29+00:00"
- },
{
"name": "twig/twig",
"version": "v3.7.1",
@@ -4699,6 +4215,687 @@
],
"time": "2023-09-19T05:39:22+00:00"
},
+ {
+ "name": "roave/security-advisories",
+ "version": "dev-latest",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Roave/SecurityAdvisories.git",
+ "reference": "66dba7265a37e4081f443ed8211d507cd3cce5ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/66dba7265a37e4081f443ed8211d507cd3cce5ef",
+ "reference": "66dba7265a37e4081f443ed8211d507cd3cce5ef",
+ "shasum": ""
+ },
+ "conflict": {
+ "3f/pygmentize": "<1.2",
+ "admidio/admidio": "<4.2.11",
+ "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3",
+ "aheinze/cockpit": "<2.2",
+ "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5",
+ "akaunting/akaunting": "<2.1.13",
+ "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53",
+ "alextselegidis/easyappointments": "<1.5",
+ "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1",
+ "amazing/media2click": ">=1,<1.3.3",
+ "amphp/artax": "<1.0.6|>=2,<2.0.6",
+ "amphp/http": "<1.0.1",
+ "amphp/http-client": ">=4,<4.4",
+ "anchorcms/anchor-cms": "<=0.12.7",
+ "andreapollastri/cipi": "<=3.1.15",
+ "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5",
+ "apache-solr-for-typo3/solr": "<2.8.3",
+ "apereo/phpcas": "<1.6",
+ "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3",
+ "appwrite/server-ce": "<=1.2.1",
+ "arc/web": "<3",
+ "area17/twill": "<1.2.5|>=2,<2.5.3",
+ "artesaos/seotools": "<0.17.2",
+ "asymmetricrypt/asymmetricrypt": "<9.9.99",
+ "athlon1600/php-proxy": "<=5.1",
+ "athlon1600/php-proxy-app": "<=3",
+ "austintoddj/canvas": "<=3.4.2",
+ "automad/automad": "<1.8",
+ "awesome-support/awesome-support": "<=6.0.7",
+ "aws/aws-sdk-php": ">=3,<3.2.1",
+ "azuracast/azuracast": "<0.18.3",
+ "backdrop/backdrop": "<1.24.2",
+ "backpack/crud": "<3.4.9",
+ "badaso/core": "<2.7",
+ "bagisto/bagisto": "<0.1.5",
+ "barrelstrength/sprout-base-email": "<1.2.7",
+ "barrelstrength/sprout-forms": "<3.9",
+ "barryvdh/laravel-translation-manager": "<0.6.2",
+ "barzahlen/barzahlen-php": "<2.0.1",
+ "baserproject/basercms": "<4.7.5",
+ "bassjobsen/bootstrap-3-typeahead": ">4.0.2",
+ "bigfork/silverstripe-form-capture": ">=3,<3.1.1",
+ "billz/raspap-webgui": "<=2.9.2",
+ "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3",
+ "bmarshall511/wordpress_zero_spam": "<5.2.13",
+ "bolt/bolt": "<3.7.2",
+ "bolt/core": "<=4.2",
+ "bottelet/flarepoint": "<2.2.1",
+ "brightlocal/phpwhois": "<=4.2.5",
+ "brotkrueml/codehighlight": "<2.7",
+ "brotkrueml/schema": "<1.13.1|>=2,<2.5.1",
+ "brotkrueml/typo3-matomo-integration": "<1.3.2",
+ "buddypress/buddypress": "<7.2.1",
+ "bugsnag/bugsnag-laravel": "<2.0.2",
+ "bytefury/crater": "<6.0.2",
+ "cachethq/cachet": "<2.5.1",
+ "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10",
+ "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10",
+ "cardgate/magento2": "<2.0.33",
+ "cardgate/woocommerce": "<=3.1.15",
+ "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4",
+ "cartalyst/sentry": "<=2.1.6",
+ "catfan/medoo": "<1.7.5",
+ "cecil/cecil": "<7.47.1",
+ "centreon/centreon": "<22.10.0.0-beta1",
+ "cesnet/simplesamlphp-module-proxystatistics": "<3.1",
+ "chriskacerguis/codeigniter-restserver": "<=2.7.1",
+ "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3",
+ "cockpit-hq/cockpit": "<=2.6.3",
+ "codeception/codeception": "<3.1.3|>=4,<4.1.22",
+ "codeigniter/framework": "<3.1.9",
+ "codeigniter4/framework": "<4.3.5",
+ "codeigniter4/shield": "<1.0.0.0-beta4",
+ "codiad/codiad": "<=2.8.4",
+ "composer/composer": "<1.10.27|>=2,<2.2.22|>=2.3,<2.6.4",
+ "concrete5/concrete5": "<=9.2.1",
+ "concrete5/core": "<8.5.8|>=9,<9.1",
+ "contao-components/mediaelement": ">=2.14.2,<2.21.1",
+ "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4",
+ "contao/core": ">=2,<3.5.39",
+ "contao/core-bundle": "<4.9.42|>=4.10,<4.13.28|>=5,<5.1.10",
+ "contao/listing-bundle": ">=4,<4.4.8",
+ "contao/managed-edition": "<=1.5",
+ "cosenary/instagram": "<=2.3",
+ "craftcms/cms": "<=4.4.14",
+ "croogo/croogo": "<4",
+ "cuyz/valinor": "<0.12",
+ "czproject/git-php": "<4.0.3",
+ "darylldoyle/safe-svg": "<1.9.10",
+ "datadog/dd-trace": ">=0.30,<0.30.2",
+ "datatables/datatables": "<1.10.10",
+ "david-garcia/phpwhois": "<=4.3.1",
+ "dbrisinajumi/d2files": "<1",
+ "dcat/laravel-admin": "<=2.1.3.0-beta",
+ "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3",
+ "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1",
+ "desperado/xml-bundle": "<=0.1.7",
+ "directmailteam/direct-mail": "<5.2.4",
+ "doctrine/annotations": ">=1,<1.2.7",
+ "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2",
+ "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1",
+ "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4",
+ "doctrine/doctrine-bundle": "<1.5.2",
+ "doctrine/doctrine-module": "<=0.7.1",
+ "doctrine/mongodb-odm": ">=1,<1.0.2",
+ "doctrine/mongodb-odm-bundle": ">=2,<3.0.1",
+ "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4",
+ "dolibarr/dolibarr": "<18",
+ "dompdf/dompdf": "<2.0.2|==2.0.2",
+ "drupal/core": "<9.4.14|>=9.5,<9.5.8|>=10,<10.0.8",
+ "drupal/drupal": ">=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4",
+ "dweeves/magmi": "<=0.7.24",
+ "ecodev/newsletter": "<=4",
+ "ectouch/ectouch": "<=2.7.2",
+ "elefant/cms": "<2.0.7",
+ "elgg/elgg": "<3.3.24|>=4,<4.0.5",
+ "encore/laravel-admin": "<=1.8.19",
+ "endroid/qr-code-bundle": "<3.4.2",
+ "enshrined/svg-sanitize": "<0.15",
+ "erusev/parsedown": "<1.7.2",
+ "ether/logs": "<3.0.4",
+ "exceedone/exment": "<4.4.3|>=5,<5.0.3",
+ "exceedone/laravel-admin": "<2.2.3|==3",
+ "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev",
+ "ezsystems/ez-support-tools": ">=2.2,<2.2.3",
+ "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev",
+ "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev",
+ "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24",
+ "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26",
+ "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1",
+ "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12",
+ "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.26",
+ "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8",
+ "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev",
+ "ezsystems/ezplatform-user": ">=1,<1.0.1",
+ "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.30",
+ "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1",
+ "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3",
+ "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15",
+ "ezyang/htmlpurifier": "<4.1.1",
+ "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2",
+ "facturascripts/facturascripts": "<=2022.08",
+ "feehi/cms": "<=2.1.1",
+ "feehi/feehicms": "<=2.1.1",
+ "fenom/fenom": "<=2.12.1",
+ "filegator/filegator": "<7.8",
+ "firebase/php-jwt": "<6",
+ "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2",
+ "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6",
+ "flarum/core": "<1.8",
+ "flarum/framework": "<1.8",
+ "flarum/mentions": "<1.6.3",
+ "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15",
+ "flarum/tags": "<=0.1.0.0-beta13",
+ "fluidtypo3/vhs": "<5.1.1",
+ "fof/byobu": ">=0.3.0.0-beta2,<1.1.7",
+ "fof/upload": "<1.2.3",
+ "fooman/tcpdf": "<6.2.22",
+ "forkcms/forkcms": "<5.11.1",
+ "fossar/tcpdf-parser": "<6.2.22",
+ "francoisjacquet/rosariosis": "<11",
+ "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2",
+ "friendsofsymfony/oauth2-php": "<1.3",
+ "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2",
+ "friendsofsymfony/user-bundle": ">=1.2,<1.3.5",
+ "friendsoftypo3/mediace": ">=7.6.2,<7.6.5",
+ "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6",
+ "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.1",
+ "froxlor/froxlor": "<2.1",
+ "fuel/core": "<1.8.1",
+ "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3",
+ "gaoming13/wechat-php-sdk": "<=1.10.2",
+ "genix/cms": "<=1.1.11",
+ "getgrav/grav": "<=1.7.42.1",
+ "getkirby/cms": "<3.5.8.3-dev|>=3.6,<3.6.6.3-dev|>=3.7,<3.7.5.2-dev|>=3.8,<3.8.4.1-dev|>=3.9,<3.9.6",
+ "getkirby/kirby": "<=2.5.12",
+ "getkirby/panel": "<2.5.14",
+ "getkirby/starterkit": "<=3.7.0.2",
+ "gilacms/gila": "<=1.11.4",
+ "gleez/cms": "<=1.2|==2",
+ "globalpayments/php-sdk": "<2",
+ "gogentooss/samlbase": "<1.2.7",
+ "google/protobuf": "<3.15",
+ "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3",
+ "gree/jose": "<2.2.1",
+ "gregwar/rst": "<1.0.3",
+ "grumpydictator/firefly-iii": "<6",
+ "gugoan/economizzer": "<=0.9.0.0-beta1",
+ "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5",
+ "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5",
+ "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2",
+ "harvesthq/chosen": "<1.8.7",
+ "helloxz/imgurl": "<=2.31",
+ "hhxsv5/laravel-s": "<3.7.36",
+ "hillelcoren/invoice-ninja": "<5.3.35",
+ "himiklab/yii2-jqgrid-widget": "<1.0.8",
+ "hjue/justwriting": "<=1",
+ "hov/jobfair": "<1.0.13|>=2,<2.0.2",
+ "httpsoft/http-message": "<1.0.12",
+ "hyn/multi-tenant": ">=5.6,<5.7.2",
+ "ibexa/admin-ui": ">=4.2,<4.2.3",
+ "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3",
+ "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3",
+ "ibexa/post-install": "<=1.0.4",
+ "ibexa/user": ">=4,<4.4.3",
+ "icecoder/icecoder": "<=8.1",
+ "idno/known": "<=1.3.1",
+ "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10",
+ "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4",
+ "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40",
+ "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15",
+ "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75",
+ "impresscms/impresscms": "<=1.4.5",
+ "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.2",
+ "in2code/ipandlanguageredirect": "<5.1.2",
+ "in2code/lux": "<17.6.1|>=18,<24.0.2",
+ "innologi/typo3-appointments": "<2.0.6",
+ "intelliants/subrion": "<4.2.2",
+ "islandora/islandora": ">=2,<2.4.1",
+ "ivankristianto/phpwhois": "<=4.3",
+ "jackalope/jackalope-doctrine-dbal": "<1.7.4",
+ "james-heinrich/getid3": "<1.9.21",
+ "james-heinrich/phpthumb": "<1.7.12",
+ "jasig/phpcas": "<1.3.3",
+ "jcbrand/converse.js": "<3.3.3",
+ "joomla/application": "<1.0.13",
+ "joomla/archive": "<1.1.12|>=2,<2.0.1",
+ "joomla/filesystem": "<1.6.2|>=2,<2.0.1",
+ "joomla/filter": "<1.4.4|>=2,<2.0.1",
+ "joomla/framework": ">=2.5.4,<=3.8.12",
+ "joomla/input": ">=2,<2.0.2",
+ "joomla/joomla-cms": ">=2.5,<3.9.12",
+ "joomla/session": "<1.3.1",
+ "joyqi/hyper-down": "<=2.4.27",
+ "jsdecena/laracom": "<2.0.9",
+ "jsmitty12/phpwhois": "<5.1",
+ "kazist/phpwhois": "<=4.2.6",
+ "kelvinmo/simplexrd": "<3.1.1",
+ "kevinpapst/kimai2": "<1.16.7",
+ "khodakhah/nodcms": "<=3",
+ "kimai/kimai": "<1.1",
+ "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4",
+ "klaviyo/magento2-extension": ">=1,<3",
+ "knplabs/knp-snappy": "<=1.4.2",
+ "kohana/core": "<3.3.3",
+ "krayin/laravel-crm": "<1.2.2",
+ "kreait/firebase-php": ">=3.2,<3.8.1",
+ "la-haute-societe/tcpdf": "<6.2.22",
+ "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2",
+ "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1",
+ "laminas/laminas-http": "<2.14.2",
+ "laravel/fortify": "<1.11.1",
+ "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75",
+ "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10",
+ "latte/latte": "<2.10.8",
+ "lavalite/cms": "<=9",
+ "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5",
+ "league/commonmark": "<0.18.3",
+ "league/flysystem": "<1.1.4|>=2,<2.1.1",
+ "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3",
+ "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3",
+ "librenms/librenms": "<2017.08.18",
+ "liftkit/database": "<2.13.2",
+ "limesurvey/limesurvey": "<3.27.19",
+ "livehelperchat/livehelperchat": "<=3.91",
+ "livewire/livewire": ">2.2.4,<2.2.6",
+ "lms/routes": "<2.1.1",
+ "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2",
+ "luyadev/yii-helpers": "<1.2.1",
+ "magento/community-edition": "<=2.4",
+ "magento/magento1ce": "<1.9.4.3-dev",
+ "magento/magento1ee": ">=1,<1.14.4.3-dev",
+ "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2.0-patch2",
+ "maikuolan/phpmussel": ">=1,<1.6",
+ "mantisbt/mantisbt": "<=2.25.5",
+ "marcwillmann/turn": "<0.3.3",
+ "matyhtf/framework": "<3.0.6",
+ "mautic/core": "<4.3",
+ "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35",
+ "mediawiki/matomo": "<2.4.3",
+ "melisplatform/melis-asset-manager": "<5.0.1",
+ "melisplatform/melis-cms": "<5.0.1",
+ "melisplatform/melis-front": "<5.0.1",
+ "mezzio/mezzio-swoole": "<3.7|>=4,<4.3",
+ "mgallegos/laravel-jqgrid": "<=1.3",
+ "microweber/microweber": "<=1.3.4",
+ "miniorange/miniorange-saml": "<1.4.3",
+ "mittwald/typo3_forum": "<1.2.1",
+ "mobiledetect/mobiledetectlib": "<2.8.32",
+ "modx/revolution": "<=2.8.3.0-patch",
+ "mojo42/jirafeau": "<4.4",
+ "mongodb/mongodb": ">=1,<1.9.2",
+ "monolog/monolog": ">=1.8,<1.12",
+ "moodle/moodle": "<4.2.0.0-RC2-dev|==4.2",
+ "movim/moxl": ">=0.8,<=0.10",
+ "mpdf/mpdf": "<=7.1.7",
+ "mustache/mustache": ">=2,<2.14.1",
+ "namshi/jose": "<2.2",
+ "neoan3-apps/template": "<1.1.1",
+ "neorazorx/facturascripts": "<2022.04",
+ "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6",
+ "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3",
+ "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2",
+ "neos/neos-ui": "<=8.3.3",
+ "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5",
+ "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15",
+ "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6",
+ "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13",
+ "nilsteampassnet/teampass": "<3.0.10",
+ "notrinos/notrinos-erp": "<=0.7",
+ "noumo/easyii": "<=0.9",
+ "nukeviet/nukeviet": "<4.5.02",
+ "nyholm/psr7": "<1.6.1",
+ "nystudio107/craft-seomatic": "<3.4.12",
+ "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1",
+ "october/backend": "<1.1.2",
+ "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1",
+ "october/october": "<=3.4.4",
+ "october/rain": "<1.0.472|>=1.1,<1.1.2",
+ "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66",
+ "onelogin/php-saml": "<2.10.4",
+ "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5",
+ "open-web-analytics/open-web-analytics": "<1.7.4",
+ "opencart/opencart": "<=3.0.3.7|>=4,<4.0.2.3-dev",
+ "openid/php-openid": "<2.3",
+ "openmage/magento-lts": "<=19.5|>=20,<=20.1",
+ "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2",
+ "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5",
+ "oro/commerce": ">=4.1,<5.0.6",
+ "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7",
+ "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8",
+ "oxid-esales/oxideshop-ce": "<4.5",
+ "packbackbooks/lti-1-3-php-library": "<5",
+ "padraic/humbug_get_contents": "<1.1.2",
+ "pagarme/pagarme-php": "<3",
+ "pagekit/pagekit": "<=1.0.18",
+ "paragonie/random_compat": "<2",
+ "passbolt/passbolt_api": "<2.11",
+ "paypal/merchant-sdk-php": "<3.12",
+ "pear/archive_tar": "<1.4.14",
+ "pear/crypt_gpg": "<1.6.7",
+ "pear/pear": "<=1.10.1",
+ "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1",
+ "personnummer/personnummer": "<3.0.2",
+ "phanan/koel": "<5.1.4",
+ "php-mod/curl": "<2.3.2",
+ "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1",
+ "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7",
+ "phpmailer/phpmailer": "<6.5",
+ "phpmussel/phpmussel": ">=1,<1.6",
+ "phpmyadmin/phpmyadmin": "<5.2.1",
+ "phpmyfaq/phpmyfaq": "<=3.1.7",
+ "phpoffice/phpexcel": "<1.8",
+ "phpoffice/phpspreadsheet": "<1.16",
+ "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.19",
+ "phpservermon/phpservermon": "<3.6",
+ "phpsysinfo/phpsysinfo": "<3.2.5",
+ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3",
+ "phpwhois/phpwhois": "<=4.2.5",
+ "phpxmlrpc/extras": "<0.6.1",
+ "phpxmlrpc/phpxmlrpc": "<4.9.2",
+ "pi/pi": "<=2.5",
+ "pimcore/admin-ui-classic-bundle": "<1.1.2",
+ "pimcore/customer-management-framework-bundle": "<3.4.2",
+ "pimcore/data-hub": "<1.2.4",
+ "pimcore/demo": "<10.3",
+ "pimcore/perspective-editor": "<1.5.1",
+ "pimcore/pimcore": "<10.6.8",
+ "pixelfed/pixelfed": "<=0.11.4",
+ "pocketmine/bedrock-protocol": "<8.0.2",
+ "pocketmine/pocketmine-mp": "<=4.23|>=5,<5.3.1",
+ "pressbooks/pressbooks": "<5.18",
+ "prestashop/autoupgrade": ">=4,<4.10.1",
+ "prestashop/blockwishlist": ">=2,<2.1.1",
+ "prestashop/contactform": ">=1.0.1,<4.3",
+ "prestashop/gamification": "<2.3.2",
+ "prestashop/prestashop": "<8.1.2",
+ "prestashop/productcomments": "<5.0.2",
+ "prestashop/ps_emailsubscription": "<2.6.1",
+ "prestashop/ps_facetedsearch": "<3.4.1",
+ "prestashop/ps_linklist": "<3.1",
+ "privatebin/privatebin": "<1.4",
+ "processwire/processwire": "<=3.0.200",
+ "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7",
+ "propel/propel1": ">=1,<=1.7.1",
+ "pterodactyl/panel": "<1.7",
+ "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2",
+ "ptrofimov/beanstalk_console": "<1.7.14",
+ "pusher/pusher-php-server": "<2.2.1",
+ "pwweb/laravel-core": "<=0.3.6.0-beta",
+ "pyrocms/pyrocms": "<=3.9.1",
+ "rainlab/blog-plugin": "<1.4.1",
+ "rainlab/debugbar-plugin": "<3.1",
+ "rainlab/user-plugin": "<=1.4.5",
+ "rankmath/seo-by-rank-math": "<=1.0.95",
+ "rap2hpoutre/laravel-log-viewer": "<0.13",
+ "react/http": ">=0.7,<1.9",
+ "really-simple-plugins/complianz-gdpr": "<6.4.2",
+ "remdex/livehelperchat": "<3.99",
+ "rmccue/requests": ">=1.6,<1.8",
+ "robrichards/xmlseclibs": "<3.0.4",
+ "roots/soil": "<4.1",
+ "rudloff/alltube": "<3.0.3",
+ "s-cart/core": "<6.9",
+ "s-cart/s-cart": "<6.9",
+ "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1",
+ "sabre/dav": "<1.7.11|>=1.8,<1.8.9",
+ "scheb/two-factor-bundle": "<3.26|>=4,<4.11",
+ "sensiolabs/connect": "<4.2.3",
+ "serluck/phpwhois": "<=4.2.6",
+ "sfroemken/url_redirect": "<=1.2.1",
+ "sheng/yiicms": "<=1.2",
+ "shopware/core": "<=6.4.20",
+ "shopware/platform": "<=6.4.20",
+ "shopware/production": "<=6.3.5.2",
+ "shopware/shopware": "<=5.7.17",
+ "shopware/storefront": "<=6.4.8.1",
+ "shopxo/shopxo": "<2.2.6",
+ "showdoc/showdoc": "<2.10.4",
+ "silverstripe-australia/advancedreports": ">=1,<=2",
+ "silverstripe/admin": "<1.13.6",
+ "silverstripe/assets": ">=1,<1.11.1",
+ "silverstripe/cms": "<4.11.3",
+ "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1",
+ "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3",
+ "silverstripe/framework": "<4.13.14|>=5,<5.0.13",
+ "silverstripe/graphql": "<3.5.2|>=4.0.0.0-alpha1,<4.0.0.0-alpha2|>=4.1.1,<4.1.2|>=4.2.2,<4.2.3",
+ "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1",
+ "silverstripe/recipe-cms": ">=4.5,<4.5.3",
+ "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1",
+ "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4",
+ "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1",
+ "silverstripe/subsites": ">=2,<2.6.1",
+ "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1",
+ "silverstripe/userforms": "<3",
+ "silverstripe/versioned-admin": ">=1,<1.11.1",
+ "simple-updates/phpwhois": "<=1",
+ "simplesamlphp/saml2": "<1.15.4|>=2,<2.3.8|>=3,<3.1.4",
+ "simplesamlphp/simplesamlphp": "<1.18.6",
+ "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1",
+ "simplesamlphp/simplesamlphp-module-openid": "<1",
+ "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9",
+ "simplito/elliptic-php": "<1.0.6",
+ "sitegeist/fluid-components": "<3.5",
+ "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3",
+ "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1",
+ "slim/slim": "<2.6",
+ "slub/slub-events": "<3.0.3",
+ "smarty/smarty": "<3.1.48|>=4,<4.3.1",
+ "snipe/snipe-it": "<=6.2.1",
+ "socalnick/scn-social-auth": "<1.15.2",
+ "socialiteproviders/steam": "<1.1",
+ "spatie/browsershot": "<3.57.4",
+ "spipu/html2pdf": "<5.2.8",
+ "spoon/library": "<1.4.1",
+ "spoonity/tcpdf": "<6.2.22",
+ "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1",
+ "ssddanbrown/bookstack": "<22.02.3",
+ "statamic/cms": "<4.10",
+ "stormpath/sdk": "<9.9.99",
+ "studio-42/elfinder": "<2.1.62",
+ "subhh/libconnect": "<7.0.8|>=8,<8.1",
+ "sukohi/surpass": "<1",
+ "sulu/sulu": "<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8|==2.4.0.0-RC1|>=2.5,<2.5.10",
+ "sumocoders/framework-user-bundle": "<1.4",
+ "swag/paypal": "<5.4.4",
+ "swiftmailer/swiftmailer": ">=4,<5.4.5",
+ "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2",
+ "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1",
+ "sylius/grid-bundle": "<1.10.1",
+ "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1",
+ "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4",
+ "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2",
+ "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99",
+ "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4",
+ "symbiote/silverstripe-seed": "<6.0.3",
+ "symbiote/silverstripe-versionedfiles": "<=2.0.3",
+ "symfont/process": ">=0",
+ "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8",
+ "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+ "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4",
+ "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1",
+ "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3",
+ "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7",
+ "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6",
+ "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13",
+ "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1",
+ "symfony/mime": ">=4.3,<4.3.8",
+ "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+ "symfony/polyfill": ">=1,<1.10",
+ "symfony/polyfill-php55": ">=1,<1.10",
+ "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+ "symfony/routing": ">=2,<2.0.19",
+ "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8",
+ "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6",
+ "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9",
+ "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
+ "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8",
+ "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2",
+ "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12",
+ "symfony/symfony": "<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6",
+ "symfony/translation": ">=2,<2.0.17",
+ "symfony/ux-autocomplete": "<2.11.2",
+ "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3",
+ "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8",
+ "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4",
+ "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7",
+ "t3/dce": "<0.11.5|>=2.2,<2.6.2",
+ "t3g/svg-sanitizer": "<1.0.3",
+ "tastyigniter/tastyigniter": "<3.3",
+ "tcg/voyager": "<=1.4",
+ "tecnickcom/tcpdf": "<6.2.22",
+ "terminal42/contao-tablelookupwizard": "<3.3.5",
+ "thelia/backoffice-default-template": ">=2.1,<2.1.2",
+ "thelia/thelia": ">=2.1,<2.1.3",
+ "theonedemon/phpwhois": "<=4.2.5",
+ "thinkcmf/thinkcmf": "<=5.1.7",
+ "thorsten/phpmyfaq": "<3.2.0.0-beta2",
+ "tikiwiki/tiki-manager": "<=17.1",
+ "tinymce/tinymce": "<5.10.7|>=6,<6.3.1",
+ "tinymighty/wiki-seo": "<1.2.2",
+ "titon/framework": "<9.9.99",
+ "tobiasbg/tablepress": "<=2.0.0.0-RC1",
+ "topthink/framework": "<6.0.14",
+ "topthink/think": "<=6.1.1",
+ "topthink/thinkphp": "<=3.2.3",
+ "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2",
+ "tribalsystems/zenario": "<=9.4.59197",
+ "truckersmp/phpwhois": "<=4.3.1",
+ "ttskch/pagination-service-provider": "<1",
+ "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3",
+ "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2",
+ "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1",
+ "typo3/cms-core": "<8.7.51|>=9,<9.5.42|>=10,<10.4.39|>=11,<11.5.30|>=12,<12.4.4",
+ "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1",
+ "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1",
+ "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30",
+ "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6",
+ "typo3/html-sanitizer": ">=1,<1.5.1|>=2,<2.1.2",
+ "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3",
+ "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1",
+ "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5",
+ "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10",
+ "ua-parser/uap-php": "<3.8",
+ "uasoft-indonesia/badaso": "<=2.9.7",
+ "unisharp/laravel-filemanager": "<=2.5.1",
+ "userfrosting/userfrosting": ">=0.3.1,<4.6.3",
+ "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2",
+ "uvdesk/community-skeleton": "<=1.1.1",
+ "vanilla/safecurl": "<0.9.2",
+ "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4",
+ "vova07/yii2-fileapi-widget": "<0.1.9",
+ "vrana/adminer": "<4.8.1",
+ "waldhacker/hcaptcha": "<2.1.2",
+ "wallabag/tcpdf": "<6.2.22",
+ "wallabag/wallabag": "<2.6.7",
+ "wanglelecc/laracms": "<=1.0.3",
+ "web-auth/webauthn-framework": ">=3.3,<3.3.4",
+ "webbuilders-group/silverstripe-kapost-bridge": "<0.4",
+ "webcoast/deferred-image-processing": "<1.0.2",
+ "webklex/laravel-imap": "<5.3",
+ "webklex/php-imap": "<5.3",
+ "webpa/webpa": "<3.1.2",
+ "wikibase/wikibase": "<=1.39.3",
+ "wikimedia/parsoid": "<0.12.2",
+ "willdurand/js-translation-bundle": "<2.1.1",
+ "wintercms/winter": "<1.2.3",
+ "woocommerce/woocommerce": "<6.6",
+ "wp-cli/wp-cli": "<2.5",
+ "wp-graphql/wp-graphql": "<=1.14.5",
+ "wpanel/wpanel4-cms": "<=4.3.1",
+ "wpcloud/wp-stateless": "<3.2",
+ "wwbn/avideo": "<=12.4",
+ "xataface/xataface": "<3",
+ "xpressengine/xpressengine": "<3.0.15",
+ "yeswiki/yeswiki": "<4.1",
+ "yetiforce/yetiforce-crm": "<=6.4",
+ "yidashi/yii2cmf": "<=2",
+ "yii2mod/yii2-cms": "<1.9.2",
+ "yiisoft/yii": "<1.1.27",
+ "yiisoft/yii2": "<2.0.38",
+ "yiisoft/yii2-bootstrap": "<2.0.4",
+ "yiisoft/yii2-dev": "<2.0.43",
+ "yiisoft/yii2-elasticsearch": "<2.0.5",
+ "yiisoft/yii2-gii": "<=2.2.4",
+ "yiisoft/yii2-jui": "<2.0.4",
+ "yiisoft/yii2-redis": "<2.0.8",
+ "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6",
+ "yoast-seo-for-typo3/yoast_seo": "<7.2.3",
+ "yourls/yourls": "<=1.8.2",
+ "zencart/zencart": "<=1.5.7.0-beta",
+ "zendesk/zendesk_api_client_php": "<2.2.11",
+ "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3",
+ "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2",
+ "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2",
+ "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5",
+ "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3",
+ "zendframework/zend-diactoros": "<1.8.4",
+ "zendframework/zend-feed": "<2.10.3",
+ "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1",
+ "zendframework/zend-http": "<2.8.1",
+ "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6",
+ "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3",
+ "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2",
+ "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1",
+ "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4",
+ "zendframework/zend-validator": ">=2.3,<2.3.6",
+ "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1",
+ "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6",
+ "zendframework/zendframework": "<=3",
+ "zendframework/zendframework1": "<1.12.20",
+ "zendframework/zendopenid": "<2.0.2",
+ "zendframework/zendrest": "<2.0.2",
+ "zendframework/zendservice-amazon": "<2.0.3",
+ "zendframework/zendservice-api": "<1",
+ "zendframework/zendservice-audioscrobbler": "<2.0.2",
+ "zendframework/zendservice-nirvanix": "<2.0.2",
+ "zendframework/zendservice-slideshare": "<2.0.2",
+ "zendframework/zendservice-technorati": "<2.0.2",
+ "zendframework/zendservice-windowsazure": "<2.0.2",
+ "zendframework/zendxml": "<1.0.1",
+ "zenstruck/collection": "<0.2.1",
+ "zetacomponents/mail": "<1.8.2",
+ "zf-commons/zfc-user": "<1.2.2",
+ "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3",
+ "zfr/zfr-oauth2-server-module": "<0.1.2",
+ "zoujingli/thinkadmin": "<6.0.22"
+ },
+ "default-branch": true,
+ "type": "metapackage",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "role": "maintainer"
+ },
+ {
+ "name": "Ilya Tribusean",
+ "email": "slash3b@gmail.com",
+ "role": "maintainer"
+ }
+ ],
+ "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it",
+ "keywords": [
+ "dev"
+ ],
+ "support": {
+ "issues": "https://github.com/Roave/SecurityAdvisories/issues",
+ "source": "https://github.com/Roave/SecurityAdvisories/tree/latest"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Ocramius",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-10-09T22:04:13+00:00"
+ },
{
"name": "sebastian/cli-parser",
"version": "1.0.1",
@@ -6009,7 +6206,9 @@
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {
+ "roave/security-advisories": 20
+ },
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
@@ -6018,5 +6217,5 @@
"ext-mbstring": "*"
},
"platform-dev": [],
- "plugin-api-version": "2.6.0"
+ "plugin-api-version": "2.3.0"
}
diff --git a/demo/demo4-generating-readme-file/demo-config.yaml b/demo/demo2-add-missing-doc-blocks/demo-config.yaml
similarity index 67%
rename from demo/demo4-generating-readme-file/demo-config.yaml
rename to demo/demo2-add-missing-doc-blocks/demo-config.yaml
index d4854c6d..228705e0 100644
--- a/demo/demo4-generating-readme-file/demo-config.yaml
+++ b/demo/demo2-add-missing-doc-blocks/demo-config.yaml
@@ -1,6 +1,6 @@
project_root: '%DOC_GEN_LIB_PATH%'
-cache_dir: '%WORKING_DIR%/demo/demo4-generating-readme-file/__cache'
-templates_dir: '%WORKING_DIR%/demo/demo4-generating-readme-file/templates'
+cache_dir: '%WORKING_DIR%/demo/demo2-add-missing-doc-blocks/__cache'
+templates_dir: '%WORKING_DIR%/demo/demo2-add-missing-doc-blocks/templates'
language_handlers:
php:
class: \BumbleDocGen\LanguageHandler\Php\PhpHandler
@@ -10,4 +10,4 @@ source_locators:
- class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator
arguments:
directories:
- - "%project_root%"
\ No newline at end of file
+ - "%project_root%/src"
diff --git a/demo/demo2-add-missing-doc-blocks/demoScript.php b/demo/demo2-add-missing-doc-blocks/demoScript.php
new file mode 100644
index 00000000..e1bbf39c
--- /dev/null
+++ b/demo/demo2-add-missing-doc-blocks/demoScript.php
@@ -0,0 +1,23 @@
+#!/usr/bin/env php
+ AddDocBlocksCommand::NAME,
+ '--config' => 'demo/demo2-add-missing-doc-blocks/demo-config.yaml',
+ '--ai_provider' => 'openai',
+ '--ai_model' => 'gpt-4',
+ ]);
+ $application->run($input);
+} catch (\Exception $e) {
+ die($e->getMessage());
+}
diff --git a/demo/demo2-templates-generation/demo-config.yaml b/demo/demo2-templates-generation/demo-config.yaml
deleted file mode 100644
index 2d5be500..00000000
--- a/demo/demo2-templates-generation/demo-config.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-project_root: '%DOC_GEN_LIB_PATH%'
-templates_dir: '%WORKING_DIR%/demo/demo2-templates-generation/templates'
-cache_dir: '%WORKING_DIR%/demo/demo2-templates-generation/__cache'
-language_handlers:
- php:
- class: \BumbleDocGen\LanguageHandler\Php\PhpHandler
- settings:
- file_source_base_url: '#'
- async_source_loading_enabled: true
-source_locators:
- - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator
- arguments:
- directories:
- - "%project_root%"
\ No newline at end of file
diff --git a/demo/demo2-templates-generation/demoScript.php b/demo/demo2-templates-generation/demoScript.php
deleted file mode 100644
index 27f1080b..00000000
--- a/demo/demo2-templates-generation/demoScript.php
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env php
-create(__DIR__ . '/demo-config.yaml');
- $docGen->generateProjectTemplatesStructure();
-} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) {
- die($e->getMessage());
-}
diff --git a/demo/demo3-add-missing-doc-blocks/demoScript.php b/demo/demo3-add-missing-doc-blocks/demoScript.php
deleted file mode 100644
index 93702bce..00000000
--- a/demo/demo3-add-missing-doc-blocks/demoScript.php
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env php
-create(__DIR__ . '/demo-config.yaml');
- $docGen->addMissingDocBlocks();
-} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) {
- die($e->getMessage());
-}
diff --git a/demo/demo3-add-missing-doc-blocks/demo-config.yaml b/demo/demo3-generating-readme-file/demo-config.yaml
similarity index 67%
rename from demo/demo3-add-missing-doc-blocks/demo-config.yaml
rename to demo/demo3-generating-readme-file/demo-config.yaml
index d5d59162..bca8adfc 100644
--- a/demo/demo3-add-missing-doc-blocks/demo-config.yaml
+++ b/demo/demo3-generating-readme-file/demo-config.yaml
@@ -1,6 +1,6 @@
project_root: '%DOC_GEN_LIB_PATH%'
-cache_dir: '%WORKING_DIR%/demo/demo3-add-missing-doc-blocks/__cache'
-templates_dir: '%WORKING_DIR%/demo/demo3-add-missing-doc-blocks/templates'
+cache_dir: '%WORKING_DIR%/demo/demo3-generating-readme-file/__cache'
+templates_dir: '%WORKING_DIR%/demo/demo3-generating-readme-file/templates'
language_handlers:
php:
class: \BumbleDocGen\LanguageHandler\Php\PhpHandler
@@ -10,4 +10,4 @@ source_locators:
- class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator
arguments:
directories:
- - "%project_root%"
\ No newline at end of file
+ - "%project_root%/src"
diff --git a/demo/demo3-generating-readme-file/demoScript.php b/demo/demo3-generating-readme-file/demoScript.php
new file mode 100644
index 00000000..055b061b
--- /dev/null
+++ b/demo/demo3-generating-readme-file/demoScript.php
@@ -0,0 +1,23 @@
+#!/usr/bin/env php
+ GenerateReadMeTemplateCommand::NAME,
+ '--config' => 'demo/demo3-generating-readme-file/demo-config.yaml',
+ '--ai_provider' => 'openai',
+ '--ai_model' => 'gpt-4',
+ ]);
+ $application->run($input);
+} catch (\Exception $e) {
+ die($e->getMessage());
+}
diff --git a/demo/demo5-config-array/demoScript.php b/demo/demo4-config-array/demoScript.php
similarity index 95%
rename from demo/demo5-config-array/demoScript.php
rename to demo/demo4-config-array/demoScript.php
index 7c733bd3..701a7c17 100644
--- a/demo/demo5-config-array/demoScript.php
+++ b/demo/demo4-config-array/demoScript.php
@@ -9,7 +9,7 @@
$docGen = (new \BumbleDocGen\DocGeneratorFactory())
->createByConfigArray([
'project_root' => '%WORKING_DIR%/vendor/doctrine',
- 'demo_dir' => '%WORKING_DIR%/demo/demo5-config-array', // <= custom parameter
+ 'demo_dir' => '%WORKING_DIR%/demo/demo4-config-array', // <= custom parameter
'cache_dir' => '%demo_dir%/.cache',
'templates_dir' => '%demo_dir%/templates',
'output_dir' => "%demo_dir%/docs",
diff --git a/demo/demo5-config-array/templates/README.md.twig b/demo/demo4-config-array/templates/README.md.twig
similarity index 73%
rename from demo/demo5-config-array/templates/README.md.twig
rename to demo/demo4-config-array/templates/README.md.twig
index c9231639..f370c324 100644
--- a/demo/demo5-config-array/templates/README.md.twig
+++ b/demo/demo4-config-array/templates/README.md.twig
@@ -6,4 +6,4 @@
To update this documentation, run the following command:
-{{ 'php demo/demo5-config-array/demoScript.php' | textToCodeBlock('console') }}
\ No newline at end of file
+{{ 'php demo/demo4-config-array/demoScript.php' | textToCodeBlock('console') }}
diff --git a/demo/demo4-generating-readme-file/demoScript.php b/demo/demo4-generating-readme-file/demoScript.php
deleted file mode 100644
index d287e7d0..00000000
--- a/demo/demo4-generating-readme-file/demoScript.php
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env php
-create(__DIR__ . '/demo-config.yaml');
- $docGen->fillInReadmeMdTemplate();
-} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) {
- die($e->getMessage());
-}
diff --git a/demo/demo6-unified-document-structure/.gitignore b/demo/demo5-unified-document-structure/.gitignore
similarity index 100%
rename from demo/demo6-unified-document-structure/.gitignore
rename to demo/demo5-unified-document-structure/.gitignore
diff --git a/demo/demo6-unified-document-structure/demo-config.yaml b/demo/demo5-unified-document-structure/demo-config.yaml
similarity index 75%
rename from demo/demo6-unified-document-structure/demo-config.yaml
rename to demo/demo5-unified-document-structure/demo-config.yaml
index 282d3021..92c129f4 100644
--- a/demo/demo6-unified-document-structure/demo-config.yaml
+++ b/demo/demo5-unified-document-structure/demo-config.yaml
@@ -1,6 +1,6 @@
parent_configuration: '%WORKING_DIR%/bumble_doc_gen.yaml'
-demo_dir: '%WORKING_DIR%/demo/demo6-unified-document-structure' # Here I define a template configuration variable
+demo_dir: '%WORKING_DIR%/demo/demo5-unified-document-structure' # Here I define a template configuration variable
output_dir: "%demo_dir%/docs"
cache_dir: '%demo_dir%/.bumbleDocGenCache'
plugins: # Connecting this built-in plugin will change the structure of the configured document
- - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace\EntityDocUnifiedPlacePlugin
\ No newline at end of file
+ - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace\EntityDocUnifiedPlacePlugin
diff --git a/demo/demo6-unified-document-structure/demoScript.php b/demo/demo5-unified-document-structure/demoScript.php
similarity index 100%
rename from demo/demo6-unified-document-structure/demoScript.php
rename to demo/demo5-unified-document-structure/demoScript.php
diff --git a/docs/README.md b/docs/README.md
index fdf78ebd..99ec2743 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -95,4 +95,4 @@ To update this documentation, run the following command:
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md
index c40ae41f..f52e4fcb 100644
--- a/docs/classes/DocGenerator.md
+++ b/docs/classes/DocGenerator.md
@@ -2,7 +2,7 @@
@@ -34,17 +34,14 @@ final class DocGenerator
-
- addMissingDocBlocks
+ addDocBlocks
- Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
--
- fillInReadmeMdTemplate
-
-
generate
- Generates documentation using configuration
-
- generateProjectTemplatesStructure
- - Generate documentation structure with blank templates using AI tools
+ generateReadmeTemplate
+
-
parseAndGetRootEntityCollectionsGroup
@@ -55,11 +52,11 @@ final class DocGenerator
@@ -74,7 +71,7 @@ final class DocGenerator
```php
@@ -154,18 +151,35 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo
-
-
-
-
-
-```php
-public function fillInReadmeMdTemplate(): void;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: void
-
-
-
Throws:
-
@@ -236,7 +207,7 @@ public function fillInReadmeMdTemplate(): void;
```php
@@ -265,36 +236,50 @@ public function generate(): void;
```php
-public function generateProjectTemplatesStructure(): void;
+public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiProvider): void;
```
-
Generate documentation structure with blank templates using AI tools
-
Parameters: not specified
+
+
Parameters:
+
+
Return value: void
Throws:
--
- \Tectalic\OpenAi\ClientException
-
--
- \DI\NotFoundException
-
-
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
\DI\DependencyException
+-
+ \DI\NotFoundException
+
-
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -307,7 +292,7 @@ public function generateProjectTemplatesStructure(): void;
```php
diff --git a/docs/shared_c.cache b/docs/shared_c.cache
index 4576516a..6bdf57da 100644
--- a/docs/shared_c.cache
+++ b/docs/shared_c.cache
@@ -1 +1 @@
-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
\ No newline at end of file
+eJzsvXmTG8mRLzgf5VmbjT3prZkU90HZ2hqPPmivW80hqdEfy2eyODyKkKoKZQCKas6svvtG4qgDBQQygUQyK9PVMywgAUQCHr8I95+7h7t7ISV58d/zF1y++G56AzO3mEyv53+7nF787Y8LCJ//OAMXr+APV/EPi39OLr77k3tBq/cz8eK7m883ry/dfP799WKy+Pp6enkJofr4d3/69YXO4726vfKX8GYafoTrT6+nM/j0zs3mMPu0+sCn+0/8PL34dXPzT3eP5g+GXN2Vkoffsvoy+cv/61//yt/fvvguTS5h/rcIN3Ad4TpM8pN9v4G/+O/JC5K/pyK7vuf7aoRZ/qavp9cL+G3x6c1m0K+ffsh3uX/63Qux/GJqdfu3+e2za3f58+T6H9/9KX8t/eK7//73BVzdXLpF9eUms3//1+4vlQcxL74L1Q2vF/kmeaD3cAG/ffenP/9p9cuv3CJ8fpvvu76Wp+Czm39e3oe9+I4RapKBICBpnrgJnHJtLBglvE0ufPenf01e0A5+M9v1m99///LNL9/X+bnzFzKP8Mff/fe///53/+P/+f3v5rDID37/u4yZS/j97/7f//F//5//K//5n9/9n9//7g//6/e/+5//33f59X//1+//+N0OQU1emKeiijI5opNIMssoSAsqeuaEMIprSYReiopVotoJ45Ko3kxmGbLT2deH8mKVvEy+8b+dPNi/ZXFuS5zuQln1gqat3PKh6KQRkRKQPATNA2grbVRS5ecsEZFiFt2/Vu/cuZ1cuZve7iXUyuXXydIMl9NruPuwksIEI70KgdjqGyl79Dd6/Wjk9VIyu+fpiAH/7XbuLuD19PZ6UWGf5lkzvLXB0+318j1/dlewBB5fbgEZja++vnOLz/Ml6GRr93Ozi/kaJtV2ffdguaD/OJ+FFdpse+Kb7gJMlxisLouMwMmiugzLobMm00zz6CLw/Jcl6axO2hrhZAAPeXdffsfjUfn28d0e4HO5dZ0i4H1D70KqPcNtYH1lKV2zNHYE3xLUy7fVVjifXsKnlzHmi68up+Efeb6urtx1rL5ehTlZ+Fh+urz/+6zVf4GP6634wQDV7xPbIMoDrD84nc0/3d337lr1QVbdeVtjP/7g+6Upsbnpo0/zatumTz/9bjb9MslK4Ae33Oyrt4rqrTt+4uatS62T7Qio3iyrn1MYd17B/vrBhepDqvqQevqhjzM3Wcw/ffjsZhDXMsuTOwnLF6pP6j+t1MQWONZTdnOz0fNye/TNe9ajVtM7qWDhLtdXHi7zyQtbfcOn5tHjMV65+aOZXe5H+77c5kMbgDz8YIUJuS3EzQez4C5mMJ+/crOHjx9MGGVrW+ng5z8svl5O/gvig2vLASp0PFkMyzX32oXPsF5yy8d5fV29m04vl5+roKLM/s/9PA1ZwKshfgtws9oH/d+zoP88XfyQ13y8u74cUO6WxK4Blw9XYy0vLD9fIUvq/Z+/g9ZN9fOhWuK3VyvDE+5H0buW2sNRprezANUXyFPwVCpm1xJffXx6nSYXtxuV8/DZ8pN2/9ff/8m8LWY1XOled7HcKCocmt1f/9Eo91Py9vqLu5zE3cM+miFWYVXthsqjwf/TXd7mXTBD8Eves1/OLr48urIcq8KtqvFzH4+1sXqfjlfBWD1dBwfGew/p6VAFZBeGevTs0T7JKmTrut8t73fX8zSdXW3G/DhdWsUPri8HreCun+44dQe9v/D4u+rdO+isWnQXF/njP+Wd6zL/XW9m+Rbfz2ZZA62vLwcxuzelJ3q82kWfWvt5gGox6J1I2zIElmty+e//hq93D+7U36PfxsmaDjUc9Q0kd3u5eDL4csxqTdQyuh6PuaFfa/a1e2y2F9N7x3b5jaurj396tTzkTkzXGOpOBXOxd9XWGOavM3dz88jc4NXK2M2v6493/+3ULgPt8Gi/wOLzdKmNuW4k8Qeq8UP+SdmU/Qkub1ZrgFdroD2OWI1o60KtoX1f2X2k7oI7wG8eoU7QNRVskzVV41YLw9SZpt3jfphcX2xA9AHcLHx+LIylSVQD5TsWmliukJ0K+PFnq920At/76XSxawsUsuYeuncAVXPJ7xpg/uNseru0qIXea5btG+axQKp1oEvCXDn+8ka4ssqX1vL0evvqD+6ysrjXT5cjV+vBlH5gzZGz/fex2oPzVuwmFdYe3EQuDarSz693k6XBCPHt9ePRl4x3pxI/ZvRsV2/foFopeqc6b3SDj7Pbx8KXS4VSWtpPB14/uoOWFHvtyVpjfPx6kxfx7dVyrOVyKW2Oe8d6zGmrVcNLoMr8qeIdq2fLj+w3mdYfecQZlkbPoyvLQcwhWTweZOOizRv507GqhaFKqHo8VrUAVsphOnsymCJ7jdedg72HcDubT75A6RsqekjPPh50tWFX3/PpUEsjqbRAt4Z6+OzR1CvebAoePdvSUErsNzUvby8mq8frhz+7eYbTxdItMFnkb/T0ynJMuf+XPhmz+nQVGoAV3u6fLkdS+8240kjVw58WV5erp6vXl+Pp/ZI7NN6TsZYLYfdqOjTW+/niyXB2L5lbj/H9F7hebGb412wouFiaWU32Q/fhgHfxlZdpGdaqnmUUb6yv5VD00IRuDfUKMmOD1zPIpsr1RX5/tSKWI7FDE7BzpLtvtR5q9a0Ky6DOWI9+4cFlsDXWr9fLXwcb3wzER6b+cswCZ9gz5o+wWO/aG//oPO9Oq2+4n0YXRtsMU8U7Xn19D/lxteNNQ3VhOaxuOLXLYatZrTwIS/Qt43p5JFMPwA9GqiC8Elv1jZZver2KsS4HXPo3d2vK1YC/Xl9+XZvIv+XdfEnxv6w/bcgu/+3DT6/+LD/wZjK/qcKwq4kzdLdjdfujjzZlUyFblJbb6s/WKjV8r06+x20VfQ+z/Ib5w8f3FM6IvUg7NMjHf07yQvgymU2vrzaS24/bprHkajS1l2c0COJXA+m9S7Q00Oa1+0sPaL0xe9lkszEfQ8E2+Kbr/ePOzbXHL2LJXpK0d8wde5Kle8l+3WG2AGx3hnx2j7jlS1p+nB+W1d0Wsf/KY1mJw7NaY8ztHyr36vu7MTZqPm/iAebz6WOb5u7qcjh1eCaeDvfjZPH51lfX509HrLFAno745MpjUVYLhJf3gs2D5fvtrlDb7vff71+UkMMgupvqNQF4GFsiFax5WZgbVbgxRShhh7feantcE7IqGlel6VwvfphNr36GtIoEE354f3s4yuvb+WJ6tXrySNSUiL0G28GRtrBKidyrO3eO9cPktw+L2YfJf62/yjL4Wd5tHn783QwufqkU6OrT+3nmvk/fuNmGMa3NCUpMs+/wH7fTBVzBwq0+bffS/p2ffg9X0y/VzeHVzP1jZRTSZbB0t0tp5yBZhBXV/zj9y2wVZFsFTXcabTsHqLw7H6evpxGWsfXVGHsCp+UxfsoaPltGqxH4Xpq9NcI6Y2YDrfXTxzBdxVPrzO7u0bahugyn1oL9Zrw3M/fPjXJa+kJ/gevb1VjqsOmyf6yNoruDIK0N5M1w1eaS7eO1FbtGkWkq/k34vdqbH9hqq9H2+0z2jrZ4JK1q1A1Al2HY3Rzq8Ggbed0NRve6tvYMVhGAO7P4zvCnq5hrnaW/GehdJnRPfMMvs46cr0fke8Pdj0f8xWVK8Fv+JvMNPpdR1jqbQPXRHeY0XUZV2fa9V3/uY2h0GSfl2+vg4dseZVPoXSGkn931xW3l+1iHPreeP17Iq+Dn9vc6MMT26l0GQJ/scNuDvPt8s3FcVGkN0/zg3i1Jl+HOJxkFhTGeBGVXwyyDONuoOTzMVpAtv2H1wkNxLyOcT8zvGmPfp4muxuG7kN1onK0JWEU6t+FZY8S8Ey/cZtGshpK7DMimQ21/P7VLXRwe9M3Xa3c1CauQ58MvqXcFCg6Pd59H8h7S+gs+TutZBkKfbF+HR376Fe0u077ZQFtSXIY9j8DNwyEfr36x06d3eMTME7LVvvj64Pcuo5xH4ObxUNu/mO/ydx0e9H52Nw+nswcEmC7jntlqrz/wk3hMtRY3mN9+8e08q6Ivy9S5B0EougySZqv8jHfN1m9YVGljj+6rlvfd1iot3vfWX07C1k318qYN5q7RTf9zMp/4yeUSMo9ua1q5bY3b/TKNkzTZAKpa7bbBhrR9g9UarQmkZZjXNtgI6t9tJ4CWgV97Am733m8HcJZB4Ewf275b5SeuSPvr29ksW2UbdD28c7Xb2NZvvA+qy4DyKbO42Trroma1/Wx7KVq64W7gqBMlWrjjLuis9pwGSrfu/WqAp9p47BluvRc+dpdLoHDD1Z8HDrfdwfLCCI8jyi/nX6/Dkwg3XUbLn6Q71R515SfYH/emamc6Ve3xNzm5K1s/7vj+1S5gGmB2z/gfvs4XcLVPSNXaf5LHvvMmn28e5KpStTPvvPzBD6tY3cp1sIymm1qa6kkAe+nH/nzzYXHrPcy2nt5Hsekywm5rTdGhe+SHG0/DdLbjTqa1X5Mf/uV6sthxj52ZW/XucU90wz8qf/3mZk/vsozU19ydn9zmLmyRf0G2SeK7y7xadl99eMv6K/Vh7HZtY/96/fozhH+8nT+kpe76FVT+nNX4rOHkPEpuWGYiVGNl6O5nvsv4/5OMt7r3+PX6ZYwPBq/cro+Hr9apqbNOmwSVHuzBWta2Vwt3eLc+i/px+ku8e7J5dZc7aplIUMtebXrX6smDN63upusS14KDdjn6L+5mNeIyZltH2+73YK4GXJps81fT+LXyuK8Gt3/617+WZ/Qr9XoBiwqFEH+drbI9/gz/1Dpw4RNlHrJeksJJ57i0MfGojWBQnW08U8bv6vitFcefOyyMvuOE47nutDzk+HVzLLfx+cYVes/xxbZPDDOyGwPfrbXCOb7D1iniI+RTQm+g1itOuaJcWMJ0ftUTlayU0UZHNaK3IXpPOGY7MhyfIKkSojl3lAaitWTSWOkspYw4a7kzOpGIiG68Hzc/9z0yJB8hoRKCow7gnTOEC6a9lNIT4owMGnx+rtCiaLwnH1mAYGQwPlZMRfsiMseciuBoJMpIamwiWolgkwpSW8RyQyzXKocxMuDWkkmRw7lsKnBwSrNgghHOROKNAG55tIwRRGlTlNarxDI2nNaTSgmpoKIxjhqpKVMggiFJMymEFCwm4ikital126wM0MgQ21A6RV4GjDDOLWFBawPCMMm5lFHbbAYQQOQ2Ru4RtajGBt8jRFTEcKCJMUhBk2CYUMkRbj0wzZ3k1EnEcEMMl6uijQytZWEUcZk3UJmY054Gq4L1Qqf8xAowRFPCEZdNPQYnVeIbGW5PE1aRl3lPlh4DJzwY5QPx+R/NSIQgk40DwbXozmZoVB1yZDhuJpwSbl0UKQplHHNcSWscaEGAMc+C5YmlgeC2Q1u3cYHSsWG3sYCKXgbLA1ORK++pI6YKQQTGlM7PM3uTaE80tieOrZM7MhgfLacSmpnXijHBkpKRgHFUZguCQiBS5iswFCuiQzQfXbV5bHA+WlAlPFsVtWfeWsdEEpZayU2IwjrnQoY6xocbWxdNi4iPDMaN5VO2jUEpoM4RH7VK3DhLhYvEsAxlgbZxY/S2V8p+ZLBuT3AlvEunKwcxoxpiYN44nkKKLBlOBLcOrY8WbOld0/a008LI4H20nEpoVkkKkxiVkilCnUo6ABFOeUKpSx7R3BjNp/X9GBumT5NWCdmEkkCZ0UYJIl20NNvSPgauBEhnNENkN0X2kb1oxgbpI8VUZIiUOG2r0IlNnHLviScGwBvwUltlEMtNGWLzxkgjg/EREirmDScCwglZtejUTpFIhbRCOR1UTEErRHA7dkbdBl0jQ/OJ0iqe7nAuyMwDiWWUygRcxxizvaGyxRFZxByipsg+T9O4kQH+PEIsRmW4C0kI7ZlIiUgijeYqBiMZmESQSTb3A7bR33BksG9FZkWUW4iOaEqTYY7r5CVziTDKFCecRYcob4rytjpvjg3pbcmtyDtJtmR0ZEFEy62WTKsgFNPUihAkR6u9Mdpb6As7NqC3ILKin1ATAUpZIfImTkiUKkWXuIlEWxoHk5P6zeOXRzQsHhvSWxNccU83lnCXYpQmaaeVC5wKKxUjVW0Ng+e2muK93X7aI8N8u8Ir5sAGY5OHaImXXHDGuJAeHATunPcJfeiNcd9yy/exIb9l8RVZa35uvRecKC0F1yqFQBkPefsHIUEg9htif3fPmDzYRb7JpkThOkU/f/r72Ww6m9/Veh0Z0k8T1oFcLKasSUQEqRX3kVpwlpkUaBBMD2VP7+48WZ027/ddWcZ8RvJoQRX3aaljNs5BBCttBWbNDWSbBbyRSeO53+Y2SqmJ9uYm9+2B/jd8vXvw46Yg1ohNlHalV97JlVOEm0gVpUaD4tYL6oW1SgQikJU2Rn6pEf3uuXsDyd1eLp5M4fhw36bsSqj3RkkHVuvIJEDe+AkR0iiStKMa8OxEc9Tv7iZemrmtnsWI/rPIsHiCSDPvQXAfOE3UOEqBZqYqjDPEK4ke+HaiTHtncGdH8pGBvg2RFb2PIIPxYI2O1AlBqtP3yVQH8jOBjQwx3pip7gyW1JiwcVZOO1VcxdxeA0sr3fvkGSOSABEkKqGzTUMowfPLjffvnbkdNSZr3QdzrNUmWpNbMX5qOeGRkOA4pzaA48zqKKNUlLAwGJ9jh2jfedKg/qyNc0NvSWpFpEtmkyTSCp+RnpRzSmqVMk/VlqWE7LSxzdLMn1bN2aqH1ejQfYKkSogWJBlBeIpB0ES4EswIIZWn4I0DgfmM52OaqyfLxx+ykq06ua075Y0M2m2IrOhTZJQqLQ2PXktlkwYHhjItgg5cB7TGG2O8jj9s901eX06v4V4+o4N6e5IrIp6rxDP/BO4z2KXQ1EK2UmL+nwYd8KT/Wbzou2/ydlE9Wt1lAvPxYv8sMiytgiRBRE2MJ5JozXgQTIJKXnshmQx4DvUsuQO7b3L3aLwO9ZalV/Q/Oq688kBUtuHzv3n3J5Frbk3wYNDiaY78Or6FA3M3H3FyWOvyK3JaxbhnhoDjPIAS+Tl4pZjgeR1o7GHSGP1nEtbYFsG5xHigygxJArLG0FqpEFNyUmtCuafeUoX5k03XgqgRUVn9Ga+lc5SMirmQnEXJtI9WUs9NoiqK5GOILgThLPLZxh6cncVQHt+kOo5QuZHfT6eLteNtvAbM6QIr5sJo7WhwjORtWlijGREk45uIqDQVfij2OuvVqQ3E9UmCKtbQrQodMQ+Buei81UCSU9pFaxmPXuF+3RjPNZKVdk3T/MfZ9HZ8fQZPFVcxB4CLqF0Q0XCeTeikKdUpRc24MyEC9ntvjO0aZwvuJ2u8VvXRcir2H6QqGBkgCqK9iz5SIYiAAMSIDHTM3WrsKSxxnx8ml4vlmYC47Bb5qWpVNr3evvqDu6y68K2fjg7nZ5BgaQUYSkM2t40UPgPeU2GJI5RxqZWh0WH9usbewpLyrTl/k0v4WB2bmV4v3KTy/I51MZxXmEUveqSBguaeS0GtyU9c1cqe6Ri95BHtnMbroqS/603lsk4+xLfXI14Q55HigTpJPgbLPKHSUGIcJZ5BNpdkZFTAULwzHa6EnYV+jpnDP08Xo14MZxNkaT1wnWTkkXMlE9NSVq55JWIMLjnrONZOaswZdpYDajSNH2e3Y6YMrQuwqA+IpYlQrVgS3APo6ASxQrLEtfYRT6429gCVskOeTt/60Uhdm6fIqlhzAISlMTNfKrOVk6zmDsBYwanz2mHljeYx1lK+X3mmPn69ybe4vRoduluRWbnWLyOCBuZBeA1SgnMmMRUNpyIpgpGpxnt3Kat774yN2It/qryKnZekppZJBtGLBIF4CcqyEKgHkhRFdDdFNy+5397NplVP2dWz0QG5iWiK3QY4GM4ztpUMjAPXnCqbfFBW8Yxl9DM23pFLZOhRv81lPc5HV0aH4tOEVe6LJBhAoKA099YyIFCVw7BGxMiAYeZtq/b046l6M5lBVbhkAvNxw7sVmRV9gZSzvGNLkElmo1py7gQxhHFhuPcSz1o0RnnJpft4xqrA3upk5HQ2cpi3IrSilaKiNZwFkqFuaSBBkpCpo/fUGR0Mekca+7xLwno8Ze8h3M7mky+A23qxR8yxwivhnlLruQDGJJXJJEZN8N4GH3gEFi3u74339/pTtxq02rDGjfY2RFa0YYIFHoTkTjrhFKOkcpaQZA2lSTrc2xtjvJSjsTVhD5+N1yvYgsTK9aR5solYTVMEBV5X9XZ55qNEGx/x/Nw5ueijZ2OuAdCKzIreb2ejoUGnFJiRgttIWXXkv8rwDVJ7RHlTG333rnR5ezFZPV4//NnNF++WX/HqarLIO9LTK6NDe6uyK6I+KUMSi04YpVk2XQi1QVfH+0PKsMfsxJaslyczV83Rz5Prf8DKNXz/dHRYb0FixRoWWscoGCMA2W7hIv9jkiMhg91SIjBC1Bjhu0/YlOarevjT4upy9XT1+vhw3pbcyr0DkrTSguU+QnWiNHJOBU0MAvcSO961ZasfmrVxI70NmRUrlIImTkaXqGPKG6It44mxyrsoqcBsw+Yo3x3IPjRj7+eLcQO9JbEVMwFAySgMMZwQw1gUGfU2RRqMpzQZtF8aY3136tFqpr7/kt+8ueOv19VsoAtmg/bWBFfuXMqiFTqAjimS5L2KQaeoBSVKkYSdS1uKGT2ctk2/wU8v0wJmq2d5/OXoE5iPD+ktiKyIcelp1ewoGumd8z54HfN+rqoiAkpqxHirXpetCXsFKb+4nIs8fn5/FfAbH8RPl1g5f1FxypSsymEAjybwKveFGZWkdOhXbJmH7pyvuz1pPWEj3MbbkFkx9l9t3gZssBnqMhqmRPRKB0md9NERRHl3KB+vsdKGzIrxfyGdrNIUXWImhKi9BJ9iUJbn/yRW+Wo1Mro1Y79er+Yhv/P2Kr8CcXWHddvB0aG9VdmVc9O9siYSSojhjASWrI2Be+UiN5Hi3t54b9999nzPzP0Ii/UxsI9wdXOZ52T+ZjIb4e7ejtSKNeyypZLAVjXsSLbNBbPOZLsmg15pkBYzXxrv77sPFOyfs81kvXOLz6++vof8uMq5nobqwugg37b4iiczhBWBhmi05lx74qPPe32ygksvncIM9XN6YpaTV7kU3sN85SueXP9jdHBvQWLFDC+TgKuqSCln0qsoIlcZ8JFpp0FwrFB6hvjRg/mq5mM1arUfLd9UldKE6xG2WG9NcMXKo0KYlO2X5K0nRCRuQUjpmSNVVy8VEO8N8S521xxZTduv15df10P9BuG2+vhyJkcH7iOlVLZNPCgtolURSJWwGDKaIQmrVMjWCnZXb4zkUrrG6s9yWt5M5jduET6P0L1yjIiKJ0BlcNazEJI2VNj8IpWGRJqS0EYBRjobY3h3K6mHEzTeg3DNhFPsQaQC9dIw5wxxREoiScwGtKfGg8b65UfgtpRSsfoz5tyqpuIpdmURzitZNToEnkHsSHREGJMpX+XtiBqx2xC7u8s83QfVsuBjmOU3zB8+/gkuxxigOU1YRXvYm5QsD5S6bDkErV2iQVDtBBOMUdyT24nIHJqqj/+cXHx//WUym15fjZHptSS1stWcpIgALkM9eCAi5X9NEpn2WaIknrhvGelLx9Jvi09v4Ka6dB2+3hU0+3p/DZF+nNSK59U8Zw4Isc4FTcDLbKIEHzWLhktp0FvXGOk7KVBpzqo8tzGD/GSBlXuPO5b/L/Dg8t6trVRWEWk4s8kbihWwmsfWd0bLStO1ee3+0g9uuUeNDuqtyq64q0vgFpijljIJQWeDncW8nStiBA0cvX6NUb8zx7PZzI3XLdiy9Ip+wxiirFwt2a4xnBJPo01BaEuAWJBoz5xrv1+neH6cuet5ms6unN+MP2Lctym7EuoTtzY6o5QGDzEAZyH6ICwoY7nGKvzNPY47UyX2ztzYk8JPFVc5f0o7ormmijsumEkJqCcSYkxVWBPzpxoz1J2ZEnUna8xBohYlVzz5YIVWMnngTkZvuDMhJcpS8IJmHos2TOPdvJ6LYXNh/Xx08D5WTMVKQYYQQ0MVx0/GECoTiGQJM4YnYAZ375bt8dUQ+aX9V9Aeb0V2xT6FVJDqqJrlUSZDhOCeMCq4SJI7K9H/0rL/pcbMjdluaVl6RWs9Cm9lSsJIYEQEybSlMv8XSKgqIyLym1rr5XSOTWWzd7NpgPl8+rg2693V0UG+LbEdqAyXiA9RMKeoUiKx/C8D5rm02eDBc5stM9Onk/bjZPH51lfX5yOHe3uSK55U5kqQbL9bBVIpZ6iqvO15CeSLVASBiG/Xmn86b0+uoDXfiuyK3vWojBCeq8CrJDDjJTdW5T+gOVEes8Gaop6X85o2D0aH6NpyKXcRFySbIcxo6rSQSSsuiZWEEOakTojWpmgV5X1m82Ck6eYNpVP0exNBHDE6WxNKGamkzvYGiV56nsAorPjTst/7zqm1bqg61rSsY8VU3IW9lCFlM5kqq0QgnoWMZaKEj0LFgPU3G9sMZYazKUEzylqyjWRTtHQ9WMuV9qBpTJFGJ2PyLnmjPLUBT7w33oHLbqjqUEqVzlw1DnsZ49sq1W3xw2x69TOkEcYfTxJW8TyP8dmwsMQHx6JReWMmQBgTVmZKx/HkWnNPXVllPpyq17fzxfRq9WS8zorTBVY8cUyqEvZUWAteskBSAKY8847SwJPDKHtjfO8U1sHpGnOQsQ2RFU/yEOOk41oBOGKtNSlD3MlghAjRIzts7tc4YDU+mLAfJr99WMw+TP5rfBv3kVIq+jlYMil4SplLnElmefCSJw5MOsiWCiK5KZLL6ccP5+jdDC5+qQonjQ/IRwmpnOuRqkQ+AsYGRmVSQTFnDHVOGqUC5nqckS3mKbpxM/gw3rKtpwmr6AUBQxXn3DDqCAVJPDU8cu+0ckGkiLg+3/78H7fTBVzBwo0Oz8cJqZifRKVIRioakoqSBKEE4Q64UiCzNY1ZqI3353J89uEUvYer6Zdqr4FXM/ePEXbFOUlWxRO+wfJETOWpliZp4njV1swGmq3nbFPj6ZjGqC5HcB/OVKY3H7/ewMfpX2aX40P0sXIqejXAKBat4ylKypQSyngVqHDK0ygEejUao3ln84qds/QRflt8nL6eRnh1OQ0jtKBPEFWxTiDQEEVk2X424PNOLYy2wSodtbGSof3cGNP1XaurifoJXMyjjw/RRwuqmPUspdBAQlCc2ZC3aSDSWiOYolQDQ39d4+hKnY1nja9NsGD9dMQRxFaEVty3I1carLEib9YmMc0i9YEb0MJzwrBucWOc13FR7Z6yUUcSWxJb0XdtLbFgqbHBaMOk9dqKJFLyVcOPhFg/S8R8M2lvZu6fb9ZVMpaD/QLXt+PDeQsiK9stQG3ywlEFnCkfU0pBMQhCJ2IEYrwxxuv4tHZN2KYSzCgDNS1JrVzvkiqlDGNESwDtUzbYq843QJgBAngu8SyRyM2cVXnFP8Ji3R1uhK7uk4RVrJ6jmQopOWkgSpcsTzRAWLYVyXu64YjrczLP/Ho1yrIswINOAqPDdztCK1oqgVESZFWykgon82PuGFWa5Wc0OMT5mXG+eGRZVlM3xgBPO0Ir1oXiIMA5EvIenmEtgwyeC6d1fpD/YuyyMc7LlY32TtnGtBwlzNuQWTFC76zzWgsDQjGWsv1NiVSSSM+IUDohypta43VykDczVk3HXcO6cTa6PllexawqXu3gOnIhmOCpqn7DQxBGac2FpJhV1XgPr5P4tpmtd7PJ9WI16v2NX85/nszHB/P2BFfMULEkg9wIRYUOjAkGTBMppNEqEW5xN2+Kd1HDH/aLm1x//1vejOaTEQaAjpBQ8fSvJQ6IDNaE6IRMwgRNYiRW2yQDwVPtje2RGplw1fyMvVPl0XIqojkZ6qjULEmgQUZKVarOkFnGaKLoK2mMZra926z+VG8eYSXJA9Iod011JkniiXRMZftYK2GczqCEKEzEKExjZPJtYT2ci7FWa6onlGKeE7FVe3ZiKXMuBMIcC0CVZ5Zy7xxWA2lsD2x7lH521xe3+bv85K7jZb7R1vPxJvGdIKlyfRtDNPU2VBh2GcoCjAnKMhKVFgIR3RjR21rwwDyNOV3vJFkVo4JUiqp9adCJE66Jot4LT3XlhIjKoeehMaq3A1zbM/Xu883mnq+nVzfT/GD1dHygPkFU5dOLnmgOJAVLJNVCU8UCJY7wbDSDxp4BjTGt60/U+p5Vq4fVw/HB+jRpFavaSKsEq44tahejktkcyVRQK6WTVh67YTRGtt527x+eq9cufIbVv1UP2fyG1Qtj5YrnEGGRWWbTm0dJlhlMYA1N1gjKeWSRSS/wpFjj3f2ICbx08/lYt/cTxVXMXUopWpdIcCmo5IjX0TmbbRcpOGHMILYbYvtJ+LbRZI2YcLYnuKI9ky30GELezBkXQpjArZZEEw1CGYc1VZvjfTsaVmPaptfzhdvkLYwP6KdLrFjnzDHONFMuqpRpaOI0UU9TcFJJpS1moza22E+drxFv6q3Krlgr20QalVJAEydEW08V1TGbNVW/XkqwP1LjfX37+NPhmXvz9dpdTcIvsPg8jWPd3FsSW/FcJA/O6ZSoi0EZKk2IGe9WRSqM5Yj15jt880n7/rcAN8vbvIe0vvvdtdGhvn0BFm14b03mrJpzbarHwYmofaBCJJryexH/Tf0x25n1h6dv1Jv8yfIq15EPngADMEFwQpnXylipDUt5s2cW6zs0tmROm60RW+8tSq54Ht5w4ZQGzSyl4GzUkEI25pnhgQWNFec78EE+nLfxJnK1J7hyTDVBtl9UdEkkxvPG7hJ3Gf9CMBsSnlzowAf5bjbNgy2+jtSCaUFiJYRnYmqIljRYSqz2UuX93SUrpfeC+4CnGTrwQT6erxFbMa3Kroh6xZPRSkCwMkUrNOMqekOYI6AMxwrJjVHfIF1vfc97Z8Lm4XT215m7uRlhtmPb4ivb8J7FwCIDL4hM2jueEhU6BkIj14j9ptin5NChggezt6p+/Xp6HSfL2ywD45tAyvaLb+fvZpMvedruLo1uZXQr3OK6yQYSEyrKGARxwsm8aGTwLDmfqUBCX37zdXPo4MIpUztd5C8Hccwrp1vxFmtYMKcs6GRVVRVUqghUJsudVyb5YHDtNF8729JqcXJv/eUkjHnhdCjbcgYcuOg0M9lkc5JrZiXNSqjK9pQCIlpqzVdNAzu70cz+52Q+8ZPLJQUd77rpVLpFW00kDkToqrmXY45CXi/MsijBcao4xp27Xzk15vSXaZykyQjpf8fSLeoc5YgxlAfjqOHEMJOIolZBYNFIiyfZm64c2yDhZnsWVxEr9Ao8WTDdCLW0TgSJRliSuGVKaM0zvwlOSxGS1C4l1DCN10mDgG79KR29F6ArsRbXSiCJOa5VjEY5JgILgRmlsyXmE5F4cq3xWjnBs7N3UkfO+juRabEyBTNSpUiicJTRzFZSdCFxLjLvt4ai5dWcszQotlBvSn+9vvz6w2x69fp2Nss325DWkS6Z7gVcrFbkbeb6zJhslwXDnKXJeSGCThICB1w/jbVM67OLXrLOpFqsoK8gsxfqsinGlONUR9CcJq+NJkTjSumUu2wSmJDlt8pdmoi1eIJPOWcTaGotMS5GCRZEyixfcK6lxDMeza0ycp5ZHT3V71CyxTo1LFWtQAUDH0Q0BsBpMEx6pZgODmP9XdphhWkdO9/vRqrFKKUlUYeY+b0XISoSvIaQlLBZv3CSsL5qc93S4Bhc3UlFzv9YyXQv4mINHSAqSRVs0sYGbvISYoQqGqw2Jjg8odVY25xhfpH3dyjXYp16GqlIxDEXbVTguEkyaCqrnBihDZ7fbbpaZINUwdWfn+DyZoQpLscLqphX7EE54lR1LpeFYAnTyft8SUvOlMDTi03xrBtM04fp7SzAz9NQNX759HL+9To8ujQ6jLcrvGKsEKylIQjKEkTGKfc8CuUDIcka4xH3TXH/RFi1p+717XwxvXp0bbxVGc4lxmI0QwTBvI/OCEjUSi6VkDFl6986FTmy6O7WwnLGrt3lqnx7HLc2OJcYi2zYxgBM2Ax7qbiV0RGrCRVEURIYw97YjddCAy/hnkn88HW+gCs0j84ry2IMz3LvMkMgICPhyiiVCJHJccsdC5rgqmi4KkStM9mfb9ZPR4f0xvIp7ukyJBa9ohJstmecYhGSDlJwDdEErIPf2GdTq8rM3ex8gMUijz0fHYqPllNxL6aKEc+MIzq4EJQyJvFQ9dHWzkHEvbixhVLrKMzl7cVkdf/1w6qrWH7lw+LW+/ymx09X7xkd4M8pynJlEYhcQFRpWRch8kCyIc+ZAu3yqkCrvXEMqxb1OjSR+WH++O1VHns6G/fKOL9Ai13dvPGBWOqzpiDcemKZIRqIJCbR/P+4Pr6JzsgP/3I9WYx7ZZxTlEWvJ1BOvExWKEGTC8IABKkFU0kmRTEC0HhN1Eo2fjKR972Hwz/ym+ebGR35qjirMIvZp4RLbZUTSVCeKKdJOBdAeq2NUh5tqabromZW8ZO5XI2dP5I3tjSB+O4yT8PuqyNdJB1KtuhfEi6GyLSL1kjPIxgNFqyi3nEfI3ahO0/8bD2XX/JnN3f+9fr1Zwj/eDt/2C3TXb+Cas5GtzzOJcZiXWhuvEmGGgFCAQuahcwvvDUuJUEcVio4J9NYTeL6C7xMC5hV85NvhV13mzKNpqIs9mv0jFEfFE9c+ciZyctD+6oGbpJBAHpsG6+JWn71HRP56/XLGB/M4MfpmJfDeaRYzjRiCUImE8Ay4Q5ZUyTBiTQ86VilWeBKaLoS6sRJ38N1hNndXfM7918ZaXL12eRYXA08UGUtD1IaH0nMllKojt4E4FRKglUEmjPtOlUgC9OYX17uax+nv8S7J5tXP/5zcvH99ZfJbHpdOeBHt0Y6lm5p5UQtZayK0yROLGGEMw1a5bVEuLVOYE2BxvG+OqZx06mtnjx40+gWTDdCLZ7ucUblJRKNtsRoI41gLLGkdRUhp1g3sPE6qdU08W4Cqz3t0w9raH56M3P/XE7hL+5mdGuhPcEV80BcosKAEDT/zyiuNbfceKDJJVDYbbIx3nWdM7d7pu1HWJ1DX9Xcmr+axq+vp3F8R3rOIsPSKgAdkgMqOASWjaIoFFGCK6WlokoBnlFutgr+PDbACvriuw9fr9L0+usqoHxdOX+q1hLTS6iuXGXgbv4eKFzMQHCjhdWZz2ai64AopTwLQlsWlEcoIhRLUOS6BMWXNzeXk+AO+x1jSopwrYLiEHlShgsiOKHEUIBIMP8NYVjeEclDGF4vZi4s5p8+wOzLJEDW3XNY1Dxrq4FG4ER4FZ2QUmsFnuT/Gakci2IouQIckXgmn8KL777/LcDN4T2PKcmtzbYfiVKC1iTIQLgJTjCuMzsaCNJwzzsf0j5+nk3/6fKdDiAtUc901MxFLhNxOvFIjWQWqKI+ojcWkXYgsJC162KWP3IYaxqkEdwnr6nmVAGTzBinPCfWeSnRkkOsHeS2v0yvp5fTi08b/8tLP19adO9m0wDzeR6u1rFibWgM2mZdyhO3gfkQjKXV8RqmOHfoZkEoHjzjvg3FNQSrfXB9qSavMCmD0GgXheYsukglT1kNa0l1gCCxmxqCsTEYf5jOrtxi0RyMIGxIwQFJKcngo+MGnHRMBmEoiZjmhWAse/0KSrqWalaCSmMUM855cIoRlk1FyZn2XkmlhlJBnyEAzwRAu8vft0yCfTOZ37hF+FzdsHp+gBoz57JZGLKNKDNr0TolzRN4F50SPGD8A4F4UC2/m8+eQO/DYnpzUynm5Qt1fc/cMxtIEpwxT6lxMvJsINpsMJpgJaplBGMZjHZXMG7nrnj//EAxIyGU8EZSqp0ThIoYnM/PBBGWAgwlHIKQPBMkpTkCko+2y39V8ORZZmlyCfO/RbipMnGuwyQ/+eMCwuc/XrmbP1zFPyz+Obmo7s1X9/71hdo+fLz8jXeJPJXdAL8tPr3ZjPi16koA90/XCKTre29KNP48uf5HJUOe8fLf/76Aq5vLLNj8zSazf//Xjm+UR8hCCNXdrher/gbv4QJ+W6Gh8q1eVT/7bb7p+loe+LObf17eJK8t5Q1zlBMDoiqDraROMjorSRSgpaikVCH4/D+Y7frB779/+eaX7+v83NUu88ff/fe///53/+P/+f3v5rDID37/uwykS/j97/7f//F//5//K//5n9/9n9//7g//6/e/+5//33f59X//1+//+N0OQU1emKeiijI5opNIklMepAUVPXNCVKmGklR55/+qrPLzi0rvxUZehvEKeiIvH7XOtq8nILhNNLH8r+U0xkiBsCoTbakc8lDTzRqf/y2zvvXKE3+4WR4/WxUtffLTlvtA3ojyTW/W2dGrbePhcbRfX+jtvtT196K7R/MHQ67uSh996eWXMctvk6cmXOZ96O6zSgoTjPTWAizjE2o7IbD+F3r9aOQ1SqqDfMfuto8H3KG2qpNRLQ2+rUEoX6I7I/LV13du8XlZILKarZbut6Ut3Av2ILb5x/ks/LEaevNDK322vLiVnrnCqG1PxtNdoOoSpwdg6pQMCNMHMDX3ML0zHc6O1Ue5RzvusTqXu/qzxf/GhFVnImL1AVbt0iiv2sG9vZ4vXB5rFVM/C1jJi/8eINxEhttkUV1esZDMBHzMdp6MSgRGuLaaSx6IMCmxGENMy+3ySZp//e/49vHdHoCRLTnqCQLeN/QuWNoz3AbWVyrp2urH6O2qAw+3s+rx+uHPbr54t/yKV1eTRR7+6ZXqiy/PFm2Xxd8zZPXhyoKu4qyVfl9cXa6eboo8reSgts+C1xtue6jKOa+2TwDWG+r9fLE9WpVQec7qupMX4k9dVCmdvJCt/ZLdNR8nL9Sfzl0/b/JC/6nT8mMVu/rX/f8Kme7ORkODTikwIzPrijSTLkiG0hCkxoBDM4day/vVyLxzrcqu6EbWOkbBGAEQgnCR/zHJkaytiaVEYCWNpqhvTaWODPGtya2IdpOklRYs9xFMyC9yTgVNDAL3kmDl4sZob8PiGxvS25BZ8Sw/aOJkdIk6prwh2jKeGDPBe0kFw0zvxihviYyMDegtiQ17+vS0ampTqjwy/GNPn4GsCezp0/YJSezpM6T1gT19eqYzsKfPt18T2NOnxVWBPX2Gsi6wp8+5FknHPX0KuSXeUYq5JZiu14eclAJMA+WYrvdwFxMPYTrL+/YyM7h6ubukvcYHCMcEWCklAhZz9s6cswdL6mcrxzqxhEAUUmnHorEMiJMKc/bq5Oxlpf/fO6p3P4yBbPUGqszHD9PbWYCfp8EtprNHuFjHVHZzjYfj3Z2VWTbfWj3LduT3d99tnaxXSjHZGukVpPzi0qzNI+X3V2du7lL1SvHMnQPdfaf1SPNNnt4JQz38eeJQBs3WUL9eryz2jTcR4mr+/zpzNzerbMkq907tXpd7hvwRqrJIf8/T93Fz2ujNZDbfpNnp7ZYghwbbjFIZkK++vof8ePKl+nB1YZNY12RSl6NW8/ke5ivULc9IrY4j1cDtg4Eq5N4RhtWbXq/OTVXj2T+dr6NixvK5G9TlWyw3jPM0/cqjs3oJilQGZz0LIWlDhc0vUmlIpCkJbRSgK6KpK6LZ+ZCReROaH57Z20pFesqpDTGbsM55H7yOwXglPBdK6qHgVnSXjnK65h4ZmFuQWDGgKKwINANca861Jz56RkKygksvnRpKPcN+InyPGYMIbyoxbNTeWfF1bNTeVmDwWzRqF9JJHUxyiZkQovYSfIpBWZ7/w9ZwjddCq1R9ZAugVdkVy+RGRxLk3V944oIUzDqTjXnOiNIgLR6Pa4z6lh1AYwN+y+IrYZ9Tr6yJhBJiMuADS9bGwL1ykZtIMcm8sX3fjid1ZJBvSWobN6MoVG47WD+qq1pucmdpszrf8eTqbpobMDxJHr20+V8HijkaBXiuYrIUq7thdbfzVncze6q78T/M1hL7491v/U83Wwa/572t8raM7u51oRGrJDfE0mXdZ8IcC0CVZ5Zy7xyeQ2+qYuV2KHWbGW89H2+k4wRJFTOHU4rWJRJcCipvj17HjONAiRScMIZugsZGY60k8Mf33L3njQzg7QlubTpWSSh7Tcfaykl2ZEJWw+8xCmp+15NNScdDEIEQHZIOzruoAQILxDrqs8L3aEqiKXk+U7KKa5xdXsLUWWW9Eh3RnhEHVpOqImFV8ohFLVViuuo8ovhSdKIDjru/XvkD0RH6t7u39ESAMhvt2gKN2kiRbCXLzJi9d5xYr6riC0sDSTWgMZVMsm7rLYnhJRKDxbTaNvmwmNZxFl8XxbQsBwEuwztQCI7LIIPnwmV1JEP+O5ScgG9dTOtOzXzM++GnH9Zw+/QjLLbjeH+ZXY4P6W3IrBj3DIySIH0Qlgon82PuGFWa5Wc0wx5R3hTlOwN3h2dsOVa1S40S5q0IbUPfSUP6vsMo64q8y1q0Yv83PZ262+Q5j+ASYTwTqqAEj95k7h45tUohdUfqjtQdqfsgqXvl6K1N3d98vXZXk/Dqchr+0d8oZHWKd/nTSo3rGv28zvzYtbB26PuerBC9kdFJEZkgkmvHjMiqscqJsBaqyjioEFEhokJEhThIhShq+LJ73mxxowBlTRb49OeIjhRe28uwpoKTShhpuDA6ukho8EIDNTZv4kmzYAQqOFRwZ1dwOzeDkrzeTGZ54U9nXx8KbZlyV3kndzipGg72b1mm22Knu8S+OdHTwi0frUojIiUgeQiaB9BW2qikys9ZIiLF+oSFyL9VUHh9O19MrzZOs/4SFirLVaFC3qiwKtSkD9X2Kpzeldv74wbtf6y8s3/cAG0jgKru0q4qfH989/lm70fHVe8sSGI4Irs3/XQbBSEeb6+j7bObMQxYC3WCNfvOXLOPZMNbKCBaZWtAZeYCnOYLWjoZLF9lm2PNvoM1+8iyZt/OcP6efe7NzP3zUbT1F7i+vavWVzbj94+0SU/YlGSrfr3c2U5pz2AVffoRFusqbPO7Wn3N4sjXS5lV8eNXFY8Ks/zR+2J9rcSkV2VlWknjWFXpkztRvmeoKqq/ynWaPyhYV9Xn210Ab88w72aT68U2SXg5/3kyX9xV5quThF9AxpKH/OJuNszyyWJuMF4FjOVwsPg8jfNX05i/doRVrb56zXKtJRYsNTYYbZi0XluRREpei2iTxqyYg3fayoppYc8ZW05MCyIrZn5JoDZ54agCzpSPKaWgGAShEzECMd4Y4+1ow7HBvB2plTN5RdQuiGg495YmTalOKWrGXdUkdyh5693Vr5O7q/I8usn76XRtMoz46O2xciq2BJVUKWUYI1oCaJ+k0FXtXCDMAAExEDR3eJT8JOIxNkifJKxiW0/NVEjJSQNRumR5ogECzUTfZwvFYCb6mTPR95DhkeG7HaHhiYv+4hxPXLR54gLPz3WHczw/1xzm5z4/B1pXuzYjAbSwRjMiSPKRiKg0FR4GgvIOuWUNYd1zphGXvTleUCU8K2ed11oYEIqxlPkkJVJJIn1GttLYPLwxnk+N14wN1qfKq9gGnFcWiY5cCCZ4Mj7EqnSRUVpzIelQerV8w6JlR4cRRwbz9gRX7E3kjEqcRKMtMdpII/KezpLOKyAQirX8T8f70WHuseP9aMFhUcplqkuP8I5FKc9blLLgM3eJVqa6oPl/1akUzS03HmhyCVRSA8F7h10rzpF2NDLon0WG5UwWKTSQEBRnNkjKgEhrs62jKNXAHK6Cprt+K5nwI4N9W8cHGpVvOHzYq6vTrPXKNxz6viefbgXJRHSZ63ilPI/cCmJ4yP9XNXYiFPB0K55uxfINPSzfsC7cNt1ssPtOt4qHG8jyZ/T4bOuh01NOK4enp3pxtpUUzrYuv9HdyVZZ/2Tr+oMjOxPowCCqJ/0511pWRyvDdPn1Pj3cVsd7ptVBFIhfPNN65jOtIlHhBA3CS7BMWC+oVNFkzkKFp4HimdY6Z1rtsmNBnazk1Rb3MsbKUs028Gx69TOkxeYwq6gTeF6N8cPktw+L2YfJf8GdUVAnnLf68LsZXPxSGcwbT36DL58/e+Nm8OFBW/vVYdUG9/+P22nmDrBwm7weWecEzuqz7+Fq+qW6MbyauX/A/O5Q6s6DDjuHyIL7+PUGPk7XZ1qrw6iyjutk9fGPmTl9nFY+wWXlx83x093JMIURfsr0aHJ9seIrtc6EJg/WcqU9aBpTpNHJmLxL3ihPbUBfe+PMmJMW7ci8i6cJq5gjQIyTjmsF4Ii11iSmvJPBCBGiV9j9uSmuj1QkIwP0kVIq9jFnyaTgKWUucSaZ5cFLnjgwmSmpxzhQYyQfZdWMDchHCalYfSImwowhYGxgVCYVFHPGUOekUSpIxPH5LI0dFvbI8HyasIoWNBiqOOeGUUcoSOKp4ZH7ygseljUuEdfn2p8fsL6R4fk4IRWzyKkUyUhFQ1JRkiCUINwBVwpktqYxi7zx/nyKB2JkcD5JVsWTP8HyREzl5ZAmaeKy3WyUDTRbz9mmxvOajVF9rFNsbIg+Vk54LrPDTHA8l1kXzmc5lynBKBat4ylKypQSyngVqHDK0ygEeuka4/mEmMPYEH2CqEqYJkBDFJFlPmjAZ8tDGG2DVTpqYyVDPtjOHl0nCjY2RB8tqE1+tqiZn30gXbGz7Oyd6cjNvu3JudlMKqKIjMkI4ZWPOtrIM9ewmWkk7xjmZmNuNuZmP+PcbP63uK6fk4nabVjczvrfJ672Tn7gx/VsJy9+29O7hmvjBRiug4ekMyeh3AiWgjDRhSQo7uS4k+NO3s+dvGJzB3dy9jd/X8+yt3v4MpF1H7vUwnkluUnLErLSkeiyWEyMjAgrIta3bzmK/qAA6sPHP8HlTXUGZmwM8yRhYZ3kvp52/xHrJLdaJ3mVcm1q2uB71VJX1ne1rGtY33u+58l2t5a0qmQkaQIvmQFPXMgqzXMWAwmJo92Ndjfa3T21u+v0bqZ/u/vlvbW6N54TWbdGyZ4fJbvas+tVJtn5LU/esY1lVhtGWJVSwxMLFrxVCQI4R6VRuGPjjo07dg937Ops5K+HupPtEN2bySzvn9PZ14fyWzoqKlK2wzZvONi/ZfFuzwDdhdjl8ezdh3yb3vKh6KQRkRKQPATNA2grbVRS5ecskWUS91I30D3Kjv3hZqmQ/jhfJY1Pg8s3662u4+VSATEpBlgqoD+lLkoN1z48RNzjZ6OtdRFTWGX2IoC/UQWiO+xW6vW+AtFq7BHCUWDpoAmWXjlz6RUTiYpOau9MSIY6EgmR0XslvIiKA5Ze2XcbWF9ZO133dVjaqXI3pmX++KMXNhVYdvuUdw5VEZTVd5zOnoxV/XhdioA8Hus9hNvZfPIFSt+vSrTf3ZF7t3Wx9KVX3/LJSPxxuZHSZhhB42aIxmW/t9f9AK68EAjgXhiXnBaKVo7T1gTCKUF0oq15ZltTJi4oFZZ7qrnSUjjiGYvcRwjKE4+2Zh1bcyndJ0ZdoanKY4X8cv71OuwwOmtVfuPBAg9CciedcIpRQpKiJFlDaZIOeyI2zrg53ZIaW7pNG7bnCuSyELU97J3vLNGG7w0qHfqSp8dsI/UqGiGEz0ueeBqSZsoEGYjz3BiM2WLM9rnHbPfnsd0tr14JzjrDnSdRkQRRB66jZSYEz0m1WN2aW4t9ue17f1TP4o20lNEepaaWSQbRiwSBeAnKshBo5jLZIGFohzS0Q/jO0lDrm7ybTf+eR9+Q45EZHE1Es7YsRCmLt7AAuzIp2t3zatoS0YKRkQTCLScgNbNJR8VDVQWPW8B+VGhLnN+WwCSm45KY7CFrYqVOVhOfv0acVO/srXHBDjhEbaAYfO9PvEmWpmELc5/uHo032uSotghf9Od3tFs6mgzCrQ/BTfsgcW6Yu96OsJIPKTGaJLNeR84Y1ZHxEKkEoYkMDsNKdcJKahlW0o0U7dXV9Hr76g/ucg53TzcJTaZEomsOnAlKVYKsMnLdpELMg3ssRVSKDNS7x9KDDvHt9aPBq4wnU8rIajT4n6eLrfGrtlV65yn5RuN/nN0+Fvz+llaHTKcfZ9Pbm1VLq4PJWeAE57j992H7rzbHA7ktf9ya89FoCWLBM+mtijpJR5wRCjiJBHhQ0drnn3zAOkk+WPmLyHaqayH94MkmU5H//HRph2+/+Hb+bjb5kr/GEw1CyTaA2rzndJElAvGJTqGkQaJF07ve+stJeKJpKNlWNW3d8j8n84mfXC69Llvqx26rnwb3/AUWn6ex3kxWKslu2wKt3GvXDFYNGe0JsNl7t6czp5Yzt20+nXyvirJWzete385meR1upvf+vlXLR9v6bfcgxZw4e3mW8q7yxE24Byt2KdJtD3dLt9u54MmJwizc8Cli6Gp/2VY5LdzuIGhotc/YM9x5D24or5deZg0jggbmQXgNUoJzVQ/GaDgVSREM6zYN657sOB1ZrLcFR/OqlCqvEwA+GDPprJIqPRwPPvBlTy+k6gxhMhmeIlMkZbtcWjDaGplIYBAwPIzhYUw1e56pZqu9o7fR4CzhcoAjsYDnYx7qavHQw3VnY1YvdxgUPqm70NA8XiX0GkoRvRgNPrOD1TnK9bJLorOWcsli4jR4ConHZGV89g7W7k53qQY+ls09dyvRhye7Crw7pWhdtrNdCirbll5H5/JMkqrEKmNmILybd8a725vAkRHw9gRXDlomIhSWK3uOJt0rN4exm3SJOMxPRZPu7CZdSsKGlCixknnrNVdE8Sir894yKU/RpKtfHKpVk251FKDpeOuw8K4hK0E82UwOD7mKHu4akB33HTeBpV1D8hqWLKHKVwiVlAQO1tAMVUE5jywy6VcV9QZgyXYYQToJt6OzX08VVwnbyTHONFMuqkQVy+w6UU9TcFJJpW0YCLZFZ9hudQ8dGdBblV2x3bvLkLcmE7YgteI+UgvOMlOV6xVMo2+i8Y5+NMkaGcRPY6N7fW2ghRNSRcchMXAhP2IZ0sxr5W1CPDfD85/HhsrqcPCm3uvLi4sZXOQvUYYcq+xgxyQI4gmz2WAA7ogklnAIVgylahdC7lyQy7r+48x9gdl85VU5UCKOxBAyBWNcCGECt1oSTTQIZZxDBtY4lnCqpTU6xd2CxIoIZ8ETYAAmCE5opbiNldqwFJRhdijtdGV3CG/P8TQ2pLcnuWUmF6uCQNfrV5n1SWjrNeMcfALNCFguqAoSiOZD8Td0uJM3dw49nK1vkpZdBQvuIdE5uD+1I68DwWAmV2cLMJzWi3Iv7a2TIYaFd8TpNHNe2wghUQOKGJc8SU4xnSJ1alXbHeN0h+J0yx+jGhyEXN/zzddrdzUJDyG4idI9OU/SDMmrn34g5KVNpFEpBTRxQrK+porqSILjXlmKh6aaq+mWIDA2W7QlsRWpl7fGuqQ516Z6HJyI2gcqRKIpvxex3hDrJ29QIwP5yfIqodvFYIiWNORt22ovlXDKJSul94L7wAeC7l4HePcnoIwM6a3KrrinywR5T1fRJZEYZym4xJ0GLQSzIamBoL7XDuPHMzc6rLcgsRLCQWtHg2MkZFBboxkRJPlIRFSaCo9WyzlSGHYf/RsZsE87I7kPzyERkgS4DGetVIgpOak1odxTb6kaip3SHZ5Fqezi+ibf0AfcCygfJaNG/RhWc9LXfgzb3+7kghsQOeVWORtsptIpZbXEVfBWgYqBRezthAU3sOBGLwtuSLqn4Ab9Q/7eaXJxu3rpyW/rWd0NVuzxZClx2hJqrE152XlPPDEA3oCX2qqhJEp2aGXsnNbXDxHz+Nn4bIzmEirZyTEKb2VKwkhgVf4605bK/F8gIUkrEcGnRmYeq4t3+VtVW3/m5gHm8+lsmZ795OroYN2W2IpYt5ZYsHm3DkYbJq3XVmSLKXktok1DSYrrEOs7hXU3aR+zQv/0wxptn97M3D/z226v8hjLwX6B69vx4bwFkZUwnrdxapMXjirgTPmYUgqKQRA6ESMQ440xXm7Htn/CYB1P2xj644J5O1IrId1rpkLl1jMQpcvcLdEAgQKnPmPfoIevMdJ3tg/ZM2f59WW6UqWCX1UcLszyR+fjA3orQisexuMgwDkSMraD4zLIzLWF0zo/yH8xxbkxzrcbQ5SnbLG9Nf1ldjk+mLchsxLKlbPOay0MCMVYIiAokUoS6TMrVXoo5/++dVn1PTNWTce7y9uLVcuqyqs4OoSfLK/i6VZe7eA6ciGY4Mn4EHkIwiituZCr0qeI7lOOqZRm691s8rSiw8v5z5P5+GDenuCKLDQwSoL0QVgq3LLQkWNUaZaf0WzEIN7Pa5vf6d/lWJW5OUqjpRWhFbNMJFVKGcaIlgDaJyk0lcEBYQayDYM4b2q1lN3Aj6esirPmaVtr4PFxz9OEVSzj5cFarrQHTWOKNDoZk3fJG+WpDZjvehZcLwP5n17GWIXfrxdVe6yfIY3PRjlNWMVCXcQ46bhWAI5Ya6vOXd7JYIQI0SuCuG6Ia1GHNa2m6ofJbx8Wsw+T/xphXuBxUirH7VO2MQwBY7OtLZMKijljqHPSKBUwbn/GHfrdDG7cDD5Mb2cBRhneOU1YRcsDDFWcc8OoIxQk8dTwyL3TygWRIuK66Q5dh/Cvpuo/bqcLuIKFGx2ejxNS0eNHpUhGKhqSipIEoQThDrhSILMVgh6/xvtznYjyaorew9X0S7XXwKuZ+weMkBieIqtilCZYnoip2KE0SRPHgZllPyXpPKUYi2yM6u1TfftnKpuFH7/ewMfpGF15R8upyAbBKBat4ylKypQSyngVqHDK0ygEssHGaK7jcF3N0kf4bfFx+noa4dXlNIzQgj5BVMXmEkBDFJFl+9mAzzu1MNoGq3TUxkqG9nNjTNdJ2Hw4UT+Bi3n08SH6aEGVC5kmk0K2LZhLnElmefCSp2x3SAfGY6neM/LBTN0vfqmOg40Oy8cJqRgp1DpGwRgByJZFVXWamORIYIRYSoRFHDfEsdp91nqZlLN8vH64OSMCq0MkPy2uLldPV6+PDtqtya2IdlOdHbNguY9gQn6RcypoYhC4lwTzPxqjfWf+5cFZGzfS25DZprClLFRnOHykmXdUpEHyvYfJD33Jk2s1eGCCRk4y/UiEMMWq8q48Zu2mmNfEY60GrNVwvloNVQWVHSUH3Dx/nfkf4zT8bb6Y3YbF7QzYH26u+1dooGrYuvwVe3aaQ7+kmyIwO/eXwlc7eVdRgXIN1vqQ9xTmWNRCOx9o8M5bzth66km9qe/3zIv6M9/5xO/cVPd/s5PnnWnuuebBappCYIlwRr3QktHkbHBmNe/cFOcdfnP5C/d81tnBWX/6M7qZc3Jgzh99r5NnXHgdGCgdBHhiKFeJsmAsY8F5BXQdb+U7Vvq2bu/ZTLNSBRmaDHVUapYk0CAjpSpVXq78u2mig8mUZ50xJbY9q6s/1ZtHWFbjgDRKHJ5Kl1k88UQ6piIXWgnj8m5MIQoTB5Pb3h0y+bawHs7FDy7kf8dX1raeUNYsnO+xkHYqgE505Klksy63zsoxBid4toSFCNRqbajNHJuCjgzseiU/tYYe/fSXb6vfO59eQpU3nS8u44lZhV1duevYO70pS3pTe1+VXUvECQ9GZXrg8z+akQhBJjuUOGd3De7E04WygsoaHsuCS3dQGdku1Uw45TrbITmgeSUHppSNQhEluFJaKlrlBg4Ft8p2hNzRdbqt3Fwfvl6l6XU13tXN9DqL4wkga4GRAyOMc0tYyAoFhGGScymjtlJbAkNJUu3OxBPbefFZ5X6cucli/unDZzeDuJ6WPPwkLF8Y31Z6hIiKrcV04MInyjwkF6Rw0jkubUw8aiPYUBoXdNeQRmyHzQ6ZjWMDcFP5FHfgxBSolFxiIpEA0XmgMbEUos9QHoo50FWgfHTGgFn32fSX950EDNnJkhtgdh3XvnI33yKIPZQAbhex7uEEcLsJeIu98noE9m8LLu8ZUB+UJJRYBiwriSQiZVI5FWxYaRRV39mz9qfB+wyJX+Dj+tej26e/+hLdPr3Qruj2aez2QUsP3T49ASO6ffoE35bdPoFar7LxrSgXGcg6v+qJqhoRRxsdHUqd++7cPrLg1jhgQI4MyidICl1B6Arq0hVkm7mCiuhFpxA6hdAp1HOn0NPs2O21fpdcNf905/Z9kBHYM2eQKjmDOHeUBqK1ZNJY6SyljDhruTM6kTgUG1B+w/aLhwEzMi17hISK0WuXkcvBKc2CCUY4E4k3Arjl0TI2lBI0HSbZ7jDO382mXyZZV4y3MXlNqRTTwWmkmZc45jLBVuC4STJoKqniILQZCj3pDqlP6qX87K4vbquj9tnYvqwOI3++2dxz9ecnuMxjjQ68xwuq3FZLRO2CiIZzb2nSlOqUombZeggRhlKQo0MH0s4SbY9v8n46XfcTGe9efLSciu5QHpzL+KUuBmWozBC2nlqV9+xsXxA2EDR3tzvrbX91YdNZ3/P73wLcLG/zHtL67nfXRgfz9gVYLIfuXJDMm0yNKZUJuI4xZktFWRoii2idNMW/2elzedxm/n6+3l5/cZeT+Ojl/IXyWHn3Gu8aOI8QN2l+uw+ONyKn6NNFny76dHvu05VNfLrvl2jYhG7669gtZvlFHcA7ZwgXTHsppSfEGRk0+PxcDeVMB+vqjFyW9PZyq4makSnsY8WELl508T5/Fy9oXXVnZSSAFtZoRgRJPhIRlabCD2bb/XYu3qKr56EiHhl4jxcUOgU6rEKLToEeOwVG7xzubh2gc7iHzuGVU0w3dYrtsenRM4aeMfSM9dszVp0pOeAZ2zCgu0pyPXODFWuDZiPVMaciOBqJMnJ58FUrEWxSQeqhpCjQ7txgfDv2vgsiI9PFtWSCDi50cH1rnNZ1cP1rUx6hhiG4BXS0+tDqQ6uv51bf4cInO7aFntl9tFjkZBwKVRHUqM9Io+p6Z0mfDIA6FXUq6tR+61RZ35MyrxTd9YMLvdOtRZ9KXlzGOGqkpkyBCIYkzaQQUrCYiB9K7RvRnU9FFPwHO8AyMh3bUDroZ+kSumgWtmAWNnO0PME8modoHqJ52G/zUD3trLq9vg/VcuuZjbjpvmh4rd2r/OtwC8MtDLewfm9h3Ja3sLtq+Dc3vduseLEIUsj4YJCCJsEwofJK49YD09zl1eaGkuTaXR2Datb3Q2NkXKAsjBJbFSxvXkYLm3d4mzd9B0Qp5VkQ2rKg/EBwqYjuCJmjK2hZaev9Fa8zAC8nYTXh5VMAKSnCtQqKQ+RJGS6I4FlXGAoQSRoIEJlBHJ7JhUce4vB6MXOh4gIw+zIJlbGVbZod+Sf0MLF4AGWkEEghkEL0m0LoA16Q7V4ML2OcVG91l+srD9nDs6IYloBMzGlPg83y8EKn/MQKMERTwgeiQXlXGnQVbz0eOyPTv6cJq1gDELRwQqroOCQGLuRHzIJjXitvkxkIsClSlDNBk2Zr4O1idWLs5cXFDC7ylyhjjllDk2MSBPGE2eAkcEcyRyYcghVDoSNd+WvGB7lshXycuS8wmz9u9VAjktFg40RCgoQECUm/CYk8UBms2K3wORGQkXT97LDHO3b9LPv76gsHu35i18/zpo+21fUT+8shFE+pW7Sjv5yuUW6lsHsiyUCSgSSj5ySjZuLUZnn/uO4hiUSjvzpSItHog0ZFooFEozdYRKKBRKMfUNxFNEyDdKo9lgiSDSQbSDb6TTbUgToEmyX+bja9mMF8/srNHj5+llUewfJstEWuvKeOmKrbSWBM6fycBS0Hk13VXbWfHR0W68FmZIr2aDkV81u8VowJlpSMBIyjMtNnCoFIma/AUCg06w7NT4X1dJY+LL5eTv4L4oNr44Pz0YLaGJk1ShnUWyJoa6KtibZmz21N3dzW3Ll7PCdjcyTambIOrU3Uz+fXz+htRG9jh95Ge5whuAO8aAmiJYiWYL8tQXmgovhScK9d+AzrjWf5+G3+7e+m08veGYDF1spWRe2Zt9ZldSkstZKbEIV1zoVsGw6lx6fszv4T2+USD8FlZAq2sXyKNVATsUJHa4JXOkhQXgbHk3CUgyFqKKfnKEd771xVZTI63s1nawA+gl7NNsmWEqdtlSdmU7ZZvCeeGABvwEtt1VBODXfn4RY7FePjjqiPno1vD20uIWyMjI2RnxfIu2+MjL4jtCVa9x3VaJNTtoDRZYQuI3QZ9dtlVNUNr+ky+nka3OV6sd9pr1/93/Pm8+fp4oe8SccH6qpnvqRyn7qsLIET4VV0QkqtFXiS/2eyqFgUYSDq02JlzTPpT/viu0eW2lKBUiIbadAm6wtVK6pWVK39Vq2Hc8B3Lf3lw9WqX17onSYtpuVIp6uK/YxqiIF543gKKbJksnbl1g0lLYd119prR25zPdiMTAUfLaeSXyU/VQqocyTvjypx4ywVLhLDRH7ABhOl6QzNVTf7dvjFyODdnuAa5YjXWUJoi6ItirZov21RzWrbone94W6qzD+I+R23V6sfBv20SIuVUFSSwiRGpWSKUKeSDkCEU55Q6pIfikVqOqz5rverohrgGZniPlFamL+B+Rs9QjPmb/QbwZi/0eP8jVV5e9GIdx1UEci+kH0h++o3+1IH69vfr/fp7SxA5WJZTGfP+HhGFkegzGijBJFZo9PgtY+BKwHSGc0Gotk7PJ4hd2ulg6gZmfI+Vkx4WAMPa+BhjW+OQST7/QEtkv1+B1OR7PeY7ONhDbQlOjysUat/SQ1DGN1J6E5Cd1LP3UmkjjupZKb1zJNEi6czRsJ8qOmwbSJyn265T0h5/3NCgrZSO0UiFdIK5XRQMQWtBoLh7tj7nrSK/fNzZ6W/chejQ/OJ0ioheywZ/90hGxP+62H6HAn/3BKQiTntabDZ4vJCp/zECjBEUzKUHgYdolkdaA32MsZJ9bk8X6srD03QsUH6JGGh7zWTP3S+PifAd+98pabayL0NnlnqqPJ5ZzdBWUai0kLYgSyEDjf4baL0s7u+uM3f5ae8PV3mG209n495fz9FViVUG64EEclaBVIpZ6gKURofYr5IRRCI6oao1juNyztn5Lv8rSrH4rvZNMB8Pt1x5UFYf2Qob1V2JdQrFaiXhjlniCNSEkki4cxT40HziHt5Y7fgbmFd3l5Mrtd/xrx9NxVP8WS55skmYjVNERT4bHsQxoESoo2Pdij5kd1hV+2szry+yaN45+NnYwZ0KzIrJk4SH7ymwlrwkgWSAjDlmXeUBp6cQ5Q3RflOYd3p1o//nFx8WgUtP72+nS+mV6snowZ5CyIrYZxErjRYY0WwyiSmWaQ+cANaeE6YRow3xfhTL9jTCVsjbTNl66ejxnlLYttkFLG6GUX7o0iYTITJRJhM1O9konqVQepGinuWWFSsDDKWnAz9zUuDYFbGbnfw+bIysjlKuEsxSpO008oFnlmYVIxIZ6mhQ8F2dw7hncJ6PFf/6S5v4ePMXc/TdHaVb766MF1ugw+ujw7o7QoP49wvMMz9rPDfk4Ii9RQLkjYkbUja+k3abK2CIifuLz3jctjBAzt4nE9F7+7gQWsfqzxpraHKRZWLKrffKlfX6q3+lNK+h/n08kuW5cvZxZdHV3qnYYveUsZdSEJoz0RKRBJpNFcxGMnAJDKYOsrdncHcnXzREEEj09KtyKwYzNdEgFJWCMoUIVGqFF3iJhJtabRDQTntEOa7G1cUpuzRs/Gm0bYnODyYjAeTewryk0Ng606LtXsVN1EVSMuQliEt6zctM83TVx6v+o1snjM1sxDzOqQ0Gea4Tl4ylwjLFiwnnMWhZFlT3Z3RWkMt1YLRyNR5a3JDjvaCdphxjRwNOdo3BzxytH6CvC2OdlyeSg11gTwNeRrytH7zNK1P5GnvIT1jimZJdFFHFkS03GrJtApCMU2tCEHyoajwDsMKdVOKCwAamR5vQ2TIy5CXPQeoIy9DXjZ0kLfDy6xtgZZtKwpkZMjIkJH1m5EZfiIj26cye8bLWLFN6UhsVo42a9/VOdqsaLMOHuRtxRJkC0br7uWDpiuarmi69tx0PTKYUKu8xHMyX0dS5oV3Z75inZdnUecFgrHJQ7TESy44Y1xIDw4Cd877NJiegLI74Iuj5+7+wnjZW9viu7N0T3DP1lhlaO2itYvWbs+tXduWtbtzp+mZvVss8zIStc+6q9iJar+Xap/SNtX+jluh4kfFj4q/34q/aqR1UPHnvesii23TQS5fX3/g+9lsOpuvr/dOzdvigcb83HovOFFaCq5VCoEyHpxWICQMpZ0d7y5ddkdn2QbYGZlSP01YxX5III3gPnlNNacKmGTGOOU5sc5LmQYCbNaVv3Z0ZQpFVgm/TK+nWRfcIfGlny9mLizW7RPzcLWwCMKGFByQlJIMPjpuwEnHZBCGkjiU2IHpKhVgdFjkBSzWQiDxzCudKItBpMRJ/k+wlIQjJmguyEAQSBGA5wEg0/cAfA/ZTF84vyYEhxOhUpCMM+KTSRW1E9F5DcrKpDN1ybRlIOCTBNF3JvTxp9tfrW2PeqmIoDYKpn0iHsDqxPOux1V1GnAoKXgK971zKV62F3k1Nz/JtOQKjJRcgwdrHAEXUgRJKAc3FAgK3PzOBUH7FII/TGdXbqWD15c+ztxkUUaiiUZxGZx1AryLjEdGnCUkGC21jkMp3I9I7BKJaybcDIncCq1k8sCdjN5wZ0LK3CQFLygPbihI7DAzvp6jf3Nh/Xx83sYjxbQ5v8lrRgrr+S8xLohxQYwL9jsuqOqkvz/eqF65OTwN9/UsJihKMUHpNFPWJCKC1Ir7SC04y0wKNGQiPZTUH9VhTLCGtHbjZmwa+mhBFVv0gq4OYqroOCSW6Xd+xDKmmdfK28HkslGLzOc8sKyak71dVC9PZy8vLmZwkb9EGXPMGpockyCIJ8wGJzPbIZJYwiFYMZT4c1enJsYHOfriu0ylv8BsSa4PHjUnSeSNDbRWKsSUnNSaUO6pt1TxgYCtO0Itdh6efnyT1Z/xJuQeJaM1lTZ1z9ocVv1Io5FGI43uN402dTo6bu1QLnyG1b//G77ePVj70qY9PlZTPEbOpI6EOxDBSlsRa80NeIjgjUyaDEVTd3madmejwqPBNDIl3rL0Skaq08z7vKf6wGmixlEKlBMljDPEKzmUNKDujNTdVYb3zl1FI8Zus7YhsruDY3U74R25mtCwRcMWDdueG7bqVMP2DSR3e7l4sg30zqwtNl2QLkuFcBOpotRoUNx6Qb2wVolAxFBOOHQXMaoOJLaGpJEp+VZlV/Txj4TMdWfSIplDMtcn6COZ6zHc2yRzxLRB5vapEaRySOWQyvWbylXb/GlUbitv+JlTOm+UdGC1jkwCZCuXECGNIkk7qoENJYGlQ0pnG1tnhxE1MpV/FhkixUOK92wWAFI8pHjjgXur8TrVBsU7pE6Q6iHVQ6rXb6pXq0N6s02mZ8yuWNp5JIqdku6S0FC1f0vVXruxbpPRUZGjIkdF3nNFXqexbo1Fv65Z8pyUOIAMpqonpSPNi44wpnQyXGW5KRvZUJS47q4fmdzZFbY+ekamv08V10Z31+0vWndk1Nuot1Fv91tvV4qpDb3915m7ycP84MJiOvvaOwVePAkWDCyTY71PnjEiCRBBohJaAmTZwUAUOO+qHN+qWE8rMBqZJm9NbsU6qE4D05xRDTEwbxxPIUWWTVaSt1U3FHu1u2iS3JnlvJqnn6fBXT54+Kv/e77X8sLo0H20nO5SA0V7FurjFYOmKpqqaKr23FQlrZqq/fQ0FQ3VkXiaTHeGKnqaOvY0FUoDWk54JCQ4zqkN4DizOsooFSUsDKbWZYf1OFSdPevwDjkyjLcktTublbVus6JzFS1WtFifgcWqTiq2Va37X2DxeRp7Z6UW46FWMpskkVb4rMiTck5JrRJwpy1LaSjHVaTuzkptlmr+EDgjU94nSGoTBT25ltD9oKijUUejju63jj46A3mtf6vHHxbTWVYNP8HlTQ+7zhddSoIkIwhPMQiaCFeCGSGk8hS8cSCG0hSPkq4aMzZJp90PoZGp7TZEVvQtqag989Y6JpKw1EpuQhTWORe8VkOJ8HcX8hQ77awnU/Q2q4h30+nl6ADdWD5t5M/vWxtohqIZimZov81Qc0TNk9371OvL6TXc65++WaPFfmeeUaq0NDx6LZVNGhwYyrQIOnAdhqKnZXep9KpOmY56QBqZCm9RciXTNEkQURPjiSRaMx4Ek6CS115IJoMcCOR5d/yrVmGOAzvZeA+Dtiy9Yq8sx5VXHohyIPK/FhKJXHNrggczmN2+w7pWLevw0WG/bfmV0A9aOxocIwG0sEYzIkjykYioNBUe0d84SlZDWO+n08VT63dkMD9eUHdJLUcW8KljLqG3Ar0V6K3ot7fimAqtu9f+qpfvaufKW0h//RblCq1cJS4CAe41OCk0zbYs8AyxqEEHNhBdrlR3puzx7Hs/pEam588iQ/RlvGDdZX6hL+OZ+DJGwuY6PFSLbK4rNndsOdZmqgN5HfI65HX95nXHdAevrz97xuiKhxjGYsp2yOjQlO2TKXta5+S6d0Klj0oflX6/lb49oq5GkyBoz9S+LJaCG0dKgraYk/BcFH+XOQkWtHBCqug4JAYu5EfMgmNeK2/TUGpwsK4KzPx5bGil2YxYOYCms5cXFzO4yF/iQF83a2hymV0J4gmzwUngLrMuSzgEK4ZyXLwrojU+yNEX332cuS8wm1cnrzFC1ambHll9r1g9BqgwQNU3kLcQoDqyhlZ9sxj9VOinQj9Vz/1UR1TqaK6s+uauKp6XFIpxzwwBx3kAJfJz8EqxjDlI2g3FnKW0uwOTZxLX2JT+ucSI5A6PUj6XNdAhu7M8I98FEQ3n3tKkKdUpxbwInAkR7ECg3+Fhsp29KvaRlvFi/Gg5oa8CfRU9hPPpvoojKzg1/vLoskCXBbos+u2yUM27Kz5RlD3zR5Q7KSZCkoD8vbVWKsSUnNSaUO5ptkoVH4jiVt2lz4gaHQHHboMeJSO0P9H+7B+UT7Y/zXEtEreWB9qWaFuibdlv27Iy+BralnlfuqhypHbvID0zNHXJ0JScRcm0j1ZSz02iKoqsoUN0IQhnB1Nwo8Oq9TsXXhP8jExVny4wNEE7bfWJNuj5bVA8WtBViGp8ed54tGBfegweZ+nD2QLpNFPWJCKC1Ir7SPP2ZplJgQbBBtPAuMMicHU00Ss3B1TZRwsKk0pedNjHE5NK6sH5HEklIzna3eHRLzzZfRLKz3Cy+1+bPPkjQgAlXwXGAzAegPGAfscDVPPjMc8iDlA8ADMSN6no0EZFN+m3dJOOxInA0YnwLAF9hBNhHH7/rjICx+eCbe72R78V+q2em99qlbx33NkRZOzI2JGxPz/GXp0PboGxz3+cTW9vnhdvV5qryDwE5qLzVgNJTmkXrWU8ejWU/D1KTHdK2hzHRzfwGZuuPlFcyHlesK6yU5H0YK5Tx6RnfJBrkuo0Frd7r5yU6HU/0eu+io7L1jj2yhRApo1MG5l2v5m2Uicw7f7WYij2pMZaDFiLYQC1GMYSzOnupCdGc84ezRk9c8LSIv2D88mlRcyJzAnLiyBlQsr0zYVVs9p+g9J1q1+QhRcny33p9fTqanq9ffUHdzmHu6fPi0xZkxU1DcyD8BqkBOdMYiobpVQkRYYSr+wwpcgWhPUUT+tHIzZGT5VXySjVVAUjA0RBtHfRRyoEERCAGJHp12DilZ2hW5dY8HG75cjwfgYJFg+HjsNZ1t0KQF/Z2Xxl6zrjDQs9HrNmkKchT0Oe1m+eRkmDLNKam0CW2Mcs3krKblKRp2fJ2QylgQhipPDZiPVUWOIIZVxqZWh0biA6nXYXOTClnMmTsTUy7X9eYRZDaujMQGfGYJ0ZSOWQyj0vKscapiSeqByQ1SGrQ1bXb1ZnGyQs1tsOfp6GLJT49rq/bE4WW11HGiho7rkU1Jr8xMmoLdMxesnjUPLAaHcHBk0pv+l4UI1M859JikX+RonTllBjbcoaynviiQHwBrzUVmG4rrGFu3ODy7ORJhe369EePRsdyo+Q0AGOBtUJWdBWaqdIpEJaoZwOKqagFSK4qQdiJ/8ozE++f/5o3oZeuYvRoflEaaH3Ab0PvcJz64cuonNBMm8yQaFUJuDZyo4uWmVpiCzKgaC4w8jJTub7eMf5/rcAN8tHb6+/uMtJ3L0F3b1tdDA/jxDvEioaprcfa9uj+w3db+h+67n7zZ7J/fbn6eLZeuAgGB+DZZ5QaSgxjpIsS+2djIwKGMrRtS49cKIt39E2rsZmGZxNkOiHQz9cj4COfrh+Ixj9cOiHGyay0Q+Hfjj0w6Ef7ux+OEbP6Id7bN6jKw5dceiK67krjrbtivs4u8UyFL22B/DkRl9V/1lPbnCdZOSRcyUT01JGybQSMQaXnHVcDATd3XE2rU52i25tliODe/sCRJ8F+ix6BfHTilDwc3C1R0sGORpyNORo/eZompzC0daP+tnFrEjHgFiaCNUqy4R7AB2dIFZIlrjWPsaBKOwOK0zI0rQegs7INPdJssL6EJ21bEYvQ6+8DMiykGU9K5ZVVWI+jWQ93PqRTyGfQj7Vcz5l2uJTH7/e5C3q9qp3vIqWeJUDYWkklFEpDU1WcwdgrODUee3YUHqZdpdorvjRVOEeQSNT2a3IbOMoJaRNHb4ZH3U56nLU5T3X5aIFXd7fFpQM01XQkdRbHY6OJHQkDQvRJzmSVEtGKDbyQwMUDdBvLqx6Bqhs0B/i3Wz697xDrZ71ztYUJVszSk0tkwyiFwkC8RKUZSFQDyQpOhRbs8PqBLzUoGALKSPTwk1EgxUEsIJAj6DbcgUBpbmKmeAH5qLzVufN1intorWMR6+Gsu2K7ih+aWtZ32RXm+75SJOgThQXnr7G09fPC/FnPX2tG7YieWTroDcAvQHoDei3N0A3OE79YXo7C7CsnDCdfXrl5vDoSu/8A8VYFOFgOE8uyycwnnU5p8qmLC6ruGVyMP1DOgxGlQ5HHsTOyLT2acIqnpoOFngQkjvphFOMksrfRZI1lCbphpIsRWVnwFalli6P5+rRs/FGpVqQ2CZG1fBE6YGlgyYpmqRokvbcJG2Q7fx4ub+ZzPLONZ3lHaLflmnxFOlILFM0THuputEwfTbFqtAu/SZ26X6EMysYQKCgNPc2KzgClLBgjYix0nYDQXh34dvimYu6un9sGG9DZseeU6k3PrIwZGHIwnrOwhq0PHq86iuJvV1Un5zOkIb1XZkjDeulFkcahjRssOA+Mw3LNhPLu7UEmSTzIDl3ghjCuDDcezmUPK0OaVipnVpt5T82kLcitDsi1rALRs0bIBNDJoZMrN9MzOhjmdh7CLez+eQLYGDsGel1ZGS91OfIyJCRDRbcZ2ZkREVrOAskkzJLAwmSBOeM99QZHcxQEN4dI9MlYTU2AkYG9naFd8fQ7CkM7eCNkKkhU0Om1m+mpo9maqv9q5Ib8rO+a3nkZ73U6sjPkJ8NFtxn5meUWs8FMCapTCYxaoL3NvjAI7BoMWLWGOH1KcZe1T82iLcgss2hsZOo2J7RkYAhAUMC1nMCpo4mYHu0Zs/4V7FNxkjs1O74F9qp3/DgtzlJh+8cHFU4qnBU4T1X4Uef/n707KEy7ZsSL9Ytdponm4jVNEVQ4LUQhHHIulwbH+1QCmhK3p0Wr38gbj+ExqbH25BZsdIxaOGEVNFxSAxcyI+YBce8Vt6moVQ67qw895/HhlCaTYRNSvPLi4sZXOQvceh4tqHJMQmCeMJscBK4I5JYwiFYMRR+1FVt4vFBLpObjzP3BWZzl2+GQaNOC2EjGf92ZPzEOgD7TATk48jHkY/3m4+bWi71y9uLyerx+uHPbr54t1QUV1eTRf5dT6/0jpfLYj8hZ6OhQacUmJEZXllQ3ELK6jwEqf1A9DkjnSl0vVs9HQelkan2VmVX7HmhgDLFUqbpmuSN1QieRIY8LNm7JgOBfVcxpdFxpqofy4evV2l6XY13dTO9zuL49P2X/O+byfym0lHVDavnH279PMwmHmqf87dCK5l8ZvEyesOdCSlRloIX2VpyYSDY7C5rSdazijYX1s9Ht/keKybs/Iad33oE45Y7v0npKac2RCO9c94Hr2MwXgnPhZKaIoLbcXitDLulxrzfc15Byi8u5yKPn99f0dXRIboFid05vGqnnxxjc6PjCx1f6Pjqt+OrXi7pk9VfrfNKGrA6ZnT/tHfuLlt0dyVlSGLR5SWnGSGJZNWuPfU2pBAkDESb8w7TUGq6bAoAQnXeVGLFQ08yOOtZCEkbKmx+kUpDIk1JaKMADdbGlGunbtlM0vLPeIOxzYSDLtnuGryhT7ZFn6wWzivJTaLAqZeOREeEMTEyIqyIeiDg7NAnu/NY+z2NrWhImOU3zB8+/gkub0ZoMZwmrBKuleYqMg+Buei81UCSU9pFaxmPXg0lLbtDXJvDwno/nS62GdL8x9n09mZ8yD5RXMXYAwcBzpEQKATHZZDBc+G0zg/yX4yjNaZ6O7Pn77ahj/+cXHz6YY2yTz/CIr/r9ioPAXE1+l9ml6MDeCsyw/gExif6jPE24hP7ER54cE6nRLNhowyVJkTrqVWRCmM5GYqNQrvLUNs2J3921xe3+bv85K7jZb7Ru883W/f8/rcAN8vbvIe0vvvdtdEBvn0BFh0jzgXJvCGWUSoTcB1jzCa6sjREFodSxag7/JudPqvHGQL38/X2+ou7nMRHL+cvlMdawGy8a+A8QmxcJaG+1xyD0xicxuB0v4PTlRo7LThdPfxpcXW5erp6vXchaoMh6i5PZGCIumch6pGE+vD0BUb6+opNjPT1E9kY6Xs2uMZIH0b6BoptjPQdYTNjpO+5oRwjfRjpG3SkAyN9GOkbM/4x0tf3SB8loo1Q3y63Pwb8MOCHAb9+B/zqlUU/tPIx2NdzjY/Bvh7rdwz2YbCvx/DEYN8zcqlhsA+DfYPENQb7MNg3UGxjsO8ImxmDfc8N5Rjsw2DfoIMdGOzDYN+Y8Y/Bvv4H+2r3W2ri8sdAHwb6MNDX70CfoW0E+t7PFxjr67nCx1hfj9U7xvow1tdjeGKs7xl51DDWh7G+QeIaY30Y6xsotjHWd4TNjLG+54ZyjPVhrG/QsQ6M9WGsb8z4x1hf/2N9vK1Y35bXH8N9GO7DcF/Pw328frhvZV6ut7dfr6s98cP0dhbg52lwi+nsYeCtbwE/UQr4MVAyCkMMJ8QwFoVL1KZIM7ejNBk7FK1vuiN2u31NR+BoZKq+PcGVzFzGsp0bTN5LueQ+6cz4NE/gXXRK8OAHAngM/50JpSJrjXfz2ZOA34fF9ObG5dsvX6gZ71OCSmMUM855cIoRRhVIzrT3SqrBxEVoV61+R4dGbh8Go68XMxcW893B6DISXd4EbSJW0xRBgddCEMaBEqKNj3YoSBTfOIqxvskj1fUJLYBiFKOhzO64vWzG7RtYGMjukd0ju+83u9e6Kbu/k+LLtPw91bO8ey33rrxz9I7XsyKvR5qDhiXSHKQ5g0BjQ5qz6s9mj7H/DigBtPzQ8kPLr+eWnzra8tuTNtQzw68Y0BlJoh5X3XlyMFOvX5l6yG3QmkRug9xmGGhsLYTDrdBKJg/cyegNdyakRFkKXmRTfDAHUboL4ch6Jvfmwvr56LT9sWI6so96HfsBaTrSdKTpPafpDdoq7Fzzd8659aLHCE0f1TWyGGQxvQEjspiesJjjSu3VUwNo/KHxh8bfWIy/TWQWjb8e6ls0/tD46w0Y0fgbsPG3UQNo/KHxh8Zfv40/c3yCzq/Xqx3uzVb9qr/O3M1NVYWwZ0ZgMVXHCemkDia5xEwIUXsJPsWgLM//STMUvdvd2WvdIPHkIJRGpsRblR2m7yD3Qe7THzAi9+kJ99mPxMStjc4opcFDDMBZiD6IbKAbm03zoVRi6TB9Z2c9kacGOer/Qo3k+uK64/Wn5fMcMC2Q3yO/R37fc35PTuD3P8Li3Wz697ybfdzI4s1k1r/wDi8xe069siZmIRHDGQksZd0euFcuchPpUHrMMN2ZMle7p7UpiEam01uSGrJ5ZPPI5vsDRmTzPWHza8bDTmQ8ezZe5DrIdZDr9Jzr2NO4zmbBv3OLz6++vof8ePKl+nB14XmRHhMdSWCNFJ64IAWzzjjvM/9RGqQdiiXYYeUBLRqa7wfQNDJl3rb4kAYhDUIa1B8wIg3qFQ2i9HQaVNyBkQ8hH0I+1G8+dELxteUGUBVxeA/zVeHtpXieEwWqurQHGqLRmnPtic/rj4RkBZdeOjWUHno9Lb62B0Aj090tSAyJDhIdJDr9ASMSnT4RnRMLVu3cc5HaILVBatNvatO8X+iDNV9tc6s9qXJmLN/0evVje8dwZInhKGed11oYEIqxlOFFicxyk5noCKXTUDRuZwRH2uL6+5hXx6cf1qrzUzUdK/DM79AzMo19srxK9mQ0CbgKRBDOpFdRRK4ynY9MO503UjcQdMsO2+Adbupac5ccGc7bExyyeWTzyOb7A0Zk8z1h8/uRaLmI2gURDefe0qQpzTtj1Kwqqh4Bz2I2tnJ3O6Uf3eT9dLpYPXywX4wMwUfL6bSut7UsCfRRoY8KfVT99lEpUd9H9ev15df15vQbhNvqE2vV2DOHFC05pEReX8k4n7z1hIjELQgp87ojnhmihtL1hMrOdLXY6WE5CJqRaeojpbTW00Y1U9P7BkSdjDoZdXLPdTKtr5NXf7YYa+8UcjFCRIQHpUW0KgIhgZGQlTIkYZUKmnM1EIXcXVFDoQqaZg9gxqaMjxBRyf+juWc2kCQ4Y55S42TM6oJazqIJVg6lia5k6Ik8n3V474m8upleV26WnZ7IupgMQijhjaRUOycIFTE4n58JIiwFGAzRIV15JUcHyqrCW2NQ1ozdJGWY8Tpbj97lv5Z6IUBoKUOIMSk9FHR2lfk+cnAWYzeNwclC0F7zqGNKwQfLjaY6Eq14INbGwYATsXkmbS52R7lLaPzXJmWwiZtnp6mKPh708aCPp98+Himb+ngebBY98+4Uwy1RAWWKJcdBkwwhI3gSlAYQTkilh1LZkqIu/fYk5MOtn4fZxO/SrFofo1nvxkGdijoVdWrPdapuqlMfare+adViJyilAvXSMOcMcURKIkkknHlqPGTeOpR8Q9lV5mtG3G5p7UXLyLRwU/EUk2VBL42/mG3CxMCF/IhZcMxr5W3CNmZoEpbBSPNG/3ZRvTydvby4mMFF/hIHPHrW0OSYBEE8YTY4CTxvnMQSDsGKoRxDxFDIuSBHX3z3cea+wGxenVIpg43K4KxnISRtqLD5RSoNiTQloU3mwwMBW3dFfcROG3ife2Rk0GwmnA0dtsfQ4QcqHgkxEmIkxP0mxLpOIuF9g/QKDmGW3zB/+PgnuLzpYUqhKtHjzC+8ktwkCjzzZEeiI8KYGFlVcG848VtKOlPBcmfGXF3wjEwlnyasInemxGlLqLE2Zb3ifaYzBsAb8FJbNRTu3FWeYd5Yd+5XWYmkycXterRHz0YH5iMkVEKwdBqY5oxqiIF543gKKbJkOMmK30VEcNOdeecR4NcufIZPP0+Du3zw8FdfNQ1aXhgdjo+WUwnNxJuUzdRsuLpM7IPWLtEgqHaCCcboUBzx3aF5dwfCQ6qzquL0/fWXyWx6XfUAHh22W5JaEenjOKbToeWBx3S6PqYTnQsy2xyZMlMqE3AdY3QZ0paGyOJQyq13SAvNTmfMY+Pw+98C3Cwfvb3+4i4n8dHL+QvlsRYwu3vb6GB+HiFuqg/XTSmuR0/R74t+X/T79tvva0gLft8nxmHPHMDFrOOx0LKu6lQiL/vGvKxh4+iGd0CljkodlfqQlPoOwb2ZzPJ2Np19fSC9vin1YtJzZuxSRACXtXrwQETK/5okguaWKDmUcr+iu8ptB9RTXRChUj9GasXaHRK4BeaozbsABJ3NWBalNIoYQQMfSgZhd10zNG86Z5vX7i+NN8WwZekVXbRSEKUYMxnzWsikFZfESkIIc1KnwWzy3YUZdoY97+Zu82CkmToNpYPBhQ4DZBhb6Hts4QiHRD3rCB0S6JBAh0S/HRK6TgmTBoJ7Vr6I4DlzQIjNSl8T8HnN2ZBBxqLhmacNpbii7tAXcerCG5tmP11g6IF40V2BAfRAoAeiT8hHD0Q/kI0eCPRADBrg581urFvWrb5dhL4H9D2g76HfvoeqHdZJvoen1uEPbumD7J0botg7R3LH8v8FHpzmVluprCLScGaTN9QOReOLDmla2RxrBqWRafpWZYcUrcuzaEjRuqFoI8lh6815YUxh2+07Pn8KGzoj0BnRP+Cfyxkx+khhhzs+Bgq7DxSu031MC962vTY/Ot7Q8YaOt5473kzrjrf+NjZixQygcSRI0O4ygDBDAjMk+gR9dL/1A9mN3W8rY7Xaz89grGJLMDRX0Vz95sI6a5x4Gm6rshgfZ+56nqazq6rlx2qz6q+xyov9wmKIsqp/7jkznBJPo01BaEuAWJBDcUJR0qG1WjPYWQtLI9PorcquZKl6Q4ihoeqTl4whVRxCJEuYMTwBM24guO/OUj0wc6sh8kv7ryDqW5FdCfWgtaPBMRJAC2s0I4IkH4mISlPhAVHfEPWyhrDeT6eLp/p/ZBA/XlAthBhqaAvkbMjZkLP1m7NVjszjORvE1ZL/68zd3PSwb1XxVHHi1kZnlNLgIQbgLEQfRF6Fxub1N5Sypaa7sqXSNGIaT9AzNv19orhKVulIfBDdnatED8Qz8EBgu6u2d3Rsd1VvKz9Huyv0p6E/rTcIb9mftjpPLE91P2zZROhxQI8Dehz67XEwokWPw0MnQN+cD/lKwfsQjc4rkWuquOOCmZSy6IiEGBMLIQ1FufPuqk4rewqdfoSkken2FiVXzGTknAFE4r1lgZNsxXLpJCQrmRbOioFAvit/25/HBtOM0qWQK7fAgcbtkAElpIqOQ2LgQn7ELDjmtfI2DaVxOyLtTEij2Tx9u6hens5eXlzM4CJ/iTLkuBVayeSBOxm94c6ElChLwYtsabuhOFw7dD3Vs6g3F9bPR6e7jxUTulHRjdo/MJ/DjZpNAa8kN4kCp146Eh0RpoqNEWFF1Ijmpmje2Si8Xkfj8UH6JGGVcE2EB6VFtCoCIYGRIFI2d4VVKmjOFeK6Ia7Fzqladb5f//n+S/7Im8n8pvKFjRDNx4ioSNR43oBdENFw7i1NmlKdUtSssp8jDCUH51tbGvtyQscbzjpaTiU0jySjrEM0Y0JZXxLKRlJhrLtwBVYY63GFsfXxCNVyfsKDUAmmKmCqAqYq9DtVQR3VdO2Jq7VneQnFs+sjCWMojXGMfmnyc8QxRlI1rMMEWiwa9jyKho3EE9Hd8R/0RHTsiVgyMHN0w6ktPYFsC9kWsq1+s61m5cNWG0bdAyfPiYKN5NiXIt2ZrXjuqy/nvkZvsmLwrKdAP2fwDNMcMM3huaU5HFshrIlGQFqGtAxpWc9pWaMmJDVWf5/P7Bb7/1oqSOBeWZ6XpSFCcE8YFbxanc7KoYQTuOpLPKEpmEam3FuWHh6ofEG7CgvjicrDJyqZNTQ5JkGQvM/a4CRwRySxhEOwIg0Ec111Wx8f5DL3+ThzX/I2d/jE+Eicrr2pl4g+1z74XNEvhX6p5+mXat5vrJk5jJ4p9EyhZ6rnninaxDP1LmuESgjvZtMA8/l09umVm8OTq71zSRVzBWIU3sqUhJHAiAiSaUtl/i+QkKQdzKmsDqvIlc/r10bRyBR6W2IrWauGK0EyK7MKpFLOUFXVuPch5otUhKHUj+vuaMIBnvF00p5cGa8F26rsihyNEqctocbalE0t74knBsAb8FJbNRTXa3ccTexU3I/PjD56NjpsHyGhu3wB3pSX1VQNSMiQkCEh6zkha1Ta++nC/3Gy+Hzrq+vzZ8zJGKhEslUqmFNUKZFY/jeLzHNpmXN+IAqbdtdX7EB96iZAGpkmb1FyyMxe0K5itUjNkJr1B/ZIzfqD7VOoWeNqRvXVA7IzZGfIznrOzhqdr22mJXvGz2iJn6GxisZqfxR6y8bqsae2mtwHlT0qe1T2/Vb2kjRR9psHvVPktnweaxT0u7ucbaTfZ6HfhZoXURkhPFeBg0nCeMlNBq6XoDlRng0EwR02AeU7J2jHRjcy4NaWSwmuSnMVmYfAXHTeaiDJKe2itYxHr4YC1w6PC+ysObIvDf7+dvMfZ9Pbm9GB+FRxYTcl7KbUJzy33U1pJMW7O9yfsXZ3rX35DLW7qSUOiAzWhOiEzMZx0CRGYrVNMhDcjxtjuexo/PjPycWnX9zkunrw/fWXyWx6XdU5Gx+Yj5VTcWcmgjhidCRCKSOV1IYrEr30PIFRBNHc7s58dw56XXLiBxfyv1/HB+YjxVRkgUkKkxiVkilCnUo6ABFOeUKpSx67QzfGst7f9fjDZzeD+Hp6dTOD+Rzim3X5ycqvPdIe0adJC3vcYY+75wX4s/a406xppHjzAKPAGAXGKHDPo8CNUr42DzbN53sWCxbFQghSEKUYM5o6LWTSiktiJSGEOanTUEIT0nTnvy3z4G2wjEwpN5QORh4w8tAr+LYceRhJKg6ehOkRhNtNxRkJ9+8Owcj9e8/9G2eJPzZr0AOAHgD0APTbA9Cshf3eeFDPXAG06AsYSbBV9qaHPUZbzxdtxZwuzOnqIZaPyunC/HHMHx9q/ng0Otv6XFPFHRfMpJSNMyIhxsRCSENpINIdtg+UrjrQj3XMfcFalBz6fNHn2yNkt+zzDYlA1dYOtJXaZYpIhbRCOR1UTEFj5K2xPbI7N2///Nx5J1+5i9Gh+URpYY7ut0c25ug2QXYrObrjSPTp0OrAPJ9u8nwkdyz/X+DBaW6zyaGsItJwZpM3dDC9erpD7oHSWTuiQJvX7i+N1VXdquyKqHcamOaMaoiBeeN4CimyZDgR3Dq0RBpbIjtnbqVbf54Gd/ng4a/+7/leI7VBjpVTCc1geWAqcuU9dcRIKX1gTOn8nAUtOaL5dDRfz6eX+T6z6UVlIL5ys4ePx7pfHy0nzDzGzOM+AbntzGOWn1vvBSdKS8G1SiFQVtnYCoSEoVTz7XBH3jlBebCLfJOf3HW8zH/z9fWnv5/NprP5+vro0HyasDAf+UV3RaoxH7nv+chGH5uPvJVRhYnJmJiMicn9TkyWjXoFflz/5EpavctGLh9M9lKGpEBSZZUIxLPAFSFK+ChUrIr2D0KPU9pdNjIv57c8xsrIFHQj2WB2zwuF2T29wW7L2T0j8W51iGD0bnXt3UIvAHoB+ofy855Kbtym8qFRg9QfqT9S/35T/yr3pAH1rwour37Ip5cxVrfPP2w2vfoZ0qJ3vgBW8gUkD9ZypT1oGlOk0cmYvEveKE9tGIpF2mHnyd3xl7rYGZnaPk1YxWL9xjtiLPHBsWhUSIrkzZEJKwMHTu1QgN1dK7YD2uThXL2+nS+mV6sn4+2jerrA1van5Y3tz9LCQYMUDVI0SHtukDYqklNjK+mZUVpshz4S3c2685Oi7v5murtxBsnBsVF/o/5G/d1z/a3b0N+PCl/0TIMXU0x01t1eU2EteMkCSQGY8sw7SgNPbiilZ1R3te/VTmk1Q9DYdHgLIivmo4CuSnWo6DgkBi7kR8yCY14rb9NQ8lGo7Qjkfx4bQGlWEps84ZcXFzO4yF/iwNkSa2hyTIIgnjAbnATuiCSWcAhWpIFgTiLkzgQ5+uK7jzP3JW9zzh9KuBsJD0ca3lu4tkfDbVs0/IF5gEQciTgS8X4TcdXsUMeDRf/D5LcPi9mHyX/1z3teTOmQxDjpuFYAjlhrTcrU28lghAjRD6bWfIcpHeLACYY9oBmZrj5SSmiAYhJHj1HdmgVqmicR71wxaHSi0YlGZ8+NTn6s0fluBhe/VF/iedmcnCWTgqeUucSZZJYHL3niwKSDrMSHoqg7tDl3NoY4hJmRKefjhIQWJ1qcPQZ1exanPMXivFswaHCiwYkGZ78NzuPPr+VlfuNm8GF6OwuwksxzMjxjTIQZQ8DYwKhMKijmjKHOSaNUGMpp9H6eX9uBnZHp6tOEhYYoGqI9BndPzq89WThokKJBigZpvw3S4z2g/3E7zRKAhXtehmgCQxXn3DDqCAVJPDU8cu+0ckGkoTQV6acH9AFmRqajjxMSGp5oePYY1D3xgN4tGDQ40eBEg7PfBqcmxxqc7+Fq+qUilvBq5v4B8+dldzIqRTJS0ayooyRBKEG4A64USEkMHYq67tABunNaa0JnZJr6JFmhFYpWaI+x3Z77k51ihW6vGzRG0RhFY7TfxqhSxxqjHxazj19v4OP0L7PL3hmismSIWg4CnCMhUAiOyyCD58JlbGWVLVwYiMbuzg6tXOgHUbNWnJ9+hEV+1+1VHgLiavQlgsams9uQWckuzWucJ2KqqsnSJE0cB2aUDXkDcJ7SoaCcse7oVrnt+/7NcWTQPlpOSLOQZvUY123QrEJ+oBREKcaMpk4LmbTiklhJCGFO6sQGAvDutmtR3oY2D36Cy5sxNltqJp0SckFrR/O2TAJoYY1mRJDkIxFRaSr8ULo0dmho1BDW++l08ZRhjQzExwtqE3Y1pzi8Hlov6OxCZxc6u3ru7LLHOrs+Zgl+nL6eRnh1OQ3P7OSJBKNYtI6nKClTSijjVaDCKU+jEFhmp7mCFrWZwBPkjE1FnyAq9AegP6DH0G4v7EpPsUK3lg0aomiIoiHac0P06J4Lq8X+U8ZH3qmelxlKgIYoIjOMGvDGgzDaBqt01MZKhudOWvIT1cHNyDT18YJCExRN0B4Du73zJydVHX+0aNAARQMUDdB+G6D6CE/oJhlpvZGsnz7Txp1GSqGBhKA4s0FSBkRaawRTlGpggykD2WHbrzqOvoMYGpv+bkVoax1OyZF+pAM3QIWOCh0Ver8VujmirN7uZf9sO3mSyJUGa6wIVpnENItZbNyAFp4Tpgei0k2Hef11asbVQNHYlHpLYsOOnnk+OwL7+NorYkfPPZjrqsni+CDXpKPnSAh6hx09kZ9/c35+ZHXRg7YCMnRk6MjQ+83Q9RE5H5uF/2bm/rk5ALz8/C9wfds7dm7w0H3eQ/DQfY/V+bkP3UdriQVLjQ1GGyat15kYiZS8FtGmofigOjx0r+qk7hzYJ8eG8hZEhtSs07wn5GbfjpsVbBZKnLYk7+Y2Zd7gPfHEAHgDXmqrBuNk7QznYqclmklCmlzcrkd79Gx0oD5CQiUEa+G8ktwkCpx66Uh0RBgTIyPCijgYe6QzBB9oo/SqYvFhlt8wf/h4pDUmThNWCdfcCq1k8sCdjN5wZ0JKlKXgBeVhMGyyQ1zX8+NsLqyfjw/RR4qphGXJHcv/FzJuNbfaSmUVkSbb1skbaofSGLA7LOtyaZsdPsnNa/eXfnBhMZ19HR3AW5Vd0VPiXJDMG2IZpTIB1zFGF62yNEQWh4L67vyBZufW9Nhy/P63ADfLR2+vv7jLSXz0cv5CeazMjO7eNjr4n0eIm2PeR56xKbpqMPSHoT8M/fU79GeO6Piya9FvwhC9bH6tysdtgGZzVjiqgDPlY0opKAZB6ESMGIwfosO4SJ1+JodBNDL93pLUMDqC0ZG+I/380ZFxZHR0uKVjRkdzmJ87o8NyEbULIhrOvaVJ5108pahZ5XOOMJQiHx16mnd6mB7f5L5m73g38KPlVEJz5WR2Gb/UxaAMlRnC1lOrIhXGcjKUIvPded30dojrZ3d9cZu/y0/uOl7mG737fLN1z3v/0XtI67uP1+PWvgDR64xe5+e1Bs7qdabkyKaOh2gwep7R84ye5357nvUJZSEqmWXG9Hr1+/rXbJyXHM5BUqWUYYxoCaB9kkJTGVwGkoEMsIEo+i673zWpavAEOyPT6KcJC93L6F7uOcDP714OKW/TTkjQVmqnSKRCWqGcDiqmoNVAgN7hBq4bppbfkYpXboQlo0+T1ibl58QT/1uqASkXUi6kXD2nXCeU1s2vVx+Ed1lDPDgR0TvqVcz18ZqpkJKTBqJ0GU6JBgjLA0hUgeFDUdwdBoabGFt7MTQyBd6O0JCKIRUbEtCPomJ4ihRPkfbWl4anSHuEazxFWgvReIq0/1jGU6R4irQvqMd8nmcF/zPn85zY5WUP10XfMvqW0bc8ZN/y3eGH9RZzAcvTDz3zLRd7vJjAKAnSB2GpcDI/zjYvVZrlZzS4wfiWe1oWfi+GRqbg2xEa+pbRtzwkoKNvuQ9+C/Qt98K3jJ4J9Ez0D+9990zstJTQM4GeCfRM9NwzYVrxTDwqy9Azx0S+UvBMJG5tdEYpDR5iAM5CrNwUoIzNq3AodSK60/fS1Ft7W8j568zdjNKSPVFcRVvW6KxfuKaKOy6YSSlvCERCjImFkIbijOiwsbI9ZbJG3Vu5PclhZlCXuzlmBn2rzKCx1GnrMGaChdqab9znLtSGEROMmPQB52ePmEQpiFKMGU2dFjJpxSWxkhDCnNRpKDXcuouYiHK24ubBSEMkDaWD/fSwn16f0NtuPz3QusozYiSAFtZoRgRJPhIRlabCAyK4KS+sIaz7KqcjdnwcLyiMUmOU+nlh/VxRaqyL3Nk6wLrIpx6hOkNd5HWWBmktS+OBcwaTNDBJA5M0ep6kIY5P0qh2w3eXtxeTKldi+Rt7l6BRPDminHVea2FAKMaq2oKUyCwu6TOHUzoNRMN3WRC2HIo9DJ+RafST5YXRD4x+9Bzj549+EOFBaREzNwNCAiNBJA5JWKWC5hzLwjb2Ie88ArHae9Z/vv+SP/JmMr+pzJAxhkCOEBH2FMOeYr0D8gk9xVbljNVproOnVg26DdBtgG6DfrsNDD/ebfBuNrl+EpN6Of95Mu+f/0CW/AeMVzmUOnIhmODJ+BB5CHkZas2FpHQoOrs7pa3KJxYa4GhkWrw9waFHAT0KfQc79jF/bmwM0+OPgPm50+Mxcw0z1zBz7dnhGTPXnhXWz1xfRZ7mfitwAfTDoR8O/XD99sMp0tgP94ubXH//W/5J8+VG0jOHmy453KQlyXgjFBU6MCayVDSRQhqtEslgGoiCN90dW959FqYImJGp7yMkVLRRI3PGeyKTIU6baH0wYJzWljLQcSguNEY6gvCfx4bHSjcsQXcHuE8v/Xwxc2FRE4JUCRM1Z4Yq8EFImVTwPilFtQzODYUmqa540vggyJ9A8O5RTQfrSIrpdOh6wmI6tRxP5yimg0fY8Qh7H4zSo4+wj8Rx2l1YFx2nPXacFixjY4im3gbPLHVUeQHGBGUZiUoLgUm4ja2S7X1q+8Tq1vMxl7E8SVbrcEAFziOiAY/8F+j2R7c/uv177vZXR7n9qwffX3+ZzKbXVaJI75z/xWxbaokDIoM1ITohkzBBkxiJ1TbJQAZzyst2p53LZdz2w2ZsmvlYOaHXAL0GPcJxy16DkURjvzWCMRh7tmAsHhzHg+PP/eD4SHy3mPT6rFB+1qTX6lcc6eXaMtHR14W+LvR19dvXJQ6kuK7+VK9PZ73zaFFadGklQx2VmiUJNMhIqUqSWW4Zo4k6PhDdLXVnypttz+tjdIxMCx+QBrqnvjm5R/fU2dxTSO6R3D97ci81tUwyiF4kCMRLUJaFQD2QpOhQatB3h2G+s07K+ibvZtO/59FXz0aH3SaiKSZR0UhFIo65aKMCx02SQVNJFQehzVAcUt+wqkCh7P/qz0jbkh0vqBKeU1RGCM9V4GCSMF5ykw3gvBVrTpTHPbjxHlwO4mwejA6+teVSQmvedcF6LzI0tRRcq5StBcaD0wqEBIFobbr77jTp8mAX+SabjWVNqvOnv5/NprP5+vroIHyasEq4VpqryDyEDHDnrc72r1M6mxiW8ejVUHbh7o4oyJK5t77JrhI88x9n09ub8SH7RHGVsK2dNJZDxjMLJhjhTCTeCOCWR8sYQWw3tTC2K6e9fFsxmC+TrEDHWzaxplSwJ16H1gX2xDsR1OfoiTf6ZBuOyTbPaQ2cNdlG1ThS9jCsiCk1mFKDKTU9T6nR9VNqfnAh//u1d5k1vJhYI51JkngiHVORC62EcZomClGYOBgvmOyQUm1LaydGRqZ46wmlGCwbRwZYdzjFBDBMAOsn1ccEsLMkgK1Iim1GUtZ7M3IV5CrIVfrNVarOViWucqBKzgPHds8ITLHYBSFWSW6Ipcy5EAhzLABVVV0q7p0bSiUq0WEcfzv6UR84I1PDJ0gKS752GcHHkq+14HyGkq+a+OA1FdZmNsQCSQFY3py9ozTw5AZTxb0zLKudwtrqWbO0TzYN/ZZPxlwvsA2RFc/PRK40WGNFyHQ/Mc1iNta4AS08J0wjxptifGdyXK22laPGeUtiw06I2Amxf+g+pRPi0vVlyWHXV10DHv1h6A9Df1i//WH6QDmMJlWje+YRE8WQ/jhqs8vucu+wOHtnxdkLYdZscDohVXQcEgMX8iNmwTGvlbdpKGFWajqC9eiacdFsCrxdrMKaLy8uZnCRv8SBM4LW0OSYBEE8YTY4CdwRSSzhEKwYSuHWrjyx44McffHdx5n7krc5l292wI00jkhWdy1bMZDVSSBrRa5rJL/XtwSQXiO9Rnrdb3pdZZI1odcPjpe9nl7dTPODd+siOT1j16zErg2VIhuEIejECddEUe+Fp7oq6x+VG4xJ2CG7FvUPJm4jZ2x6+gRRYQozpjD3CMrHpzBb2tzU3Lsu0NJESxMtzX5bmpodbWmuN6xXbr7el3pnbNKitamCJ5oDScESSbXQVLGQlTXh0jHQfiCKmasOvUK6cR2Mh/AZmZo+UVrFVCKQwXiwRkeaFQphTOlkuMp7grKRxYFgW/WrUtlrFz7D6t/KJb26+nHmJiPMdz5RXCVwO828zyaAD5wmahylQDmpDtcb4pUcCrhpd26C3Vm8NWZrvG79NkRWLHKWCEkC8vu0VirElJzUmlDuqbdUDeVMvu6upZrYVrc7bjJ2VB8lI6xV9qK73kJYq6zHtcpGX7OyO5MFa1aeuAa6rVlJqPI8SiIpCRyq1C9rBOU86wAmvcCziifz0cPT98AfNzq0nyqu4plyb411SXOuTfU4OBG1D1SIRFN+L2K7KbZt48n6BRafp3Gs4D5VXkV0Z6s9o1tFl0RinKXgEncatBDMhoQd7Bo7W2jj2Xo3qwIbi68jxXcLEisiPFgSQ8jGCeNCCBO41ZJookEo47COQhcIz+RqvnDXC0T4sRIrdg+TIbHoFZWQKSd3ikVIOlStmSBmewUR3tRCqTVfn2/WTz/AYpHHno8O10fLqZhRl1LMFgnJhkhQyRGvo3M2UJLxTBjDjLrG+/VJ5GjEBzLbE9wm/06clH+3vsd9lgCm4GEKHqbg9TsFz/JTU/C24sz5DasX+to1oZyXx6VVgilPo3YxKkm9JZ5opXTSyruh5OVR1l3QUB+hpw5hamSq/hwiLAYMTaZqIhDvk2eMSAJEkKiElgB5N0GncmMjt0Zqw86Enb/O3E0ec6zAb01uxZQ+xZPRSkCwMpM7oRnPhpghzBFQhg8lpa87tOsGp9nW97yP6W4eTmfrORwd6NsWHx4QxAOCPYL3UQcE9yNYOg1Mc0Y1xMC8cTyFFFkynGSW6HD3Ptm9vJqfpZb9eRrc5YOHv/q/53stL4wOx0fLCd3LL7qqhYbu5V64l0efmkc7PAaJuXl9yc0byfmD7kwTPH/wLM8fYI4T5jh9a2vmvDlO2kQalVJAEydEW08V1TFb8dznzX4wJ2w6RHjzAyJvvl67q0kYdTJ2W2LDEwd44qC3IMcTB88J3Xji4JucOFhm9GXW2UZK34FcAszzwzw/zPPrd56fPj3P76HXq2c5fYxirb2Mwe6iKlhrrye19kYSP5EUixv0FdxnDKCMpJIk/4bRwboJlVhJ8hhxFVM9uIjaBREN597SpCnVKUXNuDMhwlDaQjH5jTOXtjIl7zoJj7fQ3tFywpqRmXJ1l0qKNSO7rxmJCdGYEP28E6JHUm+jw+rrWG/jOLOijXobIzmc1R2a8XDWSSDv9HDWOA4DdId9PAxwbEi6k8MAlEYqEnHMRRsVOG6yLaOpzOwRhDaYL93YctkWVmHaVn9+gssx7urHC6qE55G0lO0Qz9hRtjaiz9RRFo/bduK0xuO2nRy3HUlnDGG7o5fYGuNEgtlpa4yRHFGU3QUh8YwinlHs70Lodd4/nlE8ax12xzjTTLmoElUsVf1LPU3BSSWVrhKFEeHNTJ1T52vEDsVWZVdCfTZtiKGBOWeSMaSycUSyhBnDEzCD+/rJqH985mI1RH5p/5XxZqu0Kjs8o4tndHuL9POe0WXBE2AAJghOKPNaGSu1YSkow6xGdDe11U+brRHbMS1KDk+l95ud4qn0c/bBczEYoiUNlhKrvVTCKZeslN4L7sNQ0sd7zU4fz9eId/VWZbfprtROKYb7rBosu4BlF7DsQr/LLpg2yy483FR6VoAhT8R/F3JGOIuSaR+tpJ6bRFUUyccQXQjC2aFE2TnvznzduQIf3yQPfVEdSL0/yTdijX66wDBR+wXtMIyOqdrHIr2TVG3Q2tHgGAmghTWaEUHylk5EVJoKPxQHM++uTd6TFOTioewRA/x4QR3Ia2XKmkREkFpxH6mFbJqYFGgQTA9lC+cdHpusIa37MkcI6CMEVbRJ8sbshFTRcUgMXMiPWMZ0FS3xNg0F0F1ltv55bKik+sV3bxfVy9PZy4uLGVzkL4G1E7B2Qq9QirUT+o1grJ1Q0wY4R+0EPE97bpMWz9PWNGlbOU9LhAelRcxbMxASGAkiZeNWWKWC5nwoWRDdUTSxfdZodZPL24vJ9frP91/yR95M5jdVQGSESD5GROVMHqsEU55G7WJUknqbrWStlE6Zl7mhFKPuMM/hCH9nuZ/B6DB+DhGW1gATLEEIIIG5III3KQlOpOFJR6sJxTXQcA1UYeaDE9gkzXykZsvZ5IgVFbCiQu/QfpaKCmB5YCpWNdqpI0ZK6UNVtr2q2R60xDzOFtB8PZ9eQpVxeDGD+fyVmz18PFYj5mg5YXuNFx02jsHmGo1Ajd3Jn0uAECt/tGOCd175YyQ1oLAE1LNZA92WgBpJH5oOM/mwDc0J/LOGnIq7ucvUU3kgyoHI/1pIJHLNrQkeTBhKYmqH/vWWj5CMDeWty2/T25m0faDw/iZ4tBCPFuLRwn4fLayMxOndBnHU0cKt4nF9O1PIsKnzC2o7tFuxqXMT6/V8TZ2x7e3Z3c67boJtb7toezuSQruU087QjaV2Oyhm1KTU7kh64bLuCh5gL9waqarYC7fnvjQ8z9Xxea6R5G98Q0Ma8ze+Vf4Gnu5qG9t4uqsmqs9yugvzoDEPukdx6BPzoEeSXUe7c09jeh2m1/V4IXTnC8H8umeVX4c1Rc5t12BNkXp2TRs1RUZS6rQ7NGOh02NjOC0WOl1V6DetJNQ9ihNhJh1m0mEmXb8z6UzLmXQPt5ae5dTZUkrdSBrECtIdU8MOsceTtK46xI6l8nOHQUKs/HxkIKW2oLDyM1Z+Phcqj6j8PJI8iw59XJhn0Zc8C/Tfov92OP5brD/aNsfD+qMnU72O64+O5AhKd4QPD6D07QDKOJIuOtzlMefixD2+05yLkWTfdYd/TL7rcfLduh7MGcLXWBIGA9kYyP72wqoZyKanBrLffL12V5PwCyw+T+PG0OxZDDtfKQSxtYk0KqWAJk6IzlavojqS4LjPyn8wlm826btjd81Nt504Gpm2b0tsWGjgBe8uZQMLDXyDQgPecOGUBs0speBs1JBC3sWZ4aHqGjEQGJvuOrsdkRz7cNcZL7bbExxW1sDKGj0CdsuVNbD6wLmT5rD6wG4gn6m37DgymLBSTF9RjZ1+TsW2xGjIc0J896UIuLfGuqQ516Z6HJyI2gcqRKIpv3cg66BDm8WeRJZGB/mT5YU5Hy+wzsazgXu3OR+gtaPBMRJAC2s0I4IkH4mISlPhcXc/mZHuuMl9fyY8xnWEoO5yN3gbuRs7wkeYtoFpG5i20e+0DXty2sYBrdm3BI5i/gbQCJwIr6ITUmqtwJP8P5NFxqIYShEC21X6xuhOr2aKtSM5kraiYIvrDFUtqlpUtf1WtVqcqmr7nRrJsWVeBmF3qZHYMq8RTz5fy7yxuPZNd+5PdO73yLmPLSHPnp+w6ybYErKLlpAjSf9lHXaExPTf42DeTfrvSI5tYH/IXmEb+0P2PeKKWewdZ7Fj1i9m/fbKqsb+kP3dnfGERl1UY3/IZ4Fn7A9ZD87YH/J4h153cMZDGc/yUMZI0tZZd0FJzFt/VnnrWF/83HYN1hevZ9dgf8geohn7Q3YXyjnQH1K1kUOKpzMwZRRTRvsgrJpFNVtNGX24rfQtebRYV5OzkFHFAEzIipxWvcSMldqwrOYNs3ogel11qNhPyxcbs2ZvT3LYGBIbQ/YQ4dgY8gRAY2PIM6ESG0N+e3cAJlj0JsECHbfouB2O4xYbQ7YdhsPGkCcH4jpuDDmWgyh9Dl7gOZTuzqGM5NRsd20X8Mxsj87MjiWzCBOLngvcsQnqs8Y/Zpj2OMN0XUiz9RyN+9+M2RqYrYHZGj3P1uBtZms8oFE9S9YQpVyNkZQXoATbQvZJs2NbyGPLZGh0yPUd3N045DBcjuHyoYbLsT/HN8imw/4cJwnqzq0g23Yr3CkE9CqgVwG9Cv32KlR++9O8Cu9m1ecXXzeKsmfuBMqwcPgLarvzJ2Dh8EYK/HyFw7Gw8tkp166bYGHlLgorc5nAuqSiy+YT4ywFl7jTmX8JZkNSAwF3VkndOdBq5d4Wdf/IAN6CxLCWMtZS7heosZZy371jWEv5IIaxlvIRCMZayj2FM9ZSfka7M9ZSPjZ2gbWUe4lnrKVcD85YS/l4NHfXPwoz3Xuc6T76E0+0u3w5PPL0rI48YUmOc9s1WJKjnl2DtZR7iGaspXxsDKf1WsqmjYS6x3EizKTDTDrMpOt3Jp1pOZPu4dbSs5w6W0qpywTNEC1psFlY2kslnHLJSum94D4MJWotusuo06emGYxYvbcqOyypjCWVe4hxLKl8AqCxpPKZUIkllb+9VwDzLHqTZ4H+W/TfDsd/iyWV2+Z4WFL5ZKrXcUnlkRxB6Y7w4QGUnh1AGUv2ESYfPSfQY/LRs18HmHvUw9yjdT2YM4Sv738xBrIxkI2B7J4Hsu2pgez7DWbzcDr768zd3FSHN3oWyzbFWLbiyWglIFiZohWa8bweDWGOgDJ8KIdJbFdBkKy4RGPFVUTT2PR+y+IrWr15q4heEEVlBn+MyTmmqLcmsWBsTAMBf1dHT0YXABQZG++n7gt8egWLpZ57CsT7R1hDAGsI9Au+7dYQwPgfxv+GE/8jwoPSImYoAyGBkSAShySsUkFzPpTYR4f78bZDZ3WTy9uLyfX6z/df8kfeTOY3Fc0boe17jIjK2UYkUGa0UYJIFy0NXvsYeKZ70hmNXt3GO/Jux/wyxvphejsLUB1+z7be8tLbBVy9m04vR4fjY8VUjEUnpkCl5BITiQSIzgONiaWQGZyTQ4nUdVUpbnRcLd9nUuVq5hthSLjTpAcMCfc4JLwKiVHaRkis4IfDqBhGxTAq1u+oGK2+4ZFhsdUvysKMk5XbqAp65afzhdv83PsX387fzSZfsrjuLvUuZsZLMTNvPIuBRQY+86qkveMpUaFjIDRmc2EgFgLtrmQVJbx+1OdkrI3MdOhWuMUYh2FE0MA8CK9BSnDOZFoXDaciqcFkmXVX4UragrCeTOXm0Xgrf58sLyxm36XHGGvZH3YZH1fLfkX7BDmJ9p2oK5ATIidETthzTshId5xwmkW0gPhcWWElRqGijEEQJ5zMlFAGz5LzNqQ0FOO2U1a4Pa/nRdvITIeuxYvMEJlhbxcDMkNkhsNC9GnMkHXLDLe1BXJD5IbIDXvODav6Zx1xw1t/OQnPlBhK5pQFnayiMjipIlCZsee8MskHMxTbtlNi2KCx1qlQG5nZ0KlskRIiJeztSkBKiJRwWIg+iRJy2yklfKwqkA8iH0Q+2Hc+eHxZlUa7w39O5hM/uVyyvWfJCHnIS8FpZrzxTnLNrKRZsFVfMCkgYgLpEYywQdmQ08E2MruhY+kiK0RW2Nu1gKwQWeGwEH1aoPC0k4OnKgvkhcgLkReOjBfW2Bd+mcZJmvSwGCctppBWJYbyogSjmGOOQmaDzLKYrVyetT8MRP3T7moPnM5cGoFtZJZDx9I9p83R4IugzYE2B9ocfbc5aGs2xy+w+DyNQytiwJUjxuT1aRw1nBhmElHUKggsGmntUGyN7nzQtkHHiuMxNjIToxuhoscZPc69XQLocUaP87AQfVoeEm+V/dVVEsj6kPUh6+s76+MdsL7nXaZAkGiEJYlbpoTW3CkbnJYiJKldSoPxMXfI+xp0ZT4FZSMzEroSK3I/5H69XQTI/ZD7DQvRp3E/2RH3w3oEyP6Q/T039tderbq9O8NzLkQgAknMca1iNMoxEVgIzCidVb1PRA6lxWSX1O+ECmq1ITYyA6ETmSLpQ9LX2xWApA9J37AQfRrpa7cWXU0dgYwPGR8yvp4zPsbOzPh+vb78+sNsevX6djbLYtgcT3uO7A/NWjRrh2vWKmakSpFE4SijzLIUXUicC82sNXQo6czdmbWUbNts595MR7Ycuhcw0kKkhb1aAqdVHhAd0MLiikKKiBQRKWLPKSI9N0V89tXojLfMMWaMETYY5ixNzgsRdJIQOAzFdO4yLNi6ZYdV6DqTKoYG0YfS2zWAoUHkgMNC9GmhwS44IJadQ+aHzO8ZMr/2DgO+m1UDLb4OrQgMU0Cioc4xwZTjVEfQnCavjSZEI/U7gvqdcGqtCcpGZiV0JVYkf0j+ersIkPwh+RsWovt0GLC+mkD2h+wP2V/f2Z/shP0972IwQTlnE2hqLTEuRgkWRApJCp5XqtQDUfqdNqLaXqJnA9rIbIUOJYssEFlgb9cBskBkgcNC9GksUHfGArEoDPJA5IHPjQe2l/9Z2Buec1kYy5JShgkGPohoDIDTYJj0SjEd3FAs2meS/9kAZCMzEzqSKpI/JH+9XQNI/pD8DQvRfcr/rK0lkPkh80Pm13PmV5GvMzM/LA/z3JQ/mrZ9NQTOatp6S6IOUTPrRYiKhIzxkJSwKSROUhoIurszbfPG2z4bxwIxjwPe3YsY6SHSw14tgtNKxKhO6CEWiUGqiFTxOVNFen6q+OzLxCQgKskstKSNDdxkC5oRqmiw2pjg1EDUf5dhwjPYd1gopkO5YqgQ/Sm9XQUYKkQuOCxEnxYq7IYLYrEYZIDIAJ8dA1T6aAK4+vMTXOaP947R6RKjozRmW5Q45qKNChw3SQZNZdbfILSRA1Hi1JLujNRtcdUGzsh0+fGCKpIuSpy2hBprU9Yl3hNPDIA34KW2aigdLjs0S3fuU1lxpMnF7Xq0R89GB+QjJFRCsFM8Ga0EBCtTtEIznq0hQ5gjoAyPiOCGCNai/kazvud7SOt7bh5OZ3+duZsx7tNti6+Efek0MM0Z1RAD88bxFFJkyXCSDV2H2G9sjdCde5MLn+HTz9PgLh88/NX/Pd9reWF0ID9aTiU0E6o8j5JISgIHa2iyRlDOI4tMeuEGgmbTHZob1ADc3POef40P1CeKq+j+5cE5nRJ1MShDpQnRempV5pPG8sEEN0R3VopqPFnf/xbg5qGWzQ/vro0O7e0LsIT/6FyQ2UIhllEqE3AdY3TRKktD3t+H4jmRneHf7PRUPmZR9/P19vqLu5zERy/nL5THWsBsvGvgPEJcB1CMPSl+8tCHgwERDIhgQKTfARFzfEDkw/R2FqAiS5n4f3o5/3odHl3qXZCkmPYmPShHnErBJRaCJUwn7/MlLTlTYjCZDt3FSHQD1/9hLI1Mx7crvGJHbbDZmg2CsgSRVdEUHoXygZBkjfFDAX53CWxPhFV76l7fzhfTq0fXxpsFdC4xomcaPdO9A/sJnulV2hs5jbYdUiFI5ZDKIZXrN5WzbVG5sv7sGamjJVI3EtuWcjRun5e+P59xuzIHaJvmQOmWaBigYYCGwUgMg42MVsQk9tvbK4sNUUUQzPvojIBEreRSCRmTMcE6FflQ6gTx52AYlFGFhkErYix5vUy1YwBTIShPPKdZKyliIITorRdkKFkOtKs0hz+PDbQyb+nvp+4LfHoFi6UCvMsMfozRj19v4FMDZOI5Dzzn8bzPeWS7LFBmtFF5I3XR0uC1j4ErAdIZPZQMyg4jCruTn5bu8Uc7y/LS22zAv5tOL0cH42PFhNmQL7orDITZkH3PhmzXkVYy0dGRho40dKT125FGyfFNxvbsBB++zrNonkHyZNGdlmwMwISNPEnFrYyOWE2oICqbv4zRgVgGvLuDQqZBE6zG0BqbhXBOWZYMZgAtQyLJJ61NZSJrlfcYnU1lT7lKdiDLgil0rJ0HuYo3cay99PPFzIUFun6fbNxdZb2PDqFnc/1iKi6m4j63VNz9aOaSmQhKU8+ZBE2kIpoF6YwJBEAOpah2d2hm9sV3r6dXN9Nq0Je3i+llFvmqsMFS+OOzcmtIZOPUYqe1U2xoI6NnCz1b6Nnqt2erKiLT2LH1+Wb9tHfOqnyl4K0KlnsXXCIgI+HKKJUIyWuQW+5Y0GQgylh1F8gSvI6H5QFeRqabG8unmFJArJLcEEuZcyEQlkELVHlmaca1G4pXqbN0rSzpQ9Oz9Xy85xZOkFQxzyulaPOGnDfloLIx5HXMQA6USMEJY5jn1RTR6qSicA+V9sgA3p7gSnhPMiQWvaISrIrcKRYh6ZDRriGaMJSakd/QuVVWsB9gschjz0cH76PlVHRuWaGVTB64k9Eb7kxIibIUvMh81oWBoLm74O/u5L0nvHVzYf18fGA+UkwlLGvig9dUWAteskBSAJZNa+8oDTw53JkbWyI7hXU3SR//OblYN11anzNdPZmP2QZpQWSYx/uiw7NvmMfb3zzegiMlcqXBGiuCVSYxzSL1gRvQwmfaqQeyDjrc67eLM+/auNbY22xd66ej3u9bElsxFU1rR4NjJGR0W6MZEST5SERU2drxgFhvaqPXENb76XQxeo/K8YLCzgQdnkXCzgQn4vwcnQlWFdnJkdkad24czMDADAzMwOh3BkZlBB6fgXHvqO1ZJoYpHhsaRxiECouBkJ5p67MEQkLKG6ITErSV2imSjVFphXI6qJiCxizfxmjePrl1qBjHnQvolbsYH6ZPkxaexsDTGP3D9DlOY4wkANKd1YEBkGcZALGGEUHzfg7Ca5ASnDOJqWg4FUkNxonWYetaWxDWinfmCYuTjSpePRpxOump8sJUDkzl6DPAz53KgSFsDGH3AucdhLAtFSRwryyPMhkiBPeEUcErr72zcihFhrrDut4+zPF40lZD5Jf2Xxkz5FuW3ibYZ04N9m1clRj0w6AfBv36HfSjhB4R9bu8vZishLp++MrNIb/yYXHrfX7T46er9/QuMFhsxhwVUKZYchw0yYgzgieRadsyuqIGc0K7Kwfd+KpS5Rt9+HqVptfVeFc30+ssjk/ff8n/vpnMb6rFW92wev7h1s/DbOJrn1UNVDHimcm6I7gQlDIm8UCDjNo5iEPBJu2wDHatzKnjdr2RAf+coiz6IYQVeQ1EozXn2hOfTSkSkhVceunUUCIqHfohdsa91tO13LjuDapfr39c2fzvYb4qvLS2lEYF/RYkdlcfix9Jwo5ZWMjTkKchT+s7TzumheKh3SA/zB+/vco/ezrrN1sTyNaQrT1HtuYpRC4gqhSByhR5IMlGzhRol/naYIIGXRW4znep1aHylL1vZPA/v0CLpYiEiyEy7aI10vMIRoMFq6h33Mc4lOIt3TG3eh1cH9KS9Z1/vX79GcI/3s4fant3/QqqORvdqjiXGNGLgV6MHsO+TS/Gsa3rjlc16MtAXwb6MvruyzhHzDk//Mv1ZIFejL4rf/RiPEMvBvHGB2KpTzwQbn1e3YZoIJKYRPP/DwSbHXox2gmU7t71Rgb8c4oSPRfouXh26wE9F89/LaDnYoj5F7uUDPos0GeBPou++yx4Gz6LTXvEdy78I795vtkW+u21kCWvRRYeJ15mTa8EzURSGIAgtWAqyaQoH4ri77CWRa0OMMdia2RGwXmFWazxgu48dOf11J1nqBRMQgg6ccI1UdR74almTLCo3GDceZ3t2VLUr717v7dUT0e3I58iKvTGoTfuueEdvXEDWAvojfuW3jjZljeullmP/jj0x6E/ruf+OCrb8Met9rL8kb9cT9IE4rvLTJ12X32Ovjl0QaALoq8uCEu41FY5kRHJE+U087f8Iem1Nkr5oZyL4t01gaRkW32cbRMc2TroULKlJZM3bSd1MMklZkKI2kvwKQZlef5PmoEsme5YnW7EUVbzsDl4AHF1h7/O3M3NCN14rcqu2NydemVNzNYgMZyRwJK1sSrD6SI3kQ7FiOnQl7HbNN3PzN/NplVfg48b4vBmMhtfv56WpFaMykRHElgjhSf/f3vnttw2rvT7d9kPkOFJojj7KnYOk9rJipftmX2TqhRIgja/kUQVSXmNV1Xe/QNIUdaBpAACpGXxPxcTHSw00AR+ABqNbhJMHMsjM+L7rNNPXTrxfPR0Wb4fHjWcembVw7oh+ePV8y1lr+Mn/mP+wei6vG71VfY8brfRY8+TXmDBtgfbHmx7523b87qHOpI5PzszQ17r1cCRnG07ONx+Y0uE1zjctixCgmDGqGtPbD9y3Shy7Yj6JCRTxw4uZZkMq3ZPfdaxf/8/N1l6ZMe+y5PVijDxxReCZuypY05ms6k1I8SnZGoZljmlE9tyfX86mU4vJYOZOZQZe3S90fZ2z1iWeUqCPKs/Yznh82NO2cpgYkxMI7CpNzMjb+aYth1aoTXxnUvJNuYM59Mp5Dq+L/NlMhvdUkBVXZV1wFSLGiS+yoAtALYA2ALO2xagEiuoJMGGOO8j1jo+6hnSGvb6b8kgQOyZP4tm5syhzpRagWsFxizyvRmJIscgl3IUbA6XOVcmiIhszxrZSqBPVcIwAMMADAPn0xlhGDh7w4AXRaFHIiMgUTBlK3rfDQnxAtOYOLZhWZeyVhjOMDBV2umOeGGgT3GaAvXIrT5gMIDBAAaD8zYYcJ7qsBd8X74Pwx0K3CdnbCqYtpkKXN+yuNrsyJ76oW3NZubM9QPHINEkcOjF+M8OGKDn0PVZT6ca2WKgJy22rYQdNhVFM+JHvucbhhPZHnUmEzZF8XS6xvRS3GjcwUaC47V4iH5fzp83Rf1DgzX/+Wa3MrKe3lFLMHXB1AVT1/l0Rpi6zt7UBR8Y+MC8bR8YmHFhxj33Xq7fjMvNSrrMuG3bQ1hwYcGFBffMLbgzeQvuVo/lkGd/2fzJH3S+4jEH3pIN13KsiAYBnVCLBE7gz6KITfqTmR25oecalxIsZzIZzoZrC8xhXbrVyNYCvemx1eDg2tPQ8mlgkZD4nkuNiEz55UjPskP/YgwOw92GPNq31Ai5TZL8EJDZ5zRZr0bX6VXV1brNs6lDCTGCwKQBsSfBJPBth7BlxiRg/17KGcWA4W4OCbW/8rpn66Ifnza97Mdnmn84CFL0ZzofXQfXorO2Xk5dl5gBsYyAuo43cy3DMSI/NJxw6pqOT9HLZQkuoKw6JI2ua3dXVFt/DuyAEDeKTBIG05k5mQWh55veNDSdmWcbWJHI9mdX6A7BnsyP/wR0VYi5pdFG+vaz0fVz/QpsTXZESDCx/Bnb1pvmJKK2G4YhW5BPPTMIrRAJB6T3p7X2outkGcUP601pL8/ry/KJzONw72tWIVZWTtPxjoF+lLj1PTa6Ga3ld8MwW8NsDbP1eZuti7gFGu3WNxub9H3yLdy+qb7lG7CPy6c4TZZ823V2xmyr1ZhtB+bU89g4nczYli8MjFlgGeY0oLY5mRjepawVhnNINg2RnGraOtvIVhEDa7dtmT3xjGjmz5yp6bgBT9ZILdeYOJOZO40MxvBLGTqDjRynFoj7hq5vJGbbIDbzZGNcQ3fQULVAdkztC2SZoYRVM1bNWDWf+6q5Q3wfWT7wNzt/dHar5fYcXu5kEkbEdyLb8AzLsC2XulO2fmbzvUf4IL2IKX8yXJ4kT8QyqtzHRrZMGEapbWtjf2YYMzOwCJlFs5nBrdBOxEbMbGZH1Jpdiu+/Pdy2sj7Fj4z5cucC0cjGg1bdtd4EHIk1BcaUixgXZ2RMidgCKiSz6dSlPg3ZeLGC0A8ctg2aeWwDhJGjx4vweNuDDHotXoTi6mr3InRClwROOLNt3zMj1zTdKApdyyazIKTo29J9uz7dYYPb0HjXPZ31tE0O1jGil+LeAsZCGAthLDxvYyG/a9LZVrjvs/whJf8pMPCNrM7OHui22QMnbMUa2UY4cz1j5s4mM8eymLJcN7QDw7yYJNCOMdjULnSdWagfjWyu16e41qy4k4njUiMIprblBRPTosbE81i3n7I1LbUuxa5nDhj4oDava8ODul5nebKo3o53YatHabj5hZtf593N+775hbu7uLt7flY3TXd3EaIJIZrOopfrDNGEW4/Dnbjj1qNav8etxzfd/3Hr8exvPRoTxfOZZjsQzmBwBoMzmPM+g+HzgKYzmM80L0c+zR+TMLtKQrbwDOnZHce0umf7JGKLXeo4JvuPj0PX9uyZT82IRHQaTS9lCTDgGvgwW4KOLjWyJUAvOsQhDQ5pzrzf939IA/M1zNeXar4eiTnPhDnvrfR2mPPedP+HOe/szXmVyUKTOa9h8wDLHix7sOydt2XPtARQUDKuzLrDX29efiVZflPMMYtFnLPGHX+yQYDzblX85O45Y1o76lSAAqDw5qEwqe1aIt3/VdVnmzOXbfwmkRc4DutuxPOoY3ANWr7nu1GFCaszJjgQuJL4GoKvJ/LFvHxbfg9EABFAxAUgQiSdnxgigAfgAXi4MDxYAnEhxfBwm+UgBAgBQlwYIbpGjj0GxhXJKPvmLl/7Pvuj/begBqgBalwONdyeqMFeVvcckxTsADvAjotjR18rDvbyz2WcgxqgBqhxcdToGKzumBrXyWKVZAwQJPib/XFW4QPcADfAjUvjxqTjJcpjbpROZOwnbJERxTS8mZOA1n8KhoAhYMjFMMQSWHvsnqJ8fGJtqfxTvy+5U+tdsk4D+jUJSJ6kO1chwQgwAoy4AEaYAhbRY0Zslfs+KhrF38XLh2JRwX8OOoAOoMMF0EHS4fuADlc0Yl8Wl2IYHdjfc9UCDoAD4HAJcJD04ayFw3btsKED1g7AA/AAPBziAVsL4AF4uCA8yN4lPcDD92V51/5Dfe47YAKYACYuAROGIiY+0/wmTf6HBvl9paIPcYp1BAABQFwEIDx1QFRkuCH549XzLWWv4yf+Y/4BSAFSgBQXQArFw4yCFPwc45ZmpVcE0xrgADgADhcAh26+Ujtw4N5SW6fK8o+uyxaDEWAEGHEBjLDVbo+WyCgZwe2XjzT4+0u2m7yCLK8o5wiIAWKAGBdADMU7o3sO2YWrJacD24LUZrwBNUANUOMCqGF3jLhdf43jfRju4OI+ATAADADjkoDhCdwV3bVdlP9s0xkBA8AAMPD2MdApU8fB+0Mo2O/Sje5/22rtL5LGhJWY7cJhAjgADm8bDs6sUV87w+CsVGe4vmUQ6rmG4cyiwDIMK3Qn08hySRCw/laozh6Aq81JTnZUZ5g/t39yJgqcGN7U9agZurOJE3lcl3Rm+z6xDc+fhkahQKd/BfLiTyuwDcGvqkbTCEzbsUIrsAM2nIk7iewZCdxgahAvsoxqY9vVHLafMqvF+IX5CvMV5ivMV5ivMF+pz1eWtiwlDYmM6nTF/yxePmCywmSFyQqTFSYrdQUK9b1mAL+u7Y94AfFZT5y53sywJuHUmblRRGeuPQsmzqyaqhzBqao5Le/hVco/0zmmKUxTmKYwTWGawjSlZ5oSPao+PU1tEtc/UMxTmKcwT2GewjyFeUrbPCV6q7xhnvqQkv/sTVTf6HJ9PEsZk59cJ9frLE8W1Y/3zqkczFWYqzBXjXSumorNVSco8qqqdMnEMB3b8g1iTxxCHS8KTcN3beIHgWPRyjXA0gfcyoC1c0EfzAVzwVwwF8zdYa54hNY9/6vbJMnLly3ewqAsKAvKgrKgrHBkmYaVLVfrZ5pvgslkQC1QC9QCtUBtjRFB4H5B++nikqZFHNAHesX7UpCynwK5QC6QC+QCub0gV9ChA8gFcoFcIBfItY1hXL1BXBAXxAVxQVxTOMdIw0FZW5wCYBaYBWaBWWBWOCVkw8KWB0cur9dnm9My0Ba0BW1BW9C2xoygeBXvJo2XR8vb99nXOAN2gV1gF9gFdjtity4GYsu9hyIg4jeyAnaBXWAX2AV29WG3U+hZYBfYBXaBXWDX6ZjKqtl1oVzs0vwxCbOrJGQcDnH9DAQGgUFgELgHB939xuPGL5AL5AK5QG6bH0NH5Bat+fE+DHkdWOvSZPGVRnWnac6ukoqfAbQALUAL0HLQ1o5KOYa8qiInoW1Oiel7NnUIQ6xvGpOZ4/rUoEbIXlVeuR1D3peY/RT/c5end/F/65ay4Cv4Cr6Cr+Pma8fANSVfb1L68I3XBHgFXoFX4BV43cermpWA4XVFUnqXrNOANgS6BWaBWWAWmB01ZtVWsf9eJ0xFNCfAK/AKvAKvwOvBKrZjMJoSr7d0kTzx5Su9SsnftC7SIigLyoKyoOyoKVu1vxtl7/L0/nlF75P6MF8gLAgLwoKw4yZsx4SPJWHvmYrvE34V4WqeBLDFArKALCALyB5C1lWH7B+sA8XLByAWiAVigVgg9gCx0lG9dhLd7L7+g85XNK3BrPXTf/krABaABWABWNbQqRBgG+jxqiq0SeBTOnWnwdRybUJdw/Em1sSYuJOZPbV1JXIUzy4GxAKxQOzZqA6IHQqxsokWNu6vSUDyJP3xIU5pwF6wn+x9sSGs9W5V/Oq3bPdL4BV4vSS8NjNi2//PSnEemdnEN8KpEdHQDWw39KxZEPi2EZr+lNDB4GqfVlwDOF53oJqhxzpe5Ht25EbBLDDDKHItLzIs4k7cSNZPq5asXJNfcr56TVKgFWgFWoFWoLVC60wFrbc0WKdZ/ESxegVigVggFog9RqyphNi7ePkwp1yfACvACrACrACrxNq1JS3CPmffZ8/LAIgFYoFYIBaIlXV6rV+77r47jL4NroKr4Cq4OkauziSxepMm/0ODvHx3yM/D/kN+twFOgBPgPDdwFjmlRAPnbUZ+2QymzTAuM5oki0WyPPz0E5lndPv2EBC0yPl38BsstMAL8OKseTHM3SLztOJOAORV9WgytbkONSee7Rle4BCPuObU8g1v6kxNk2y4y+vRA3dZifxmJ38IJF5mQDAQDAQDwUBwDYId0dudUggutv80/LIEe8FesBfsBXvr2CvpgyTF3n8lOfAL/AK/wC/wW49fyQtMYvi9T9cw+gK7wC6wC+zWYVf2Rv4xdjevPqfJegXCgrAgLAgLwr4QdirgyNTign8E3DnJ+CFalpOqyS9ffslu0viJaRNrXhAZRAaRQeQ6IguseXUSOWEazGkIJoPJYDKYDCbXMVkgA5ZGJq/9eRwAyAAygAwgA8h1QFaLHCAF5L/iLPbjOVMZkAwkA8lAMpBch2QBFwkJJH+j+WMSwoQMFJ8PUYBioPhNoFjgrpwWFMN2DBgDxoAxYNxycVnveV4jjGE0BolBYpAYJG4isSsQukeZxN+X8+dPabK4XqcpU0VlWQaVQWVQGVQGlY+MFUNQGWd4YDFYDBaDxUMajm/SZEXTI53gFA8wBowBY8C4HcbOYDDGOR5wDBwDx8DxYHaKFhzjJA8sBovBYrC48STPHoTFOMsDl89CX+AyuPwWuDwdhss4zQONQWPQGDRupbElQGOh6JmNmX9BWVAWlAVlx0xZkQzrLWvej4UGyggU5evrZD6nQfOiFnwFX8FX8FVEcYfEeFXFRUZgWZY7DdzINyzTDRzD9n17EkQTYk7dKsOyoRuowCgwCowCo+PCqKkWj6fC6CYoGkgKkoKkIOkYSWr1QFJs8sFUMBVMHStTTYFc8qeZ+uF5SRZxUN75xRIVOAVOgdNR4lQtHvoGp7scxQIVRAVRQdSxEtXQTlRwFBwFR8HRcXFUzzFUdRMAJAVJQVKQdIwk1XMMtU9S7PLBVDAVTB0rUw2BoC67V6Q2EL1NEpzjA6AAKAA6boB6AonRa/hZ/nPiWinQCXQCnUDnhaJTfO3JFBjFD+uUVLfyX95tyGm+C3Y/PepH5HcbAAVA3zZAJ3ajvk71/1fVnzuhM3s2s106DTzX9BzLDgPXt+xZGDmETCvzniWIg61Cb8gD5cq5SZOAZlmS/rgiGT36FIwAI8CIi2CEiJvfvkLvWdt+fFovCxPVjw8p+Q/7s/WCNbHQwje6XIMP4AP4cBF8sES3FAJ8oBu3Na46IAKIACIuAxECXgRtiGDfU9b8YptxxRUQpOynGQgBQoAQF0EI01MlRH64hvgznQMQAAQAcRmAELi73QaIrwkJb+brh3iZXZcNBRwAB8DhIuBgCWStbIPDTRofx8h5n32NM1AClAAlLoQSylaIfO8cg1sjsMkAIUCISyGEKe0OsU8IrktGic0GA/ZJkAFkGDcZitb8eB+GvA6sdWmy+Eoj7CpABpDhMshgdDRMlmT4FP9zl6d38X8pkAAkAAkXgQS1xcJNSlckpXfJOg0oHKFABpDhYshgdDyoKMnw73XCNENzAiKACCDCRRDB7Og9XRLhli6SJ75IoFcp+ZvC4ggwAAyXAQaRjJTNYLjL0/vnFb1PcEAJKAAKlwIFkcC2zVC4Z5q9T66TkF7NkwB2BXABXLgMLogkDjjFhT9Yu+PlA6gAKoAKl0EFJWvjTUofvvGagAggAohwEUSwbNHQmcVVqeL15mUV4mkTA+qPfDEv35bfAxKABCBxEZAQvot9EhIABAABQFwaIKYCRsjyHx60hceCPBxU5HcTg1xikHOlCxwH7Sr9EwnY/5+hew26N6sWqmVB+vhPQFfFPaFbGm0uGW8/+1mPU/K7haeF6bC36VDqXuz1Xkzwl+78ZflE5nG49zXr+mRBWXPRw9HDX7uHCx+PXJPgkf74mgRkXr586eTf/f9hyP5Xkn9K1ssQvRq9+pV7taeaRuwwFQ76MPrw0H1YMexfY1Qv9GX05YH78kz0Iuj+MnrvHXoveu9rrZFFjwa7RGBFh0aHHnppIe0St9XfQTf+/ylZrWiKroyu/Fpsll4mn+jL2VEKaXRrdOuhCS19maHSX/XB5j26MLrwK5HZFjDC6TkZdN6tCkPH3XPGtAe/GXT2C/Sbqe1aIt3/VdVnmzM3DKaTyAsch3U34nnUMbgGLd/z3ahiRTcDUcdzVvACvAAv3jIvTMWsBo2HI0AD0AA0vGU0iGw79C0l7Hfp5rGAFWDF5bHCmTXqq6Xrv6rqDNe3DEI91zCcWRRYhmGF7mQaWS4JAtbfKtdOAa9xPeYJMAKMACPOSnWCjDAszX6EQAFQABSclepEUaD7nBlEABFAhDdMBPmcidKeJ4AD4AA4nJXqRJcL0rHL2x14QAKQACQ4K9UJkkD1qLL18gCwACwAC2elOtHdg6g9QcsxpfVuVVgoQQlQ4gIpMW3UV2PHf1XFeWRmE98Ip0ZEQzew3dCzZkHg20Zo+lNCK0YIeEXqOaIEH8AH8OFsFCfIB0PUAil6PAkMAAPAwNkoThADtkAIRn1bCUQpBiouHhWXHaXYtAX8mvRsLEAL0AK0eNu0kD/BEHN9AhvABrDhbbNBxESp6AQFTAATwMTbxoQhaqIQdIcCE8AEMOFtM8EcIj4UUvyogaF4UEMF58HDUn9YrIKUjwz+hFI6L3SdFaqcFApgDC4RsiCrXU1PXP41q0jxtzODv3PsA6W//8I1nSVz+uN9GLIPr+ZJ8Ddbsi8WbIBuwgryHrOpxPPPJXvIxdmLbFEZrzDT9XYzUJVkMb2sHlfXc5JlJQNedgxMByU2m0RtcoDRW8bLb/R+87wF6q9QaPeWOJNjodssZtmPrdK2n7U+AfnCFJ7B4XDdF3ZbTFeVpoSq37XE7m3ggUQOJd6kyVPMkLNJIddWYaGfK9SupkNWxW+P9VvrJ1aAQu9tUUD24zsj884HrT1XriCFGk+PBd2nJM6zH3ePJKXhZkx/TR7ioPiitdodSuted/4HBxPkhq6rVVst23+nQIDD1lflblrNqR/zvybzzSe7BbRwQKlchb5xvADZl3tFMpGJRK4chfo2PddKTjVridRZuiyFfnM42CtZbIA/pDTLrki6+1qAxJ2LVGiFJSDyLn+ex/+l4c5nrc3oXKZCLzqcJHZSwW1+wF9/YSvnmySZS60ATxXVvdbTWbMomQR2bc3RJ0PrWKmrQ/GyFF98IDlWxIpUaIXbLHI7Ua54Z6ZhdWjAN3en26JWsMbV767gZJ0GlOuPMUZ48HQtUePe41R+Jqm9x+nCtPenZmFbU8QVeejQn0QL7t6iWf3TV7K2tDW0H3kKPK+fOvbq8xeZr9kOnE2ITzT98T59eNr7pBXlOopXaJ1At9oXX1mvxFuoS4RCK49XLyeqcEsj8QZqKF37eqNF+t47oe26Phnd2+mKapntZpdZlKSLqhr3SVHqzudtbdUrR6G9x/se0Xq8fCD0dHVL0rpvT/l67+GBSayOYTb7PX7UkqZJmm0+l9y3S5SrdSd2dCGGb7mPfyy1ExMsU6Ev1k5S+zLL9WDx//9Hn7cvttZQsa6oV5BCi2u3Iq0V+UAjsp7nR/Vpba9OMQqt9aSrceAaIdfqPsTpXh00VoewP/y4f4NNfnUgV7oCgWpnbgHpJy3MqiXrXrMKSN54+QlY7bSJUGhl7bZVvAonH6AmARrPSk9X4BvNHxO5s1LxQocgyI6x8Y71EO5dQuerLvsLudIV2iYC6+1P2Jrq+4pW9oh5sqTbt61N1Cek51mwvhJf8uII4uPG+UGozb2I63mNV1+d7St9azxxQQotFgHgiYpku2W2tFm3KAV7nghN6qtyFy8fqkngjpI0eBTq6H1JVLAvC0zvEku8TsUpELnWQrovju9t+dz2Em5BrKOql93vblm2Pd3L7HfNXScz+5wm61Z/CdWSdZ/2nQztIX/aJ1CkAvHbBmrpU8k2mGG8OU1ZLJLl4aefyJy7SGzetjJfvzAF6rf1HMHKxHN6z/febAtOytx1p5XQr1wFfbR1PrF6FYeeNPyyFFNEPwIVNFBr9e1SoX8luagSepOpwIRa27BUne7TtSAStMtSIHrbkvS4LptXp6colWJ1n9IKib1/XrEV5nohf0orWbzCs2rbKjaKF5uFVYtW8CJumxtu0oQ7+JTvWl2JJUrRfTK1kbLnBFMcvux9In8yJVpuT+NlX+6HOKXcmhnTTLhZWopXaF3bPLMvnq8uSnNKkoo3T0v5us/Ca+Xf0mCdZvET7fIY9crpyb66X4/SYsC1Lv40NZSu0La2heGB9N13YodP6oUPwpi9d4I2NS3Faz8hLjIYF683L7+SjM0/D4V7epwztR5/0uGEuJsY7b30qBpcIL/XSMv56uVth14qU7j208Q24fzlH/liXr4tv+9wmigvQvtYPFUF4RbqKF6hdfWrqFPib7NcuIGaJOj289uI/fjE6lux7/vya0LCTkjVJkP7XL9bh+3N6/dRcQuav2MTc3Uc1mGulyq9J4oeSL+iEfvyOqUkZ9LZ3/NVR2eKihXeE19qhW8Vu5He/th0FP8qrRPqlDqK72klcyD++7LoNPRDfQCtzisZWTHa/WoaqvGZ5hsbQnW9O2MbnPanqUeAbs/hlgpUkm9I/nj1fFsEbnjiP+YfyHsOd5c0DFmLmnDucf/0YgIrAnHoIWtD4b3O+zvC+axcFsOVWvzRdRkyRHHeF5ShcCZfb4gs6/B9OX/e+AL8Q4M1/1FRrdZT+W4FKrSgbY1Y/lPI+BBnKx5w5UTggQ6lKdS9/tx/V5qYK4RUOQr1bVvHlf8IrnllS9JtQ36Z2XkcrSBlf5Dtvj7tH6hWru6Z9JRcnmDw4/IpTpPl4hSW9AjorYU1gZ8q6+fzTvSn7i0UFaDbl0gitJW0L5FM2brXtG2yq+9ePhLwE9cqRrfvplw1FHw3Owvq//lu9g/bi2qSlze0itHtUdZYDYlNmWrJuv3KRSWLGrT0CVF4emIcPLjiJB+R4XSJvY237Xag+RMd401OTG88FaiGqF+4XkG6LehbsZVZ+yZNApplyf4BzPZTeQu6vITeiHNcg89x/rj2+eeZeDP1CelttB5X4ugTHaNVToyCH1H7Irp60epEJFqEwo61XVnVi9PbPcmCepu3tsTdeLeIBEPrWKJC32gfjpU98tTZilQxvVkI+M5245PHIw3ygL3L/FOaLL7SqH29oFRub7vLXbnX6yxPFuUbMdcW5bJ1n1GelC26aNVQum47bK30T/E/d3l6F/+33STYrUCFFrTvaXYF3qT04Ru3nrY2oFN5g1CAyVuRtHJGO3GMoVbuIM/j3+skpwuaE03PY6c83Z7ytfJu6SJ54gqjVyn5u/3UV6lY3Te5asWysci91++TP9P2AIFdi1RoRe3JY61IfnfoPrlOQlrEGG9tiEKpCm0R530p9Q9KwnjZHi6wc5m6va4PZK6XxQ+qmWvzVmzG11J+b3vkNvmiM78mCT2vbKoafEjJfyrTWXEn+xtdrpVXNidK7+00p1l6ZRY86SegR0DPK4eqAnyz8pnmm6P79qlKqdyBiPJ5EwecGxl2jgO1EaWx/MHal+8NB16PExOznvJ1+82dll+Nh1PN01G8wmgT2dhU4rnTzNab4KRDjnLRuv2NGkTfpPHyKNrA++xrnHXwN+oiQ2FXIgDrbyRefvyHaTQ75UQiX1i/K3guTMLTonOR3VthHaqs/Od09MATP1SwFR6uTnYLFkm6I/R7hed+iLvDBHUH78Xu/3YvVOOO+oRQweWzUrEa96ItiQN50P+EvTh9r1mlVIW2HF5VOp0E8SXYrFT8ermCFc7CDuea04IP4gOyPyi/EHEI6kGaRr8Rgdq8FCblNyJZssb1iZRkwX24NhkaPdoF6pAss5xUiyUpj3b5wjWeTssKF/St0ClGo9XodDU+PLPS46CMSyrwMDVJUHii8jVoTZ0rFUNHWZbGHeDpuog+VOWiNfrJyInu6JnXXcigc8luJbrlzugsY9C55CZNVjTNn3uZSw4LH3Qu2Rfe21zSLEahtRJ7gk01XohXvUxSkcuamiV1b7NpnNqh7lTlKGAVL7aa1Q+//JLdpPFTkTlSIHbbsPVQ0depXbBKPZOcieK564Q0NmxNVHR2aLrRWNO1P48DQYUNWA0VbUnAQaqaf8VZ7MfzQqSQvgatyGtqTKCC35IwjuJ2rA9cke4a8yRW+YdVKpdParQfRr6CfiRWleL1k6H7UDVQ0JHC9NNYQ3GaDyJehUkSFlmx+vFL9dxt+HqdpkwZFWFFQD50XRR6lfaqSs56A1XgddhU7ZoU6T1QDVRG36H7uqYqyi3QB6vE64y3ljpKcHyYCqj0JQlbmmgNFVg+fG0UelcPlZXl+VBV0Oih3FLF8h+BqCWdy1Swn0nI3I8g+z57Xgbd4yYryene3qPMS8L1KJ2L5QMO9yXxNXRQpSEvz+ZD4affl0QFHUhMYQ01unvOcrqQGwa9ilXw/BMy5D6uBBJLSxel0euvXdRdGYWu3a27a5EKPVHIrnIUVreIBfC4usvXvk/Tg7eno/f2KVVh7SHEiVO1Yi8rv+YkFdZI/7Jfu4+wl38u43zgPlIvVUEXQjvZo1q9OAQGf/PIElX1xLXRq9ze981HFSsLYz9hTyeKaXgzZ8uK+k9PK2fASvS97tkN8bk5x/2+vH6kwd9fst2yyfKK8nsG6useeYnDkGQvvHkR+ptLZ/OdtPdgn1IVdCE02deGen8fhjvl8luvQmroR6CCBkQWa9s7D9th2fzJ6U1ubyL7PotsqdPNpvT75Fu4fVN9K3HnZOCK9HwWKVtP/mbnj5TPIpXl9+xF13ILtij5G2lNK6hPhoL1SMRQ13z7sKxCcQCTXSXhM48d0GpE6kNc19bXXZh7/6W6E5ukGb/sVERCyI4vcY3VPXhWG6LoOllG8cN6k+H8RfiX5ROZx+He16yiTBhbFQi1vR95Cl3mKN7Xfpe5pSRc0Cp41nG/Gbf+xjpu6ix05YMoLkpV2wP2+ktOFzdJUtwRN9FhGq8Gl4rjltP5zsvvPs86UnywVWD9xeyj37+0qSzkX0n+KVkvQyGl6ZOhoqjalGyl5LtHkvLD68UqpVlGw8rExQNb7KsL/a2+QqUad+31GK9ia6qaCu29g+pOjOBm1W3lX5EHqLFSY30Yzf2J/mvy8MCvJt8mSe0NzEKT9VPPwRWRbQFisQm6FqnSrdqSAR/JvFw9HFnvdmUe54VfLJLl4acF+mn4ZbnnBoNhV6i3NjJTF/WydRE0XKNhuz6n2cahqEy59xKFAzr7dSqL3s5B1uksz+PcuqILaU+njY401o6kMWM5OtFYO5HexPDoR2PtRxqT8Ja7xAuMHaohxSmW4b90ph2FOptNXG3qPM5xCk3+0p9VFUr9pTsRJlT6q0NGuE7HMHKxoFsLw8qs+wlaO5KOXTUxQpoPbo/UVpPbD/r7JZ9XEEpr9k452JnUp54qvVMuOJ2E3tw7l6wpDCTNmYxg1RprN9KUXgmzWwdtNiZzgjabj3+kZ7BJYWxtTzd0YoctlQZBsmSFSzc6rQbCQbq7C1EIfCBmvqs+2LxvfWodS8RUg5sMshjTmE0NE0Ozy/S+Ro/ytkF1ovvvhsRxUOAv4Zx144Qduoem5GnjVuNYh09vmepA7l/6MuGNs2+i/2jNOmhjRI53JF3I9TB92SkxEMY4EHpKAzpOZY59EOnPsjpufY51HGnM6IoONNIOpD957jhVOfYhpDVr77hVOdYh1FN6ZHSmsXYm7dmnYZuuDTkkm11pnD0SPafH3EYYmbVxSAUzBY1bcWMFklqSJoy4XwPkaBhnz0TH0p+kAD1ppD2pzzQQ6FSj7FSbkAW/5TR4/M15tyoC8pSpL39LiyQJ7xbhu5x1pe2dFtaAooGFM0l9XI7jMFdfSZbzm0Y8oGic83u2R5+09hidYhSuvmgOMVh38UWXCIVWaox/J3yFV7J4hdbpDcxW10BNEhSghlynW10g1ylynSLXqZw+kOtUeDY5HZ7xpsotySMe7pk7Re/CapOh0M765AS1YSiLZKLlu3j5UBQX09Z04DpKV2hb2+LyQPoVjdiX12xpzM1n7O+rODuNTVMvvKeVXK3wrWI30tsfm47iX6V1Qp1SR/EKlmyJjvN9WXQa+kE+joBWMQrPsvZubVM1PtN8k0ehCneVfYjT9qepR4DC86zPu9FcgUryDckfr55vKXsdP/Ef8w9aH6lmScOQtagJ594tzcoJbDdSkCJZGwrvdd7fEd4elllh3heUobAyRi535HLf1YXQMeMl53J36tOWbUw6xT9Cd6fkylE5f0JeFJwUaDnIRF4UdCLlToS8KOhHfXhVKCzALzcvysaTsDzetd+lG5Hs/WZX+xdJYx6/I9s95rV2j3kL3ZzyjTp4L3Z5vHuhGvdtCtEUhPdtnWUgbMS5EGe8M81FhI3YpGto5iBfXLD98i4FnR0KFiNgzN4f0uFvzzSAu65QyY3N01I+dvuvjr1xT3cIg40w2C8rAITBfuPDeawYR24E3c7ijluzijYmP/mi+Xqd5cmiUuaeRcE0dxbTZrGy1phzSNijSK503d4MAtJrs+QIezNICxj3rvBk0uB9NXJ/JX6LpjTKtTqbqJU72O6mMa2Opt1NQ/nYvY1z730UbaJ1gIstkLuXqdCOCzwp0JsvRM6jqYuMnk8AZK7jdj0BEJKBk46TO5seL8XWbW76EDfQjLi/QBdalOkpX2X/htSksHCI9RSkJoXde3CDEVKTwvyGMxmcyeBMBlMNzmTEMKZiCCp9NS/A+owUrX1MkIi1hm3AcD0J/rOY7cZwUorYg4BsP+4kkzp3EmfXnSSeM3GN11O8YjkoctxelPPjfRh+YR8v809psvhKo/YtkVK5CleMRU4BS7mf4n/u8vQu/m8rMDoWqNACkZVtKfAmpQ/fSB60hrToVl7PjiFbeSuS0juhmBVq5Q7yPP69TnLKxjjR9Dx2ylN4HiK2/VLeLV0kT1xh9Colf7eH+FEqVveSoFYsG4v3zyt6n5w4fOpcpEIrREy7pch7+k/O4y+E9GqeBO0jRKFU3a4pLVL/oEV8DXnXFJEyVUwr3buWeelnpEWwY69uwWH99F8Ob3aXGvbRTdh2gO+cAe2+PkgFID8xnCgXHoPNA0LxgcGuhkNR/SHXpxWFrHerYq/5W7YbtHPPdX4HQdNmRNfmWvoQp5QnPotpdpRnSTLsoVzxuoFUK547Tn/JeVdLUvHmaSlfwQzWdvaxL/+WBus045H4OjxGvXIUnqd4Pe7Y4mdOudbFn6aG0jU+S+EkaO+z52XQ/VkqyVF4lm12xwNt774T8zRUL1wFyZZ3hOTj/Be7lqeCy3Z9FJpNxsQygmj5rq3pMqUoTOJylcVUXVoonaN+Uda53EUx2WHM/7xx11Do0a2/lV+q/qCkHzxVSbI8/PQTmWd0+7YVF/qFKdi42zqdYGUYs/kOmbuckPKyw2kl9CtXQR9tmBOrVwE+Gn5ZiimiH4EKGmhbgUlV6F9JLqqE3mRqPBCVr9N9uhZEgnZZum25jXXZvPqcJuvWOzdKxXZvjWkIZWptqAYvlr3NcrLMD7/8kt2k8RPrc0JPeNh6qOjr8DnprGfCZmo2SAU1NmxNVHQmsQGQrenan8eBoMIGrIaKtg5hr6uaf8VZ7MfzQqSQvgatSHeNeRI+EYdVKX061Ng1jHwF/Uj4gonXT4ZVQ9VAQUcKMG2soTibBhGvwqTDPZly/b4v58/c2eR6naZMGRUvRLA0dF0UepX2qkoyfKAKvA6bGAFWND0yZcjSe6AaqIw+oUxy8lWUW24OVonXGW8tdZTg+DAVUOlLIo6wkjVUYPnwtVHoXT1UVpbnQ1VBwT5S66x5ypAh5jiuWrTC6UNvhk8cVPzq2aoKDTcdEZZ1bo50WPrUjSQSz9G9b6k6SN0olyxZ45G3gOSN0eZ0szQUrnD8oCpcrGNqFaPwHOWv/Xx4ZqXHQbmLE3iYmiQotFFibbOpwa5oQdDoE6JxiSRXCaklkmzRg7KmWpL2wprDwgdlzb7w3ljTLEb3ZQKx8AbnFOfSafMj2cgs/xFLeNmlOBWfZdzgxg1u3ODejgdNy/Ox9oJxj36tW6Fxq3KsQ6inPec4lTn2QaR/Sz9ufY51HPViNhmnKsc+hDTapcatyLEOIK0mQHShkXahPmyt6Ewj7UyI1HsUscF8F+x2tJpbwubuNeHy/qdTezlpv0PvvWs1pMsXpvHgdD/yR5VGmiEkoFmWpD+uSEaPPpU6OO0oQaGNSEV5LP3NpKK87BBGlx2SC8n0kredTE9TehdNY097Qs5LSxCLSLnnFikXkWYRaRaRZhFp9m1Fmn37Eb6n9d5oxQqweL15WW00NzvRP/LFvHxbft+6eNElQvfe4WQVhFuoo3gF81QnswpusyCvLg41JXqKVgvSOE3p6EYIIY1MsNIla7wLJSUZmWC7lAg44nxZFmPIgPq60ywSriOdjkJn02xEGScHMc602qnQicbaiXSu+TH/FX5v/Je/3X58/+Hbx6ZEGMVr69BIVP5TJs9pa/KJH3YfDvahgXO34E+E57lpDZgg9nuF7iqmMtBsrEPPMiqX02MXU7uzUym4BvMZzGcwn13OcB7rHIkVbz+5Oc2aDMENqeCgf8zMmJkxM2Nmxsy8N438KmtY3hT8+Uiyx8qkEEZTb+LPjCkNotA2qTch1DBNz4ymtulP3OLv2E9jfm9xSeY/AxI8xsuHn9lzltPFzyc2vgop8e/W//31v+h6tyY=
\ No newline at end of file
diff --git a/docs/tech/1.configuration/classes/Configuration.md b/docs/tech/1.configuration/classes/Configuration.md
index aaa97409..d62e9a5d 100644
--- a/docs/tech/1.configuration/classes/Configuration.md
+++ b/docs/tech/1.configuration/classes/Configuration.md
@@ -39,12 +39,18 @@ final class Configuration
-
getCacheDir
+-
+ getConfigurationVersion
+
-
getDocGenLibDir
-
getGitClientPath
+-
+ getIfExists
+
-
getLanguageHandlersCollection
@@ -153,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame
```php
@@ -187,7 +193,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad
```php
@@ -208,6 +214,27 @@ public function getCacheDir(): string|null;
+
+
+
+
+
+
+```php
+public function getConfigurationVersion(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
@@ -215,7 +242,7 @@ public function getCacheDir(): string|null;
```php
@@ -236,7 +263,7 @@ public function getDocGenLibDir(): string;
```php
@@ -250,6 +277,51 @@ public function getGitClientPath(): string;
Return value: string
+
Throws:
+
+
+
+
+
+
+
+
+```php
+public function getIfExists(mixed $key): string|null;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ mixed |
+ - |
+
+
+
+
+
Return value: string |
null
+
+
Throws:
-
@@ -264,7 +336,7 @@ public function getGitClientPath(): string;
```php
@@ -298,7 +370,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L
```php
@@ -326,7 +398,7 @@ public function getOutputDir(): string;
```php
@@ -354,7 +426,7 @@ public function getOutputDirBaseUrl(): string;
```php
@@ -388,7 +460,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc
```php
@@ -422,7 +494,7 @@ public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection;
```php
@@ -450,7 +522,7 @@ public function getProjectRoot(): string;
```php
@@ -484,7 +556,7 @@ public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\Sou
```php
@@ -512,7 +584,7 @@ public function getTemplatesDir(): string;
```php
@@ -546,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom
```php
@@ -580,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu
```php
@@ -608,7 +680,7 @@ public function getWorkingDir(): string;
```php
@@ -636,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool;
```php
diff --git a/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md b/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md
index fd7a969f..6759727b 100644
--- a/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md
+++ b/docs/tech/1.configuration/classes/DocumentedEntityWrappersCollection.md
@@ -2,7 +2,7 @@
@@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
```php
-public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
+public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
```
@@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
$localObjectCache |
\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache |
- |
+
+
+ $breadcrumbsHelper |
+ \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper |
+ - |
$pluginEventDispatcher |
@@ -107,7 +112,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
```php
@@ -134,7 +139,7 @@ public function count(): int;
```php
@@ -165,6 +170,13 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En
Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper
+Throws:
+
+
@@ -172,7 +184,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En
```php
@@ -193,7 +205,7 @@ public function getDocumentedEntitiesRelations(): array;
```php
diff --git a/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md b/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md
index 5a6f875c..2a57a65e 100644
--- a/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md
+++ b/docs/tech/1.configuration/classes/GetDocumentedEntityUrl.md
@@ -25,7 +25,7 @@ See:
-
\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection
-
- \BumbleDocGen\Core\Renderer\Context\RendererContext::$entityWrappersCollection
+
\BumbleDocGen\Core\Renderer\Context\RendererContext::$entityWrappersCollection
diff --git a/docs/tech/1.configuration/classes/StrTypeToUrl.md b/docs/tech/1.configuration/classes/StrTypeToUrl.md
index cc710cab..cda69c1d 100644
--- a/docs/tech/1.configuration/classes/StrTypeToUrl.md
+++ b/docs/tech/1.configuration/classes/StrTypeToUrl.md
@@ -2,7 +2,7 @@
@@ -77,7 +77,7 @@ See:
```php
@@ -124,7 +124,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $renderer
```php
@@ -170,22 +170,6 @@ public function __invoke(string $text, \BumbleDocGen\Core\Parser\Entity\RootEnti
Return value: string
-
Throws:
-
-
@@ -193,7 +177,7 @@ public function __invoke(string $text, \BumbleDocGen\Core\Parser\Entity\RootEnti
```php
@@ -214,7 +198,7 @@ public static function getName(): string;
```php
diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md
index 15428d00..d9796223 100644
--- a/docs/tech/1.configuration/readme.md
+++ b/docs/tech/1.configuration/readme.md
@@ -222,4 +222,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/2.parser/classes/ClassEntity.md b/docs/tech/2.parser/classes/ClassEntity.md
index 248a7bec..72861a06 100644
--- a/docs/tech/2.parser/classes/ClassEntity.md
+++ b/docs/tech/2.parser/classes/ClassEntity.md
@@ -2,7 +2,7 @@
@@ -249,6 +249,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
-
isEnum
+-
+ isExternalLibraryEntity
+ - The entity is loaded from a third party library and should not be treated the same as a standard one
-
isInGit
- Checking if class file is in git repository
@@ -273,6 +276,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
-
reloadEntityDependenciesCache
+-
+ removeEntityValueFromCache
+
-
removeNotUsedEntityDataCache
@@ -294,11 +300,11 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
```php
-public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper $reflector, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName);
+public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper $reflector, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser $composerParser, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName);
```
@@ -338,6 +344,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
$parserHelper |
\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper |
- |
+
+
+ $composerParser |
+ \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser |
+ - |
$localObjectCache |
@@ -371,7 +382,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -430,7 +441,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu
```php
@@ -461,7 +472,7 @@ public function documentCreationAllowed(): bool;
```php
@@ -494,7 +505,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -516,6 +527,9 @@ public function entityDataCanBeLoaded(): bool;
-
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+-
+ \Exception
+
@@ -525,7 +539,7 @@ public function entityDataCanBeLoaded(): bool;
```php
@@ -555,11 +569,11 @@ public function getAbsoluteFileName(): string|null;
```php
-// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
public function getCacheKey(): string;
```
@@ -578,7 +592,7 @@ public function getCacheKey(): string;
```php
@@ -608,7 +622,7 @@ public function getCachedEntityDependencies(): array;
```php
@@ -639,7 +653,7 @@ public function getCasesNames(): array;
```php
@@ -687,7 +701,7 @@ public function getConstant(string $name): string|array|int|bool|null|float;
```php
@@ -746,7 +760,7 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): \B
```php
@@ -783,7 +797,7 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php
```php
@@ -814,7 +828,7 @@ public function getConstants(): array;
```php
@@ -845,7 +859,7 @@ public function getConstantsData(): array;
```php
@@ -882,7 +896,7 @@ public function getDescription(): string;
```php
@@ -915,7 +929,7 @@ public function getDescriptionLinks(): array;
```php
@@ -952,7 +966,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock;
```php
@@ -985,7 +999,7 @@ public function getDocComment(): string;
```php
@@ -1022,7 +1036,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -1045,7 +1059,7 @@ public function getDocNote(): string;
```php
@@ -1076,7 +1090,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En
```php
@@ -1107,7 +1121,7 @@ public function getEndLine(): int;
```php
@@ -1128,7 +1142,7 @@ public function getEntityDependencies(): array;
```php
@@ -1151,7 +1165,7 @@ public function getExamples(): array;
```php
@@ -1182,7 +1196,7 @@ public function getExtends(): string|null;
```php
@@ -1210,7 +1224,7 @@ public function getFileContent(): string;
```php
@@ -1231,7 +1245,7 @@ public function getFileName(): string|null;
```php
@@ -1278,7 +1292,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -1301,7 +1315,7 @@ public function getFirstExample(): string;
```php
@@ -1332,7 +1346,7 @@ public function getFullFileName(): string|null;
```php
@@ -1363,7 +1377,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
```php
@@ -1394,7 +1408,7 @@ public function getInterfaceNames(): array;
```php
@@ -1425,7 +1439,7 @@ public function getInterfacesEntities(): array;
```php
@@ -1456,7 +1470,7 @@ public function getInterfacesString(): string;
```php
@@ -1515,7 +1529,7 @@ public function getMethodEntity(string $methodName, bool $unsafe = true): \Bumbl
```php
@@ -1552,7 +1566,7 @@ public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\P
```php
@@ -1583,7 +1597,7 @@ public function getMethodsData(): array;
```php
@@ -1614,7 +1628,7 @@ public function getModifiersString(): string;
```php
@@ -1635,7 +1649,7 @@ public function getName(): string;
```php
@@ -1666,7 +1680,7 @@ public function getNamespaceName(): string;
```php
@@ -1687,7 +1701,7 @@ public function getObjectId(): string;
```php
@@ -1718,7 +1732,7 @@ public function getParentClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entit
```php
@@ -1749,7 +1763,7 @@ public function getParentClassName(): string|null;
```php
@@ -1780,7 +1794,7 @@ public function getParentClassNames(): array;
```php
@@ -1801,7 +1815,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa
```php
@@ -1839,7 +1853,7 @@ public function getPluginData(string $pluginKey): array|null;
```php
@@ -1870,7 +1884,7 @@ public function getPropertiesData(): array;
```php
@@ -1929,7 +1943,7 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): \B
```php
@@ -1966,7 +1980,7 @@ public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php
```php
@@ -1987,7 +2001,7 @@ public function getReflector(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\
```php
@@ -2035,7 +2049,7 @@ public function getRelativeFileName(bool $loadIfEmpty = true): string|null;
```php
@@ -2056,7 +2070,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par
```php
@@ -2077,7 +2091,7 @@ public function getShortName(): string;
```php
@@ -2108,7 +2122,7 @@ public function getStartLine(): int;
```php
@@ -2141,7 +2155,7 @@ public function getThrows(): array;
```php
@@ -2172,7 +2186,7 @@ public function getTraitsNames(): array;
```php
@@ -2210,7 +2224,7 @@ public function hasAnnotationKey(string $annotationKey): bool;
```php
@@ -2258,7 +2272,7 @@ public function hasConstant(string $constant): bool;
```php
@@ -2288,7 +2302,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -2311,7 +2325,7 @@ public function hasExamples(): bool;
```php
@@ -2359,7 +2373,7 @@ public function hasMethod(string $method): bool;
```php
@@ -2407,7 +2421,7 @@ public function hasParentClass(string $parentClassName): bool;
```php
@@ -2455,7 +2469,7 @@ public function hasProperty(string $property): bool;
```php
@@ -2478,7 +2492,7 @@ public function hasThrows(): bool;
```php
@@ -2509,7 +2523,7 @@ public function hasTraits(): bool;
```php
@@ -2557,7 +2571,7 @@ public function implementsInterface(string $interfaceName): bool;
```php
@@ -2588,7 +2602,7 @@ public function isAbstract(): bool;
```php
@@ -2609,7 +2623,7 @@ public function isClassLoad(): bool;
```php
@@ -2632,7 +2646,7 @@ public function isDeprecated(): bool;
```php
@@ -2662,7 +2676,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -2695,7 +2709,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -2733,7 +2747,7 @@ public static function isEntityNameValid(string $entityName): bool;
```php
@@ -2757,6 +2771,27 @@ public function isEnum(): bool;
+
+
+
+
+
+
+```php
+public function isExternalLibraryEntity(): bool;
+```
+
+
The entity is loaded from a third party library and should not be treated the same as a standard one
+
+
Parameters: not specified
+
+
Return value: bool
+
+
@@ -2764,7 +2799,7 @@ public function isEnum(): bool;
```php
@@ -2795,7 +2830,7 @@ public function isInGit(): bool;
```php
@@ -2826,7 +2861,7 @@ public function isInstantiable(): bool;
```php
@@ -2857,7 +2892,7 @@ public function isInterface(): bool;
```php
@@ -2880,7 +2915,7 @@ public function isInternal(): bool;
```php
@@ -2928,7 +2963,7 @@ public function isSubclassOf(string $className): bool;
```php
@@ -2959,7 +2994,7 @@ public function isTrait(): bool;
```php
@@ -3002,20 +3037,20 @@ public function loadPluginData(string $pluginKey, array $data): void;
```php
// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-
Return value: void
+
Return value: array
Throws:
@@ -3025,6 +3060,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -3032,7 +3107,7 @@ public function reloadEntityDependenciesCache(): void;
```php
@@ -3062,7 +3137,7 @@ public function removeNotUsedEntityDataCache(): void;
```php
diff --git a/docs/tech/2.parser/classes/ConstantEntity.md b/docs/tech/2.parser/classes/ConstantEntity.md
index cfb51506..4c4312f3 100644
--- a/docs/tech/2.parser/classes/ConstantEntity.md
+++ b/docs/tech/2.parser/classes/ConstantEntity.md
@@ -147,6 +147,9 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
-
reloadEntityDependenciesCache
+
-
+ removeEntityValueFromCache
+
-
removeNotUsedEntityDataCache
@@ -237,7 +240,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -270,7 +273,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -300,11 +303,11 @@ public function getAbsoluteFileName(): string|null;
```php
-// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
public function getCacheKey(): string;
```
@@ -323,7 +326,7 @@ public function getCacheKey(): string;
```php
@@ -384,7 +387,7 @@ public function getDescription(): string;
```php
@@ -448,7 +451,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock;
```php
@@ -502,7 +505,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -556,7 +559,7 @@ public function getEndLine(): int;
```php
@@ -610,7 +613,7 @@ public function getFileName(): string|null;
```php
@@ -657,7 +660,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -805,7 +808,7 @@ public function getNamespaceName(): string;
```php
@@ -943,7 +946,7 @@ public function getStartLine(): int;
```php
@@ -976,7 +979,7 @@ public function getThrows(): array;
```php
@@ -1006,7 +1009,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -1029,7 +1032,7 @@ public function hasExamples(): bool;
```php
@@ -1052,7 +1055,7 @@ public function hasThrows(): bool;
```php
@@ -1075,7 +1078,7 @@ public function isDeprecated(): bool;
```php
@@ -1105,7 +1108,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -1138,7 +1141,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -1254,20 +1257,20 @@ public function isPublic(): bool;
```php
// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-
Return value: void
+
Return value: array
Throws:
@@ -1277,6 +1280,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -1284,7 +1327,7 @@ public function reloadEntityDependenciesCache(): void;
```php
diff --git a/docs/tech/2.parser/classes/InvalidConfigurationParameterException_2.md b/docs/tech/2.parser/classes/InvalidConfigurationParameterException_2.md
deleted file mode 100644
index aacfc757..00000000
--- a/docs/tech/2.parser/classes/InvalidConfigurationParameterException_2.md
+++ /dev/null
@@ -1,391 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Core\Configuration\Exception;
-
-final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable
-```
-
-
Exception is the base class for
-all Exceptions.
-
-See:
-
-
-
-
-
-
-
-
Initialization methods:
-
-
--
- __construct
- - Construct the exception. Note: The message is NOT binary safe.
-
-
-
Methods:
-
-
--
- __toString
- - String representation of the exception
--
- __wakeup
-
--
- getCode
- - Gets the Exception code
--
- getFile
- - Gets the file in which the exception occurred
--
- getLine
- - Gets the line in which the exception occurred
--
- getMessage
- - Gets the Exception message
--
- getPrevious
- - Returns previous Exception
--
- getTrace
- - Gets the stack trace
--
- getTraceAsString
- - Gets the stack trace as a string
-
-
-
-
-
-
-
-
-
Method details:
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __construct(string $message = "", int $code, \Throwable|null $previous = \null);
-```
-
-
Construct the exception. Note: The message is NOT binary safe.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $message |
- string |
- [optional] The Exception message to throw. |
-
-
- $code |
- int |
- [optional] The Exception code. |
-
-
- $previous |
- \Throwable | null |
- [optional] The previous throwable used for the exception chaining. |
-
-
-
-
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __toString(): string;
-```
-
-
String representation of the exception
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __wakeup(): mixed;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getCode(): mixed|int;
-```
-
-
Gets the Exception code
-
-
Parameters: not specified
-
-
Return value: mixed |
int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getFile(): string;
-```
-
-
Gets the file in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getLine(): int;
-```
-
-
Gets the line in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getMessage(): string;
-```
-
-
Gets the Exception message
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getPrevious(): \Throwable|null;
-```
-
-
Returns previous Exception
-
-
Parameters: not specified
-
-
Return value: \Throwable |
null
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getTrace(): array;
-```
-
-
Gets the stack trace
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
See:
-
-
-
-
-
-
-- #
- getTraceAsString
-
-
-
-```php
-// Implemented in Exception
-
-public function getTraceAsString(): string;
-```
-
-
Gets the stack trace as a string
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/2.parser/classes/LocatedInCondition.md b/docs/tech/2.parser/classes/LocatedInCondition.md
index e71384a0..928c362e 100644
--- a/docs/tech/2.parser/classes/LocatedInCondition.md
+++ b/docs/tech/2.parser/classes/LocatedInCondition.md
@@ -132,7 +132,7 @@ public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterf
Throws:
diff --git a/docs/tech/2.parser/classes/LocatedNotInCondition.md b/docs/tech/2.parser/classes/LocatedNotInCondition.md
index d9e0eef3..2becdf60 100644
--- a/docs/tech/2.parser/classes/LocatedNotInCondition.md
+++ b/docs/tech/2.parser/classes/LocatedNotInCondition.md
@@ -132,7 +132,7 @@ public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterf
Throws:
diff --git a/docs/tech/2.parser/classes/MethodEntity.md b/docs/tech/2.parser/classes/MethodEntity.md
index d9f75e11..5e958af8 100644
--- a/docs/tech/2.parser/classes/MethodEntity.md
+++ b/docs/tech/2.parser/classes/MethodEntity.md
@@ -201,6 +201,9 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
-
reloadEntityDependenciesCache
+
-
+ removeEntityValueFromCache
+
-
removeNotUsedEntityDataCache
@@ -296,7 +299,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -329,7 +332,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -359,7 +362,7 @@ public function getAbsoluteFileName(): string|null;
```php
@@ -390,11 +393,11 @@ public function getBodyCode(): string;
```php
-// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
public function getCacheKey(): string;
```
@@ -413,7 +416,7 @@ public function getCacheKey(): string;
```php
@@ -443,7 +446,7 @@ public function getCachedEntityDependencies(): array;
```php
@@ -480,7 +483,7 @@ public function getDescription(): string;
```php
@@ -567,7 +570,7 @@ public function getDocBlock(bool $recursive = true): \phpDocumentor\Reflection\D
```php
@@ -635,7 +638,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -666,7 +669,7 @@ public function getDocCommentLine(): int|null;
```php
@@ -703,7 +706,7 @@ public function getDocCommentLineRecursive(): int|null;
```php
@@ -740,7 +743,7 @@ public function getDocCommentRecursive(): string;
```php
@@ -763,7 +766,7 @@ public function getDocNote(): string;
```php
@@ -794,7 +797,7 @@ public function getEndLine(): int;
```php
@@ -817,7 +820,7 @@ public function getExamples(): array;
```php
@@ -848,7 +851,7 @@ public function getFileName(): string|null;
```php
@@ -895,7 +898,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -918,7 +921,7 @@ public function getFirstExample(): string;
```php
@@ -970,7 +973,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser
```php
@@ -1022,7 +1025,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
```php
@@ -1053,7 +1056,7 @@ public function getModifiersString(): string;
```php
@@ -1105,7 +1108,7 @@ public function getNamespaceName(): string;
```php
@@ -1128,7 +1131,7 @@ public function getObjectId(): string;
```php
@@ -1168,7 +1171,7 @@ public function getParameters(): array;
```php
@@ -1226,7 +1229,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa
```php
@@ -1263,7 +1266,7 @@ public function getPrototype(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\
```php
@@ -1363,7 +1366,7 @@ public function getShortName(): string;
```php
@@ -1400,7 +1403,7 @@ public function getSignature(): string;
```php
@@ -1431,7 +1434,7 @@ public function getStartColumn(): int;
```php
@@ -1462,7 +1465,7 @@ public function getStartLine(): int;
```php
@@ -1495,7 +1498,7 @@ public function getThrows(): array;
```php
@@ -1525,7 +1528,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -1548,7 +1551,7 @@ public function hasExamples(): bool;
```php
@@ -1571,7 +1574,7 @@ public function hasThrows(): bool;
```php
@@ -1592,7 +1595,7 @@ public function isConstructor(): bool;
```php
@@ -1615,7 +1618,7 @@ public function isDeprecated(): bool;
```php
@@ -1636,7 +1639,7 @@ public function isDynamic(): bool;
```php
@@ -1666,7 +1669,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -1699,7 +1702,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -1720,7 +1723,7 @@ public function isImplementedInParentClass(): bool;
```php
@@ -1757,7 +1760,7 @@ public function isInitialization(): bool;
```php
@@ -1780,7 +1783,7 @@ public function isInternal(): bool;
```php
@@ -1811,7 +1814,7 @@ public function isPrivate(): bool;
```php
@@ -1842,7 +1845,7 @@ public function isProtected(): bool;
```php
@@ -1873,7 +1876,7 @@ public function isPublic(): bool;
```php
@@ -1904,7 +1907,7 @@ public function isStatic(): bool;
```php
@@ -1942,20 +1945,20 @@ public static function parseAnnotationParams(array $params): array;
```php
// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-
Return value: void
+
Return value: array
Throws:
@@ -1965,6 +1968,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -1972,7 +2015,7 @@ public function reloadEntityDependenciesCache(): void;
```php
diff --git a/docs/tech/2.parser/classes/PropertyEntity.md b/docs/tech/2.parser/classes/PropertyEntity.md
index 71088233..617c0494 100644
--- a/docs/tech/2.parser/classes/PropertyEntity.md
+++ b/docs/tech/2.parser/classes/PropertyEntity.md
@@ -159,6 +159,9 @@ class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
-
reloadEntityDependenciesCache
+
-
+ removeEntityValueFromCache
+
-
removeNotUsedEntityDataCache
@@ -249,7 +252,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -282,7 +285,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -312,11 +315,11 @@ public function getAbsoluteFileName(): string|null;
```php
-// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
public function getCacheKey(): string;
```
@@ -335,7 +338,7 @@ public function getCacheKey(): string;
```php
@@ -365,7 +368,7 @@ public function getCachedEntityDependencies(): array;
```php
@@ -396,7 +399,7 @@ public function getDefaultValue(): string|array|int|bool|null|float;
```php
@@ -433,7 +436,7 @@ public function getDescription(): string;
```php
@@ -503,7 +506,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock;
```php
@@ -573,7 +576,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -596,7 +599,7 @@ public function getDocNote(): string;
```php
@@ -627,7 +630,7 @@ public function getEndLine(): int;
```php
@@ -650,7 +653,7 @@ public function getExamples(): array;
```php
@@ -681,7 +684,7 @@ public function getFileName(): string|null;
```php
@@ -728,7 +731,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -751,7 +754,7 @@ public function getFirstExample(): string;
```php
@@ -772,7 +775,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser
```php
@@ -824,7 +827,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
```php
@@ -861,7 +864,7 @@ public function getModifiersString(): string;
```php
@@ -882,7 +885,7 @@ public function getName(): string;
```php
@@ -913,7 +916,7 @@ public function getNamespaceName(): string;
```php
@@ -999,7 +1002,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par
```php
@@ -1020,7 +1023,7 @@ public function getShortName(): string;
```php
@@ -1051,7 +1054,7 @@ public function getStartLine(): int;
```php
@@ -1084,7 +1087,7 @@ public function getThrows(): array;
```php
@@ -1121,7 +1124,7 @@ public function getType(): string;
```php
@@ -1151,7 +1154,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -1174,7 +1177,7 @@ public function hasExamples(): bool;
```php
@@ -1197,7 +1200,7 @@ public function hasThrows(): bool;
```php
@@ -1220,7 +1223,7 @@ public function isDeprecated(): bool;
```php
@@ -1250,7 +1253,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -1283,7 +1286,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -1304,7 +1307,7 @@ public function isImplementedInParentClass(): bool;
```php
@@ -1327,7 +1330,7 @@ public function isInternal(): bool;
```php
@@ -1358,7 +1361,7 @@ public function isPrivate(): bool;
```php
@@ -1389,7 +1392,7 @@ public function isProtected(): bool;
```php
@@ -1420,20 +1423,20 @@ public function isPublic(): bool;
```php
// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-
Return value: void
+
Return value: array
Throws:
@@ -1443,6 +1446,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -1450,7 +1493,7 @@ public function reloadEntityDependenciesCache(): void;
```php
diff --git a/docs/tech/2.parser/classes/ReflectionException.md b/docs/tech/2.parser/classes/ReflectionException.md
index 484bd11f..3447c81b 100644
--- a/docs/tech/2.parser/classes/ReflectionException.md
+++ b/docs/tech/2.parser/classes/ReflectionException.md
@@ -1,5 +1,5 @@
-
+
ReflectionException class:
diff --git a/docs/tech/2.parser/classes/RootEntityInterface.md b/docs/tech/2.parser/classes/RootEntityInterface.md
index 66a1490f..420020ae 100644
--- a/docs/tech/2.parser/classes/RootEntityInterface.md
+++ b/docs/tech/2.parser/classes/RootEntityInterface.md
@@ -1,5 +1,5 @@
-
+
RootEntityInterface class:
@@ -63,6 +63,9 @@ their entities need to correspond to the same interfaces
-
isEntityNameValid
- Check if entity name is valid
+
-
+ isExternalLibraryEntity
+ - The entity is loaded from a third party library and should not be treated the same as a standard one
-
isInGit
- The entity file is in the git repository
@@ -148,7 +151,7 @@ public function getAbsoluteFileName(): string|null;
```php
@@ -169,7 +172,7 @@ public function getEntityDependencies(): array;
```php
@@ -213,7 +216,7 @@ public function getFileName(): string|null;
```php
@@ -374,6 +377,27 @@ public static function isEntityNameValid(string $entityName): bool;
Return value: bool
+
+
+
+
+
+
+```php
+public function isExternalLibraryEntity(): bool;
+```
+
+
The entity is loaded from a third party library and should not be treated the same as a standard one
+
+
Parameters: not specified
+
+
Return value: bool
+
+
@@ -381,7 +405,7 @@ public static function isEntityNameValid(string $entityName): bool;
```php
diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md
index 9ad24f95..b3230099 100644
--- a/docs/tech/2.parser/entity.md
+++ b/docs/tech/2.parser/entity.md
@@ -123,4 +123,4 @@ These classes are a convenient wrapper for accessing data in templates:
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md
index 72619891..6c18390d 100644
--- a/docs/tech/2.parser/entityFilterCondition.md
+++ b/docs/tech/2.parser/entityFilterCondition.md
@@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md
index e359c9f0..9d462717 100644
--- a/docs/tech/2.parser/readme.md
+++ b/docs/tech/2.parser/readme.md
@@ -41,4 +41,4 @@ In this section, we show how the parser works and what components it consists of
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/2.parser/sourceLocator.md b/docs/tech/2.parser/sourceLocator.md
index df7da3c3..c7cae9be 100644
--- a/docs/tech/2.parser/sourceLocator.md
+++ b/docs/tech/2.parser/sourceLocator.md
@@ -30,4 +30,4 @@ You can create your own source locators or use any existing ones. All source loc
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/01_templates.md b/docs/tech/3.renderer/01_templates.md
index 4e9dcb57..72ce1bb5 100644
--- a/docs/tech/3.renderer/01_templates.md
+++ b/docs/tech/3.renderer/01_templates.md
@@ -101,4 +101,4 @@ Result after starting the documentation generation process:
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Fri Oct 13 18:40:45 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Fri Oct 13 18:40:45 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/02_breadcrumbs.md b/docs/tech/3.renderer/02_breadcrumbs.md
index b979e42c..38a39bce 100644
--- a/docs/tech/3.renderer/02_breadcrumbs.md
+++ b/docs/tech/3.renderer/02_breadcrumbs.md
@@ -51,4 +51,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function:
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/03_documentStructure.md b/docs/tech/3.renderer/03_documentStructure.md
index 158325da..f7a420ff 100644
--- a/docs/tech/3.renderer/03_documentStructure.md
+++ b/docs/tech/3.renderer/03_documentStructure.md
@@ -19,4 +19,4 @@ plugins:
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Fri Oct 13 18:40:45 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Fri Oct 13 18:40:45 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/04_twigCustomFilters.md b/docs/tech/3.renderer/04_twigCustomFilters.md
index ac2c586a..cb110aaa 100644
--- a/docs/tech/3.renderer/04_twigCustomFilters.md
+++ b/docs/tech/3.renderer/04_twigCustomFilters.md
@@ -263,4 +263,4 @@ Here is a list of filters available by default:
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/05_twigCustomFunctions.md b/docs/tech/3.renderer/05_twigCustomFunctions.md
index 5b2947ed..9a0db2a5 100644
--- a/docs/tech/3.renderer/05_twigCustomFunctions.md
+++ b/docs/tech/3.renderer/05_twigCustomFunctions.md
@@ -177,7 +177,7 @@ Here is a list of functions available by default:
- getDocumentationPageUrl
+ getDocumentationPageUrl
Creates an entity link by object
|
@@ -193,7 +193,7 @@ Here is a list of functions available by default:
|
- getDocumentedEntityUrl
+ getDocumentedEntityUrl
Get the URL of a documented entity by its name. If the entity is found, next to the file where this method was called, the `EntityDocRendererInterface::getDocFileExtension()` directory will be created, in which the documented entity file will be created
:warning: This function initiates the creation of documents for the displayed entities |
@@ -385,4 +385,4 @@ Here is a list of functions available by default:
- Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com> Last modified date: Sat Oct 28 11:03:31 2023 +0300 Page content update date: Tue Oct 31 2023 Made with Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com> Last modified date: Sat Oct 28 11:03:31 2023 +0300 Page content update date: Mon Nov 06 2023 Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md
index b9f31d6e..3559f4cc 100644
--- a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md
+++ b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md
@@ -42,6 +42,9 @@ final class BreadcrumbsHelper
-
getBreadcrumbsForTemplates
+-
+ getNearestIndexFile
+
-
getPageDataByKey
@@ -139,7 +142,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -162,7 +165,7 @@ public function getAllPageLinks(): array;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -173,7 +176,7 @@ public function getAllPageLinks(): array;
```php
@@ -218,7 +221,7 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -229,7 +232,7 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr
```php
@@ -274,7 +277,52 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
+
+
+
+
+
+
+
+
+```php
+public function getNearestIndexFile(string $templateName): string;
+```
+
+
+
+ Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $templateName |
+ string |
+ - |
+
+
+
+
+ Return value: string
+
+
+ Throws:
+
@@ -285,7 +333,7 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent
```php
@@ -322,7 +370,7 @@ public function getPageDataByKey(string $key): array|null;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
@@ -336,7 +384,7 @@ public function getPageDataByKey(string $key): array|null;
```php
@@ -373,7 +421,7 @@ public function getPageDocFileByKey(string $key): string|null;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
@@ -387,7 +435,7 @@ public function getPageDocFileByKey(string $key): string|null;
```php
@@ -424,7 +472,7 @@ public function getPageLinkByKey(string $key): string|null;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
@@ -438,7 +486,7 @@ public function getPageLinkByKey(string $key): string|null;
```php
@@ -472,7 +520,7 @@ public function getTemplateLinkKey(string $templateName): string|null;
Throws:
@@ -483,7 +531,7 @@ public function getTemplateLinkKey(string $templateName): string|null;
```php
@@ -517,7 +565,7 @@ public function getTemplateTitle(string $templateName): string;
Throws:
@@ -539,7 +587,7 @@ $breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true
```php
@@ -598,7 +646,7 @@ public function renderBreadcrumbs(string $currentPageTitle, string $filePatch, b
\Twig\Error\LoaderError
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/ClassEntityCollection_2.md b/docs/tech/3.renderer/classes/ClassEntityCollection_2.md
index 78de16c9..b8e21b37 100644
--- a/docs/tech/3.renderer/classes/ClassEntityCollection_2.md
+++ b/docs/tech/3.renderer/classes/ClassEntityCollection_2.md
@@ -254,10 +254,10 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity
Throws:
@@ -325,10 +325,10 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan
Throws:
@@ -411,10 +411,10 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen
Throws:
@@ -459,10 +459,10 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P
Throws:
@@ -749,7 +749,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit
See:
@@ -775,10 +775,10 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars
Throws:
@@ -806,10 +806,10 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\
Throws:
@@ -837,10 +837,10 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En
Throws:
@@ -868,10 +868,10 @@ public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity
Throws:
@@ -1125,10 +1125,10 @@ public function loadClassEntities(): void;
\DI\DependencyException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md b/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md
index 14cf61fa..9303aeb1 100644
--- a/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md
+++ b/docs/tech/3.renderer/classes/DocumentedEntityWrapper.md
@@ -1,5 +1,5 @@
-
+
DocumentedEntityWrapper class:
diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrapper_3.md b/docs/tech/3.renderer/classes/DocumentedEntityWrapper_3.md
deleted file mode 100644
index f7d977a4..00000000
--- a/docs/tech/3.renderer/classes/DocumentedEntityWrapper_3.md
+++ /dev/null
@@ -1,303 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Core\Renderer\Context;
-
-final class DocumentedEntityWrapper
-```
-
-Wrapper for the entity that was requested for documentation
-
-
-
-
-
-
-Initialization methods:
-
-
--
- __construct
-
-
-
-Methods:
-
-
--
- getDocRender
-
--
- getDocUrl
- - Get the relative path to the document to be generated
--
- getDocumentTransformableEntity
- - Get entity that is allowed to be documented
--
- getEntityName
-
--
- getFileName
- - The name of the file to be generated
--
- getKey
- - Get document key
--
- getParentDocFilePath
-
--
- setParentDocFilePath
-
-
-
-
-
-
-
-
-
-Method details:
-
-
-
-
-
-```php
-public function __construct(\BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface $documentTransformableEntity, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, string $parentDocFilePath);
-```
-
-
-
- Parameters:
-
-
-
-
-
-
-
-
-
-
-
-
-
-```php
-public function getDocUrl(): string;
-```
-
- Get the relative path to the document to be generated
-
- Parameters: not specified
-
- Return value: string
-
-
-
-
-
-
-
-
-
-
-```php
-public function getEntityName(): string;
-```
-
-
-
- Parameters: not specified
-
- Return value: string
-
-
-
-
-
-
-
-
-```php
-public function getFileName(): string;
-```
-
- The name of the file to be generated
-
- Parameters: not specified
-
- Return value: string
-
-
-
-
-
-
-
-
-```php
-public function getKey(): string;
-```
-
- Get document key
-
- Parameters: not specified
-
- Return value: string
-
-
-
-
-
-
-
-
-```php
-public function getParentDocFilePath(): string;
-```
-
-
-
- Parameters: not specified
-
- Return value: string
-
-
-
-
-
-
-
-
-```php
-public function setParentDocFilePath(string $parentDocFilePath): void;
-```
-
-
-
- Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $parentDocFilePath |
- string |
- - |
-
-
-
-
- Return value: void
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md
index a0475d57..d2cbd376 100644
--- a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md
+++ b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection.md
@@ -1,8 +1,8 @@
-
+
@@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
```php
-public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
+public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
```
@@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
$localObjectCache |
\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache |
- |
+ |
+
+ $breadcrumbsHelper |
+ \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper |
+ - |
$pluginEventDispatcher |
@@ -107,7 +112,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
```php
@@ -134,7 +139,7 @@ public function count(): int;
```php
@@ -165,6 +170,13 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En
Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper
+Throws:
+
+
@@ -172,7 +184,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En
```php
@@ -193,7 +205,7 @@ public function getDocumentedEntitiesRelations(): array;
```php
diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_3.md b/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_3.md
deleted file mode 100644
index 54a1ffda..00000000
--- a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_3.md
+++ /dev/null
@@ -1,226 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Core\Renderer\Context;
-
-final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Traversable, \Countable
-```
-
-
-
-
-
-
-
-
-
Initialization methods:
-
-
--
- __construct
-
-
-
-
Methods:
-
-
--
- count
- - Count elements of an object
--
- createAndAddDocumentedEntityWrapper
-
--
- getDocumentedEntitiesRelations
-
--
- getIterator
- - Retrieve an external iterator
-
-
-
-
-
-
-
-
-
Method details:
-
-
-
-
-
-```php
-public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
-```
-
-
-
-
Parameters:
-
-
-
-
-
-
-
-
-
-
-
-```php
-public function count(): int;
-```
-
-
Count elements of an object
-
-
Parameters: not specified
-
-
Return value: int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $rootEntity): \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper;
-```
-
-
-
-
Parameters:
-
-
-
-
Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper
-
-
-
-
-
-
-
-
-```php
-public function getDocumentedEntitiesRelations(): array;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
-
-
-
-
-```php
-public function getIterator(): \Generator;
-```
-
-
Retrieve an external iterator
-
-
Parameters: not specified
-
-
Return value: \Generator
-
-
-
Throws:
-
-
-
-
See:
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/DrawClassMap.md b/docs/tech/3.renderer/classes/DrawClassMap.md
index 1d07d031..84f0f7ed 100644
--- a/docs/tech/3.renderer/classes/DrawClassMap.md
+++ b/docs/tech/3.renderer/classes/DrawClassMap.md
@@ -165,13 +165,13 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEn
\DI\NotFoundException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -267,13 +267,13 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E
\DI\NotFoundException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/DrawDocumentationMenu.md b/docs/tech/3.renderer/classes/DrawDocumentationMenu.md
index 77fd7c92..39e7b383 100644
--- a/docs/tech/3.renderer/classes/DrawDocumentationMenu.md
+++ b/docs/tech/3.renderer/classes/DrawDocumentationMenu.md
@@ -21,7 +21,7 @@ and all links with this page are recursively collected for it, after which the h
See:
@@ -196,7 +196,7 @@ public function __invoke(string|null $startPageKey = null, int|null $maxDeep = n
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md b/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md
index 8355ffe1..21f61981 100644
--- a/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md
+++ b/docs/tech/3.renderer/classes/DrawDocumentedEntityLink.md
@@ -169,13 +169,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e
\DI\NotFoundException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md
index 7b7eee1e..b251ade9 100644
--- a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md
+++ b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs.md
@@ -175,7 +175,7 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s
\DI\NotFoundException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md
index 3060d122..cbfa1200 100644
--- a/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md
+++ b/docs/tech/3.renderer/classes/GeneratePageBreadcrumbs_2.md
@@ -175,7 +175,7 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s
\DI\NotFoundException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/GetClassMethodsBodyCode.md b/docs/tech/3.renderer/classes/GetClassMethodsBodyCode.md
index d73a9038..a34314a8 100644
--- a/docs/tech/3.renderer/classes/GetClassMethodsBodyCode.md
+++ b/docs/tech/3.renderer/classes/GetClassMethodsBodyCode.md
@@ -151,7 +151,7 @@ public function __invoke(string $className, array $methodsNames): string|null;
Throws:
diff --git a/docs/tech/3.renderer/classes/GetDocumentationPageUrl.md b/docs/tech/3.renderer/classes/GetDocumentationPageUrl.md
index c3abac92..026c1f00 100644
--- a/docs/tech/3.renderer/classes/GetDocumentationPageUrl.md
+++ b/docs/tech/3.renderer/classes/GetDocumentationPageUrl.md
@@ -177,7 +177,7 @@ public function __invoke(string $key): string;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
diff --git a/docs/tech/3.renderer/classes/GetDocumentationPageUrl_2.md b/docs/tech/3.renderer/classes/GetDocumentationPageUrl_2.md
index 18f74b4b..13464c1f 100644
--- a/docs/tech/3.renderer/classes/GetDocumentationPageUrl_2.md
+++ b/docs/tech/3.renderer/classes/GetDocumentationPageUrl_2.md
@@ -177,7 +177,7 @@ public function __invoke(string $key): string;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md
index 3c66c451..bfae4f01 100644
--- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md
+++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md
@@ -25,7 +25,7 @@ See:
-
\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection
-
- \BumbleDocGen\Core\Renderer\Context\RendererContext::$entityWrappersCollection
+
\BumbleDocGen\Core\Renderer\Context\RendererContext::$entityWrappersCollection
@@ -211,13 +211,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md
index dc59f8b2..2ce0dbe3 100644
--- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md
+++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md
@@ -21,11 +21,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create
See:
@@ -211,13 +211,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md
index d7fa2b43..94533a93 100644
--- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md
+++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md
@@ -1,5 +1,5 @@
-
+
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException.md
index e81d87c3..e5223cd5 100644
--- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException.md
+++ b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException.md
@@ -1,5 +1,5 @@
-
+
InvalidConfigurationParameterException class:
diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_2.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_2.md
deleted file mode 100644
index 53b4583e..00000000
--- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_2.md
+++ /dev/null
@@ -1,391 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Core\Configuration\Exception;
-
-final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable
-```
-
-Exception is the base class for
-all Exceptions.
-
-See:
-
-
-
-
-
-
-
-Initialization methods:
-
-
--
- __construct
- - Construct the exception. Note: The message is NOT binary safe.
-
-
-Methods:
-
-
--
- __toString
- - String representation of the exception
--
- __wakeup
-
--
- getCode
- - Gets the Exception code
--
- getFile
- - Gets the file in which the exception occurred
--
- getLine
- - Gets the line in which the exception occurred
--
- getMessage
- - Gets the Exception message
--
- getPrevious
- - Returns previous Exception
--
- getTrace
- - Gets the stack trace
--
- getTraceAsString
- - Gets the stack trace as a string
-
-
-
-
-
-
-
-
-Method details:
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __construct(string $message = "", int $code, \Throwable|null $previous = \null);
-```
-
-
Construct the exception. Note: The message is NOT binary safe.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $message |
- string |
- [optional] The Exception message to throw. |
-
-
- $code |
- int |
- [optional] The Exception code. |
-
-
- $previous |
- \Throwable | null |
- [optional] The previous throwable used for the exception chaining. |
-
-
-
-
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __toString(): string;
-```
-
-
String representation of the exception
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __wakeup(): mixed;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getCode(): mixed|int;
-```
-
-
Gets the Exception code
-
-
Parameters: not specified
-
-
Return value: mixed |
int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getFile(): string;
-```
-
-
Gets the file in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getLine(): int;
-```
-
-
Gets the line in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getMessage(): string;
-```
-
-
Gets the Exception message
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getPrevious(): \Throwable|null;
-```
-
-
Returns previous Exception
-
-
Parameters: not specified
-
-
Return value: \Throwable |
null
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getTrace(): array;
-```
-
-
Gets the stack trace
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
See:
-
-
-
-
-
-
-- #
- getTraceAsString
-
-
-
-```php
-// Implemented in Exception
-
-public function getTraceAsString(): string;
-```
-
-
Gets the stack trace as a string
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_3.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_3.md
deleted file mode 100644
index a8e2343c..00000000
--- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_3.md
+++ /dev/null
@@ -1,391 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Core\Configuration\Exception;
-
-final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable
-```
-
-Exception is the base class for
-all Exceptions.
-
-See:
-
-
-
-
-
-
-
-Initialization methods:
-
-
--
- __construct
- - Construct the exception. Note: The message is NOT binary safe.
-
-
-Methods:
-
-
--
- __toString
- - String representation of the exception
--
- __wakeup
-
--
- getCode
- - Gets the Exception code
--
- getFile
- - Gets the file in which the exception occurred
--
- getLine
- - Gets the line in which the exception occurred
--
- getMessage
- - Gets the Exception message
--
- getPrevious
- - Returns previous Exception
--
- getTrace
- - Gets the stack trace
--
- getTraceAsString
- - Gets the stack trace as a string
-
-
-
-
-
-
-
-
-Method details:
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __construct(string $message = "", int $code, \Throwable|null $previous = \null);
-```
-
-
Construct the exception. Note: The message is NOT binary safe.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $message |
- string |
- [optional] The Exception message to throw. |
-
-
- $code |
- int |
- [optional] The Exception code. |
-
-
- $previous |
- \Throwable | null |
- [optional] The previous throwable used for the exception chaining. |
-
-
-
-
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __toString(): string;
-```
-
-
String representation of the exception
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __wakeup(): mixed;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getCode(): mixed|int;
-```
-
-
Gets the Exception code
-
-
Parameters: not specified
-
-
Return value: mixed |
int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getFile(): string;
-```
-
-
Gets the file in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getLine(): int;
-```
-
-
Gets the line in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getMessage(): string;
-```
-
-
Gets the Exception message
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getPrevious(): \Throwable|null;
-```
-
-
Returns previous Exception
-
-
Parameters: not specified
-
-
Return value: \Throwable |
null
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getTrace(): array;
-```
-
-
Gets the stack trace
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
See:
-
-
-
-
-
-
-- #
- getTraceAsString
-
-
-
-```php
-// Implemented in Exception
-
-public function getTraceAsString(): string;
-```
-
-
Gets the stack trace as a string
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_4.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_4.md
deleted file mode 100644
index 5bdbfb7b..00000000
--- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_4.md
+++ /dev/null
@@ -1,391 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Core\Configuration\Exception;
-
-final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable
-```
-
-Exception is the base class for
-all Exceptions.
-
-See:
-
-
-
-
-
-
-
-Initialization methods:
-
-
--
- __construct
- - Construct the exception. Note: The message is NOT binary safe.
-
-
-Methods:
-
-
--
- __toString
- - String representation of the exception
--
- __wakeup
-
--
- getCode
- - Gets the Exception code
--
- getFile
- - Gets the file in which the exception occurred
--
- getLine
- - Gets the line in which the exception occurred
--
- getMessage
- - Gets the Exception message
--
- getPrevious
- - Returns previous Exception
--
- getTrace
- - Gets the stack trace
--
- getTraceAsString
- - Gets the stack trace as a string
-
-
-
-
-
-
-
-
-Method details:
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __construct(string $message = "", int $code, \Throwable|null $previous = \null);
-```
-
-
Construct the exception. Note: The message is NOT binary safe.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $message |
- string |
- [optional] The Exception message to throw. |
-
-
- $code |
- int |
- [optional] The Exception code. |
-
-
- $previous |
- \Throwable | null |
- [optional] The previous throwable used for the exception chaining. |
-
-
-
-
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __toString(): string;
-```
-
-
String representation of the exception
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __wakeup(): mixed;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getCode(): mixed|int;
-```
-
-
Gets the Exception code
-
-
Parameters: not specified
-
-
Return value: mixed |
int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getFile(): string;
-```
-
-
Gets the file in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getLine(): int;
-```
-
-
Gets the line in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getMessage(): string;
-```
-
-
Gets the Exception message
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getPrevious(): \Throwable|null;
-```
-
-
Returns previous Exception
-
-
Parameters: not specified
-
-
Return value: \Throwable |
null
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getTrace(): array;
-```
-
-
Gets the stack trace
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
See:
-
-
-
-
-
-
-- #
- getTraceAsString
-
-
-
-```php
-// Implemented in Exception
-
-public function getTraceAsString(): string;
-```
-
-
Gets the stack trace as a string
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_5.md b/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_5.md
deleted file mode 100644
index 6a63ea19..00000000
--- a/docs/tech/3.renderer/classes/InvalidConfigurationParameterException_5.md
+++ /dev/null
@@ -1,391 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Core\Configuration\Exception;
-
-final class InvalidConfigurationParameterException extends \Exception implements \Throwable, \Stringable
-```
-
-Exception is the base class for
-all Exceptions.
-
-See:
-
-
-
-
-
-
-
-Initialization methods:
-
-
--
- __construct
- - Construct the exception. Note: The message is NOT binary safe.
-
-
-Methods:
-
-
--
- __toString
- - String representation of the exception
--
- __wakeup
-
--
- getCode
- - Gets the Exception code
--
- getFile
- - Gets the file in which the exception occurred
--
- getLine
- - Gets the line in which the exception occurred
--
- getMessage
- - Gets the Exception message
--
- getPrevious
- - Returns previous Exception
--
- getTrace
- - Gets the stack trace
--
- getTraceAsString
- - Gets the stack trace as a string
-
-
-
-
-
-
-
-
-Method details:
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __construct(string $message = "", int $code, \Throwable|null $previous = \null);
-```
-
-
Construct the exception. Note: The message is NOT binary safe.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $message |
- string |
- [optional] The Exception message to throw. |
-
-
- $code |
- int |
- [optional] The Exception code. |
-
-
- $previous |
- \Throwable | null |
- [optional] The previous throwable used for the exception chaining. |
-
-
-
-
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __toString(): string;
-```
-
-
String representation of the exception
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __wakeup(): mixed;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getCode(): mixed|int;
-```
-
-
Gets the Exception code
-
-
Parameters: not specified
-
-
Return value: mixed |
int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getFile(): string;
-```
-
-
Gets the file in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getLine(): int;
-```
-
-
Gets the line in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getMessage(): string;
-```
-
-
Gets the Exception message
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getPrevious(): \Throwable|null;
-```
-
-
Returns previous Exception
-
-
Parameters: not specified
-
-
Return value: \Throwable |
null
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getTrace(): array;
-```
-
-
Gets the stack trace
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
See:
-
-
-
-
-
-
-- #
- getTraceAsString
-
-
-
-```php
-// Implemented in Exception
-
-public function getTraceAsString(): string;
-```
-
-
Gets the stack trace as a string
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md b/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md
index aaa648ad..79de64fa 100644
--- a/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md
+++ b/docs/tech/3.renderer/classes/PageHtmlLinkerPlugin.md
@@ -180,10 +180,10 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
\DI\DependencyException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md b/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md
index c03d19cf..a8086d43 100644
--- a/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md
+++ b/docs/tech/3.renderer/classes/PrintEntityCollectionAsList.md
@@ -168,7 +168,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $
Throws:
diff --git a/docs/tech/3.renderer/classes/ReflectionException.md b/docs/tech/3.renderer/classes/ReflectionException.md
index d62e456e..89c5be36 100644
--- a/docs/tech/3.renderer/classes/ReflectionException.md
+++ b/docs/tech/3.renderer/classes/ReflectionException.md
@@ -1,5 +1,5 @@
-
+
ReflectionException class:
diff --git a/docs/tech/3.renderer/classes/ReflectionException_3.md b/docs/tech/3.renderer/classes/ReflectionException_3.md
deleted file mode 100644
index 0d51cfa2..00000000
--- a/docs/tech/3.renderer/classes/ReflectionException_3.md
+++ /dev/null
@@ -1,391 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception;
-
-final class ReflectionException extends \Exception implements \Throwable, \Stringable
-```
-
-Exception is the base class for
-all Exceptions.
-
-See:
-
-
-
-
-
-
-
-Initialization methods:
-
-
--
- __construct
- - Construct the exception. Note: The message is NOT binary safe.
-
-
-Methods:
-
-
--
- __toString
- - String representation of the exception
--
- __wakeup
-
--
- getCode
- - Gets the Exception code
--
- getFile
- - Gets the file in which the exception occurred
--
- getLine
- - Gets the line in which the exception occurred
--
- getMessage
- - Gets the Exception message
--
- getPrevious
- - Returns previous Exception
--
- getTrace
- - Gets the stack trace
--
- getTraceAsString
- - Gets the stack trace as a string
-
-
-
-
-
-
-
-
-Method details:
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __construct(string $message = "", int $code, \Throwable|null $previous = \null);
-```
-
-
Construct the exception. Note: The message is NOT binary safe.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $message |
- string |
- [optional] The Exception message to throw. |
-
-
- $code |
- int |
- [optional] The Exception code. |
-
-
- $previous |
- \Throwable | null |
- [optional] The previous throwable used for the exception chaining. |
-
-
-
-
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __toString(): string;
-```
-
-
String representation of the exception
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function __wakeup(): mixed;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getCode(): mixed|int;
-```
-
-
Gets the Exception code
-
-
Parameters: not specified
-
-
Return value: mixed |
int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getFile(): string;
-```
-
-
Gets the file in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getLine(): int;
-```
-
-
Gets the line in which the exception occurred
-
-
Parameters: not specified
-
-
Return value: int
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getMessage(): string;
-```
-
-
Gets the Exception message
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getPrevious(): \Throwable|null;
-```
-
-
Returns previous Exception
-
-
Parameters: not specified
-
-
Return value: \Throwable |
null
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Exception
-
-public function getTrace(): array;
-```
-
-
Gets the stack trace
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
See:
-
-
-
-
-
-
-- #
- getTraceAsString
-
-
-
-```php
-// Implemented in Exception
-
-public function getTraceAsString(): string;
-```
-
-
Gets the stack trace as a string
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
See:
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/RendererContext.md b/docs/tech/3.renderer/classes/RendererContext.md
index 2938cd52..b8df10a8 100644
--- a/docs/tech/3.renderer/classes/RendererContext.md
+++ b/docs/tech/3.renderer/classes/RendererContext.md
@@ -1,5 +1,5 @@
-
+
RendererContext class:
diff --git a/docs/tech/3.renderer/classes/RendererContext_3.md b/docs/tech/3.renderer/classes/RendererContext_3.md
deleted file mode 100644
index ab188eda..00000000
--- a/docs/tech/3.renderer/classes/RendererContext_3.md
+++ /dev/null
@@ -1,259 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Core\Renderer\Context;
-
-final class RendererContext
-```
-
-Document rendering context
-
-
-
-
-
-
-
-Methods:
-
-
--
- addDependency
-
--
- clearDependencies
-
--
- getCurrentDocumentedEntityWrapper
-
--
- getCurrentTemplateFilePatch
- - Getting the path to the template file that is currently being worked on
--
- getDependencies
-
--
- setCurrentDocumentedEntityWrapper
-
--
- setCurrentTemplateFilePatch
- - Saving the path to the template file that is currently being worked on in the context
-
-
-
-
-
-
-
-
-Method details:
-
-
-
-
-
-```php
-public function addDependency(\BumbleDocGen\Core\Renderer\Context\Dependency\RendererDependencyInterface $dependency): void;
-```
-
-
-
-
Parameters:
-
-
-
-
Return value: void
-
-
-
-
-
-
-
-
-```php
-public function clearDependencies(): void;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: void
-
-
-
-
-
-
-
-
-
-
-```php
-public function getCurrentTemplateFilePatch(): string;
-```
-
-
Getting the path to the template file that is currently being worked on
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
-
-
-
-
-```php
-public function getDependencies(): array;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
-
-
-
-
-```php
-public function setCurrentDocumentedEntityWrapper(\BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper $currentDocumentedEntityWrapper): void;
-```
-
-
-
-
Parameters:
-
-
-
-
Return value: void
-
-
-
-
-
-
-
-
-```php
-public function setCurrentTemplateFilePatch(string $currentTemplateFilePath): void;
-```
-
-
Saving the path to the template file that is currently being worked on in the context
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $currentTemplateFilePath |
- string |
- - |
-
-
-
-
-
Return value: void
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/3.renderer/classes/RootEntityCollection.md b/docs/tech/3.renderer/classes/RootEntityCollection.md
index f2af393f..57f757a4 100644
--- a/docs/tech/3.renderer/classes/RootEntityCollection.md
+++ b/docs/tech/3.renderer/classes/RootEntityCollection.md
@@ -298,7 +298,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit
See:
diff --git a/docs/tech/3.renderer/classes/RootEntityInterface.md b/docs/tech/3.renderer/classes/RootEntityInterface.md
index 7d97a5c6..1ba150ef 100644
--- a/docs/tech/3.renderer/classes/RootEntityInterface.md
+++ b/docs/tech/3.renderer/classes/RootEntityInterface.md
@@ -63,6 +63,9 @@ their entities need to correspond to the same interfaces
-
isEntityNameValid
- Check if entity name is valid
+-
+ isExternalLibraryEntity
+ - The entity is loaded from a third party library and should not be treated the same as a standard one
-
isInGit
- The entity file is in the git repository
@@ -148,7 +151,7 @@ public function getAbsoluteFileName(): string|null;
```php
@@ -169,7 +172,7 @@ public function getEntityDependencies(): array;
```php
@@ -213,7 +216,7 @@ public function getFileName(): string|null;
```php
@@ -374,6 +377,27 @@ public static function isEntityNameValid(string $entityName): bool;
Return value: bool
+
+
+
+
+
+
+```php
+public function isExternalLibraryEntity(): bool;
+```
+
+
The entity is loaded from a third party library and should not be treated the same as a standard one
+
+
Parameters: not specified
+
+
Return value: bool
+
+
@@ -381,7 +405,7 @@ public static function isEntityNameValid(string $entityName): bool;
```php
diff --git a/docs/tech/3.renderer/classes/RootEntityInterface_2.md b/docs/tech/3.renderer/classes/RootEntityInterface_2.md
index 7badee12..f771214c 100644
--- a/docs/tech/3.renderer/classes/RootEntityInterface_2.md
+++ b/docs/tech/3.renderer/classes/RootEntityInterface_2.md
@@ -1,5 +1,5 @@
-
+
RootEntityInterface class:
@@ -63,6 +63,9 @@ their entities need to correspond to the same interfaces
-
isEntityNameValid
- Check if entity name is valid
+
-
+ isExternalLibraryEntity
+ - The entity is loaded from a third party library and should not be treated the same as a standard one
-
isInGit
- The entity file is in the git repository
@@ -148,7 +151,7 @@ public function getAbsoluteFileName(): string|null;
```php
@@ -169,7 +172,7 @@ public function getEntityDependencies(): array;
```php
@@ -213,7 +216,7 @@ public function getFileName(): string|null;
```php
@@ -374,6 +377,27 @@ public static function isEntityNameValid(string $entityName): bool;
Return value: bool
+
+
+
+
+
+
+```php
+public function isExternalLibraryEntity(): bool;
+```
+
+
The entity is loaded from a third party library and should not be treated the same as a standard one
+
+
Parameters: not specified
+
+
Return value: bool
+
+
@@ -381,7 +405,7 @@ public static function isEntityNameValid(string $entityName): bool;
```php
diff --git a/docs/tech/3.renderer/classes/StrTypeToUrl.md b/docs/tech/3.renderer/classes/StrTypeToUrl.md
index 89c5aa44..3ceef34f 100644
--- a/docs/tech/3.renderer/classes/StrTypeToUrl.md
+++ b/docs/tech/3.renderer/classes/StrTypeToUrl.md
@@ -2,7 +2,7 @@
@@ -77,7 +77,7 @@ See:
```php
@@ -124,7 +124,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $renderer
```php
@@ -170,22 +170,6 @@ public function __invoke(string $text, \BumbleDocGen\Core\Parser\Entity\RootEnti
Return value: string
-
Throws:
-
-
@@ -193,7 +177,7 @@ public function __invoke(string $text, \BumbleDocGen\Core\Parser\Entity\RootEnti
```php
@@ -214,7 +198,7 @@ public static function getName(): string;
```php
diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md
index 37d1604e..800c1393 100644
--- a/docs/tech/3.renderer/readme.md
+++ b/docs/tech/3.renderer/readme.md
@@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Sep 2 21:01:47 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Sep 2 21:01:47 2023 +0300
Page content update date: Mon Nov 06 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md
index 2be1acf4..5f0ba622 100644
--- a/docs/tech/3.renderer/templatesDynamicBlocks.md
+++ b/docs/tech/3.renderer/templatesDynamicBlocks.md
@@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Sep 2 21:01:47 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Sep 2 21:01:47 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md
index 32623d36..acd69845 100644
--- a/docs/tech/3.renderer/templatesLinking.md
+++ b/docs/tech/3.renderer/templatesLinking.md
@@ -27,4 +27,4 @@ You can also implement your own functions for relinking if necessary.
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md
index 18860755..cf73d7a0 100644
--- a/docs/tech/3.renderer/templatesVariables.md
+++ b/docs/tech/3.renderer/templatesVariables.md
@@ -11,4 +11,4 @@ There are several variables available in each processed template.
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md b/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md
index 044d0ff5..d1fde6a2 100644
--- a/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md
+++ b/docs/tech/4.pluginSystem/classes/AfterLoadingClassEntityCollection.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser;
-final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDispatcher\Event
```
The event is called after the initial creation of a collection of class entities
diff --git a/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md b/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md
index ee57fae3..37f8776d 100644
--- a/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md
+++ b/docs/tech/4.pluginSystem/classes/AfterRenderingEntities.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event
```
Event is the base class for classes containing event data.
diff --git a/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md b/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md
index 28977bea..6c8bd9da 100644
--- a/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md
+++ b/docs/tech/4.pluginSystem/classes/BeforeCreatingDocFile.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Event
```
Called before the content of the documentation document is saved to a file
diff --git a/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md b/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md
index 10df4a78..68122b37 100644
--- a/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md
+++ b/docs/tech/4.pluginSystem/classes/BeforeRenderingDocFiles.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\Event
```
The event occurs before the main documents begin rendering
diff --git a/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md b/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md
index a57268a7..0ad8070a 100644
--- a/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md
+++ b/docs/tech/4.pluginSystem/classes/BeforeRenderingEntities.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event
```
The event occurs before the rendering of entity documents begins, after the main documents have been created
diff --git a/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md b/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md
index cd2cd987..8247594d 100644
--- a/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md
+++ b/docs/tech/4.pluginSystem/classes/OnAddClassEntityToCollection.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser;
-final class OnAddClassEntityToCollection extends \Symfony\Contracts\EventDispatcher\Event implements \BumbleDocGen\Core\Plugin\OnlySingleExecutionEvent, \Psr\EventDispatcher\StoppableEventInterface
+final class OnAddClassEntityToCollection extends \Symfony\Contracts\EventDispatcher\Event implements \BumbleDocGen\Core\Plugin\OnlySingleExecutionEvent
```
Called when each class entity is added to the entity collection
diff --git a/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md b/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md
index 72a1eac6..2c3a1991 100644
--- a/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md
+++ b/docs/tech/4.pluginSystem/classes/OnCheckIsClassEntityCanBeLoad.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity;
-final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispatcher\Event
```
Event is the base class for classes containing event data.
diff --git a/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md b/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md
index 300a593b..b0dbaf39 100644
--- a/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md
+++ b/docs/tech/4.pluginSystem/classes/OnCreateDocumentedEntityWrapper.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDispatcher\Event
```
The event occurs when an entity is added to the list for documentation
diff --git a/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md b/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md
index 889c3574..e9d504ac 100644
--- a/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md
+++ b/docs/tech/4.pluginSystem/classes/OnGetProjectTemplatesDirs.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher\Event
```
This event occurs when all directories containing document templates are retrieved
diff --git a/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md b/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md
index ec4c765d..64f9ac0b 100644
--- a/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md
+++ b/docs/tech/4.pluginSystem/classes/OnGetTemplatePathByRelativeDocPath.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventDispatcher\Event
```
The event occurs when the path to the template file is obtained relative to the path to the document
diff --git a/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md b/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md
index c8ede590..55ab7614 100644
--- a/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md
+++ b/docs/tech/4.pluginSystem/classes/OnGettingResourceLink.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Event
```
Event occurs when a reference to an entity (resource) is received
diff --git a/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md b/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md
index f0ceccd6..e03471f4 100644
--- a/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md
+++ b/docs/tech/4.pluginSystem/classes/OnLoadEntityDocPluginContent.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnLoadEntityDocPluginContent extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnLoadEntityDocPluginContent extends \Symfony\Contracts\EventDispatcher\Event
```
Called when entity documentation is generated (plugin content loading)
diff --git a/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md b/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md
index bba0eed7..0bc4f882 100644
--- a/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md
+++ b/docs/tech/4.pluginSystem/classes/OnLoadSourceLocatorsCollection.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Parser;
-final class OnLoadSourceLocatorsCollection extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnLoadSourceLocatorsCollection extends \Symfony\Contracts\EventDispatcher\Event
```
Called when source locators are loaded
diff --git a/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md b/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md
index 1c6e9b9c..30956139 100644
--- a/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md
+++ b/docs/tech/4.pluginSystem/classes/PhpUnitStubberPlugin.md
@@ -71,7 +71,7 @@ public static function getSubscribedEvents(): array;
```php
diff --git a/docs/tech/4.pluginSystem/classes/StubberPlugin.md b/docs/tech/4.pluginSystem/classes/StubberPlugin.md
index e47ed002..eae9c06f 100644
--- a/docs/tech/4.pluginSystem/classes/StubberPlugin.md
+++ b/docs/tech/4.pluginSystem/classes/StubberPlugin.md
@@ -2,7 +2,7 @@
@@ -57,11 +57,11 @@ final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface,
```php
-public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration);
+public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser $composerParser);
```
@@ -78,8 +78,8 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
- $configuration |
- \BumbleDocGen\Core\Configuration\Configuration |
+ $composerParser |
+ \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser |
- |
@@ -94,7 +94,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -115,7 +115,7 @@ public static function getSubscribedEvents(): array;
```php
@@ -160,7 +160,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\
```php
diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md
index b93c5027..01f7ca5b 100644
--- a/docs/tech/4.pluginSystem/readme.md
+++ b/docs/tech/4.pluginSystem/readme.md
@@ -190,4 +190,4 @@ plugins:
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Oct 28 11:03:31 2023 +0300
Page content update date: Mon Nov 06 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/classes/GenerateProjectTemplatesStructureCommand.md b/docs/tech/classes/AddDocBlocksCommand.md
similarity index 98%
rename from docs/tech/classes/GenerateProjectTemplatesStructureCommand.md
rename to docs/tech/classes/AddDocBlocksCommand.md
index f34f515b..e4bca321 100644
--- a/docs/tech/classes/GenerateProjectTemplatesStructureCommand.md
+++ b/docs/tech/classes/AddDocBlocksCommand.md
@@ -1,8 +1,8 @@
-
+
@@ -10,9 +10,9 @@
```php
-namespace BumbleDocGen\Console\Command;
+namespace BumbleDocGen\AI\Console;
-final class GenerateProjectTemplatesStructureCommand extends \BumbleDocGen\Console\Command\BaseCommand
+final class AddDocBlocksCommand extends \BumbleDocGen\Console\Command\BaseCommand
```
Base class for all commands.
@@ -134,6 +134,11 @@ final class GenerateProjectTemplatesStructureCommand extends \BumbleDocGen\Conso
- Sets the process title of the command.
+Traits:
+
+
Constants:
@@ -145,6 +150,10 @@ final class GenerateProjectTemplatesStructureCommand extends \BumbleDocGen\Conso
href="#qinvalid">#
INVALID
| source
code
+ - #
+
NAME
| source
+ code
- #
SUCCESS
| source
diff --git a/docs/tech/classes/AddMissingDocBlocksCommand.md b/docs/tech/classes/AddMissingDocBlocksCommand.md
deleted file mode 100644
index 447de151..00000000
--- a/docs/tech/classes/AddMissingDocBlocksCommand.md
+++ /dev/null
@@ -1,1384 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\Console\Command;
-
-final class AddMissingDocBlocksCommand extends \BumbleDocGen\Console\Command\BaseCommand
-```
-
-Base class for all commands.
-
-
-
-
-
-
-Initialization methods:
-
-
--
- __construct
-
-
-
-Methods:
-
-
--
- addArgument
- - Adds an argument.
--
- addOption
- - Adds an option.
--
- addUsage
- - Add a command usage example, it'll be prefixed with the command name.
--
- complete
- - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
--
- getAliases
- - Returns the aliases for the command.
--
- getApplication
- - Gets the application instance for this command.
--
- getDefaultDescription
-
--
- getDefaultName
-
--
- getDefinition
- - Gets the InputDefinition attached to this Command.
--
- getDescription
- - Returns the description for the command.
--
- getHelp
- - Returns the help for the command.
--
- getHelper
- - Gets a helper instance by name.
--
- getHelperSet
- - Gets the helper set.
--
- getName
- - Returns the command name.
--
- getNativeDefinition
- - Gets the InputDefinition to be used to create representations of this Command.
--
- getProcessedHelp
- - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
--
- getSynopsis
- - Returns the synopsis for the command.
--
- getUsages
- - Returns alternative usages of the command.
--
- ignoreValidationErrors
- - Ignores validation errors.
--
- isEnabled
- - Checks whether the command is enabled or not in the current environment.
--
- isHidden
-
--
- mergeApplicationDefinition
- - Merges the application definition with the command definition.
--
- run
- - Runs the command.
--
- setAliases
- - Sets the aliases for the command.
--
- setApplication
-
--
- setCode
- - Sets the code to execute when running this command.
--
- setDefinition
- - Sets an array of argument and option instances.
--
- setDescription
- - Sets the description for the command.
--
- setHelp
- - Sets the help for the command.
--
- setHelperSet
-
--
- setHidden
-
--
- setName
- - Sets the name of the command.
--
- setProcessTitle
- - Sets the process title of the command.
-
-
-
-Constants:
-
-
-
-
-
-
-Method details:
-
-
-
-
-
-```php
-// Implemented in BumbleDocGen\Console\Command\BaseCommand
-
-public function __construct(string $name = null);
-```
-
-
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $name |
- string |
- The name of the command; passing null means it must be set in configure() |
-
-
-
-
-
-
-
Throws:
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static;
-```
-
-
Adds an argument.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $name |
- string |
- - |
-
-
- $mode |
- int |
- The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL |
-
-
- $description |
- string |
- - |
-
-
- $default |
- mixed |
- The default value (for InputArgument::OPTIONAL mode only) |
-
-
-
-
-
Return value: static
-
-
-
Throws:
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static;
-```
-
-
Adds an option.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $name |
- string |
- - |
-
-
- $shortcut |
- string | array |
- The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts |
-
-
- $mode |
- int |
- The option mode: One of the InputOption::VALUE_* constants |
-
-
- $description |
- string |
- - |
-
-
- $default |
- mixed |
- The default value (must be null for InputOption::VALUE_NONE) |
-
-
-
-
-
Return value: static
-
-
-
Throws:
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function addUsage(string $usage): static;
-```
-
-
Add a command usage example, it'll be prefixed with the command name.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $usage |
- string |
- - |
-
-
-
-
-
Return value: static
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void;
-```
-
-
Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
-
-
Parameters:
-
-
-
-
Return value: void
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getAliases(): array;
-```
-
-
Returns the aliases for the command.
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getApplication(): \Symfony\Component\Console\Application|null;
-```
-
-
Gets the application instance for this command.
-
-
Parameters: not specified
-
-
Return value: \Symfony\Component\Console\Application |
null
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public static function getDefaultDescription(): string|null;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: string |
null
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public static function getDefaultName(): string|null;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: string |
null
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition;
-```
-
-
Gets the InputDefinition attached to this Command.
-
-
Parameters: not specified
-
-
Return value: \Symfony\Component\Console\Input\InputDefinition
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getDescription(): string;
-```
-
-
Returns the description for the command.
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getHelp(): string;
-```
-
-
Returns the help for the command.
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getHelper(string $name): mixed;
-```
-
-
Gets a helper instance by name.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $name |
- string |
- - |
-
-
-
-
-
Return value: mixed
-
-
-
Throws:
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null;
-```
-
-
Gets the helper set.
-
-
Parameters: not specified
-
-
Return value: \Symfony\Component\Console\Helper\HelperSet |
null
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getName(): string|null;
-```
-
-
Returns the command name.
-
-
Parameters: not specified
-
-
Return value: string |
null
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition;
-```
-
-
Gets the InputDefinition to be used to create representations of this Command.
-
-
Parameters: not specified
-
-
Return value: \Symfony\Component\Console\Input\InputDefinition
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getProcessedHelp(): string;
-```
-
-
Returns the processed help for the command replacing the %command.name% and
-%command.full_name% patterns with the real values dynamically.
-
-
Parameters: not specified
-
-
Return value: string
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getSynopsis(bool $short = false): string;
-```
-
-
Returns the synopsis for the command.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $short |
- bool |
- Whether to show the short version of the synopsis (with options folded) or not |
-
-
-
-
-
Return value: string
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function getUsages(): array;
-```
-
-
Returns alternative usages of the command.
-
-
Parameters: not specified
-
-
Return value: array
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function ignoreValidationErrors(): mixed;
-```
-
-
Ignores validation errors.
-
-
Parameters: not specified
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function isEnabled(): bool;
-```
-
-
Checks whether the command is enabled or not in the current environment.
-
-
Parameters: not specified
-
-
Return value: bool
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function isHidden(): bool;
-```
-
-
-
-
Parameters: not specified
-
-
Return value: bool
-
-
-
-
-
-
-
-- #
- mergeApplicationDefinition
- :warning: Is internal | source code
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function mergeApplicationDefinition(bool $mergeArgs = true): mixed;
-```
-
-
Merges the application definition with the command definition.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $mergeArgs |
- bool |
- Whether to merge or not the Application definition arguments to Command definition arguments |
-
-
-
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int;
-```
-
-
Runs the command.
-
-
Parameters:
-
-
-
-
Return value: int
-
-
-
Throws:
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setAliases(iterable $aliases): static;
-```
-
-
Sets the aliases for the command.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $aliases |
- iterable |
- An array of aliases for the command |
-
-
-
-
-
Return value: static
-
-
-
Throws:
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setApplication(\Symfony\Component\Console\Application $application = null): mixed;
-```
-
-
-
-
Parameters:
-
-
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setCode(callable $code): static;
-```
-
-
Sets the code to execute when running this command.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $code |
- callable |
- A callable(InputInterface $input, OutputInterface $output) |
-
-
-
-
-
Return value: static
-
-
-
Throws:
-
-
-
-
See:
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static;
-```
-
-
Sets an array of argument and option instances.
-
-
Parameters:
-
-
-
-
Return value: static
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setDescription(string $description): static;
-```
-
-
Sets the description for the command.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $description |
- string |
- - |
-
-
-
-
-
Return value: static
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setHelp(string $help): static;
-```
-
-
Sets the help for the command.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $help |
- string |
- - |
-
-
-
-
-
Return value: static
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed;
-```
-
-
-
-
Parameters:
-
-
-
-
Return value: mixed
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setHidden(bool $hidden = true): static;
-```
-
-
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $hidden |
- bool |
- Whether or not the command should be hidden from the list of commands |
-
-
-
-
-
Return value: static
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setName(string $name): static;
-```
-
-
Sets the name of the command.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $name |
- string |
- - |
-
-
-
-
-
Return value: static
-
-
-
Throws:
-
-
-
-
-
-
-
-
-```php
-// Implemented in Symfony\Component\Console\Command\Command
-
-public function setProcessTitle(string $title): static;
-```
-
-
Sets the process title of the command.
-
-
Parameters:
-
-
-
-
- Name |
- Type |
- Description |
-
-
-
-
- $title |
- string |
- - |
-
-
-
-
-
Return value: static
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/classes/AfterLoadingClassEntityCollection.md b/docs/tech/classes/AfterLoadingClassEntityCollection.md
index 8a21a74e..82149929 100644
--- a/docs/tech/classes/AfterLoadingClassEntityCollection.md
+++ b/docs/tech/classes/AfterLoadingClassEntityCollection.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser;
-final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class AfterLoadingClassEntityCollection extends \Symfony\Contracts\EventDispatcher\Event
```
The event is called after the initial creation of a collection of class entities
diff --git a/docs/tech/classes/AfterRenderingEntities.md b/docs/tech/classes/AfterRenderingEntities.md
index e8faf6a2..a64b57f8 100644
--- a/docs/tech/classes/AfterRenderingEntities.md
+++ b/docs/tech/classes/AfterRenderingEntities.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class AfterRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event
```
Event is the base class for classes containing event data.
diff --git a/docs/tech/classes/App.md b/docs/tech/classes/App.md
index e290ecfd..a6a41439 100644
--- a/docs/tech/classes/App.md
+++ b/docs/tech/classes/App.md
@@ -2,7 +2,7 @@
- App class:
+ App class:
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Console;
-class App extends \Symfony\Component\Console\Application implements \Symfony\Contracts\Service\ResetInterface
+class App extends \Symfony\Component\Console\Application
```
An Application is the container for a collection of commands.
@@ -156,7 +156,7 @@ class App extends \Symfony\Component\Console\Application implements \Symfony\Con
```php
diff --git a/docs/tech/classes/BaseEntity.md b/docs/tech/classes/BaseEntity.md
index 3a99374e..1f29bd28 100644
--- a/docs/tech/classes/BaseEntity.md
+++ b/docs/tech/classes/BaseEntity.md
@@ -2,7 +2,7 @@
@@ -116,6 +116,9 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach
reloadEntityDependenciesCache
+
+ removeEntityValueFromCache
+
removeNotUsedEntityDataCache
@@ -139,7 +142,7 @@ abstract class BaseEntity implements \BumbleDocGen\Core\Parser\Entity\Cache\Cach
```php
@@ -156,7 +159,7 @@ public function entityCacheIsOutdated(): bool;
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Psr\Cache\InvalidArgumentException
@@ -170,7 +173,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -187,7 +190,7 @@ public function getAbsoluteFileName(): string|null;
Throws:
@@ -198,10 +201,12 @@ public function getAbsoluteFileName(): string|null;
```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
public function getCacheKey(): string;
```
@@ -219,7 +224,7 @@ public function getCacheKey(): string;
```php
@@ -247,7 +252,7 @@ public function getCachedEntityDependencies(): array;
```php
@@ -268,7 +273,7 @@ public function getDescription(): string;
```php
@@ -285,7 +290,7 @@ public function getDescriptionLinks(): array;
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Exception
@@ -299,7 +304,7 @@ public function getDescriptionLinks(): array;
```php
@@ -320,7 +325,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock;
```php
@@ -337,10 +342,10 @@ public function getDocComment(): string;
Throws:
@@ -351,7 +356,7 @@ public function getDocComment(): string;
```php
@@ -372,7 +377,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -393,7 +398,7 @@ public function getDocNote(): string;
```php
@@ -414,7 +419,7 @@ public function getExamples(): array;
```php
@@ -435,7 +440,7 @@ public function getFileName(): string|null;
```php
@@ -469,7 +474,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
Throws:
@@ -480,7 +485,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -501,7 +506,7 @@ public function getFirstExample(): string;
```php
@@ -545,7 +550,7 @@ public function getName(): string;
```php
@@ -566,7 +571,7 @@ public function getObjectId(): string;
```php
@@ -587,7 +592,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa
```php
@@ -631,7 +636,7 @@ public function getShortName(): string;
```php
@@ -652,7 +657,7 @@ public function getStartLine(): int;
```php
@@ -669,10 +674,10 @@ public function getThrows(): array;
Throws:
@@ -683,7 +688,7 @@ public function getThrows(): array;
```php
@@ -711,7 +716,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -732,7 +737,7 @@ public function hasExamples(): bool;
```php
@@ -753,7 +758,7 @@ public function hasThrows(): bool;
```php
@@ -774,7 +779,7 @@ public function isDeprecated(): bool;
```php
@@ -804,7 +809,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -821,10 +826,10 @@ public function isEntityFileCanBeLoad(): bool;
Throws:
@@ -835,7 +840,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -856,18 +861,18 @@ public function isInternal(): bool;
```php
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-Return value: void
+Return value: array
Throws:
@@ -877,6 +882,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -884,7 +929,7 @@ public function reloadEntityDependenciesCache(): void;
```php
diff --git a/docs/tech/classes/BasePageLinker.md b/docs/tech/classes/BasePageLinker.md
index e0876358..9e0e7672 100644
--- a/docs/tech/classes/BasePageLinker.md
+++ b/docs/tech/classes/BasePageLinker.md
@@ -146,10 +146,10 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
\DI\DependencyException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/BeforeCreatingDocFile.md b/docs/tech/classes/BeforeCreatingDocFile.md
index 7133e947..8fb330dd 100644
--- a/docs/tech/classes/BeforeCreatingDocFile.md
+++ b/docs/tech/classes/BeforeCreatingDocFile.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class BeforeCreatingDocFile extends \Symfony\Contracts\EventDispatcher\Event
```
Called before the content of the documentation document is saved to a file
diff --git a/docs/tech/classes/BeforeRenderingDocFiles.md b/docs/tech/classes/BeforeRenderingDocFiles.md
index 72b44ec5..c31648f9 100644
--- a/docs/tech/classes/BeforeRenderingDocFiles.md
+++ b/docs/tech/classes/BeforeRenderingDocFiles.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class BeforeRenderingDocFiles extends \Symfony\Contracts\EventDispatcher\Event
```
The event occurs before the main documents begin rendering
diff --git a/docs/tech/classes/BeforeRenderingEntities.md b/docs/tech/classes/BeforeRenderingEntities.md
index 689d8eb5..dd163de4 100644
--- a/docs/tech/classes/BeforeRenderingEntities.md
+++ b/docs/tech/classes/BeforeRenderingEntities.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class BeforeRenderingEntities extends \Symfony\Contracts\EventDispatcher\Event
```
The event occurs before the rendering of entity documents begins, after the main documents have been created
diff --git a/docs/tech/classes/BreadcrumbsHelper.md b/docs/tech/classes/BreadcrumbsHelper.md
index 24e94018..f5c84ec7 100644
--- a/docs/tech/classes/BreadcrumbsHelper.md
+++ b/docs/tech/classes/BreadcrumbsHelper.md
@@ -42,6 +42,9 @@ final class BreadcrumbsHelper
-
getBreadcrumbsForTemplates
+
-
+ getNearestIndexFile
+
-
getPageDataByKey
@@ -139,7 +142,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -162,7 +165,7 @@ public function getAllPageLinks(): array;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -173,7 +176,7 @@ public function getAllPageLinks(): array;
```php
@@ -218,7 +221,7 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -229,7 +232,7 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr
```php
@@ -274,7 +277,52 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
+
+
+
+
+
+
+
+
+```php
+public function getNearestIndexFile(string $templateName): string;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $templateName |
+ string |
+ - |
+
+
+
+
+
Return value: string
+
+
+
Throws:
+
@@ -285,7 +333,7 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent
```php
@@ -322,7 +370,7 @@ public function getPageDataByKey(string $key): array|null;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
@@ -336,7 +384,7 @@ public function getPageDataByKey(string $key): array|null;
```php
@@ -373,7 +421,7 @@ public function getPageDocFileByKey(string $key): string|null;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
@@ -387,7 +435,7 @@ public function getPageDocFileByKey(string $key): string|null;
```php
@@ -424,7 +472,7 @@ public function getPageLinkByKey(string $key): string|null;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
@@ -438,7 +486,7 @@ public function getPageLinkByKey(string $key): string|null;
```php
@@ -472,7 +520,7 @@ public function getTemplateLinkKey(string $templateName): string|null;
Throws:
@@ -483,7 +531,7 @@ public function getTemplateLinkKey(string $templateName): string|null;
```php
@@ -517,7 +565,7 @@ public function getTemplateTitle(string $templateName): string;
Throws:
@@ -539,7 +587,7 @@ $breadcrumbsHelper->getTemplateTitle() == 'Some template title'; // is true
```php
@@ -598,7 +646,7 @@ public function renderBreadcrumbs(string $currentPageTitle, string $filePatch, b
\Twig\Error\LoaderError
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/CacheableEntityInterface.md b/docs/tech/classes/CacheableEntityInterface.md
index 08df82db..04d2f117 100644
--- a/docs/tech/classes/CacheableEntityInterface.md
+++ b/docs/tech/classes/CacheableEntityInterface.md
@@ -171,14 +171,14 @@ public function isEntityFileCanBeLoad(): bool;
```php
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-
Return value: void
+
Return value: array
diff --git a/docs/tech/classes/CacheableEntityTrait.md b/docs/tech/classes/CacheableEntityTrait.md
index ba728ec6..1bf16d86 100644
--- a/docs/tech/classes/CacheableEntityTrait.md
+++ b/docs/tech/classes/CacheableEntityTrait.md
@@ -2,7 +2,7 @@
@@ -35,6 +35,9 @@ trait CacheableEntityTrait
-
isEntityDataCacheOutdated
+-
+ removeEntityValueFromCache
+
-
removeNotUsedEntityDataCache
@@ -53,7 +56,7 @@ trait CacheableEntityTrait
```php
@@ -74,7 +77,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -95,7 +98,7 @@ public function getCacheKey(): string;
```php
@@ -116,6 +119,44 @@ public function isEntityDataCacheOutdated(): bool;
+
+
+
+
+
+
+```php
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -123,7 +164,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
diff --git a/docs/tech/classes/CacheableEntityWrapperTrait.md b/docs/tech/classes/CacheableEntityWrapperTrait.md
index f2a1ba62..e40efbbe 100644
--- a/docs/tech/classes/CacheableEntityWrapperTrait.md
+++ b/docs/tech/classes/CacheableEntityWrapperTrait.md
@@ -2,7 +2,7 @@
@@ -38,6 +38,9 @@ trait CacheableEntityWrapperTrait
isEntityFileCanBeLoad
+
+ removeEntityValueFromCache
+
removeNotUsedEntityDataCache
@@ -61,7 +64,7 @@ trait CacheableEntityWrapperTrait
```php
@@ -84,7 +87,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -107,7 +110,7 @@ public function getCacheKey(): string;
```php
@@ -137,7 +140,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -151,6 +154,46 @@ public function isEntityFileCanBeLoad(): bool;
Return value: bool
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -158,7 +201,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
diff --git a/docs/tech/classes/CacheablePhpEntityFactory.md b/docs/tech/classes/CacheablePhpEntityFactory.md
index f14af954..b3880a8d 100644
--- a/docs/tech/classes/CacheablePhpEntityFactory.md
+++ b/docs/tech/classes/CacheablePhpEntityFactory.md
@@ -232,7 +232,7 @@ public function createClassEntityByReflection(\Roave\BetterReflection\Reflection
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -603,7 +603,7 @@ public function createSubClassEntityByReflection(string $subClassEntity, \Roave\
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/CachedSourceLocator.md b/docs/tech/classes/CachedSourceLocator.md
index 8e1fc9e4..5726a857 100644
--- a/docs/tech/classes/CachedSourceLocator.md
+++ b/docs/tech/classes/CachedSourceLocator.md
@@ -143,7 +143,7 @@ public function locateIdentifier(\Roave\BetterReflection\Reflector\Reflector $re
\Psr\Cache\InvalidArgumentException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/ClassEntity.md b/docs/tech/classes/ClassEntity.md
index 64c4ad48..937dc33a 100644
--- a/docs/tech/classes/ClassEntity.md
+++ b/docs/tech/classes/ClassEntity.md
@@ -2,7 +2,7 @@
@@ -249,6 +249,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
isEnum
+
+ isExternalLibraryEntity
+ - The entity is loaded from a third party library and should not be treated the same as a standard one
isInGit
- Checking if class file is in git repository
@@ -273,6 +276,9 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
reloadEntityDependenciesCache
+
+ removeEntityValueFromCache
+
removeNotUsedEntityDataCache
@@ -294,11 +300,11 @@ class ClassEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEn
```php
-public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper $reflector, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName);
+public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration, \BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings $phpHandlerSettings, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper $reflector, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection $classEntityCollection, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser $composerParser, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger, string $className, string|null $relativeFileName);
```
@@ -338,6 +344,11 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
$parserHelper |
\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper |
- |
+
+
+ $composerParser |
+ \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser |
+ - |
$localObjectCache |
@@ -371,7 +382,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -410,7 +421,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu
Throws:
@@ -430,7 +441,7 @@ public function cursorToDocAttributeLinkFragment(string $cursor, bool $isForDocu
```php
@@ -447,10 +458,10 @@ public function documentCreationAllowed(): bool;
Throws:
@@ -461,7 +472,7 @@ public function documentCreationAllowed(): bool;
```php
@@ -480,7 +491,7 @@ public function entityCacheIsOutdated(): bool;
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Psr\Cache\InvalidArgumentException
@@ -494,7 +505,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -511,10 +522,13 @@ public function entityDataCanBeLoaded(): bool;
Throws:
@@ -525,7 +539,7 @@ public function entityDataCanBeLoaded(): bool;
```php
@@ -544,7 +558,7 @@ public function getAbsoluteFileName(): string|null;
Throws:
@@ -555,11 +569,11 @@ public function getAbsoluteFileName(): string|null;
```php
-// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
public function getCacheKey(): string;
```
@@ -578,7 +592,7 @@ public function getCacheKey(): string;
```php
@@ -608,7 +622,7 @@ public function getCachedEntityDependencies(): array;
```php
@@ -625,10 +639,10 @@ public function getCasesNames(): array;
Throws:
@@ -639,7 +653,7 @@ public function getCasesNames(): array;
```php
@@ -673,10 +687,10 @@ public function getConstant(string $name): string|array|int|bool|null|float;
Throws:
@@ -687,7 +701,7 @@ public function getConstant(string $name): string|array|int|bool|null|float;
```php
@@ -729,13 +743,13 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): \B
\DI\NotFoundException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -746,7 +760,7 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): \B
```php
@@ -766,13 +780,13 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -783,7 +797,7 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php
```php
@@ -800,10 +814,10 @@ public function getConstants(): array;
Throws:
@@ -814,7 +828,7 @@ public function getConstants(): array;
```php
@@ -831,10 +845,10 @@ public function getConstantsData(): array;
Throws:
@@ -845,7 +859,7 @@ public function getConstantsData(): array;
```php
@@ -865,13 +879,13 @@ public function getDescription(): string;
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -882,7 +896,7 @@ public function getDescription(): string;
```php
@@ -901,7 +915,7 @@ public function getDescriptionLinks(): array;
Throws:
@@ -952,7 +966,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock;
```php
@@ -971,10 +985,10 @@ public function getDocComment(): string;
Throws:
@@ -985,7 +999,7 @@ public function getDocComment(): string;
```php
@@ -1008,10 +1022,10 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -1022,7 +1036,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -1045,7 +1059,7 @@ public function getDocNote(): string;
```php
@@ -1062,7 +1076,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Exception
@@ -1076,7 +1090,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En
```php
@@ -1093,10 +1107,10 @@ public function getEndLine(): int;
Throws:
@@ -1107,7 +1121,7 @@ public function getEndLine(): int;
```php
@@ -1128,7 +1142,7 @@ public function getEntityDependencies(): array;
```php
@@ -1151,7 +1165,7 @@ public function getExamples(): array;
```php
@@ -1168,10 +1182,10 @@ public function getExtends(): string|null;
Throws:
@@ -1182,7 +1196,7 @@ public function getExtends(): string|null;
```php
@@ -1199,7 +1213,7 @@ public function getFileContent(): string;
Throws:
@@ -1210,7 +1224,7 @@ public function getFileContent(): string;
```php
@@ -1231,7 +1245,7 @@ public function getFileName(): string|null;
```php
@@ -1267,7 +1281,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
Throws:
@@ -1278,7 +1292,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -1301,7 +1315,7 @@ public function getFirstExample(): string;
```php
@@ -1318,10 +1332,10 @@ public function getFullFileName(): string|null;
Throws:
@@ -1332,7 +1346,7 @@ public function getFullFileName(): string|null;
```php
@@ -1349,10 +1363,10 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
Throws:
@@ -1363,7 +1377,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
```php
@@ -1380,10 +1394,10 @@ public function getInterfaceNames(): array;
Throws:
@@ -1394,7 +1408,7 @@ public function getInterfaceNames(): array;
```php
@@ -1411,10 +1425,10 @@ public function getInterfacesEntities(): array;
Throws:
@@ -1425,7 +1439,7 @@ public function getInterfacesEntities(): array;
```php
@@ -1442,10 +1456,10 @@ public function getInterfacesString(): string;
Throws:
@@ -1456,7 +1470,7 @@ public function getInterfacesString(): string;
```php
@@ -1501,10 +1515,10 @@ public function getMethodEntity(string $methodName, bool $unsafe = true): \Bumbl
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
@@ -1515,7 +1529,7 @@ public function getMethodEntity(string $methodName, bool $unsafe = true): \Bumbl
```php
@@ -1535,13 +1549,13 @@ public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\P
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
@@ -1552,7 +1566,7 @@ public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\P
```php
@@ -1569,10 +1583,10 @@ public function getMethodsData(): array;
Throws:
@@ -1583,7 +1597,7 @@ public function getMethodsData(): array;
```php
@@ -1600,10 +1614,10 @@ public function getModifiersString(): string;
Throws:
@@ -1614,7 +1628,7 @@ public function getModifiersString(): string;
```php
@@ -1635,7 +1649,7 @@ public function getName(): string;
```php
@@ -1652,10 +1666,10 @@ public function getNamespaceName(): string;
Throws:
@@ -1666,7 +1680,7 @@ public function getNamespaceName(): string;
```php
@@ -1687,7 +1701,7 @@ public function getObjectId(): string;
```php
@@ -1704,10 +1718,10 @@ public function getParentClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entit
Throws:
@@ -1718,7 +1732,7 @@ public function getParentClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entit
```php
@@ -1735,10 +1749,10 @@ public function getParentClassName(): string|null;
Throws:
@@ -1749,7 +1763,7 @@ public function getParentClassName(): string|null;
```php
@@ -1766,10 +1780,10 @@ public function getParentClassNames(): array;
Throws:
@@ -1780,7 +1794,7 @@ public function getParentClassNames(): array;
```php
@@ -1801,7 +1815,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa
```php
@@ -1839,7 +1853,7 @@ public function getPluginData(string $pluginKey): array|null;
```php
@@ -1856,10 +1870,10 @@ public function getPropertiesData(): array;
Throws:
@@ -1870,7 +1884,7 @@ public function getPropertiesData(): array;
```php
@@ -1915,10 +1929,10 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): \B
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
@@ -1929,7 +1943,7 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): \B
```php
@@ -1949,13 +1963,13 @@ public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
@@ -1966,7 +1980,7 @@ public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php
```php
@@ -1987,7 +2001,7 @@ public function getReflector(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\
```php
@@ -2021,10 +2035,10 @@ public function getRelativeFileName(bool $loadIfEmpty = true): string|null;
Throws:
@@ -2035,7 +2049,7 @@ public function getRelativeFileName(bool $loadIfEmpty = true): string|null;
```php
@@ -2056,7 +2070,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par
```php
@@ -2077,7 +2091,7 @@ public function getShortName(): string;
```php
@@ -2094,10 +2108,10 @@ public function getStartLine(): int;
Throws:
@@ -2108,7 +2122,7 @@ public function getStartLine(): int;
```php
@@ -2127,10 +2141,10 @@ public function getThrows(): array;
Throws:
@@ -2141,7 +2155,7 @@ public function getThrows(): array;
```php
@@ -2158,10 +2172,10 @@ public function getTraitsNames(): array;
Throws:
@@ -2172,7 +2186,7 @@ public function getTraitsNames(): array;
```php
@@ -2210,7 +2224,7 @@ public function hasAnnotationKey(string $annotationKey): bool;
```php
@@ -2244,10 +2258,10 @@ public function hasConstant(string $constant): bool;
Throws:
@@ -2258,7 +2272,7 @@ public function hasConstant(string $constant): bool;
```php
@@ -2288,7 +2302,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -2311,7 +2325,7 @@ public function hasExamples(): bool;
```php
@@ -2345,10 +2359,10 @@ public function hasMethod(string $method): bool;
Throws:
@@ -2359,7 +2373,7 @@ public function hasMethod(string $method): bool;
```php
@@ -2393,10 +2407,10 @@ public function hasParentClass(string $parentClassName): bool;
Throws:
@@ -2407,7 +2421,7 @@ public function hasParentClass(string $parentClassName): bool;
```php
@@ -2441,10 +2455,10 @@ public function hasProperty(string $property): bool;
Throws:
@@ -2455,7 +2469,7 @@ public function hasProperty(string $property): bool;
```php
@@ -2478,7 +2492,7 @@ public function hasThrows(): bool;
```php
@@ -2495,10 +2509,10 @@ public function hasTraits(): bool;
Throws:
@@ -2509,7 +2523,7 @@ public function hasTraits(): bool;
```php
@@ -2543,10 +2557,10 @@ public function implementsInterface(string $interfaceName): bool;
Throws:
@@ -2557,7 +2571,7 @@ public function implementsInterface(string $interfaceName): bool;
```php
@@ -2574,10 +2588,10 @@ public function isAbstract(): bool;
Throws:
@@ -2588,7 +2602,7 @@ public function isAbstract(): bool;
```php
@@ -2609,7 +2623,7 @@ public function isClassLoad(): bool;
```php
@@ -2632,7 +2646,7 @@ public function isDeprecated(): bool;
```php
@@ -2662,7 +2676,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -2681,10 +2695,10 @@ public function isEntityFileCanBeLoad(): bool;
Throws:
@@ -2695,7 +2709,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -2733,7 +2747,7 @@ public static function isEntityNameValid(string $entityName): bool;
```php
@@ -2750,13 +2764,34 @@ public function isEnum(): bool;
Throws:
+
+
+
+
+
+
+```php
+public function isExternalLibraryEntity(): bool;
+```
+
+
The entity is loaded from a third party library and should not be treated the same as a standard one
+
+
Parameters: not specified
+
+
Return value: bool
+
+
@@ -2764,7 +2799,7 @@ public function isEnum(): bool;
```php
@@ -2781,10 +2816,10 @@ public function isInGit(): bool;
Throws:
@@ -2795,7 +2830,7 @@ public function isInGit(): bool;
```php
@@ -2812,10 +2847,10 @@ public function isInstantiable(): bool;
Throws:
@@ -2826,7 +2861,7 @@ public function isInstantiable(): bool;
```php
@@ -2843,10 +2878,10 @@ public function isInterface(): bool;
Throws:
@@ -2857,7 +2892,7 @@ public function isInterface(): bool;
```php
@@ -2880,7 +2915,7 @@ public function isInternal(): bool;
```php
@@ -2914,10 +2949,10 @@ public function isSubclassOf(string $className): bool;
Throws:
@@ -2928,7 +2963,7 @@ public function isSubclassOf(string $className): bool;
```php
@@ -2945,10 +2980,10 @@ public function isTrait(): bool;
Throws:
@@ -2959,7 +2994,7 @@ public function isTrait(): bool;
```php
@@ -3002,20 +3037,20 @@ public function loadPluginData(string $pluginKey, array $data): void;
```php
// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-
Return value: void
+
Return value: array
Throws:
@@ -3025,6 +3060,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -3032,7 +3107,7 @@ public function reloadEntityDependenciesCache(): void;
```php
@@ -3062,7 +3137,7 @@ public function removeNotUsedEntityDataCache(): void;
```php
diff --git a/docs/tech/classes/ClassEntityCollection.md b/docs/tech/classes/ClassEntityCollection.md
index bf0098f0..a89030c5 100644
--- a/docs/tech/classes/ClassEntityCollection.md
+++ b/docs/tech/classes/ClassEntityCollection.md
@@ -254,10 +254,10 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity
Throws:
@@ -325,10 +325,10 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan
Throws:
@@ -411,10 +411,10 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen
Throws:
@@ -459,10 +459,10 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P
Throws:
@@ -749,7 +749,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit
See:
@@ -775,10 +775,10 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars
Throws:
@@ -806,10 +806,10 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\
Throws:
@@ -837,10 +837,10 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En
Throws:
@@ -868,10 +868,10 @@ public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity
Throws:
@@ -1125,10 +1125,10 @@ public function loadClassEntities(): void;
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/ComposerParser.md b/docs/tech/classes/ComposerParser.md
new file mode 100644
index 00000000..fd9b98ed
--- /dev/null
+++ b/docs/tech/classes/ComposerParser.md
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+```php
+namespace BumbleDocGen\LanguageHandler\Php\Parser;
+
+final class ComposerParser
+```
+
+
+
+
+
+
+
+
+Initialization methods:
+
+
+-
+ __construct
+
+
+
+Methods:
+
+
+-
+ getComposerPackageDataByClassName
+
+-
+ getComposerPackages
+
+
+
+
+
+
+
+
+
+Method details:
+
+
+
+
+
+```php
+public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration);
+```
+
+
+
+
Parameters:
+
+
+
+
+
+
+
+
+
+
+
+```php
+public function getComposerPackageDataByClassName(string $className): array|null;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $className |
+ string |
+ - |
+
+
+
+
+
Return value: array |
null
+
+
+
Throws:
+
+
+
+
+
+
+
+
+```php
+public function getComposerPackages(): array;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: array
+
+
+
Throws:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/classes/Configuration.md b/docs/tech/classes/Configuration.md
index 5982a656..f3c41b3e 100644
--- a/docs/tech/classes/Configuration.md
+++ b/docs/tech/classes/Configuration.md
@@ -39,12 +39,18 @@ final class Configuration
getCacheDir
+
+ getConfigurationVersion
+
getDocGenLibDir
getGitClientPath
+
+ getIfExists
+
getLanguageHandlersCollection
@@ -153,7 +159,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame
```php
@@ -176,7 +182,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -187,7 +193,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad
```php
@@ -204,10 +210,31 @@ public function getCacheDir(): string|null;
Throws:
+
+
+
+
+
+
+```php
+public function getConfigurationVersion(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
@@ -215,7 +242,7 @@ public function getCacheDir(): string|null;
```php
@@ -236,7 +263,7 @@ public function getDocGenLibDir(): string;
```php
@@ -253,7 +280,52 @@ public function getGitClientPath(): string;
Throws:
+
+
+
+
+
+
+
+```php
+public function getIfExists(mixed $key): string|null;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ mixed |
+ - |
+
+
+
+
+
Return value: string |
null
+
+
+
Throws:
+
@@ -264,7 +336,7 @@ public function getGitClientPath(): string;
```php
@@ -287,7 +359,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -298,7 +370,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L
```php
@@ -315,7 +387,7 @@ public function getOutputDir(): string;
Throws:
@@ -326,7 +398,7 @@ public function getOutputDir(): string;
```php
@@ -343,7 +415,7 @@ public function getOutputDirBaseUrl(): string;
Throws:
@@ -354,7 +426,7 @@ public function getOutputDirBaseUrl(): string;
```php
@@ -374,7 +446,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -388,7 +460,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc
```php
@@ -408,7 +480,7 @@ public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection;
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -422,7 +494,7 @@ public function getPlugins(): \BumbleDocGen\Core\Plugin\PluginsCollection;
```php
@@ -439,7 +511,7 @@ public function getProjectRoot(): string;
Throws:
@@ -450,7 +522,7 @@ public function getProjectRoot(): string;
```php
@@ -470,7 +542,7 @@ public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\Sou
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -484,7 +556,7 @@ public function getSourceLocators(): \BumbleDocGen\Core\Parser\SourceLocator\Sou
```php
@@ -501,7 +573,7 @@ public function getTemplatesDir(): string;
Throws:
@@ -512,7 +584,7 @@ public function getTemplatesDir(): string;
```php
@@ -535,7 +607,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -546,7 +618,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom
```php
@@ -566,7 +638,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -580,7 +652,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu
```php
@@ -608,7 +680,7 @@ public function getWorkingDir(): string;
```php
@@ -625,7 +697,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool;
Throws:
@@ -636,7 +708,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool;
```php
@@ -653,7 +725,7 @@ public function useSharedCache(): bool;
Throws:
diff --git a/docs/tech/classes/ConfigurationParameterBag.md b/docs/tech/classes/ConfigurationParameterBag.md
index 5e2eeadf..fbdbf4c5 100644
--- a/docs/tech/classes/ConfigurationParameterBag.md
+++ b/docs/tech/classes/ConfigurationParameterBag.md
@@ -48,6 +48,9 @@ final class ConfigurationParameterBag
getConfigValues
+
+ getConfigVersion
+
getSubConfigurationParameterBag
@@ -99,7 +102,7 @@ final class ConfigurationParameterBag
```php
@@ -141,7 +144,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ValueTransformer\Va
```php
@@ -184,7 +187,7 @@ public function addValueFromFileIfNotExists(string $name, string ...$fileNames):
```php
@@ -227,7 +230,7 @@ public function addValueIfNotExists(string $name, mixed $value): void;
```php
@@ -277,7 +280,7 @@ public function get(string $name, bool $useResolvers = true): mixed;
```php
@@ -315,7 +318,7 @@ public function getAll(bool $useResolvers = true): array;
```php
@@ -346,6 +349,27 @@ public function getConfigValues(string ...$configurationFiles): array;
Return value: array
+
+
+
+
+
+
+```php
+public function getConfigVersion(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
@@ -353,7 +377,7 @@ public function getConfigValues(string ...$configurationFiles): array;
```php
@@ -391,7 +415,7 @@ public function getSubConfigurationParameterBag(string $parentKey): \BumbleDocGe
```php
@@ -429,7 +453,7 @@ public function has(mixed $name): bool;
```php
@@ -467,7 +491,7 @@ public function loadFromArray(array $parameters): void;
```php
@@ -505,7 +529,7 @@ public function loadFromFiles(string ...$fileNames): void;
```php
@@ -543,7 +567,7 @@ public function resolveValue(mixed $value): mixed;
```php
@@ -586,7 +610,7 @@ public function set(string $name, mixed $value): void;
```php
@@ -620,7 +644,7 @@ public function validateAndGetBooleanValue(string $parameterName): bool;
Throws:
@@ -631,7 +655,7 @@ public function validateAndGetBooleanValue(string $parameterName): bool;
```php
@@ -681,7 +705,7 @@ public function validateAndGetClassListValue(string $parameterName, string $clas
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -692,7 +716,7 @@ public function validateAndGetClassListValue(string $parameterName, string $clas
```php
@@ -734,7 +758,7 @@ public function validateAndGetClassValue(string $parameterName, string $classInt
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -748,7 +772,7 @@ public function validateAndGetClassValue(string $parameterName, string $classInt
```php
@@ -787,7 +811,7 @@ public function validateAndGetDirectoryPathValue(string $parameterName, bool $nu
Throws:
@@ -798,7 +822,7 @@ public function validateAndGetDirectoryPathValue(string $parameterName, bool $nu
```php
@@ -842,7 +866,7 @@ public function validateAndGetFilePathValue(string $parameterName, array $fileEx
Throws:
@@ -853,7 +877,7 @@ public function validateAndGetFilePathValue(string $parameterName, array $fileEx
```php
@@ -892,7 +916,7 @@ public function validateAndGetStringValue(string $parameterName, bool $nullable
Throws:
diff --git a/docs/tech/classes/Configuration_2.md b/docs/tech/classes/Configuration_2.md
new file mode 100644
index 00000000..d8fa6f21
--- /dev/null
+++ b/docs/tech/classes/Configuration_2.md
@@ -0,0 +1,735 @@
+
+
+
+
+
+
+
+
+
+```php
+namespace BumbleDocGen\Core\Configuration;
+
+final class Configuration
+```
+
+
Configuration project documentation
+
+
+
+
+
+
+
Initialization methods:
+
+
+-
+ __construct
+
+
+
+
Methods:
+
+
+-
+ getAdditionalConsoleCommands
+
+-
+ getCacheDir
+
+-
+ getConfigurationVersion
+
+-
+ getDocGenLibDir
+
+-
+ getGitClientPath
+
+-
+ getIfExists
+
+-
+ getLanguageHandlersCollection
+
+-
+ getOutputDir
+
+-
+ getOutputDirBaseUrl
+
+-
+ getPageLinkProcessor
+
+-
+ getPlugins
+
+-
+ getProjectRoot
+
+-
+ getSourceLocators
+
+-
+ getTemplatesDir
+
+-
+ getTwigFilters
+
+-
+ getTwigFunctions
+
+-
+ getWorkingDir
+
+-
+ isCheckFileInGitBeforeCreatingDocEnabled
+
+-
+ useSharedCache
+
+
+
+
+
Constants:
+
+
+
+
+
+
+
Method details:
+
+
+
+
+
+```php
+public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParameterBag $parameterBag, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \Psr\Log\LoggerInterface $logger);
+```
+
+
+
+
Parameters:
+
+
+
+
+
+
+
+
+
+
+
+
+
+```php
+public function getCacheDir(): string|null;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string |
null
+
+
+
Throws:
+
+
+
+
+
+
+
+
+```php
+public function getConfigurationVersion(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public function getDocGenLibDir(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public function getGitClientPath(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
Throws:
+
+
+
+
+
+
+
+
+```php
+public function getIfExists(mixed $key): string|null;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ mixed |
+ - |
+
+
+
+
+
Return value: string |
null
+
+
+
Throws:
+
+
+
+
+
+
+
+
+
+
+```php
+public function getOutputDir(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
Throws:
+
+
+
+
+
+
+
+
+```php
+public function getOutputDirBaseUrl(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
Throws:
+
+
+
+
+
+
+
+
+
+
+
+
+```php
+public function getProjectRoot(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
Throws:
+
+
+
+
+
+
+
+
+
+
+```php
+public function getTemplatesDir(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
Throws:
+
+
+
+
+
+
+
+
+
+
+
+
+```php
+public function getWorkingDir(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
Throws:
+
+
+
+
+
+
+
+- #
+ isCheckFileInGitBeforeCreatingDocEnabled
+ | source code
+
+
+```php
+public function isCheckFileInGitBeforeCreatingDocEnabled(): bool;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: bool
+
+
+
Throws:
+
+
+
+
+
+
+
+
+```php
+public function useSharedCache(): bool;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: bool
+
+
+
Throws:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/classes/ConstantEntity.md b/docs/tech/classes/ConstantEntity.md
index 064118dc..8367da3e 100644
--- a/docs/tech/classes/ConstantEntity.md
+++ b/docs/tech/classes/ConstantEntity.md
@@ -147,6 +147,9 @@ class ConstantEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
reloadEntityDependenciesCache
+
+ removeEntityValueFromCache
+
removeNotUsedEntityDataCache
@@ -237,7 +240,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -256,7 +259,7 @@ public function entityCacheIsOutdated(): bool;
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Psr\Cache\InvalidArgumentException
@@ -270,7 +273,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -289,7 +292,7 @@ public function getAbsoluteFileName(): string|null;
Throws:
@@ -300,11 +303,11 @@ public function getAbsoluteFileName(): string|null;
```php
-// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
public function getCacheKey(): string;
```
@@ -323,7 +326,7 @@ public function getCacheKey(): string;
```php
@@ -370,10 +373,10 @@ public function getDescription(): string;
Throws:
@@ -384,7 +387,7 @@ public function getDescription(): string;
```php
@@ -403,7 +406,7 @@ public function getDescriptionLinks(): array;
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Exception
@@ -434,10 +437,10 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock;
Throws:
@@ -448,7 +451,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock;
```php
@@ -467,10 +470,10 @@ public function getDocComment(): string;
Throws:
@@ -502,7 +505,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -542,10 +545,10 @@ public function getEndLine(): int;
Throws:
@@ -556,7 +559,7 @@ public function getEndLine(): int;
```php
@@ -596,10 +599,10 @@ public function getFileName(): string|null;
Throws:
@@ -610,7 +613,7 @@ public function getFileName(): string|null;
```php
@@ -646,7 +649,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
Throws:
@@ -657,7 +660,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -739,10 +742,10 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
Throws:
@@ -791,10 +794,10 @@ public function getNamespaceName(): string;
Throws:
@@ -805,7 +808,7 @@ public function getNamespaceName(): string;
```php
@@ -929,10 +932,10 @@ public function getStartLine(): int;
Throws:
@@ -943,7 +946,7 @@ public function getStartLine(): int;
```php
@@ -962,10 +965,10 @@ public function getThrows(): array;
Throws:
@@ -976,7 +979,7 @@ public function getThrows(): array;
```php
@@ -1006,7 +1009,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -1029,7 +1032,7 @@ public function hasExamples(): bool;
```php
@@ -1052,7 +1055,7 @@ public function hasThrows(): bool;
```php
@@ -1075,7 +1078,7 @@ public function isDeprecated(): bool;
```php
@@ -1105,7 +1108,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -1124,10 +1127,10 @@ public function isEntityFileCanBeLoad(): bool;
Throws:
@@ -1138,7 +1141,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -1178,10 +1181,10 @@ public function isPrivate(): bool;
Throws:
@@ -1209,10 +1212,10 @@ public function isProtected(): bool;
Throws:
@@ -1240,10 +1243,10 @@ public function isPublic(): bool;
Throws:
@@ -1254,20 +1257,20 @@ public function isPublic(): bool;
```php
// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-Return value: void
+Return value: array
Throws:
@@ -1277,6 +1280,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -1284,7 +1327,7 @@ public function reloadEntityDependenciesCache(): void;
```php
diff --git a/docs/tech/classes/ConstantEntityCollection.md b/docs/tech/classes/ConstantEntityCollection.md
index 4bca354d..46430bb9 100644
--- a/docs/tech/classes/ConstantEntityCollection.md
+++ b/docs/tech/classes/ConstantEntityCollection.md
@@ -322,10 +322,10 @@ public function loadConstantEntities(): void;
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -413,13 +413,13 @@ public function unsafeGet(string $constantName): \BumbleDocGen\LanguageHandler\P
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/DirectoryDependency.md b/docs/tech/classes/DirectoryDependency.md
index a1598111..36aae44d 100644
--- a/docs/tech/classes/DirectoryDependency.md
+++ b/docs/tech/classes/DirectoryDependency.md
@@ -135,7 +135,7 @@ public static function create(\BumbleDocGen\Core\Renderer\RendererHelper $render
Throws:
@@ -180,7 +180,7 @@ public function isChanged(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHe
Throws:
diff --git a/docs/tech/classes/MissingDocBlocksGenerator.md b/docs/tech/classes/DocBlocksGenerator.md
similarity index 68%
rename from docs/tech/classes/MissingDocBlocksGenerator.md
rename to docs/tech/classes/DocBlocksGenerator.md
index 94dee11e..d1f9a760 100644
--- a/docs/tech/classes/MissingDocBlocksGenerator.md
+++ b/docs/tech/classes/DocBlocksGenerator.md
@@ -1,8 +1,8 @@
-
+
@@ -10,9 +10,9 @@
```php
-namespace BumbleDocGen\TemplateGenerator\ChatGpt;
+namespace BumbleDocGen\AI\Generators;
-final class MissingDocBlocksGenerator
+final class DocBlocksGenerator
```
@@ -44,17 +44,13 @@ final class MissingDocBlocksGenerator
Constants:
@@ -69,11 +65,11 @@ final class MissingDocBlocksGenerator
```php
-public function __construct(\Tectalic\OpenAi\Client $openaiClient, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, string $model = self::MODEL_GPT_4);
+public function __construct(\BumbleDocGen\AI\ProviderInterface $aiProvider, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper);
```
@@ -90,19 +86,14 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, \BumbleDocGen
- $openaiClient |
- \Tectalic\OpenAi\Client |
+ $aiProvider |
+ \BumbleDocGen\AI\ProviderInterface |
- |
$parserHelper |
\BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper |
- |
-
-
- $model |
- string |
- - |
@@ -116,7 +107,7 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, \BumbleDocGen
```php
@@ -155,7 +146,7 @@ public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\E
Throws:
@@ -178,7 +166,7 @@ public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\E
```php
@@ -218,10 +206,10 @@ public function hasMethodsWithoutDocBlocks(\BumbleDocGen\Core\Parser\Entity\Root
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md
index 486ecaeb..51981535 100644
--- a/docs/tech/classes/DocGenerator.md
+++ b/docs/tech/classes/DocGenerator.md
@@ -2,7 +2,7 @@
@@ -34,17 +34,14 @@ final class DocGenerator
-
- addMissingDocBlocks
+ addDocBlocks
- Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
--
- fillInReadmeMdTemplate
-
-
generate
- Generates documentation using configuration
-
- generateProjectTemplatesStructure
- - Generate documentation structure with blank templates using AI tools
+ generateReadmeTemplate
+
-
parseAndGetRootEntityCollectionsGroup
@@ -55,11 +52,11 @@ final class DocGenerator
@@ -74,7 +71,7 @@ final class DocGenerator
```php
@@ -154,58 +151,35 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo
```php
-public function addMissingDocBlocks(): void;
+public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): void;
```
Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
-
Parameters: not specified
-
-
Return value: void
-
-
-
Throws:
-
-
-
-
-
-
-
-
-```php
-public function fillInReadmeMdTemplate(): void;
-```
-
-
+
Parameters:
-
Parameters: not specified
+
Return value: void
@@ -213,19 +187,16 @@ public function fillInReadmeMdTemplate(): void;
Throws:
@@ -236,7 +207,7 @@ public function fillInReadmeMdTemplate(): void;
```php
@@ -265,18 +236,35 @@ public function generate(): void;
```php
-public function generateProjectTemplatesStructure(): void;
+public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiProvider): void;
```
-
Generate documentation structure with blank templates using AI tools
-
Parameters: not specified
+
+
Parameters:
+
+
Return value: void
@@ -284,19 +272,16 @@ public function generateProjectTemplatesStructure(): void;
Throws:
@@ -307,7 +292,7 @@ public function generateProjectTemplatesStructure(): void;
```php
@@ -330,7 +315,7 @@ public function parseAndGetRootEntityCollectionsGroup(): \BumbleDocGen\Core\Pars
\DI\NotFoundException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrapper_2.md b/docs/tech/classes/DocumentedEntityWrapper_2.md
similarity index 97%
rename from docs/tech/3.renderer/classes/DocumentedEntityWrapper_2.md
rename to docs/tech/classes/DocumentedEntityWrapper_2.md
index c6dfad98..f5621eef 100644
--- a/docs/tech/3.renderer/classes/DocumentedEntityWrapper_2.md
+++ b/docs/tech/classes/DocumentedEntityWrapper_2.md
@@ -1,5 +1,5 @@
-
+
DocumentedEntityWrapper class:
diff --git a/docs/tech/classes/DocumentedEntityWrappersCollection.md b/docs/tech/classes/DocumentedEntityWrappersCollection.md
index 1d16d4c1..63cdd40e 100644
--- a/docs/tech/classes/DocumentedEntityWrappersCollection.md
+++ b/docs/tech/classes/DocumentedEntityWrappersCollection.md
@@ -2,7 +2,7 @@
@@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
```php
-public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
+public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
```
@@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
$localObjectCache |
\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache |
- |
+
+
+ $breadcrumbsHelper |
+ \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper |
+ - |
$pluginEventDispatcher |
@@ -107,7 +112,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
```php
@@ -134,7 +139,7 @@ public function count(): int;
```php
@@ -165,6 +170,13 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En
Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper
+Throws:
+
+
@@ -172,7 +184,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En
```php
@@ -193,7 +205,7 @@ public function getDocumentedEntitiesRelations(): array;
```php
diff --git a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_2.md b/docs/tech/classes/DocumentedEntityWrappersCollection_2.md
similarity index 84%
rename from docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_2.md
rename to docs/tech/classes/DocumentedEntityWrappersCollection_2.md
index ff2e994b..c913bb55 100644
--- a/docs/tech/3.renderer/classes/DocumentedEntityWrappersCollection_2.md
+++ b/docs/tech/classes/DocumentedEntityWrappersCollection_2.md
@@ -1,8 +1,8 @@
-
+
@@ -60,11 +60,11 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \T
```php
-public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
+public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext $rendererContext, \BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache $localObjectCache, \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
```
@@ -89,6 +89,11 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
$localObjectCache |
\BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache |
- |
+
+
+ $breadcrumbsHelper |
+ \BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper |
+ - |
$pluginEventDispatcher |
@@ -107,7 +112,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
```php
@@ -134,7 +139,7 @@ public function count(): int;
```php
@@ -165,6 +170,13 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En
Return value: \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrapper
+Throws:
+
+
@@ -172,7 +184,7 @@ public function createAndAddDocumentedEntityWrapper(\BumbleDocGen\Core\Parser\En
```php
@@ -193,7 +205,7 @@ public function getDocumentedEntitiesRelations(): array;
```php
diff --git a/docs/tech/classes/DrawClassMap.md b/docs/tech/classes/DrawClassMap.md
index 5d32d7ff..7ed2a300 100644
--- a/docs/tech/classes/DrawClassMap.md
+++ b/docs/tech/classes/DrawClassMap.md
@@ -165,13 +165,13 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEn
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -267,13 +267,13 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/DrawDocumentationMenu.md b/docs/tech/classes/DrawDocumentationMenu.md
index bf71bb15..c322dbcb 100644
--- a/docs/tech/classes/DrawDocumentationMenu.md
+++ b/docs/tech/classes/DrawDocumentationMenu.md
@@ -21,7 +21,7 @@ and all links with this page are recursively collected for it, after which the h
See:
@@ -196,7 +196,7 @@ public function __invoke(string|null $startPageKey = null, int|null $maxDeep = n
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/DrawDocumentedEntityLink.md b/docs/tech/classes/DrawDocumentedEntityLink.md
index 1eeb445b..085b28a6 100644
--- a/docs/tech/classes/DrawDocumentedEntityLink.md
+++ b/docs/tech/classes/DrawDocumentedEntityLink.md
@@ -169,13 +169,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $e
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/DynamicMethodEntity.md b/docs/tech/classes/DynamicMethodEntity.md
index 01d0f534..4e60369a 100644
--- a/docs/tech/classes/DynamicMethodEntity.md
+++ b/docs/tech/classes/DynamicMethodEntity.md
@@ -225,7 +225,7 @@ public function getAbsoluteFileName(): string|null;
Throws:
@@ -351,7 +351,7 @@ public function getFileName(): string|null;
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Exception
@@ -522,10 +522,10 @@ public function getNamespaceName(): string;
Throws:
@@ -616,10 +616,10 @@ public function getReturnType(): string;
Throws:
@@ -787,10 +787,10 @@ public function isInitialization(): bool;
Throws:
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Exception
diff --git a/docs/tech/classes/EntityCacheItemPool.md b/docs/tech/classes/EntityCacheItemPool.md
index 84e34139..62a896b1 100644
--- a/docs/tech/classes/EntityCacheItemPool.md
+++ b/docs/tech/classes/EntityCacheItemPool.md
@@ -108,7 +108,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
Throws:
diff --git a/docs/tech/classes/EntityDocRendererHelper.md b/docs/tech/classes/EntityDocRendererHelper.md
index d085e770..e38d5521 100644
--- a/docs/tech/classes/EntityDocRendererHelper.md
+++ b/docs/tech/classes/EntityDocRendererHelper.md
@@ -160,10 +160,10 @@ public function getEntityDataByLink(string $linkString, \BumbleDocGen\Core\Parse
Throws:
@@ -174,7 +174,7 @@ public function getEntityDataByLink(string $linkString, \BumbleDocGen\Core\Parse
```php
@@ -218,10 +218,10 @@ public function getEntityUrlDataByLink(string $linkString, string|null $defaultE
Throws:
diff --git a/docs/tech/classes/FileDependency.md b/docs/tech/classes/FileDependency.md
index 299b8ce8..1175a15f 100644
--- a/docs/tech/classes/FileDependency.md
+++ b/docs/tech/classes/FileDependency.md
@@ -220,7 +220,7 @@ public static function create(\BumbleDocGen\Core\Renderer\RendererHelper $render
Throws:
@@ -265,7 +265,7 @@ public function isChanged(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHe
Throws:
diff --git a/docs/tech/classes/GeneratePageBreadcrumbs.md b/docs/tech/classes/GeneratePageBreadcrumbs.md
index 4151e4ec..ade4f717 100644
--- a/docs/tech/classes/GeneratePageBreadcrumbs.md
+++ b/docs/tech/classes/GeneratePageBreadcrumbs.md
@@ -175,7 +175,7 @@ public function __invoke(string $currentPageTitle, string $templatePath, bool $s
\DI\NotFoundException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/FillInReadmeMdTemplateCommand.md b/docs/tech/classes/GenerateReadMeTemplateCommand.md
similarity index 98%
rename from docs/tech/classes/FillInReadmeMdTemplateCommand.md
rename to docs/tech/classes/GenerateReadMeTemplateCommand.md
index 197457d3..1c839113 100644
--- a/docs/tech/classes/FillInReadmeMdTemplateCommand.md
+++ b/docs/tech/classes/GenerateReadMeTemplateCommand.md
@@ -1,8 +1,8 @@
-
+
@@ -10,9 +10,9 @@
```php
-namespace BumbleDocGen\Console\Command;
+namespace BumbleDocGen\AI\Console;
-final class FillInReadmeMdTemplateCommand extends \BumbleDocGen\Console\Command\BaseCommand
+final class GenerateReadMeTemplateCommand extends \BumbleDocGen\Console\Command\BaseCommand
```
Base class for all commands.
@@ -134,6 +134,11 @@ final class FillInReadmeMdTemplateCommand extends \BumbleDocGen\Console\Command\
- Sets the process title of the command.
+Traits:
+
+
Constants:
@@ -145,6 +150,10 @@ final class FillInReadmeMdTemplateCommand extends \BumbleDocGen\Console\Command\
href="#qinvalid">#
INVALID
| source
code
+ - #
+
NAME
| source
+ code
- #
SUCCESS
| source
diff --git a/docs/tech/classes/GenerationErrorsHandler.md b/docs/tech/classes/GenerationErrorsHandler.md
index 4c08c9f0..61c91bbb 100644
--- a/docs/tech/classes/GenerationErrorsHandler.md
+++ b/docs/tech/classes/GenerationErrorsHandler.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Logger\Handler;
-final class GenerationErrorsHandler extends \Monolog\Handler\AbstractProcessingHandler implements \Monolog\Handler\ProcessableHandlerInterface, \Monolog\Handler\FormattableHandlerInterface, \Monolog\ResettableInterface, \Monolog\Handler\HandlerInterface
+final class GenerationErrorsHandler extends \Monolog\Handler\AbstractProcessingHandler
```
Base Handler class providing the Handler structure, including processors and formatters
@@ -192,7 +192,7 @@ public function __sleep(): mixed;
```php
@@ -322,7 +322,7 @@ public function getLevel(): int;
```php
@@ -654,7 +654,7 @@ public function setLevel(\Monolog\Handler\Level|\Monolog\Handler\LevelName|\Psr\
$level |
- \Monolog\Handler\Level | \Monolog\Handler\LevelName | \Psr\Log\LogLevel::* |
+ \Monolog\Handler\Level | \Monolog\Handler\LevelName | \Psr\Log\LogLevel::* |
Level or level name |
diff --git a/docs/tech/classes/GetClassMethodsBodyCode.md b/docs/tech/classes/GetClassMethodsBodyCode.md
index 3a055ac8..98395caf 100644
--- a/docs/tech/classes/GetClassMethodsBodyCode.md
+++ b/docs/tech/classes/GetClassMethodsBodyCode.md
@@ -151,7 +151,7 @@ public function __invoke(string $className, array $methodsNames): string|null;
Throws:
diff --git a/docs/tech/classes/GetDocumentationPageUrl.md b/docs/tech/classes/GetDocumentationPageUrl.md
index fa66f1ed..f2bbb34c 100644
--- a/docs/tech/classes/GetDocumentationPageUrl.md
+++ b/docs/tech/classes/GetDocumentationPageUrl.md
@@ -177,7 +177,7 @@ public function __invoke(string $key): string;
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
diff --git a/docs/tech/classes/GetDocumentedEntityUrl.md b/docs/tech/classes/GetDocumentedEntityUrl.md
index c0e96456..daf1f88f 100644
--- a/docs/tech/classes/GetDocumentedEntityUrl.md
+++ b/docs/tech/classes/GetDocumentedEntityUrl.md
@@ -21,11 +21,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create
See:
@@ -211,13 +211,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $
\DI\DependencyException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\DI\NotFoundException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
diff --git a/docs/tech/classes/GetDocumentedEntityUrl_2.md b/docs/tech/classes/GetDocumentedEntityUrl_2.md
new file mode 100644
index 00000000..738c5993
--- /dev/null
+++ b/docs/tech/classes/GetDocumentedEntityUrl_2.md
@@ -0,0 +1,269 @@
+
+
+
+
+
+
+
+
+
+```php
+namespace BumbleDocGen\Core\Renderer\Twig\Function;
+
+final class GetDocumentedEntityUrl implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface
+```
+
+
Get the URL of a documented entity by its name. If the entity is found, next to the file where this method was called,
+the `EntityDocRendererInterface::getDocFileExtension()` directory will be created, in which the documented entity file will be created
+
+See:
+
+
+
+
Examples of using:
+
+```php
+{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', 'getFunctions') }}
+The function returns a reference to the documented entity, anchored to the getFunctions method
+
+```
+
+```php
+{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension') }}
+The function returns a reference to the documented entity MainExtension
+
+```
+
+```php
+{{ getDocumentedEntityUrl(phpClassEntityCollection, '\\BumbleDocGen\\Renderer\\Twig\\MainExtension', '', false) }}
+The function returns a link to the file MainExtension
+
+```
+
+
+
+
+
Settings:
+
+
+
+ Function name: |
+ getDocumentedEntityUrl |
+
+
+
+
+
+
+
Initialization methods:
+
+
+-
+ __construct
+
+
+
+
Methods:
+
+
+-
+ __invoke
+
+-
+ getName
+
+-
+ getOptions
+
+
+
+
+
Constants:
+
+
+
+
+
+
+
Method details:
+
+
+
+
+
+```php
+public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $rendererHelper, \BumbleDocGen\Core\Renderer\Context\DocumentedEntityWrappersCollection $documentedEntityWrappersCollection, \BumbleDocGen\Core\Configuration\Configuration $configuration, \Monolog\Logger $logger);
+```
+
+
+
+
Parameters:
+
+
+
+
+
+
+
+
+
+
+
+```php
+public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string $entityName, string $cursor = '', bool $createDocument = true): string;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $rootEntityCollection |
+ \BumbleDocGen\Core\Parser\Entity\RootEntityCollection |
+ Processed entity collection |
+
+
+ $entityName |
+ string |
+ The full name of the entity for which the URL will be retrieved.
+ If the entity is not found, the DEFAULT_URL value will be returned. |
+
+
+ $cursor |
+ string |
+ Cursor on the page of the documented entity (for example, the name of a method or property) |
+
+
+ $createDocument |
+ bool |
+ If true, creates an entity document. Otherwise, just gives a reference to the entity code |
+
+
+
+
+
Return value: string
+
+
+
Throws:
+
+
+
+
+
+
+
+
+```php
+public static function getName(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public static function getOptions(): array;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: array
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/2.parser/classes/InvalidConfigurationParameterException_3.md b/docs/tech/classes/InvalidConfigurationParameterException_2.md
similarity index 97%
rename from docs/tech/2.parser/classes/InvalidConfigurationParameterException_3.md
rename to docs/tech/classes/InvalidConfigurationParameterException_2.md
index 6fd398e0..6f1165dc 100644
--- a/docs/tech/2.parser/classes/InvalidConfigurationParameterException_3.md
+++ b/docs/tech/classes/InvalidConfigurationParameterException_2.md
@@ -1,5 +1,5 @@
-
+
InvalidConfigurationParameterException class:
diff --git a/docs/tech/classes/LoadPluginsContent_2.md b/docs/tech/classes/LoadPluginsContent_2.md
new file mode 100644
index 00000000..c6a8a8d9
--- /dev/null
+++ b/docs/tech/classes/LoadPluginsContent_2.md
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+:warning: Is internal
+```php
+namespace BumbleDocGen\Core\Renderer\Twig\Function;
+
+final class LoadPluginsContent implements \BumbleDocGen\Core\Renderer\Twig\Function\CustomFunctionInterface
+```
+
+Process entity template blocks with plugins. The method returns the content processed by plugins.
+
+
+Examples of using:
+
+```php
+{{ loadPluginsContent('some text', entity, constant('BumbleDocGen\\Plugin\\BaseTemplatePluginInterface::BLOCK_AFTER_HEADER')) }}
+
+```
+
+
+
+
+Settings:
+
+
+
+ Function name: |
+ loadPluginsContent |
+
+
+
+
+
+
+
Initialization methods:
+
+
+-
+ __construct
+
+
+
+
Methods:
+
+
+-
+ __invoke
+
+-
+ getName
+
+-
+ getOptions
+
+
+
+
+
+
+
+
+
+
Method details:
+
+
+
+
+
+```php
+public function __construct(\BumbleDocGen\Core\Plugin\PluginEventDispatcher $pluginEventDispatcher);
+```
+
+
+
+
Parameters:
+
+
+
+
+
+
+
+
+
+
+
+```php
+public function __invoke(string $content, \BumbleDocGen\Core\Parser\Entity\RootEntityInterface $entity, string $blockType): string;
+```
+
+
+
+
Parameters:
+
+
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public static function getName(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public static function getOptions(): array;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: array
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/classes/LocalObjectCache.md b/docs/tech/classes/LocalObjectCache.md
index f67e27cd..55533ee7 100644
--- a/docs/tech/classes/LocalObjectCache.md
+++ b/docs/tech/classes/LocalObjectCache.md
@@ -134,7 +134,7 @@ public function getMethodCachedResult(string $methodKey, string $objectId): mixe
Throws:
diff --git a/docs/tech/classes/LocatedInCondition.md b/docs/tech/classes/LocatedInCondition.md
index 398e3758..bc896755 100644
--- a/docs/tech/classes/LocatedInCondition.md
+++ b/docs/tech/classes/LocatedInCondition.md
@@ -132,7 +132,7 @@ public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterf
Throws:
diff --git a/docs/tech/classes/LocatedNotInCondition.md b/docs/tech/classes/LocatedNotInCondition.md
index 17d48a2a..0c4b849e 100644
--- a/docs/tech/classes/LocatedNotInCondition.md
+++ b/docs/tech/classes/LocatedNotInCondition.md
@@ -132,7 +132,7 @@ public function canAddToCollection(\BumbleDocGen\Core\Parser\Entity\EntityInterf
Throws:
diff --git a/docs/tech/classes/LoggableRootEntityCollection.md b/docs/tech/classes/LoggableRootEntityCollection.md
index 9b543c78..db44b043 100644
--- a/docs/tech/classes/LoggableRootEntityCollection.md
+++ b/docs/tech/classes/LoggableRootEntityCollection.md
@@ -354,7 +354,7 @@ public function getLoadedOrCreateNew(string $objectName, bool $withAddClassEntit
See:
diff --git a/docs/tech/classes/MainExtension.md b/docs/tech/classes/MainExtension.md
index 78c1559e..4db33a6d 100644
--- a/docs/tech/classes/MainExtension.md
+++ b/docs/tech/classes/MainExtension.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Renderer\Twig;
-final class MainExtension extends \Twig\Extension\AbstractExtension implements \Twig\Extension\ExtensionInterface
+final class MainExtension extends \Twig\Extension\AbstractExtension
```
This is an extension that is used to generate documents from templates
@@ -113,7 +113,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\Context\RendererContext
Throws:
@@ -183,7 +183,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L
Throws:
@@ -303,7 +303,7 @@ public function setDefaultFilters(): void;
Throws:
@@ -331,7 +331,7 @@ public function setDefaultFunctions(): void;
Throws:
diff --git a/docs/tech/classes/MainTwigEnvironment.md b/docs/tech/classes/MainTwigEnvironment.md
index 42f3ba98..c0a946fa 100644
--- a/docs/tech/classes/MainTwigEnvironment.md
+++ b/docs/tech/classes/MainTwigEnvironment.md
@@ -146,7 +146,7 @@ public function render(mixed $name, array $context = []): string;
\Twig\Error\LoaderError
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/MethodEntity.md b/docs/tech/classes/MethodEntity.md
index 7c4e360b..fbb57e47 100644
--- a/docs/tech/classes/MethodEntity.md
+++ b/docs/tech/classes/MethodEntity.md
@@ -201,6 +201,9 @@ class MethodEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseE
reloadEntityDependenciesCache
+
+ removeEntityValueFromCache
+
removeNotUsedEntityDataCache
@@ -296,7 +299,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -315,7 +318,7 @@ public function entityCacheIsOutdated(): bool;
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Psr\Cache\InvalidArgumentException
@@ -329,7 +332,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -348,7 +351,7 @@ public function getAbsoluteFileName(): string|null;
Throws:
@@ -359,7 +362,7 @@ public function getAbsoluteFileName(): string|null;
```php
@@ -376,10 +379,10 @@ public function getBodyCode(): string;
Throws:
@@ -390,11 +393,11 @@ public function getBodyCode(): string;
```php
-// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
public function getCacheKey(): string;
```
@@ -413,7 +416,7 @@ public function getCacheKey(): string;
```php
@@ -443,7 +446,7 @@ public function getCachedEntityDependencies(): array;
```php
@@ -466,10 +469,10 @@ public function getDescription(): string;
\DI\DependencyException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -480,7 +483,7 @@ public function getDescription(): string;
```php
@@ -499,7 +502,7 @@ public function getDescriptionLinks(): array;
Throws:
@@ -567,7 +570,7 @@ public function getDocBlock(bool $recursive = true): \phpDocumentor\Reflection\D
```php
@@ -584,10 +587,10 @@ public function getDocComment(): string;
Throws:
@@ -615,7 +618,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
Throws:
@@ -635,7 +638,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -652,10 +655,10 @@ public function getDocCommentLine(): int|null;
Throws:
@@ -666,7 +669,7 @@ public function getDocCommentLine(): int|null;
```php
@@ -686,13 +689,13 @@ public function getDocCommentLineRecursive(): int|null;
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -703,7 +706,7 @@ public function getDocCommentLineRecursive(): int|null;
```php
@@ -723,13 +726,13 @@ public function getDocCommentRecursive(): string;
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -740,7 +743,7 @@ public function getDocCommentRecursive(): string;
```php
@@ -763,7 +766,7 @@ public function getDocNote(): string;
```php
@@ -780,10 +783,10 @@ public function getEndLine(): int;
Throws:
@@ -794,7 +797,7 @@ public function getEndLine(): int;
```php
@@ -817,7 +820,7 @@ public function getExamples(): array;
```php
@@ -834,10 +837,10 @@ public function getFileName(): string|null;
Throws:
@@ -848,7 +851,7 @@ public function getFileName(): string|null;
```php
@@ -884,7 +887,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
Throws:
@@ -895,7 +898,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -918,7 +921,7 @@ public function getFirstExample(): string;
```php
@@ -935,10 +938,10 @@ public function getFirstReturnValue(): mixed;
Throws:
@@ -970,7 +973,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser
```php
@@ -1008,10 +1011,10 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
Throws:
@@ -1022,7 +1025,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
```php
@@ -1039,10 +1042,10 @@ public function getModifiersString(): string;
Throws:
@@ -1053,7 +1056,7 @@ public function getModifiersString(): string;
```php
@@ -1091,10 +1094,10 @@ public function getNamespaceName(): string;
Throws:
@@ -1105,7 +1108,7 @@ public function getNamespaceName(): string;
```php
@@ -1128,7 +1131,7 @@ public function getObjectId(): string;
```php
@@ -1148,13 +1151,13 @@ public function getParameters(): array;
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\Exception
@@ -1168,7 +1171,7 @@ public function getParameters(): array;
```php
@@ -1191,10 +1194,10 @@ public function getParametersString(): string;
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -1226,7 +1229,7 @@ public function getPhpHandlerSettings(): \BumbleDocGen\LanguageHandler\Php\PhpHa
```php
@@ -1243,7 +1246,7 @@ public function getPrototype(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\
Throws:
@@ -1263,7 +1266,7 @@ public function getPrototype(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\
```php
@@ -1283,13 +1286,13 @@ public function getReturnType(): string;
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -1363,7 +1366,7 @@ public function getShortName(): string;
```php
@@ -1380,7 +1383,7 @@ public function getSignature(): string;
Throws:
@@ -1400,7 +1403,7 @@ public function getSignature(): string;
```php
@@ -1417,10 +1420,10 @@ public function getStartColumn(): int;
Throws:
@@ -1431,7 +1434,7 @@ public function getStartColumn(): int;
```php
@@ -1448,10 +1451,10 @@ public function getStartLine(): int;
Throws:
@@ -1462,7 +1465,7 @@ public function getStartLine(): int;
```php
@@ -1481,10 +1484,10 @@ public function getThrows(): array;
Throws:
@@ -1495,7 +1498,7 @@ public function getThrows(): array;
```php
@@ -1525,7 +1528,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -1548,7 +1551,7 @@ public function hasExamples(): bool;
```php
@@ -1571,7 +1574,7 @@ public function hasThrows(): bool;
```php
@@ -1592,7 +1595,7 @@ public function isConstructor(): bool;
```php
@@ -1615,7 +1618,7 @@ public function isDeprecated(): bool;
```php
@@ -1636,7 +1639,7 @@ public function isDynamic(): bool;
```php
@@ -1666,7 +1669,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -1685,10 +1688,10 @@ public function isEntityFileCanBeLoad(): bool;
Throws:
@@ -1699,7 +1702,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -1720,7 +1723,7 @@ public function isImplementedInParentClass(): bool;
```php
@@ -1737,7 +1740,7 @@ public function isInitialization(): bool;
Throws:
@@ -1757,7 +1760,7 @@ public function isInitialization(): bool;
```php
@@ -1780,7 +1783,7 @@ public function isInternal(): bool;
```php
@@ -1797,10 +1800,10 @@ public function isPrivate(): bool;
Throws:
@@ -1811,7 +1814,7 @@ public function isPrivate(): bool;
```php
@@ -1828,10 +1831,10 @@ public function isProtected(): bool;
Throws:
@@ -1842,7 +1845,7 @@ public function isProtected(): bool;
```php
@@ -1859,10 +1862,10 @@ public function isPublic(): bool;
Throws:
@@ -1873,7 +1876,7 @@ public function isPublic(): bool;
```php
@@ -1890,10 +1893,10 @@ public function isStatic(): bool;
Throws:
@@ -1904,7 +1907,7 @@ public function isStatic(): bool;
```php
@@ -1942,20 +1945,20 @@ public static function parseAnnotationParams(array $params): array;
```php
// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-Return value: void
+Return value: array
Throws:
@@ -1965,6 +1968,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -1972,7 +2015,7 @@ public function reloadEntityDependenciesCache(): void;
```php
diff --git a/docs/tech/classes/MethodEntityCollection.md b/docs/tech/classes/MethodEntityCollection.md
index 72c0981f..429e6c6b 100644
--- a/docs/tech/classes/MethodEntityCollection.md
+++ b/docs/tech/classes/MethodEntityCollection.md
@@ -369,7 +369,7 @@ public function loadMethodEntities(): void;
Throws:
@@ -466,13 +466,13 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/ReflectionException_4.md b/docs/tech/classes/ObjectNotFoundException_2.md
similarity index 94%
rename from docs/tech/3.renderer/classes/ReflectionException_4.md
rename to docs/tech/classes/ObjectNotFoundException_2.md
index 410e0d79..675bfc47 100644
--- a/docs/tech/3.renderer/classes/ReflectionException_4.md
+++ b/docs/tech/classes/ObjectNotFoundException_2.md
@@ -1,8 +1,8 @@
-
+
@@ -10,9 +10,9 @@
```php
-namespace BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception;
+namespace BumbleDocGen\Core\Cache\LocalCache\Exception;
-final class ReflectionException extends \Exception implements \Throwable, \Stringable
+final class ObjectNotFoundException extends \Exception implements \Throwable, \Stringable
```
Exception is the base class for
diff --git a/docs/tech/classes/OnAddClassEntityToCollection.md b/docs/tech/classes/OnAddClassEntityToCollection.md
index 82345b80..3b252cc8 100644
--- a/docs/tech/classes/OnAddClassEntityToCollection.md
+++ b/docs/tech/classes/OnAddClassEntityToCollection.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Parser;
-final class OnAddClassEntityToCollection extends \Symfony\Contracts\EventDispatcher\Event implements \BumbleDocGen\Core\Plugin\OnlySingleExecutionEvent, \Psr\EventDispatcher\StoppableEventInterface
+final class OnAddClassEntityToCollection extends \Symfony\Contracts\EventDispatcher\Event implements \BumbleDocGen\Core\Plugin\OnlySingleExecutionEvent
```
Called when each class entity is added to the entity collection
diff --git a/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md b/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md
index 9f0e4b9e..806ad056 100644
--- a/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md
+++ b/docs/tech/classes/OnCheckIsClassEntityCanBeLoad.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity;
-final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnCheckIsClassEntityCanBeLoad extends \Symfony\Contracts\EventDispatcher\Event
```
Event is the base class for classes containing event data.
diff --git a/docs/tech/classes/OnCreateDocumentedEntityWrapper.md b/docs/tech/classes/OnCreateDocumentedEntityWrapper.md
index 7490327c..0e8cdba4 100644
--- a/docs/tech/classes/OnCreateDocumentedEntityWrapper.md
+++ b/docs/tech/classes/OnCreateDocumentedEntityWrapper.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnCreateDocumentedEntityWrapper extends \Symfony\Contracts\EventDispatcher\Event
```
The event occurs when an entity is added to the list for documentation
diff --git a/docs/tech/classes/OnGetProjectTemplatesDirs.md b/docs/tech/classes/OnGetProjectTemplatesDirs.md
index dc32725c..1a3e4e7a 100644
--- a/docs/tech/classes/OnGetProjectTemplatesDirs.md
+++ b/docs/tech/classes/OnGetProjectTemplatesDirs.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnGetProjectTemplatesDirs extends \Symfony\Contracts\EventDispatcher\Event
```
This event occurs when all directories containing document templates are retrieved
diff --git a/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md b/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md
index 482c6d64..289c6f8a 100644
--- a/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md
+++ b/docs/tech/classes/OnGetTemplatePathByRelativeDocPath.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnGetTemplatePathByRelativeDocPath extends \Symfony\Contracts\EventDispatcher\Event
```
The event occurs when the path to the template file is obtained relative to the path to the document
diff --git a/docs/tech/classes/OnGettingResourceLink.md b/docs/tech/classes/OnGettingResourceLink.md
index 2b6178f0..62eccd7b 100644
--- a/docs/tech/classes/OnGettingResourceLink.md
+++ b/docs/tech/classes/OnGettingResourceLink.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnGettingResourceLink extends \Symfony\Contracts\EventDispatcher\Event
```
Event occurs when a reference to an entity (resource) is received
diff --git a/docs/tech/classes/OnLoadEntityDocPluginContent.md b/docs/tech/classes/OnLoadEntityDocPluginContent.md
index 80395553..7ac5ca98 100644
--- a/docs/tech/classes/OnLoadEntityDocPluginContent.md
+++ b/docs/tech/classes/OnLoadEntityDocPluginContent.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Renderer;
-final class OnLoadEntityDocPluginContent extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnLoadEntityDocPluginContent extends \Symfony\Contracts\EventDispatcher\Event
```
Called when entity documentation is generated (plugin content loading)
@@ -20,7 +20,7 @@ final class OnLoadEntityDocPluginContent extends \Symfony\Contracts\EventDispatc
See:
diff --git a/docs/tech/classes/OnLoadSourceLocatorsCollection.md b/docs/tech/classes/OnLoadSourceLocatorsCollection.md
index 63b31b60..35f2157d 100644
--- a/docs/tech/classes/OnLoadSourceLocatorsCollection.md
+++ b/docs/tech/classes/OnLoadSourceLocatorsCollection.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin\Event\Parser;
-final class OnLoadSourceLocatorsCollection extends \Symfony\Contracts\EventDispatcher\Event implements \Psr\EventDispatcher\StoppableEventInterface
+final class OnLoadSourceLocatorsCollection extends \Symfony\Contracts\EventDispatcher\Event
```
Called when source locators are loaded
diff --git a/docs/tech/classes/PageHtmlLinkerPlugin.md b/docs/tech/classes/PageHtmlLinkerPlugin.md
index edc51fe8..7b41425e 100644
--- a/docs/tech/classes/PageHtmlLinkerPlugin.md
+++ b/docs/tech/classes/PageHtmlLinkerPlugin.md
@@ -180,10 +180,10 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/PageLinkerPlugin.md b/docs/tech/classes/PageLinkerPlugin.md
index c9cade86..b09021e6 100644
--- a/docs/tech/classes/PageLinkerPlugin.md
+++ b/docs/tech/classes/PageLinkerPlugin.md
@@ -180,10 +180,10 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/PageRstLinkerPlugin.md b/docs/tech/classes/PageRstLinkerPlugin.md
index c2b611d8..02047850 100644
--- a/docs/tech/classes/PageRstLinkerPlugin.md
+++ b/docs/tech/classes/PageRstLinkerPlugin.md
@@ -170,10 +170,10 @@ public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\B
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/ParserHelper.md b/docs/tech/classes/ParserHelper.md
index b369d13e..c0bea1a4 100644
--- a/docs/tech/classes/ParserHelper.md
+++ b/docs/tech/classes/ParserHelper.md
@@ -239,10 +239,10 @@ public function getDocBlock(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Clas
Throws:
@@ -287,10 +287,10 @@ public function getDocBlockContext(\BumbleDocGen\LanguageHandler\Php\Parser\Enti
Throws:
@@ -318,7 +318,7 @@ public function getFilesInGit(): array;
Throws:
@@ -411,10 +411,10 @@ public function getUsesListByClassEntity(\BumbleDocGen\LanguageHandler\Php\Parse
Throws:
@@ -626,10 +626,10 @@ public function parseFullClassName(string $searchClassName, \BumbleDocGen\Langua
Throws:
diff --git a/docs/tech/classes/PhpHandler.md b/docs/tech/classes/PhpHandler.md
index f7d4215c..4931dd39 100644
--- a/docs/tech/classes/PhpHandler.md
+++ b/docs/tech/classes/PhpHandler.md
@@ -139,7 +139,7 @@ public function getCustomTwigFilters(\BumbleDocGen\Core\Renderer\Context\Rendere
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -190,7 +190,7 @@ public function getCustomTwigFunctions(\BumbleDocGen\Core\Renderer\Context\Rende
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -224,13 +224,13 @@ public function getEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEnti
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/PhpHandlerSettings.md b/docs/tech/classes/PhpHandlerSettings.md
index 7a7e0df9..9883e2be 100644
--- a/docs/tech/classes/PhpHandlerSettings.md
+++ b/docs/tech/classes/PhpHandlerSettings.md
@@ -145,7 +145,7 @@ public function asyncSourceLoadingEnabled(): bool;
Throws:
@@ -179,7 +179,7 @@ public function getClassConstantEntityFilter(): \BumbleDocGen\Core\Parser\Filter
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -213,7 +213,7 @@ public function getClassEntityFilter(): \BumbleDocGen\Core\Parser\FilterConditio
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -244,7 +244,7 @@ public function getCustomTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -278,7 +278,7 @@ public function getCustomTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Funct
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -312,7 +312,7 @@ public function getEntityDocRenderersCollection(): \BumbleDocGen\Core\Renderer\E
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -343,7 +343,7 @@ public function getFileSourceBaseUrl(): string|null;
Throws:
@@ -374,7 +374,7 @@ public function getMethodEntityFilter(): \BumbleDocGen\Core\Parser\FilterConditi
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -408,7 +408,7 @@ public function getPropertyEntityFilter(): \BumbleDocGen\Core\Parser\FilterCondi
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
diff --git a/docs/tech/classes/PhpUnitStubberPlugin.md b/docs/tech/classes/PhpUnitStubberPlugin.md
index 63e2ad48..23f6ab62 100644
--- a/docs/tech/classes/PhpUnitStubberPlugin.md
+++ b/docs/tech/classes/PhpUnitStubberPlugin.md
@@ -71,7 +71,7 @@ public static function getSubscribedEvents(): array;
```php
diff --git a/docs/tech/classes/PluginEventDispatcher.md b/docs/tech/classes/PluginEventDispatcher.md
index 326c8968..b626564f 100644
--- a/docs/tech/classes/PluginEventDispatcher.md
+++ b/docs/tech/classes/PluginEventDispatcher.md
@@ -2,7 +2,7 @@
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\Core\Plugin;
-class PluginEventDispatcher extends \Symfony\Component\EventDispatcher\EventDispatcher implements \Symfony\Component\EventDispatcher\EventDispatcherInterface, \Symfony\Contracts\EventDispatcher\EventDispatcherInterface, \Psr\EventDispatcher\EventDispatcherInterface
+class PluginEventDispatcher extends \Symfony\Component\EventDispatcher\EventDispatcher
```
The EventDispatcherInterface is the central point of Symfony's event listener system.
@@ -72,18 +72,33 @@ class PluginEventDispatcher extends \Symfony\Component\EventDispatcher\EventDisp
```php
-// Implemented in Symfony\Component\EventDispatcher\EventDispatcher
-
-public function __construct();
+public function __construct(\Monolog\Logger $logger);
```
-Parameters: not specified
+Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $logger |
+ \Monolog\Logger |
+ - |
+
+
+
@@ -185,7 +200,7 @@ public function addSubscriber(\Symfony\Component\EventDispatcher\EventSubscriber
```php
diff --git a/docs/tech/classes/PrintEntityCollectionAsList.md b/docs/tech/classes/PrintEntityCollectionAsList.md
index 8f770f88..fae8c861 100644
--- a/docs/tech/classes/PrintEntityCollectionAsList.md
+++ b/docs/tech/classes/PrintEntityCollectionAsList.md
@@ -168,7 +168,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $
Throws:
diff --git a/docs/tech/classes/ProjectParser.md b/docs/tech/classes/ProjectParser.md
index f9a01dd5..d4ec5ed0 100644
--- a/docs/tech/classes/ProjectParser.md
+++ b/docs/tech/classes/ProjectParser.md
@@ -113,7 +113,7 @@ public function parse(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsG
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
diff --git a/docs/tech/classes/PropertyEntity.md b/docs/tech/classes/PropertyEntity.md
index 749c00ca..56b3e947 100644
--- a/docs/tech/classes/PropertyEntity.md
+++ b/docs/tech/classes/PropertyEntity.md
@@ -159,6 +159,9 @@ class PropertyEntity extends \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Bas
reloadEntityDependenciesCache
+
+ removeEntityValueFromCache
+
removeNotUsedEntityDataCache
@@ -249,7 +252,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -268,7 +271,7 @@ public function entityCacheIsOutdated(): bool;
Throws:
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
-
\Psr\Cache\InvalidArgumentException
@@ -282,7 +285,7 @@ public function entityCacheIsOutdated(): bool;
```php
@@ -301,7 +304,7 @@ public function getAbsoluteFileName(): string|null;
Throws:
@@ -312,11 +315,11 @@ public function getAbsoluteFileName(): string|null;
```php
-// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
public function getCacheKey(): string;
```
@@ -335,7 +338,7 @@ public function getCacheKey(): string;
```php
@@ -365,7 +368,7 @@ public function getCachedEntityDependencies(): array;
```php
@@ -382,10 +385,10 @@ public function getDefaultValue(): string|array|int|bool|null|float;
Throws:
@@ -396,7 +399,7 @@ public function getDefaultValue(): string|array|int|bool|null|float;
```php
@@ -419,10 +422,10 @@ public function getDescription(): string;
\DI\DependencyException
-
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
-
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -433,7 +436,7 @@ public function getDescription(): string;
```php
@@ -452,7 +455,7 @@ public function getDescriptionLinks(): array;
Throws:
@@ -503,7 +506,7 @@ public function getDocBlock(): \phpDocumentor\Reflection\DocBlock;
```php
@@ -522,10 +525,10 @@ public function getDocComment(): string;
Throws:
@@ -553,7 +556,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
Throws:
@@ -573,7 +576,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\
```php
@@ -596,7 +599,7 @@ public function getDocNote(): string;
```php
@@ -613,10 +616,10 @@ public function getEndLine(): int;
Throws:
@@ -627,7 +630,7 @@ public function getEndLine(): int;
```php
@@ -650,7 +653,7 @@ public function getExamples(): array;
```php
@@ -667,10 +670,10 @@ public function getFileName(): string|null;
Throws:
@@ -681,7 +684,7 @@ public function getFileName(): string|null;
```php
@@ -717,7 +720,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
Throws:
@@ -728,7 +731,7 @@ public function getFileSourceLink(bool $withLine = true): string|null;
```php
@@ -751,7 +754,7 @@ public function getFirstExample(): string;
```php
@@ -772,7 +775,7 @@ public function getImplementingClass(): \BumbleDocGen\LanguageHandler\Php\Parser
```php
@@ -810,10 +813,10 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
Throws:
@@ -824,7 +827,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec
```php
@@ -841,7 +844,7 @@ public function getModifiersString(): string;
Throws:
@@ -861,7 +864,7 @@ public function getModifiersString(): string;
```php
@@ -882,7 +885,7 @@ public function getName(): string;
```php
@@ -899,10 +902,10 @@ public function getNamespaceName(): string;
Throws:
@@ -913,7 +916,7 @@ public function getNamespaceName(): string;
```php
@@ -999,7 +1002,7 @@ public function getRootEntityCollection(): \BumbleDocGen\LanguageHandler\Php\Par
```php
@@ -1020,7 +1023,7 @@ public function getShortName(): string;
```php
@@ -1037,10 +1040,10 @@ public function getStartLine(): int;
Throws:
@@ -1051,7 +1054,7 @@ public function getStartLine(): int;
```php
@@ -1070,10 +1073,10 @@ public function getThrows(): array;
Throws:
@@ -1084,7 +1087,7 @@ public function getThrows(): array;
```php
@@ -1104,13 +1107,13 @@ public function getType(): string;
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+ \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -1121,7 +1124,7 @@ public function getType(): string;
```php
@@ -1151,7 +1154,7 @@ public function hasDescriptionLinks(): bool;
```php
@@ -1174,7 +1177,7 @@ public function hasExamples(): bool;
```php
@@ -1197,7 +1200,7 @@ public function hasThrows(): bool;
```php
@@ -1220,7 +1223,7 @@ public function isDeprecated(): bool;
```php
@@ -1250,7 +1253,7 @@ public function isEntityDataCacheOutdated(): bool;
```php
@@ -1269,10 +1272,10 @@ public function isEntityFileCanBeLoad(): bool;
Throws:
@@ -1283,7 +1286,7 @@ public function isEntityFileCanBeLoad(): bool;
```php
@@ -1304,7 +1307,7 @@ public function isImplementedInParentClass(): bool;
```php
@@ -1327,7 +1330,7 @@ public function isInternal(): bool;
```php
@@ -1344,10 +1347,10 @@ public function isPrivate(): bool;
Throws:
@@ -1358,7 +1361,7 @@ public function isPrivate(): bool;
```php
@@ -1375,10 +1378,10 @@ public function isProtected(): bool;
Throws:
@@ -1389,7 +1392,7 @@ public function isProtected(): bool;
```php
@@ -1406,10 +1409,10 @@ public function isPublic(): bool;
Throws:
@@ -1420,20 +1423,20 @@ public function isPublic(): bool;
```php
// Implemented in BumbleDocGen\LanguageHandler\Php\Parser\Entity\BaseEntity
-public function reloadEntityDependenciesCache(): void;
+public function reloadEntityDependenciesCache(): array;
```
Parameters: not specified
-Return value: void
+Return value: array
Throws:
@@ -1443,6 +1446,46 @@ public function reloadEntityDependenciesCache(): void;
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait
+
+public function removeEntityValueFromCache(string $key): void;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $key |
+ string |
+ - |
+
+
+
+
+
Return value: void
+
+
@@ -1450,7 +1493,7 @@ public function reloadEntityDependenciesCache(): void;
```php
diff --git a/docs/tech/classes/PropertyEntityCollection.md b/docs/tech/classes/PropertyEntityCollection.md
index 8608dd85..e7842cde 100644
--- a/docs/tech/classes/PropertyEntityCollection.md
+++ b/docs/tech/classes/PropertyEntityCollection.md
@@ -319,13 +319,13 @@ public function loadPropertyEntities(): void;
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
@@ -416,10 +416,10 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php
\DI\DependencyException
- \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
+
\BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/Provider.md b/docs/tech/classes/Provider.md
new file mode 100644
index 00000000..140ee025
--- /dev/null
+++ b/docs/tech/classes/Provider.md
@@ -0,0 +1,287 @@
+
+
+
+
+
+
+
+
+
+```php
+namespace BumbleDocGen\AI\Providers\OpenAI;
+
+final class Provider implements \BumbleDocGen\AI\ProviderInterface
+```
+
+
+
+
+
+
+
+
+
Initialization methods:
+
+
+-
+ __construct
+
+
+
+
Methods:
+
+
+-
+ formatDataPrompt
+
+-
+ getAvailableModels
+
+-
+ getName
+
+-
+ getSystemPrompt
+
+-
+ sendPrompts
+
+
+
+
+
Constants:
+
+
+
+
+
+
+
Method details:
+
+
+
+
+
+```php
+public function __construct(string $bearerToken, string|null $model);
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $bearerToken |
+ string |
+ - |
+
+
+ $model |
+ string | null |
+ - |
+
+
+
+
+
+
+
+
+
+
+
+
+```php
+public function formatDataPrompt(string $title, string $content): string;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $title |
+ string |
+ - |
+
+
+ $content |
+ string |
+ - |
+
+
+
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public function getAvailableModels(): array;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: array
+
+
+
Throws:
+
+
+
+
+
+
+
+
+```php
+public function getName(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public function getSystemPrompt(string $fileName): string;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $fileName |
+ string |
+ - |
+
+
+
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public function sendPrompts(array $prompts, string $system): string;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $prompts |
+ array |
+ - |
+
+
+ $system |
+ string |
+ - |
+
+
+
+
+
Return value: string
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/classes/ProviderFactory.md b/docs/tech/classes/ProviderFactory.md
new file mode 100644
index 00000000..7e4b91dc
--- /dev/null
+++ b/docs/tech/classes/ProviderFactory.md
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+```php
+namespace BumbleDocGen\AI;
+
+final class ProviderFactory
+```
+
+
+
+
+
+
+
+
+
+
Methods:
+
+
+-
+ create
+
+
+
+
+
Constants:
+
+
+
+
+
+
+
Method details:
+
+
+
+
+
+```php
+public static function create(string $provider, string $apiKey, string|null $model = null): \BumbleDocGen\AI\ProviderInterface;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $provider |
+ string |
+ - |
+
+
+ $apiKey |
+ string |
+ - |
+
+
+ $model |
+ string | null |
+ - |
+
+
+
+
+
Return value: \BumbleDocGen\AI\ProviderInterface
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/classes/ProviderInterface.md b/docs/tech/classes/ProviderInterface.md
new file mode 100644
index 00000000..003f029a
--- /dev/null
+++ b/docs/tech/classes/ProviderInterface.md
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+
+
+```php
+namespace BumbleDocGen\AI;
+
+interface ProviderInterface
+```
+
+
+
+
+
+
+
+
+
+
Methods:
+
+
+-
+ formatDataPrompt
+
+-
+ getName
+
+-
+ getSystemPrompt
+
+-
+ sendPrompts
+
+
+
+
+
+
+
+
+
+
Method details:
+
+
+
+
+
+```php
+public function formatDataPrompt(string $title, string $content): string;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $title |
+ string |
+ - |
+
+
+ $content |
+ string |
+ - |
+
+
+
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public function getName(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public function getSystemPrompt(string $fileName): string;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $fileName |
+ string |
+ - |
+
+
+
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public function sendPrompts(array $prompts, string $system): string;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $prompts |
+ array |
+ - |
+
+
+ $system |
+ string |
+ - |
+
+
+
+
+
Return value: string
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/classes/ReadmeTemplateFiller.md b/docs/tech/classes/ReadmeTemplateGenerator.md
similarity index 67%
rename from docs/tech/classes/ReadmeTemplateFiller.md
rename to docs/tech/classes/ReadmeTemplateGenerator.md
index 7907dbd1..c151085b 100644
--- a/docs/tech/classes/ReadmeTemplateFiller.md
+++ b/docs/tech/classes/ReadmeTemplateGenerator.md
@@ -1,8 +1,8 @@
-
+
@@ -10,9 +10,9 @@
```php
-namespace BumbleDocGen\TemplateGenerator\ChatGpt;
+namespace BumbleDocGen\AI\Generators;
-final class ReadmeTemplateFiller
+final class ReadmeTemplateGenerator
```
@@ -39,13 +39,6 @@ final class ReadmeTemplateFiller
-
Constants:
-
@@ -58,11 +51,11 @@ final class ReadmeTemplateFiller
```php
-public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = self::MODEL_GPT_4);
+public function __construct(\BumbleDocGen\AI\ProviderInterface $aiProvider);
```
@@ -79,13 +72,8 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model
- $openaiClient |
- \Tectalic\OpenAi\Client |
- - |
-
-
- $model |
- string |
+ $aiProvider |
+ \BumbleDocGen\AI\ProviderInterface |
- |
@@ -100,7 +88,7 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model
```php
@@ -148,20 +136,17 @@ public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootE
Throws:
diff --git a/docs/tech/3.renderer/classes/ReflectionException_2.md b/docs/tech/classes/ReflectionException_2.md
similarity index 96%
rename from docs/tech/3.renderer/classes/ReflectionException_2.md
rename to docs/tech/classes/ReflectionException_2.md
index 548e90c1..2c6379e1 100644
--- a/docs/tech/3.renderer/classes/ReflectionException_2.md
+++ b/docs/tech/classes/ReflectionException_2.md
@@ -1,5 +1,5 @@
-
+
ReflectionException class:
diff --git a/docs/tech/classes/ReflectorWrapper.md b/docs/tech/classes/ReflectorWrapper.md
index 6ed4a972..2050c50d 100644
--- a/docs/tech/classes/ReflectorWrapper.md
+++ b/docs/tech/classes/ReflectorWrapper.md
@@ -143,7 +143,7 @@ public function reflectAllClasses(): iterable;
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -177,7 +177,7 @@ public function reflectAllConstants(): iterable;
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -211,7 +211,7 @@ public function reflectAllFunctions(): iterable;
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -265,7 +265,7 @@ public function reflectClass(string $identifierName): \Roave\BetterReflection\Re
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
@@ -313,7 +313,7 @@ public function reflectConstant(string $identifierName): \Roave\BetterReflection
\DI\DependencyException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
\DI\NotFoundException
@@ -367,7 +367,7 @@ public function reflectFunction(string $identifierName): \Roave\BetterReflection
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/classes/Renderer.md b/docs/tech/classes/Renderer.md
index 904cf571..463791c8 100644
--- a/docs/tech/classes/Renderer.md
+++ b/docs/tech/classes/Renderer.md
@@ -20,9 +20,9 @@ final class Renderer
See:
@@ -171,7 +171,7 @@ public function run(): void;
\DI\NotFoundException
- \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
+
\BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
diff --git a/docs/tech/3.renderer/classes/RendererContext_2.md b/docs/tech/classes/RendererContext_2.md
similarity index 97%
rename from docs/tech/3.renderer/classes/RendererContext_2.md
rename to docs/tech/classes/RendererContext_2.md
index b75cf640..151654d5 100644
--- a/docs/tech/3.renderer/classes/RendererContext_2.md
+++ b/docs/tech/classes/RendererContext_2.md
@@ -1,5 +1,5 @@
-
+
diff --git a/docs/tech/classes/RootEntityInterface.md b/docs/tech/classes/RootEntityInterface.md
index 98f570ab..d581979c 100644
--- a/docs/tech/classes/RootEntityInterface.md
+++ b/docs/tech/classes/RootEntityInterface.md
@@ -63,6 +63,9 @@ their entities need to correspond to the same interfaces
isEntityNameValid
- Check if entity name is valid
+
+ isExternalLibraryEntity
+ - The entity is loaded from a third party library and should not be treated the same as a standard one
isInGit
- The entity file is in the git repository
@@ -148,7 +151,7 @@ public function getAbsoluteFileName(): string|null;
```php
@@ -169,7 +172,7 @@ public function getEntityDependencies(): array;
```php
@@ -213,7 +216,7 @@ public function getFileName(): string|null;
```php
@@ -374,6 +377,27 @@ public static function isEntityNameValid(string $entityName): bool;
Return value: bool
+
+
+
+
+
+
+```php
+public function isExternalLibraryEntity(): bool;
+```
+
+
The entity is loaded from a third party library and should not be treated the same as a standard one
+
+
Parameters: not specified
+
+
Return value: bool
+
+
@@ -381,7 +405,7 @@ public static function isEntityNameValid(string $entityName): bool;
```php
diff --git a/docs/tech/classes/RootEntityInterface_2.md b/docs/tech/classes/RootEntityInterface_2.md
new file mode 100644
index 00000000..68e688c4
--- /dev/null
+++ b/docs/tech/classes/RootEntityInterface_2.md
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+```php
+namespace BumbleDocGen\Core\Parser\Entity;
+
+interface RootEntityInterface extends \\BumbleDocGen\Core\Parser\Entity\EntityInterface implements \BumbleDocGen\Core\Parser\Entity\EntityInterface
+```
+
+
Since the documentation generator supports several programming languages,
+their entities need to correspond to the same interfaces
+
+
+
+
+
+
+
+
Methods:
+
+
+-
+ entityCacheIsOutdated
+
+-
+ entityDataCanBeLoaded
+ - Checking if it is possible to get the entity data
+-
+ getAbsoluteFileName
+ - Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
+-
+ getEntityDependencies
+
+-
+ getFileContent
+
+-
+ getFileName
+ - Returns the relative path to a file if it can be retrieved and if the file is in the project directory
+-
+ getFileSourceLink
+
+-
+ getName
+
+-
+ getObjectId
+
+-
+ getRootEntityCollection
+ - Get parent collection of entities
+-
+ getShortName
+
+-
+ isEntityNameValid
+ - Check if entity name is valid
+-
+ isExternalLibraryEntity
+ - The entity is loaded from a third party library and should not be treated the same as a standard one
+-
+ isInGit
+ - The entity file is in the git repository
+
+
+
+
+
+
+
+
+
Method details:
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface
+
+public function entityCacheIsOutdated(): bool;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: bool
+
+
+
+
+
+
+
+
+```php
+public function entityDataCanBeLoaded(): bool;
+```
+
+
Checking if it is possible to get the entity data
+
+
Parameters: not specified
+
+
Return value: bool
+
+
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface
+
+public function getAbsoluteFileName(): string|null;
+```
+
+
Returns the absolute path to a file if it can be retrieved and if the file is in the project directory
+
+
Parameters: not specified
+
+
Return value: string |
null
+
+
+
+
+
+
+
+
+```php
+public function getEntityDependencies(): array;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: array
+
+
+
+
+
+
+
+
+```php
+public function getFileContent(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface
+
+public function getFileName(): string|null;
+```
+
+
Returns the relative path to a file if it can be retrieved and if the file is in the project directory
+
+
Parameters: not specified
+
+
Return value: string |
null
+
+
+
+
+
+
+
+
+```php
+public function getFileSourceLink(bool $withLine = true): string|null;
+```
+
+
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $withLine |
+ bool |
+ - |
+
+
+
+
+
Return value: string |
null
+
+
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface
+
+public function getName(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface
+
+public function getObjectId(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface
+
+public function getRootEntityCollection(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollection;
+```
+
+
Get parent collection of entities
+
+
Parameters: not specified
+
+
Return value: \BumbleDocGen\Core\Parser\Entity\RootEntityCollection
+
+
+
+
+
+
+
+
+```php
+// Implemented in BumbleDocGen\Core\Parser\Entity\EntityInterface
+
+public function getShortName(): string;
+```
+
+
+
+
Parameters: not specified
+
+
Return value: string
+
+
+
+
+
+
+
+
+```php
+public static function isEntityNameValid(string $entityName): bool;
+```
+
+
Check if entity name is valid
+
+
Parameters:
+
+
+
+
+ Name |
+ Type |
+ Description |
+
+
+
+
+ $entityName |
+ string |
+ - |
+
+
+
+
+
Return value: bool
+
+
+
+
+
+
+
+
+```php
+public function isExternalLibraryEntity(): bool;
+```
+
+
The entity is loaded from a third party library and should not be treated the same as a standard one
+
+
Parameters: not specified
+
+
Return value: bool
+
+
+
+
+
+
+
+
+```php
+public function isInGit(): bool;
+```
+
+
The entity file is in the git repository
+
+
Parameters: not specified
+
+
Return value: bool
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/classes/SharedCommandLogicTrait.md b/docs/tech/classes/SharedCommandLogicTrait.md
new file mode 100644
index 00000000..de7e9de7
--- /dev/null
+++ b/docs/tech/classes/SharedCommandLogicTrait.md
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+```php
+namespace BumbleDocGen\AI\Traits;
+
+trait SharedCommandLogicTrait
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tech/classes/SharedCompressedDocumentFileCache.md b/docs/tech/classes/SharedCompressedDocumentFileCache.md
index 0f8ad530..e5a8aa08 100644
--- a/docs/tech/classes/SharedCompressedDocumentFileCache.md
+++ b/docs/tech/classes/SharedCompressedDocumentFileCache.md
@@ -96,7 +96,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
Throws:
@@ -209,7 +209,7 @@ public function saveChanges(): void;
Throws:
diff --git a/docs/tech/classes/SourceLocatorCacheItemPool.md b/docs/tech/classes/SourceLocatorCacheItemPool.md
index 7414e481..702f80cb 100644
--- a/docs/tech/classes/SourceLocatorCacheItemPool.md
+++ b/docs/tech/classes/SourceLocatorCacheItemPool.md
@@ -108,7 +108,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
Throws:
diff --git a/docs/tech/classes/StrTypeToUrl.md b/docs/tech/classes/StrTypeToUrl.md
index 2b2d7ad5..83d9592e 100644
--- a/docs/tech/classes/StrTypeToUrl.md
+++ b/docs/tech/classes/StrTypeToUrl.md
@@ -2,7 +2,7 @@
@@ -20,7 +20,7 @@ final class StrTypeToUrl implements \BumbleDocGen\Core\Renderer\Twig\Filter\Cust
See:
@@ -77,7 +77,7 @@ See:
```php
@@ -124,7 +124,7 @@ public function __construct(\BumbleDocGen\Core\Renderer\RendererHelper $renderer
```php
@@ -170,22 +170,6 @@ public function __invoke(string $text, \BumbleDocGen\Core\Parser\Entity\RootEnti
Return value: string
-
Throws:
-
-
@@ -193,7 +177,7 @@ public function __invoke(string $text, \BumbleDocGen\Core\Parser\Entity\RootEnti
```php
@@ -214,7 +198,7 @@ public static function getName(): string;
```php
diff --git a/docs/tech/classes/StubberPlugin.md b/docs/tech/classes/StubberPlugin.md
index f3e82546..115ce876 100644
--- a/docs/tech/classes/StubberPlugin.md
+++ b/docs/tech/classes/StubberPlugin.md
@@ -2,7 +2,7 @@
@@ -57,11 +57,11 @@ final class StubberPlugin implements \BumbleDocGen\Core\Plugin\PluginInterface,
```php
-public function __construct(\BumbleDocGen\Core\Configuration\Configuration $configuration);
+public function __construct(\BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser $composerParser);
```
@@ -78,8 +78,8 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
- $configuration |
- \BumbleDocGen\Core\Configuration\Configuration |
+ $composerParser |
+ \BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser |
- |
@@ -94,7 +94,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\Configuration $conf
```php
@@ -115,7 +115,7 @@ public static function getSubscribedEvents(): array;
```php
@@ -160,7 +160,7 @@ public function onCheckIsClassEntityCanBeLoad(\BumbleDocGen\LanguageHandler\Php\
```php
diff --git a/docs/tech/classes/SystemAsyncSourceLocator.md b/docs/tech/classes/SystemAsyncSourceLocator.md
index df77339b..c7417701 100644
--- a/docs/tech/classes/SystemAsyncSourceLocator.md
+++ b/docs/tech/classes/SystemAsyncSourceLocator.md
@@ -12,7 +12,7 @@
```php
namespace BumbleDocGen\LanguageHandler\Php\Parser\SourceLocator\Internal;
-final class SystemAsyncSourceLocator extends \Roave\BetterReflection\SourceLocator\Type\AbstractSourceLocator implements \Roave\BetterReflection\SourceLocator\Type\SourceLocator
+final class SystemAsyncSourceLocator extends \Roave\BetterReflection\SourceLocator\Type\AbstractSourceLocator
```
diff --git a/docs/tech/classes/TemplateFile.md b/docs/tech/classes/TemplateFile.md
index f7ada938..7e6b0fe3 100644
--- a/docs/tech/classes/TemplateFile.md
+++ b/docs/tech/classes/TemplateFile.md
@@ -155,7 +155,7 @@ public static function create(\Symfony\Component\Finder\SplFileInfo $fileInfo, \
Throws:
@@ -252,7 +252,7 @@ public static function getRelativeDocPathByTemplatePath(string $templatePath, \B
Throws:
@@ -328,7 +328,7 @@ public static function getTemplatePathByRelativeDocPath(string $relativeDocPath,
Throws:
diff --git a/docs/tech/classes/TemplatesStructureGenerator.md b/docs/tech/classes/TemplatesStructureGenerator.md
deleted file mode 100644
index caae17c4..00000000
--- a/docs/tech/classes/TemplatesStructureGenerator.md
+++ /dev/null
@@ -1,155 +0,0 @@
-
-
-
-
-
-
-
-
-
-```php
-namespace BumbleDocGen\TemplateGenerator\ChatGpt;
-
-final class TemplatesStructureGenerator
-```
-
-
-
-
-
-
-
-
-
Initialization methods:
-
-
--
- __construct
-
-
-
-
Methods:
-
-
--
- generateStructureByEntityCollection
-
-
-
-
-
Constants:
-
-
-
-
-
-
-
Method details:
-
-
-
-
-
-```php
-public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = self::MODEL_GPT_4);
-```
-
-
-
-
Parameters:
-
-
-
-
-
-
-
-
-
-
-
-```php
-public function generateStructureByEntityCollection(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string|null $additionalPrompt = null): array;
-```
-
-
-
-
Parameters:
-
-
-
-
Return value: array
-
-
-
Throws:
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/tech/map.md b/docs/tech/map.md
index e13cbbb6..8f6177f1 100644
--- a/docs/tech/map.md
+++ b/docs/tech/map.md
@@ -3,14 +3,25 @@
Directory layout ( only documented files shown ):
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Sep 2 21:01:47 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Sat Sep 2 21:01:47 2023 +0300
Page content update date: Mon Nov 06 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
diff --git a/docs/tech/readme.md b/docs/tech/readme.md
index f4cb803d..79334796 100644
--- a/docs/tech/readme.md
+++ b/docs/tech/readme.md
@@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati
-
Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Thu Oct 5 17:42:06 2023 +0300
Page content update date: Tue Oct 31 2023
Made with
Bumble Documentation Generator
\ No newline at end of file
+Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
Last modified date: Thu Oct 5 17:42:06 2023 +0300
Page content update date: Mon Nov 06 2023
Made with Bumble Documentation Generator
\ No newline at end of file
diff --git a/src/Console/Command/FillInReadmeMdTemplateCommand.php b/src/AI/Console/AddDocBlocksCommand.php
similarity index 52%
rename from src/Console/Command/FillInReadmeMdTemplateCommand.php
rename to src/AI/Console/AddDocBlocksCommand.php
index d0d001cc..1826f010 100644
--- a/src/Console/Command/FillInReadmeMdTemplateCommand.php
+++ b/src/AI/Console/AddDocBlocksCommand.php
@@ -2,45 +2,64 @@
declare(strict_types=1);
-namespace BumbleDocGen\Console\Command;
+namespace BumbleDocGen\AI\Console;
+use BumbleDocGen\AI\Traits\SharedCommandLogicTrait;
+use BumbleDocGen\Console\Command\BaseCommand;
use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException;
use DI\DependencyException;
use DI\NotFoundException;
+use GuzzleHttp\Exception\GuzzleException;
+use JsonException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
-use Tectalic\OpenAi\ClientException;
-final class FillInReadmeMdTemplateCommand extends BaseCommand
+final class AddDocBlocksCommand extends BaseCommand
{
+ use SharedCommandLogicTrait;
+
+ public const NAME = 'ai:add-doc-blocks';
+
protected function getCustomConfigOptionsMap(): array
{
return [
'project_root' => 'Path to the directory of the documented project',
'templates_dir' => 'Path to directory with documentation templates',
'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved',
+ 'ai_provider' => 'The AI service to use, options: openai',
+ 'ai_api_key' => 'The API key to use when interacting with the AI',
+ 'ai_model' => 'The AI model to use',
];
}
protected function configure(): void
{
- $this->setName('ai-fill-in-readme-md-template')
- ->setDescription('Filling the readme file template with data using LLMs tools');
+ $this->setName(self::NAME)
+ ->setDescription('Leverage AI to insert missing doc blocks in code.');
}
/**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ * @return int
* @throws DependencyException
- * @throws ReflectionException
- * @throws ClientException
- * @throws NotFoundException
* @throws InvalidConfigurationParameterException
+ * @throws NotFoundException
+ * @throws ReflectionException
+ * @throws GuzzleException
+ * @throws JsonException
*/
protected function execute(
InputInterface $input,
OutputInterface $output
): int {
- $this->createDocGenInstance($input, $output)->fillInReadmeMdTemplate();
+ // Initialise AI provider from params/config
+ $aiProvider = $this->initAiProvider($input, $output);
+
+ // Generate doc blocks
+ $this->createDocGenInstance($input, $output)->addDocBlocks($aiProvider);
+
return self::SUCCESS;
}
}
diff --git a/src/Console/Command/GenerateProjectTemplatesStructureCommand.php b/src/AI/Console/GenerateReadMeTemplateCommand.php
similarity index 53%
rename from src/Console/Command/GenerateProjectTemplatesStructureCommand.php
rename to src/AI/Console/GenerateReadMeTemplateCommand.php
index ac16dae4..909dd60a 100644
--- a/src/Console/Command/GenerateProjectTemplatesStructureCommand.php
+++ b/src/AI/Console/GenerateReadMeTemplateCommand.php
@@ -2,45 +2,62 @@
declare(strict_types=1);
-namespace BumbleDocGen\Console\Command;
+namespace BumbleDocGen\AI\Console;
+use BumbleDocGen\AI\Traits\SharedCommandLogicTrait;
+use BumbleDocGen\Console\Command\BaseCommand;
use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException;
use DI\DependencyException;
use DI\NotFoundException;
+use GuzzleHttp\Exception\GuzzleException;
+use JsonException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
-use Tectalic\OpenAi\ClientException;
-final class GenerateProjectTemplatesStructureCommand extends BaseCommand
+final class GenerateReadMeTemplateCommand extends BaseCommand
{
+ use SharedCommandLogicTrait;
+
+ public const NAME = 'ai:generate-readme-template';
+
protected function getCustomConfigOptionsMap(): array
{
return [
'project_root' => 'Path to the directory of the documented project',
'templates_dir' => 'Path to directory with documentation templates',
'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved',
+ 'ai_provider' => 'The AI service to use, options: openai',
+ 'ai_api_key' => 'The API key to use when interacting with the AI',
+ 'ai_model' => 'The AI model to use',
];
}
protected function configure(): void
{
- $this->setName('ai-generate-project-templates-structure')
- ->setDescription('Generate empty documentation templates for a documented project using LLMs tools');
+ $this->setName(self::NAME)
+ ->setDescription('Leverage AI to generate content for a project readme.md file.');
}
+
/**
- * @throws DependencyException
- * @throws ReflectionException
- * @throws ClientException
* @throws NotFoundException
+ * @throws GuzzleException
+ * @throws ReflectionException
+ * @throws DependencyException
* @throws InvalidConfigurationParameterException
+ * @throws JsonException
*/
protected function execute(
InputInterface $input,
OutputInterface $output
): int {
- $this->createDocGenInstance($input, $output)->generateProjectTemplatesStructure();
+ // Initialise AI provider from params/config
+ $aiProvider = $this->initAiProvider($input, $output);
+
+ // Generate Read me
+ $this->createDocGenInstance($input, $output)->generateReadmeTemplate($aiProvider);
+
return self::SUCCESS;
}
}
diff --git a/src/TemplateGenerator/ChatGpt/MissingDocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php
similarity index 73%
rename from src/TemplateGenerator/ChatGpt/MissingDocBlocksGenerator.php
rename to src/AI/Generators/DocBlocksGenerator.php
index 8dba3747..49174426 100644
--- a/src/TemplateGenerator/ChatGpt/MissingDocBlocksGenerator.php
+++ b/src/AI/Generators/DocBlocksGenerator.php
@@ -2,8 +2,9 @@
declare(strict_types=1);
-namespace BumbleDocGen\TemplateGenerator\ChatGpt;
+namespace BumbleDocGen\AI\Generators;
+use BumbleDocGen\AI\ProviderInterface;
use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
use BumbleDocGen\Core\Parser\Entity\RootEntityInterface;
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity;
@@ -12,20 +13,15 @@
use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper;
use DI\DependencyException;
use DI\NotFoundException;
-use Tectalic\OpenAi\Client;
-use Tectalic\OpenAi\ClientException;
-final class MissingDocBlocksGenerator
+final class DocBlocksGenerator
{
- public const MODEL_GPT_4 = 'gpt-4';
-
public const MODE_READ_ONLY_SIGNATURES = 1;
public const MODE_READ_ALL_CODE = 2;
public function __construct(
- private Client $openaiClient,
+ private ProviderInterface $aiProvider,
private ParserHelper $parserHelper,
- private string $model = self::MODEL_GPT_4,
) {
}
@@ -55,13 +51,11 @@ public function hasMethodsWithoutDocBlocks(RootEntityInterface $rootEntity): boo
* @throws DependencyException
* @throws NotFoundException
* @throws InvalidConfigurationParameterException
- * @throws ClientException
*/
public function generateDocBlocksForMethodsWithoutIt(
RootEntityInterface $rootEntity,
int $mode = self::MODE_READ_ONLY_SIGNATURES,
): array {
-
if (!is_a($rootEntity, ClassEntity::class)) {
throw new \InvalidArgumentException('Currently we can only work PHP class entities');
}
@@ -82,12 +76,15 @@ public function generateDocBlocksForMethodsWithoutIt(
$foundThrows = $matches[1] ?? [];
$foundThrows = array_combine($foundThrows, $foundThrows);
if ($foundThrows) {
- $newThrowsDockBlocks[$method->getName()] = array_filter(array_map(function (string $className) use ($method) {
- return $this->parserHelper->parseFullClassName(
- $className,
- $method->getImplementingClass()
- );
- }, $foundThrows), fn($c) => !in_array($c, $alreadySavedThrows));
+ $newThrowsDockBlocks[$method->getName()] = array_filter(
+ array_map(function (string $className) use ($method) {
+ return $this->parserHelper->parseFullClassName(
+ $className,
+ $method->getImplementingClass()
+ );
+ }, $foundThrows),
+ fn($c) => !in_array($c, $alreadySavedThrows)
+ );
}
}
@@ -96,18 +93,34 @@ public function generateDocBlocksForMethodsWithoutIt(
$prototypeDocComment = $prototype?->getDocComment();
if ($prototypeDocComment && !str_contains(strtolower($method->getDocComment()), '@inheritdoc')) {
if (isset($newThrowsDockBlocks[$method->getName()])) {
- $methodsDockBlocks[$method->getName()] = str_replace('*/', "*\n * [throws]\n * {@inheritDoc}\n */", $method->getDocComment());
+ $methodsDockBlocks[$method->getName()] = str_replace(
+ '*/',
+ "*\n * [throws]\n * {@inheritDoc}\n */",
+ $method->getDocComment()
+ );
} else {
- $methodsDockBlocks[$method->getName()] = str_replace('*/', "*\n * {@inheritDoc}\n */", $method->getDocComment());
+ $methodsDockBlocks[$method->getName()] = str_replace(
+ '*/',
+ "*\n * {@inheritDoc}\n */",
+ $method->getDocComment()
+ );
}
} elseif (isset($newThrowsDockBlocks[$method->getName()])) {
- $methodsDockBlocks[$method->getName()] = str_replace('*/', "* [throws]\n */", $method->getDocComment());
+ $methodsDockBlocks[$method->getName()] = str_replace(
+ '*/',
+ "* [throws]\n */",
+ $method->getDocComment()
+ );
}
continue;
}
if (!$method->getDescription() && $method->getDocComment()) {
- $methodsDockBlocks[$method->getName()] = str_replace('/**', "/**\n * [insert]", $method->getDocComment());
+ $methodsDockBlocks[$method->getName()] = str_replace(
+ '/**',
+ "/**\n * [insert]",
+ $method->getDocComment()
+ );
} elseif (strlen($method->getDocCommentRecursive()) > 1) {
if ($method->getDescription()) {
if (isset($newThrowsDockBlocks[$method->getName()])) {
@@ -116,9 +129,9 @@ public function generateDocBlocksForMethodsWithoutIt(
$methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['{@inheritDoc}']);
}
continue;
- } else {
- $methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['[insert]', '{@inheritDoc}']);
}
+
+ $methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['[insert]', '{@inheritDoc}']);
} else {
$methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['[insert]']);
}
@@ -132,27 +145,16 @@ public function generateDocBlocksForMethodsWithoutIt(
if ($toRequest) {
$classSignature = "{$rootEntity->getModifiersString()} \\{$rootEntity->getName()}";
- $requestData = "/**{$rootEntity->getDescription()}*/\n{$classSignature}{\n" . implode("\n", $toRequest) . "\n}";
-
- $messages = [
- [
- 'role' => 'system',
- 'content' => file_get_contents(__DIR__ . '/prompts/missingDocBlockGeneration')
- ],
- ];
- $messages[] = [
- 'role' => 'user',
- 'content' => $requestData,
- ];
-
- $response = $this->openaiClient->chatCompletions()->create(
- new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([
- 'model' => $this->model,
- 'messages' => $messages,
- ])
- )->toModel();
-
- $responseData = json_decode($response->choices[0]->message->content ?? "{}", true);
+ $requestData = "/**{$rootEntity->getDescription()}*/\n{$classSignature}{\n" . implode(
+ "\n",
+ $toRequest
+ ) . "\n}";
+
+ $systemPrompt = $this->aiProvider->getSystemPrompt('docBlockGeneration');
+ $prompts = [$requestData];
+ $responseData = $this->aiProvider->sendPrompts($prompts, $systemPrompt);
+ $responseData = json_decode($responseData, true, 512, JSON_THROW_ON_ERROR);
+
if (!$responseData) {
return [];
}
@@ -160,7 +162,10 @@ public function generateDocBlocksForMethodsWithoutIt(
foreach ($methodsDockBlocks as $methodName => $block) {
$methodsDockBlocks[$methodName] = str_replace("[insert]", $responseData[$methodName] ?? '', $block);
- $throwsString = implode("\n *", array_map(fn($v) => "@throws {$v}", $newThrowsDockBlocks[$methodName] ?? []));
+ $throwsString = implode(
+ "\n *",
+ array_map(fn($v) => "@throws {$v}", $newThrowsDockBlocks[$methodName] ?? [])
+ );
if ($throwsString) {
$methodsDockBlocks[$methodName] = str_replace(
'[throws]',
diff --git a/src/TemplateGenerator/ChatGpt/ReadmeTemplateFiller.php b/src/AI/Generators/ReadmeTemplateGenerator.php
similarity index 54%
rename from src/TemplateGenerator/ChatGpt/ReadmeTemplateFiller.php
rename to src/AI/Generators/ReadmeTemplateGenerator.php
index 74e96774..f6af61a9 100644
--- a/src/TemplateGenerator/ChatGpt/ReadmeTemplateFiller.php
+++ b/src/AI/Generators/ReadmeTemplateGenerator.php
@@ -2,8 +2,9 @@
declare(strict_types=1);
-namespace BumbleDocGen\TemplateGenerator\ChatGpt;
+namespace BumbleDocGen\AI\Generators;
+use BumbleDocGen\AI\ProviderInterface;
use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
use BumbleDocGen\Core\Parser\Entity\RootEntityCollection;
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity;
@@ -11,16 +12,11 @@
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException;
use DI\DependencyException;
use DI\NotFoundException;
-use Tectalic\OpenAi\Client;
-use Tectalic\OpenAi\ClientException;
-final class ReadmeTemplateFiller
+final class ReadmeTemplateGenerator
{
- public const MODEL_GPT_4 = 'gpt-4';
-
public function __construct(
- private Client $openaiClient,
- private string $model = self::MODEL_GPT_4,
+ private ProviderInterface $aiProvider,
) {
}
@@ -31,7 +27,6 @@ public function __construct(
* @param string|null $composerJsonFile
* @param string|null $additionalPrompt
* @return string
- * @throws ClientException
* @throws DependencyException
* @throws InvalidConfigurationParameterException
* @throws NotFoundException
@@ -47,25 +42,17 @@ public function generateReadmeFileContent(
throw new \InvalidArgumentException('Currently we can only work with collections of PHP entities');
}
- $messages = [
- [
- 'role' => 'system',
- 'content' => file_get_contents(__DIR__ . '/prompts/readmeTemplateFiller')
- ],
- ];
+ $namespacesList = array_map(
+ fn(ClassEntity $e) => $e->getNamespaceName(),
+ iterator_to_array($rootEntityCollection)
+ );
- $namespacesList = array_map(fn(ClassEntity $e) => $e->getNamespaceName(), iterator_to_array($rootEntityCollection));
$namespacesList = array_unique($namespacesList);
- $messages[] = [
- 'role' => 'user',
- 'content' => "Project namespaces:\n" . implode("\n", $namespacesList),
- ];
+ $prompts = [];
+ $prompts[] = $this->aiProvider->formatDataPrompt('Project namespaces', implode("\n", $namespacesList));
if ($composerJsonFile) {
- $messages[] = [
- 'role' => 'user',
- 'content' => "Composer JSON:\n" . file_get_contents($composerJsonFile),
- ];
+ $prompts[] = $this->aiProvider->formatDataPrompt('Composer JSON', file_get_contents($composerJsonFile));
}
$entryPointsSignatures = [];
@@ -76,30 +63,24 @@ public function generateReadmeFileContent(
}
$classSignature = "{$entryPoint->getModifiersString()} \\{$entryPoint->getName()}";
- $entryPointsSignatures[] = "/**{$entryPoint->getDescription()}*/\n{$classSignature}{\n" . implode("\n", $methodsSignatures) . "\n}";
+ $entryPointsSignatures[] = "/**{$entryPoint->getDescription()}*/\n{$classSignature}{\n" . implode(
+ "\n",
+ $methodsSignatures
+ ) . "\n}";
}
if ($entryPointsSignatures) {
- $messages[] = [
- 'role' => 'user',
- 'content' => "Project entry points: \n" . implode("\n\n", $entryPointsSignatures)
- ];
+ $prompts[] = $this->aiProvider->formatDataPrompt(
+ 'Project entry points',
+ implode("\n\n", $entryPointsSignatures)
+ );
}
if ($additionalPrompt) {
- $messages[] = [
- 'role' => 'user',
- 'content' => "Additional Information: {$additionalPrompt}"
- ];
+ $prompts[] = $this->aiProvider->formatDataPrompt('Additional Information', $additionalPrompt);
}
- $response = $this->openaiClient->chatCompletions()->create(
- new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([
- 'model' => $this->model,
- 'messages' => $messages,
- ])
- )->toModel();
-
- return $response->choices[0]->message->content ?? '';
+ $systemPrompt = $this->aiProvider->getSystemPrompt('readmeTemplateGeneration');
+ return $this->aiProvider->sendPrompts($prompts, $systemPrompt);
}
}
diff --git a/src/TemplateGenerator/ChatGpt/prompts/missingDocBlockGeneration b/src/AI/Prompts/docBlockGeneration
similarity index 100%
rename from src/TemplateGenerator/ChatGpt/prompts/missingDocBlockGeneration
rename to src/AI/Prompts/docBlockGeneration
diff --git a/src/TemplateGenerator/ChatGpt/prompts/readmeTemplateFiller b/src/AI/Prompts/readmeTemplateGeneration
similarity index 100%
rename from src/TemplateGenerator/ChatGpt/prompts/readmeTemplateFiller
rename to src/AI/Prompts/readmeTemplateGeneration
diff --git a/src/AI/ProviderFactory.php b/src/AI/ProviderFactory.php
new file mode 100644
index 00000000..8cc8872a
--- /dev/null
+++ b/src/AI/ProviderFactory.php
@@ -0,0 +1,23 @@
+ new OpenAIProvider($apiKey, $model),
+ default => throw new RuntimeException(
+ "Parameter 'ai_provider' not set to valid option (" . implode(',', self::VALID_PROVIDERS) . ")!",
+ ),
+ };
+ }
+}
diff --git a/src/AI/ProviderInterface.php b/src/AI/ProviderInterface.php
new file mode 100644
index 00000000..64ef819c
--- /dev/null
+++ b/src/AI/ProviderInterface.php
@@ -0,0 +1,16 @@
+ 'Bearer ' . $bearerToken
+ ];
+
+ $client = new Client(
+ [
+ 'headers' => $headers
+ ]
+ );
+ $this->client = $client;
+ $this->model = $model ?? 'gpt-4';
+ $this->temperature = 0.5;
+ $this->frequencyPenalty = 0;
+ $this->maxTokens = null;
+ $this->topP = 1;
+ }
+
+ public function getName(): string
+ {
+ return self::NAME;
+ }
+
+ public function sendPrompts(array $prompts, string $system): string
+ {
+ $requestData = [
+ 'messages' => $this->createMessages($prompts, $system),
+ 'model' => $this->model,
+ 'temperature' => $this->temperature,
+ 'frequency_penalty' => $this->frequencyPenalty,
+ 'top_p' => $this->topP,
+ ];
+
+ if ($this->maxTokens !== null) {
+ $requestData['max_tokens'] = $this->maxTokens;
+ }
+
+ try {
+ $response = $this->client->request('POST', self::API_ENDPOINT, [
+ 'json' => $requestData,
+ ]);
+
+ $responseData = json_decode(
+ $response->getBody()->getContents(),
+ true,
+ 512,
+ JSON_THROW_ON_ERROR
+ );
+
+ if (isset($responseData['choices'][0]['message']['content'])) {
+ return $responseData['choices'][0]['message']['content'];
+ }
+
+ throw new RuntimeException('Generated text not found in response');
+ } catch (GuzzleException $e) {
+ throw new RuntimeException('[' . $e->getCode() . ']' . $e->getMessage());
+ } catch (JsonException $e) {
+ throw new RuntimeException(
+ '[' . $e->getCode() . '] Failed to decode JSON response: ' . $e->getMessage()
+ );
+ }
+ }
+
+ public function getSystemPrompt(string $fileName): string
+ {
+ return file_get_contents(dirname(__DIR__) . '/../Prompts/' . $fileName);
+ }
+
+ public function formatDataPrompt(string $title, string $content): string
+ {
+ return $title . ": \n" . self::DATA_SEPARATOR . "\n" . $content . "\n" . self::DATA_SEPARATOR;
+ }
+
+ /**
+ * @throws GuzzleException
+ * @throws JsonException
+ */
+ public function getAvailableModels(): array
+ {
+ $response = $this->client->request('GET', self::API_MODEL_ENDPOINT);
+ $data = json_decode($response->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
+ // Order by 'created' field in descending order
+ usort($data['data'], function ($a, $b) {
+ return $b['created'] <=> $a['created'];
+ });
+ $models = [];
+ foreach ($data['data'] as $model) {
+ $models[] = $model['id'];
+ }
+ return $models;
+ }
+
+ private function createMessage(string $role, string $content): \stdClass
+ {
+ $message = new \stdClass();
+ $message->role = $role;
+ $message->content = $content;
+ return $message;
+ }
+
+ private function createMessages(array $prompts, string $system): array
+ {
+ $messages = [];
+ $messages[] = $this->createMessage('system', $system);
+ foreach ($prompts as $prompt) {
+ $messages[] = $this->createMessage('user', $prompt);
+ }
+ return $messages;
+ }
+}
diff --git a/src/AI/Traits/SharedCommandLogicTrait.php b/src/AI/Traits/SharedCommandLogicTrait.php
new file mode 100644
index 00000000..a3046393
--- /dev/null
+++ b/src/AI/Traits/SharedCommandLogicTrait.php
@@ -0,0 +1,124 @@
+createConfiguration($input->getOption('config'));
+ $configParams = $this->getCustomConfigurationParameters($input);
+
+ // Get Provider, request if not found
+ $provider = $this->getValueFromParamOrConfig($configParams, $config, 'ai_provider');
+ if ($provider === null) {
+ $provider = $this->askForAiProvider($input, $output);
+ }
+
+ // Get API Key, request if not found
+ $apiKey = $this->getValueFromParamOrConfig($configParams, $config, 'ai_api_key');
+ if ($apiKey === null) {
+ $apiKey = $this->askForAiApiKey($input, $output);
+ }
+
+ // Test API key is valid
+ $aiProvider = ProviderFactory::create($provider, $apiKey);
+ $apiKeyTest = $this->testProviderAPIKey($aiProvider);
+ if (!$apiKeyTest) {
+ throw new \RuntimeException('Parameter/config: `ai_api_key` is invalid!');
+ }
+
+ // Get model, request if not found
+ $model = $this->getValueFromParamOrConfig($configParams, $config, 'ai_model');
+ if ($model === null) {
+ $model = $this->askForAIModel($input, $output, $aiProvider);
+ }
+
+ // Return finalised provider
+ return ProviderFactory::create($provider, $apiKey, $model);
+ }
+
+ private function askForAiApiKey(
+ InputInterface $input,
+ OutputInterface $output,
+ ) {
+ $question = new Question('Please provide the API key: ');
+ return $this->getHelper('question')->ask($input, $output, $question);
+ }
+
+ private function askForAiProvider(
+ InputInterface $input,
+ OutputInterface $output,
+ ) {
+ $question = new ChoiceQuestion(
+ 'Please choose one of the available AI providers:',
+ ProviderFactory::VALID_PROVIDERS,
+ );
+ $question->setErrorMessage('Provider %s is invalid.');
+ return $this->getHelper('question')->ask($input, $output, $question);
+ }
+
+ /**
+ * @throws GuzzleException
+ * @throws JsonException
+ */
+ private function askForAIModel(
+ InputInterface $input,
+ OutputInterface $output,
+ ProviderInterface $provider
+ ): ?string {
+ if (method_exists($provider, 'getAvailableModels')) {
+ $models = $provider->getAvailableModels();
+
+ $question = new ChoiceQuestion(
+ 'Please choose one of the available models:',
+ $models,
+ );
+ $question->setErrorMessage('Model %s is invalid.');
+
+ return $this->getHelper('question')->ask($input, $output, $question);
+ }
+ throw new \RuntimeException('Missing parameter/config: `ai_model`');
+ }
+
+ private function testProviderAPIKey(ProviderInterface $provider): bool
+ {
+ if (method_exists($provider, 'getAvailableModels')) {
+ try {
+ $provider->getAvailableModels();
+ } catch (JsonException | GuzzleException) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private function getValueFromParamOrConfig(array $configParams, Configuration $configuration, $key): ?string
+ {
+ if (array_key_exists($key, $configParams)) {
+ return $configParams[$key];
+ }
+ return $configuration->getIfExists($key);
+ }
+}
diff --git a/src/Console/App.php b/src/Console/App.php
index 28ee02e4..4dfc8606 100644
--- a/src/Console/App.php
+++ b/src/Console/App.php
@@ -4,10 +4,9 @@
namespace BumbleDocGen\Console;
-use BumbleDocGen\Console\Command\AddMissingDocBlocksCommand;
-use BumbleDocGen\Console\Command\FillInReadmeMdTemplateCommand;
+use BumbleDocGen\AI\Console\AddDocBlocksCommand;
+use BumbleDocGen\AI\Console\GenerateReadMeTemplateCommand;
use BumbleDocGen\Console\Command\GenerateCommand;
-use BumbleDocGen\Console\Command\GenerateProjectTemplatesStructureCommand;
use BumbleDocGen\DocGeneratorFactory;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\CompleteCommand;
@@ -33,9 +32,8 @@ public function __construct()
);
$this->setDefinition($inputDefinition);
$this->add(new GenerateCommand());
- $this->add(new FillInReadmeMdTemplateCommand());
- $this->add(new AddMissingDocBlocksCommand());
- $this->add(new GenerateProjectTemplatesStructureCommand());
+ $this->add(new GenerateReadMeTemplateCommand());
+ $this->add(new AddDocBlocksCommand());
$this->setExtraCommands();
}
diff --git a/src/Console/Command/AddMissingDocBlocksCommand.php b/src/Console/Command/AddMissingDocBlocksCommand.php
deleted file mode 100644
index cd3d964e..00000000
--- a/src/Console/Command/AddMissingDocBlocksCommand.php
+++ /dev/null
@@ -1,45 +0,0 @@
- 'Path to the directory of the documented project',
- 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved',
- ];
- }
-
- protected function configure(): void
- {
- $this->setName('ai-add-missing-doc-blocks')
- ->setDescription('Add missing doc blocks in documented code using LLMs tools');
- }
-
- /**
- * @throws DependencyException
- * @throws ReflectionException
- * @throws ClientException
- * @throws NotFoundException
- * @throws InvalidConfigurationParameterException
- */
- protected function execute(
- InputInterface $input,
- OutputInterface $output
- ): int {
- $this->createDocGenInstance($input, $output)->addMissingDocBlocks();
- return self::SUCCESS;
- }
-}
diff --git a/src/Core/Configuration/Configuration.php b/src/Core/Configuration/Configuration.php
index 913273b1..f538d02c 100644
--- a/src/Core/Configuration/Configuration.php
+++ b/src/Core/Configuration/Configuration.php
@@ -39,6 +39,11 @@ public function __construct(
$parameterBag->addValueFromFileIfNotExists('', self::DEFAULT_SETTINGS_FILE);
}
+ public function getConfigurationVersion(): string
+ {
+ return $this->parameterBag->getConfigVersion();
+ }
+
/**
* @throws InvalidConfigurationParameterException
*/
@@ -355,4 +360,23 @@ public function getAdditionalConsoleCommands(): AdditionalCommandCollection
$this->localObjectCache->cacheMethodResult(__METHOD__, '', $additionalCommandCollection);
return $additionalCommandCollection;
}
+
+ /**
+ * @throws InvalidConfigurationParameterException
+ */
+ public function getIfExists($key): ?string
+ {
+ try {
+ return $this->localObjectCache->getMethodCachedResult(__METHOD__, $key);
+ } catch (ObjectNotFoundException) {
+ }
+
+ if (!$this->parameterBag->has($key)) {
+ return null;
+ }
+ $value = $this->parameterBag->validateAndGetStringValue($key, false);
+
+ $this->localObjectCache->cacheMethodResult(__METHOD__, $key, $value);
+ return $value;
+ }
}
diff --git a/src/Core/Configuration/ConfigurationParameterBag.php b/src/Core/Configuration/ConfigurationParameterBag.php
index a2a7e91d..95a0eabc 100644
--- a/src/Core/Configuration/ConfigurationParameterBag.php
+++ b/src/Core/Configuration/ConfigurationParameterBag.php
@@ -20,6 +20,7 @@
final class ConfigurationParameterBag
{
private array $parameters = [];
+ private ?string $lastConfigVersion = null;
/**
* @param ValueResolverInterface[] $resolvers
@@ -30,6 +31,14 @@ public function __construct(
) {
}
+ public function getConfigVersion(): string
+ {
+ if (is_null($this->lastConfigVersion)) {
+ $this->lastConfigVersion = md5(serialize($this->getAll(false)));
+ }
+ return $this->lastConfigVersion;
+ }
+
public function getConfigValues(string ...$configurationFiles): array
{
$values = [];
@@ -48,6 +57,7 @@ public function loadFromFiles(string ...$fileNames): void
public function loadFromArray(array $parameters): void
{
+ $this->lastConfigVersion = null;
foreach ($parameters as $name => $value) {
$this->set($name, $value);
}
@@ -77,6 +87,7 @@ public function set(string $name, mixed $value): void
public function addValueIfNotExists(string $name, mixed $value): void
{
+ $this->lastConfigVersion = null;
$keys = array_reverse(explode('.', $name));
foreach ($keys as $key) {
if ($key) {
diff --git a/src/Core/Logger/Handler/GenerationErrorsHandler.php b/src/Core/Logger/Handler/GenerationErrorsHandler.php
index 8da55a70..b21143af 100644
--- a/src/Core/Logger/Handler/GenerationErrorsHandler.php
+++ b/src/Core/Logger/Handler/GenerationErrorsHandler.php
@@ -41,7 +41,8 @@ protected function write(array $record): void
"type" => $record['level_name'],
"msg" => $record['message'],
'initiator' => $initiator,
- 'isRenderingError' => boolval($this->rendererContext->getCurrentTemplateFilePatch())
+ 'isRenderingError' => boolval($this->rendererContext->getCurrentTemplateFilePatch()),
+ 'currentDocumentedEntityWrapper' => $this->rendererContext->getCurrentDocumentedEntityWrapper()?->getDocumentTransformableEntity()?->getName()
];
}
diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php b/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php
index eafa8bb4..db46a416 100644
--- a/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php
+++ b/src/Core/Parser/Entity/Cache/CacheableEntityInterface.php
@@ -16,7 +16,7 @@ public function isEntityFileCanBeLoad(): bool;
public function isEntityDataCacheOutdated(): bool;
- public function reloadEntityDependenciesCache(): void;
+ public function reloadEntityDependenciesCache(): array;
public function removeNotUsedEntityDataCache(): void;
}
diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php b/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php
index 9b5456f6..f09b89fc 100644
--- a/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php
+++ b/src/Core/Parser/Entity/Cache/CacheableEntityTrait.php
@@ -4,31 +4,39 @@
namespace BumbleDocGen\Core\Parser\Entity\Cache;
+use BumbleDocGen\Core\Configuration\Configuration;
use DI\Attribute\Inject;
use Psr\Cache\InvalidArgumentException;
trait CacheableEntityTrait
{
#[Inject] private EntityCacheStorageHelper $entityCacheStorageHelper;
+ #[Inject] private Configuration $configuration;
- private string $cacheVersion = 'v7';
+ private string $entityCacheVersion = 'v1';
+ private string $entityCacheKey = '';
private bool $isCacheChanged = false;
- abstract public function getCacheKey(): string;
-
- abstract public function entityCacheIsOutdated(): bool;
-
- private function getVersionedCacheKey(): string
+ public function getCacheKey(): string
{
- return "{$this->cacheVersion}_{$this->getCacheKey()}";
+ if (!$this->entityCacheKey) {
+ $currentRootEntity = $this->getCurrentRootEntity();
+ $configVersion = $this->configuration->getConfigurationVersion();
+ $this->entityCacheKey = $currentRootEntity ? md5(
+ $this->entityCacheVersion . $configVersion . $this->getCurrentRootEntity()->getName()
+ ) : '';
+ }
+ return $this->entityCacheKey;
}
+ abstract public function entityCacheIsOutdated(): bool;
+
/**
* @throws InvalidArgumentException
*/
protected function getEntityCacheValue(string $key): mixed
{
- return $this->entityCacheStorageHelper->getItemValueFromCache($this->getVersionedCacheKey(), $key);
+ return $this->entityCacheStorageHelper->getItemValueFromCache($this->getCacheKey(), $key);
}
/**
@@ -36,7 +44,7 @@ protected function getEntityCacheValue(string $key): mixed
*/
protected function hasEntityCacheValue(string $key): bool
{
- $cacheValues = $this->entityCacheStorageHelper->getItemValues($this->getVersionedCacheKey());
+ $cacheValues = $this->entityCacheStorageHelper->getItemValues($this->getCacheKey());
return array_key_exists($key, $cacheValues) && is_array($cacheValues[$key]) && $cacheValues[$key];
}
@@ -47,19 +55,28 @@ protected function addEntityValueToCache(string $key, mixed $value, int $cacheEx
{
$this->isCacheChanged = true;
$this->entityCacheStorageHelper->addItemValueToCache(
- $this->getVersionedCacheKey(),
+ $this->getCacheKey(),
$key,
$value,
$cacheExpiresAfter
);
}
+ public function removeEntityValueFromCache(string $key): void
+ {
+ $this->isCacheChanged = true;
+ $this->entityCacheStorageHelper->removeItemValueFromCache(
+ $this->getCacheKey(),
+ $key,
+ );
+ }
+
/**
* @throws InvalidArgumentException
*/
public function isEntityDataCacheOutdated(): bool
{
- $cacheKey = $this->getVersionedCacheKey();
+ $cacheKey = $this->getCacheKey();
$values = $this->entityCacheStorageHelper->getItemValues($cacheKey);
$usedCacheItemsKeys = $this->entityCacheStorageHelper->getUsedCacheItemsKeys($cacheKey);
$isCacheChanged = $this->isCacheChanged || count($values) !== count($usedCacheItemsKeys);
@@ -79,7 +96,7 @@ public function isEntityDataCacheOutdated(): bool
*/
public function removeNotUsedEntityDataCache(): void
{
- $cacheKey = $this->getVersionedCacheKey();
+ $cacheKey = $this->getCacheKey();
$cacheValues = $this->entityCacheStorageHelper->getItemValues($cacheKey);
$usedCacheItemsKeys = $this->entityCacheStorageHelper->getUsedCacheItemsKeys($cacheKey);
foreach ($cacheValues as $k => $v) {
diff --git a/src/Core/Parser/Entity/Cache/CacheableEntityWrapperTrait.php b/src/Core/Parser/Entity/Cache/CacheableEntityWrapperTrait.php
index 3b344ec4..03bda662 100644
--- a/src/Core/Parser/Entity/Cache/CacheableEntityWrapperTrait.php
+++ b/src/Core/Parser/Entity/Cache/CacheableEntityWrapperTrait.php
@@ -5,12 +5,15 @@
namespace BumbleDocGen\Core\Parser\Entity\Cache;
use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
+use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler;
+use DI\Attribute\Inject;
use Psr\Cache\InvalidArgumentException;
trait CacheableEntityWrapperTrait
{
use CacheableEntityTrait;
+ #[Inject] private GenerationErrorsHandler $generationErrorsHandler;
private bool $noCacheMode = false;
abstract public function isEntityFileCanBeLoad(): bool;
@@ -39,9 +42,11 @@ final protected function getWrappedMethodResult(
if ($this->hasEntityCacheValue($cacheKey) && !$this->entityCacheIsOutdated()) {
$methodReturnValue = $this->getEntityCacheValue($cacheKey);
} else {
+ $errorsBeforeGenerationCount = count($this->generationErrorsHandler->getRecords());
$methodReturnValue = call_user_func_array([parent::class, $methodName], $funcArgs);
$this->noCacheMode = true;
- if ($this->isEntityFileCanBeLoad()) {
+ $errorsCount = count($this->generationErrorsHandler->getRecords());
+ if ($errorsCount === $errorsBeforeGenerationCount && $this->isEntityFileCanBeLoad()) {
$this->addEntityValueToCache($cacheKey, $methodReturnValue, $cacheExpiresAfter);
}
$this->noCacheMode = false;
diff --git a/src/Core/Parser/Entity/RootEntityInterface.php b/src/Core/Parser/Entity/RootEntityInterface.php
index 54d1594b..babd4697 100644
--- a/src/Core/Parser/Entity/RootEntityInterface.php
+++ b/src/Core/Parser/Entity/RootEntityInterface.php
@@ -20,6 +20,11 @@ public static function isEntityNameValid(string $entityName): bool;
*/
public function entityDataCanBeLoaded(): bool;
+ /**
+ * The entity is loaded from a third party library and should not be treated the same as a standard one
+ */
+ public function isExternalLibraryEntity(): bool;
+
/**
* @return string[]
*/
diff --git a/src/Core/Plugin/PluginEventDispatcher.php b/src/Core/Plugin/PluginEventDispatcher.php
index c9198bf7..205f5fc8 100644
--- a/src/Core/Plugin/PluginEventDispatcher.php
+++ b/src/Core/Plugin/PluginEventDispatcher.php
@@ -4,12 +4,18 @@
namespace BumbleDocGen\Core\Plugin;
+use Monolog\Logger;
use Symfony\Component\EventDispatcher\EventDispatcher;
class PluginEventDispatcher extends EventDispatcher
{
private array $handledSingleExecutionEvents = [];
+ public function __construct(private Logger $logger)
+ {
+ parent::__construct();
+ }
+
public function dispatch(object $event, string $eventName = null): object
{
if ($event instanceof OnlySingleExecutionEvent) {
@@ -20,6 +26,11 @@ public function dispatch(object $event, string $eventName = null): object
$this->handledSingleExecutionEvents[$uniqueExecutionId] = true;
}
}
- return parent::dispatch($event, $eventName);
+ try {
+ return parent::dispatch($event, $eventName);
+ } catch (\Exception $e) {
+ $this->logger->error($e->getMessage());
+ }
+ return $event;
}
}
diff --git a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php
index 1d762c22..5dfd37ca 100644
--- a/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php
+++ b/src/Core/Renderer/Breadcrumbs/BreadcrumbsHelper.php
@@ -91,22 +91,7 @@ private function getPrevPage(string $templateName): ?string
if ($pathParts) {
$subPath = count($pathParts) > 1 ? implode('/', $pathParts) : '';
- $finder = Finder::create()
- ->name('*.twig')
- ->ignoreVCS(true)
- ->ignoreDotFiles(true)
- ->ignoreUnreadableDirs()
- ->depth(0)
- ->in($this->configuration->getTemplatesDir() . '/' . $subPath);
-
- $indexFile = null;
- foreach ($finder->files() as $file) {
- $indexFile = $file->getFileName();
- if (preg_match($this->prevPageNameTemplate, $indexFile)) {
- break;
- }
- }
-
+ $indexFile = $this->getFindIndexFileByRelativePath($subPath);
if ($indexFile) {
$prevPage = $subPath . "/{$indexFile}";
}
@@ -115,6 +100,44 @@ private function getPrevPage(string $templateName): ?string
return $prevPage;
}
+ /**
+ * @throws InvalidConfigurationParameterException
+ */
+ public function getNearestIndexFile(string $templateName): string
+ {
+ $pathParts = explode('/', $templateName);
+ array_pop($pathParts);
+ $subPath = implode('/', $pathParts);
+ $indexFile = $this->getFindIndexFileByRelativePath($subPath);
+ if (is_null($indexFile)) {
+ return $templateName;
+ }
+ return "{$subPath}/{$indexFile}";
+ }
+
+ /**
+ * @throws InvalidConfigurationParameterException
+ */
+ private function getFindIndexFileByRelativePath(string $relativePath): ?string
+ {
+ $finder = Finder::create()
+ ->name('*.twig')
+ ->ignoreVCS(true)
+ ->ignoreDotFiles(true)
+ ->ignoreUnreadableDirs()
+ ->depth(0)
+ ->in($this->configuration->getTemplatesDir() . '/' . $relativePath);
+
+ $indexFile = null;
+ foreach ($finder->files() as $file) {
+ $indexFile = $file->getFileName();
+ if (preg_match($this->prevPageNameTemplate, $indexFile)) {
+ break;
+ }
+ }
+ return $indexFile;
+ }
+
/**
* Get the name of a template by its URL.
* Only templates with .twig extension are processed.
diff --git a/src/Core/Renderer/Context/DocumentedEntityWrappersCollection.php b/src/Core/Renderer/Context/DocumentedEntityWrappersCollection.php
index 2e681a0b..dd2222d6 100644
--- a/src/Core/Renderer/Context/DocumentedEntityWrappersCollection.php
+++ b/src/Core/Renderer/Context/DocumentedEntityWrappersCollection.php
@@ -5,9 +5,11 @@
namespace BumbleDocGen\Core\Renderer\Context;
use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache;
+use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
use BumbleDocGen\Core\Parser\Entity\RootEntityInterface;
use BumbleDocGen\Core\Plugin\Event\Renderer\OnCreateDocumentedEntityWrapper;
use BumbleDocGen\Core\Plugin\PluginEventDispatcher;
+use BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper;
final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \Countable
{
@@ -19,6 +21,7 @@ final class DocumentedEntityWrappersCollection implements \IteratorAggregate, \C
public function __construct(
private RendererContext $rendererContext,
private LocalObjectCache $localObjectCache,
+ private BreadcrumbsHelper $breadcrumbsHelper,
private PluginEventDispatcher $pluginEventDispatcher
) {
}
@@ -33,12 +36,22 @@ public function getIterator(): \Generator
}
}
+ /**
+ * @throws InvalidConfigurationParameterException
+ */
public function createAndAddDocumentedEntityWrapper(RootEntityInterface $rootEntity): DocumentedEntityWrapper
{
+ $parentDocFilePatch = $this->rendererContext->getCurrentTemplateFilePatch();
+
+ $entityWrapper = $this->rendererContext->getCurrentDocumentedEntityWrapper();
+ if (!is_null($entityWrapper)) {
+ $parentDocFilePatch = $this->breadcrumbsHelper->getNearestIndexFile($parentDocFilePatch);
+ }
+
$documentedEntity = new DocumentedEntityWrapper(
$rootEntity,
$this->localObjectCache,
- $this->rendererContext->getCurrentTemplateFilePatch()
+ $parentDocFilePatch
);
$this->pluginEventDispatcher->dispatch(new OnCreateDocumentedEntityWrapper($documentedEntity));
diff --git a/src/Core/Renderer/RendererIteratorFactory.php b/src/Core/Renderer/RendererIteratorFactory.php
index 487a241b..61a176f7 100644
--- a/src/Core/Renderer/RendererIteratorFactory.php
+++ b/src/Core/Renderer/RendererIteratorFactory.php
@@ -198,7 +198,7 @@ public function getDocumentedEntityWrappersWithOutdatedCache(): \Generator
);
$this->sharedCompressedDocumentFileCache->set(
'config_hash',
- md5(serialize($this->configurationParameterBag->getAll(false)))
+ $this->configuration->getConfigurationVersion()
);
$this->sharedCompressedDocumentFileCache->set(
'internal_caching_system_version',
@@ -283,7 +283,7 @@ private function isConfigurationVersionChanged(): bool
return $this->localObjectCache->getMethodCachedResult(__METHOD__, '');
} catch (ObjectNotFoundException) {
}
- $configHash = md5(serialize($this->configurationParameterBag->getAll(false)));
+ $configHash = $this->configuration->getConfigurationVersion();
$cachedConfigHash = $this->sharedCompressedDocumentFileCache->get('config_hash');
$isConfigChanged = $configHash !== $cachedConfigHash;
$this->localObjectCache->cacheMethodResult(__METHOD__, '', $isConfigChanged);
diff --git a/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php b/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php
index 3764fe10..1f9678b3 100644
--- a/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php
+++ b/src/Core/Renderer/Twig/Filter/StrTypeToUrl.php
@@ -4,13 +4,9 @@
namespace BumbleDocGen\Core\Renderer\Twig\Filter;
-use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
use BumbleDocGen\Core\Parser\Entity\RootEntityCollection;
use BumbleDocGen\Core\Renderer\RendererHelper;
use BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl;
-use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException;
-use DI\DependencyException;
-use DI\NotFoundException;
use Monolog\Logger;
/**
@@ -49,10 +45,6 @@ public static function getOptions(): array
* If true, creates an entity document. Otherwise, just gives a reference to the entity code
*
* @return string
- * @throws NotFoundException
- * @throws ReflectionException
- * @throws DependencyException
- * @throws InvalidConfigurationParameterException
*/
public function __invoke(
string $text,
@@ -70,30 +62,34 @@ public function __invoke(
$preparedTypes[] = "{$type}";
continue;
}
+ try {
+ $entityOfLink = $rootEntityCollection->getLoadedOrCreateNew($type);
+ if (!$entityOfLink->isExternalLibraryEntity() && $entityOfLink->entityDataCanBeLoaded()) {
+ if ($entityOfLink->getAbsoluteFileName()) {
+ $link = $getDocumentedEntityUrlFunction($rootEntityCollection, $type, '', $createDocument);
- $entityOfLink = $rootEntityCollection->getLoadedOrCreateNew($type);
- if ($entityOfLink->entityDataCanBeLoaded()) {
- if ($entityOfLink->getAbsoluteFileName()) {
- $link = $getDocumentedEntityUrlFunction($rootEntityCollection, $type, '', $createDocument);
+ if ($useShortLinkVersion) {
+ $type = $entityOfLink->getShortName();
+ } else {
+ $type = "\\{$entityOfLink->getName()}";
+ }
- if ($useShortLinkVersion) {
- $type = $entityOfLink->getShortName();
- } else {
- $type = "\\{$entityOfLink->getName()}";
+ if ($link && $link !== '#') {
+ $preparedTypes[] = "{$type}";
+ } else {
+ $preparedTypes[] = $type;
+ }
}
-
- if ($link && $link !== '#') {
- $preparedTypes[] = "{$type}";
- } else {
- $preparedTypes[] = $type;
+ } else {
+ if ($entityOfLink::isEntityNameValid($type)) {
+ $this->logger->warning(
+ "StrTypeToUrl: Entity {$type} not found in specified sources"
+ );
}
+ $preparedTypes[] = $type;
}
- } else {
- if ($entityOfLink::isEntityNameValid($type)) {
- $this->logger->warning(
- "StrTypeToUrl: Entity {$type} not found in specified sources"
- );
- }
+ } catch (\Exception $e) {
+ $this->logger->error($e->getMessage());
$preparedTypes[] = $type;
}
}
diff --git a/src/DocGenerator.php b/src/DocGenerator.php
index e764f097..a3cf7d31 100644
--- a/src/DocGenerator.php
+++ b/src/DocGenerator.php
@@ -4,6 +4,9 @@
namespace BumbleDocGen;
+use BumbleDocGen\AI\Generators\DocBlocksGenerator;
+use BumbleDocGen\AI\Generators\ReadmeTemplateGenerator;
+use BumbleDocGen\AI\ProviderInterface;
use BumbleDocGen\Core\Configuration\Configuration;
use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler;
@@ -16,11 +19,10 @@
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection;
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException;
use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper;
-use BumbleDocGen\TemplateGenerator\ChatGpt\MissingDocBlocksGenerator;
-use BumbleDocGen\TemplateGenerator\ChatGpt\ReadmeTemplateFiller;
-use BumbleDocGen\TemplateGenerator\ChatGpt\TemplatesStructureGenerator;
use DI\DependencyException;
use DI\NotFoundException;
+use Exception;
+use Generator;
use Monolog\Logger;
use Psr\Cache\InvalidArgumentException;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
@@ -29,14 +31,13 @@
use Symfony\Component\Console\Style\OutputStyle;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
-use Tectalic\OpenAi\ClientException;
/**
* Class for generating documentation.
*/
final class DocGenerator
{
- public const VERSION = '1.4.0';
+ public const VERSION = '1.5.0';
public const LOG_FILE_NAME = 'last_run.log';
public function __construct(
@@ -71,67 +72,6 @@ public function parseAndGetRootEntityCollectionsGroup(): RootEntityCollectionsGr
return $this->rootEntityCollectionsGroup;
}
- /**
- * Generate documentation structure with blank templates using AI tools
- *
- * @throws ClientException
- * @throws NotFoundException
- * @throws ReflectionException
- * @throws DependencyException
- * @throws InvalidConfigurationParameterException
- */
- public function generateProjectTemplatesStructure(): void
- {
- $this->parser->parse();
- $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME);
-
- $openaiKey = getenv('OPENAI_API_KEY') ?: $this->io->askHidden('Enter the key to work with ChatGpt');
- $openaiClient = \Tectalic\OpenAi\Manager::build(
- new \GuzzleHttp\Client(),
- new \Tectalic\OpenAi\Authentication($openaiKey)
- );
-
- $availableModels = array_values(array_filter(
- array_map(
- fn(array $v) => $v['id'],
- $openaiClient->models()->list()->toArray()['data'] ?? []
- ),
- fn(string $v) => str_starts_with($v, "gpt-")
- ));
-
- $model = $this->io->choice("Choose GPT model from available", $availableModels);
- $templatesStructureGenerator = new TemplatesStructureGenerator($openaiClient, $model);
-
- do {
- $additionalPrompt = $this->io->ask('Write instructions for more accurate documentation generation ( or just skip this step )') ?: null;
- $this->logger->notice("Sending ChatGPT request");
- $structure = $templatesStructureGenerator->generateStructureByEntityCollection($entitiesCollection, $additionalPrompt);
- $structureAsString = implode("\n", array_map(fn($v, $k) => "{$k} => {$v}", $structure, array_keys($structure)));
- $action = $this->io->choice("The proposed documentation structure is as follows:\n\n{$structureAsString}", ['Save', 'Regenerate', 'Cancel']);
- } while ($action == 'Regenerate');
-
- if ($action === 'Save') {
- $templatesDir = $this->configuration->getTemplatesDir();
- $finder = new Finder();
- $finder->files()->in($this->configuration->getTemplatesDir());
- if (
- $finder->hasResults() &&
- $this->io->confirm("Directory `{$templatesDir}` already contains files. Clean before saving new ones?")
- ) {
- $this->fs->remove([$templatesDir]);
- }
-
- foreach ($structure as $fileName => $title) {
- $fileName = $templatesDir . $fileName;
- $this->fs->appendToFile($fileName, "{% set title = '{$title}' %}\n");
- if (!str_ends_with($fileName, 'readme.md.twig')) {
- $this->fs->appendToFile($fileName, "{{ generatePageBreadcrumbs(title, _self) }}\n");
- }
- $this->logger->notice("Creating `{$fileName}` template");
- }
- }
- }
-
/**
* Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
*
@@ -139,39 +79,32 @@ public function generateProjectTemplatesStructure(): void
* @throws DependencyException
* @throws ReflectionException
* @throws InvalidConfigurationParameterException
- * @throws ClientException
*/
- public function addMissingDocBlocks(): void
- {
+ public function addDocBlocks(
+ ProviderInterface $aiProvider,
+ ): void {
if (!$this->io->confirm("This command will change the source code of your project. Continue?")) {
return;
}
$this->parser->parse();
$entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME);
-
- $openaiKey = getenv('OPENAI_API_KEY') ?: $this->io->askHidden('Enter the key to work with ChatGpt');
- $openaiClient = \Tectalic\OpenAi\Manager::build(
- new \GuzzleHttp\Client(),
- new \Tectalic\OpenAi\Authentication($openaiKey)
- );
-
- $availableModels = array_values(array_filter(
- array_map(
- fn(array $v) => $v['id'],
- $openaiClient->models()->list()->toArray()['data'] ?? []
- ),
- fn(string $v) => str_starts_with($v, "gpt-")
- ));
-
- $model = $this->io->choice("Choose GPT model from available", $availableModels);
- $missingDocBlocksGenerator = new MissingDocBlocksGenerator($openaiClient, $this->parserHelper, $model);
+ $missingDocBlocksGenerator = new DocBlocksGenerator($aiProvider, $this->parserHelper);
$alreadyProcessedEntities = [];
- $getEntities = function (ClassEntityCollection|array $entitiesCollection) use (&$getEntities, &$alreadyProcessedEntities): \Generator {
+ $getEntities = function (ClassEntityCollection|array $entitiesCollection) use (
+ &$getEntities,
+ &
+ $alreadyProcessedEntities
+ ): Generator {
foreach ($entitiesCollection as $classEntity) {
/**@var ClassEntity $classEntity */
- if (!$classEntity->entityDataCanBeLoaded() || array_key_exists($classEntity->getName(), $alreadyProcessedEntities)) {
+ if (
+ !$classEntity->entityDataCanBeLoaded() || array_key_exists(
+ $classEntity->getName(),
+ $alreadyProcessedEntities
+ )
+ ) {
continue;
}
$interfaces = $classEntity->getInterfacesEntities();
@@ -203,7 +136,9 @@ public function addMissingDocBlocks(): void
$classFileLines = explode("\n", $classFileContent);
foreach ($newBocBlocks as $method => $docBlock) {
$methodEntity = $entity->getMethodEntity($method);
- $lineNumber = $docCommentLine = $methodEntity->getDocComment() ? $methodEntity->getDocBlock(false)->getLocation()?->getLineNumber() : null;
+ $lineNumber = $docCommentLine = $methodEntity->getDocComment() ? $methodEntity->getDocBlock(
+ false
+ )->getLocation()?->getLineNumber() : null;
$lineNumber = $lineNumber ?: $methodEntity->getStartLine();
foreach (file($entity->getFullFileName(), FILE_IGNORE_NEW_LINES) as $line => $lineContent) {
@@ -226,22 +161,16 @@ public function addMissingDocBlocks(): void
/**
* @throws ReflectionException
* @throws DependencyException
- * @throws ClientException
* @throws NotFoundException
* @throws InvalidConfigurationParameterException
*/
- public function fillInReadmeMdTemplate(): void
- {
+ public function generateReadmeTemplate(
+ ProviderInterface $aiProvider,
+ ): void {
$this->io->note("Project analysis");
$this->parser->parse();
$entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME);
- $openaiKey = getenv('OPENAI_API_KEY') ?: $this->io->askHidden('Enter the key to work with ChatGpt');
- $openaiClient = \Tectalic\OpenAi\Manager::build(
- new \GuzzleHttp\Client(),
- new \Tectalic\OpenAi\Authentication($openaiKey)
- );
-
$finder = new Finder();
$finder
->files()
@@ -256,7 +185,9 @@ public function fillInReadmeMdTemplate(): void
$entryPoints = [];
do {
- $entityName = $this->io->ask("Enter the name of the class that is the entry point of the documented project (or just skip this step)");
+ $entityName = $this->io->ask(
+ "Enter the name of the class that is the entry point of the documented project (or just skip this step)"
+ );
if ($entityName) {
$entity = $entitiesCollection->findEntity($entityName, false);
if (!$entity) {
@@ -269,11 +200,17 @@ public function fillInReadmeMdTemplate(): void
$action = null;
if ($entryPoints) {
do {
- $this->io->text(array_merge(["Entry-point classes:"], array_map(function ($v) {
- static $n = 0;
- ++$n;
- return "{$n}) {$v}";
- }, array_keys($entryPoints))));
+ $this->io->text(
+ array_merge(
+ ["Entry-point classes:"],
+ array_map(function ($v) {
+ static $n = 0;
+ ++$n;
+ return "{$n}) {$v}";
+ },
+ array_keys($entryPoints))
+ )
+ );
$action = $this->io->choice("Choose your next action", ['Continue', 'Add more', 'Remove last']);
if ($action === 'Remove last') {
@@ -283,19 +220,18 @@ public function fillInReadmeMdTemplate(): void
}
} while ($action !== 'Continue');
- $additionalPrompt = $this->io->ask('Write instructions for more accurate documentation generation ( or just skip this step )');
-
- $availableModels = array_values(array_filter(
- array_map(
- fn(array $v) => $v['id'],
- $openaiClient->models()->list()->toArray()['data'] ?? []
- ),
- fn(string $v) => str_starts_with($v, "gpt-")
- ));
+ $additionalPrompt = $this->io->ask(
+ 'Write instructions for more accurate documentation generation ( or just skip this step )'
+ );
- $model = $this->io->choice("Choose GPT model from available", $availableModels, 'gpt-4');
- $readmeTemplateFiller = new ReadmeTemplateFiller($openaiClient, $model);
- $readmeFileContent = $readmeTemplateFiller->generateReadmeFileContent($entitiesCollection, $entryPoints, $composerJsonFile, $additionalPrompt);
+ $readmeTemplateFiller = new ReadmeTemplateGenerator($aiProvider);
+ $this->io->note("Sending " . $aiProvider->getName() . " request");
+ $readmeFileContent = $readmeTemplateFiller->generateReadmeFileContent(
+ $entitiesCollection,
+ $entryPoints,
+ $composerJsonFile,
+ $additionalPrompt,
+ );
$fileContent = "{% set title = 'About the project' %}\n{$readmeFileContent}";
$this->io->note("readme.md.twig file content generated:");
@@ -311,7 +247,7 @@ public function fillInReadmeMdTemplate(): void
* Generates documentation using configuration
*
* @throws InvalidArgumentException
- * @throws \Exception
+ * @throws Exception
*/
public function generate(): void
{
@@ -321,8 +257,10 @@ public function generate(): void
try {
$this->parser->parse();
$this->renderer->run();
- } catch (\Exception $e) {
- $this->logger->critical("{$e->getFile()}:{$e->getLine()} {$e->getMessage()} \n\n{{$e->getTraceAsString()}}");
+ } catch (Exception $e) {
+ $this->logger->critical(
+ "{$e->getFile()}:{$e->getLine()} {$e->getMessage()} \n\n{{$e->getTraceAsString()}}"
+ );
throw $e;
}
@@ -349,7 +287,10 @@ public function generate(): void
$tag = strtolower($warningMessage['type']);
$rows[] = ["<{$tag}>{$warningMessage['type']}>", "<{$tag}>{$warningMessage['msg']}>"];
if ($warningMessage['isRenderingError']) {
- $rows[] = ['', 'This error occurs during the document rendering process>'];
+ $rows[] = [
+ '',
+ 'This error occurs during the document rendering process>'
+ ];
}
$rows[] = ['', $warningMessage['initiator']];
if ($warningMessagesCount - $i !== 1) {
diff --git a/src/LanguageHandler/Php/Parser/ComposerParser.php b/src/LanguageHandler/Php/Parser/ComposerParser.php
new file mode 100644
index 00000000..32feaf16
--- /dev/null
+++ b/src/LanguageHandler/Php/Parser/ComposerParser.php
@@ -0,0 +1,73 @@
+packages) {
+ return $this->packages;
+ }
+ $installedJsonFile = realpath($this->configuration->getProjectRoot() . '/vendor/composer/installed.json');
+ $installedPackagesData = json_decode(file_get_contents($installedJsonFile), true);
+ foreach ($installedPackagesData['packages'] as $package) {
+ if (!isset($package['source']['url'])) {
+ continue;
+ }
+
+ if (str_starts_with($package['source']['url'], 'https://github.com/')) {
+ $url = str_replace('.git', '', $package['source']['url']);
+ } elseif (str_starts_with($package['source']['url'], 'git@github')) {
+ preg_match('/(@)(.*?)(:)(.*?)(.git)/', $package['source']['url'], $matches);
+ $url = "https://{$matches[2]}/{$matches[4]}";
+ } else {
+ continue;
+ }
+
+ $psr4 = $package['autoload']["psr-4"] ?? [];
+ foreach ($psr4 as $namespace => $path) {
+ $this->packages[$namespace] = [
+ 'path' => $path,
+ 'namespace' => $namespace,
+ 'url' => $url
+ ];
+ }
+ }
+ return $this->packages;
+ }
+
+ /**
+ * @throws \Exception
+ */
+ public function getComposerPackageDataByClassName(string $className): ?array
+ {
+ if (!ParserHelper::isCorrectClassName($className)) {
+ return null;
+ }
+ $packages = $this->getComposerPackages();
+ $classParts = explode('\\', $className);
+ $namespace = '';
+ foreach ($classParts as $part) {
+ if ($part) {
+ $namespace .= "{$part}\\";
+ if (isset($packages[$namespace])) {
+ return $packages[$namespace];
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php
index f3a1d0ea..733ad1ec 100644
--- a/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php
+++ b/src/LanguageHandler/Php/Parser/Entity/BaseEntity.php
@@ -8,6 +8,7 @@
use BumbleDocGen\Core\Cache\LocalCache\LocalObjectCache;
use BumbleDocGen\Core\Configuration\Configuration;
use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException;
+use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler;
use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityInterface;
use BumbleDocGen\Core\Parser\Entity\Cache\CacheableEntityTrait;
use BumbleDocGen\Core\Parser\Entity\Cache\CacheableMethod;
@@ -18,6 +19,7 @@
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException;
use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper;
use BumbleDocGen\LanguageHandler\Php\PhpHandlerSettings;
+use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad;
use DI\Attribute\Inject;
use phpDocumentor\Reflection\DocBlock;
use Psr\Cache\InvalidArgumentException;
@@ -400,14 +402,37 @@ private function fillInLinkDataWithUrls(array $linkData): array
$this->getImplementingReflectionClass()->getName(),
false
);
- $linkData[$key]['url'] = $entityData['entityName'] ? call_user_func_array(
- callback: $this->documentedEntityUrlFunction,
- args: [
- $this->getRootEntityCollection(),
- $entityData['entityName'],
- $entityData['cursor']
- ]
- ) : null;
+ if (!$entityData['entityName'] && !str_contains($data['className'], '\\')) {
+ try {
+ $data['className'] = $this->getDocCommentEntity()->getCurrentRootEntity()->getNamespaceName() . "\\{$data['className']}";
+ $entityData = $this->getRootEntityCollection()->getEntityLinkData(
+ $data['className'],
+ $this->getDocCommentEntity()->getCurrentRootEntity()->getName(),
+ false
+ );
+ } catch (\Exception $e) {
+ $this->logger->error($e->getMessage());
+ }
+ }
+
+ if ($entityData['entityName']) {
+ $linkData[$key]['url'] = call_user_func_array(
+ callback: $this->documentedEntityUrlFunction,
+ args: [
+ $this->getRootEntityCollection(),
+ $entityData['entityName'],
+ $entityData['cursor']
+ ]
+ );
+ } else {
+ $preloadResourceLink = $this->rendererHelper->getPreloadResourceLink($data['className']);
+ if ($preloadResourceLink) {
+ $linkData[$key]['url'] = $preloadResourceLink;
+ } else {
+ $linkData[$key]['url'] = null;
+ $this->logger->warning("Unable to get URL data for entity `{$data['className']}`");
+ }
+ }
$linkData[$key]['name'] = $entityData['title'];
unset($data['className']);
}
@@ -467,7 +492,7 @@ public function getDocNote(): string
return $this->getReflection()->getDocComment();
}
- private function getCurrentRootEntity(): ?RootEntityInterface
+ protected function getCurrentRootEntity(): ?RootEntityInterface
{
if (is_a($this, RootEntityInterface::class)) {
return $this;
@@ -477,7 +502,7 @@ private function getCurrentRootEntity(): ?RootEntityInterface
return null;
}
- private function getEntityDependenciesCacheKey(): string
+ protected function getEntityDependenciesCacheKey(): string
{
return "__internalEntityDependencies{$this->getCacheKey()}";
}
@@ -493,23 +518,32 @@ final public function getCachedEntityDependencies(): array
$filesDependenciesCacheKey = $this->getEntityDependenciesCacheKey();
$entityDependencies = $this->getEntityCacheValue($filesDependenciesCacheKey);
if (is_null($entityDependencies)) {
- $entityDependencies = $entity->getEntityDependencies();
- $this->addEntityValueToCache($this->getEntityDependenciesCacheKey(), $entityDependencies);
+ $entityDependencies = $this->reloadEntityDependenciesCache();
}
}
return $entityDependencies;
}
+ #[Inject] private GenerationErrorsHandler $generationErrorsHandler;
/**
* @throws InvalidArgumentException
*/
- final public function reloadEntityDependenciesCache(): void
+ final public function reloadEntityDependenciesCache(): array
{
+ $entityDependencies = [];
$entity = $this->getCurrentRootEntity();
if ($entity) {
+ $errorsBeforeCount = count($this->generationErrorsHandler->getRecords());
$entityDependencies = $entity->getEntityDependencies();
- $this->addEntityValueToCache($this->getEntityDependenciesCacheKey(), $entityDependencies);
+ $errorsAfterCount = count($this->generationErrorsHandler->getRecords());
+ if ($errorsBeforeCount === $errorsAfterCount) {
+ $this->addEntityValueToCache($this->getEntityDependenciesCacheKey(), $entityDependencies);
+ } else {
+ $this->removeEntityValueFromCache($this->getEntityDependenciesCacheKey());
+ $entityDependencies = [];
+ }
}
+ return $entityDependencies;
}
/**
@@ -549,6 +583,23 @@ private function isSubEntityFileCacheIsOutdated(string $dependenciesCacheKey): b
return $entityCacheIsOutdated;
}
+ protected function isCurrentEntityCanBeLoad(): bool
+ {
+ $classEntity = $this->getCurrentRootEntity();
+ if (!$classEntity) {
+ return false;
+ }
+ try {
+ return $this->localObjectCache->getMethodCachedResult(__METHOD__, $classEntity->getObjectId());
+ } catch (ObjectNotFoundException) {
+ }
+ $entityCanBeLoad = $this->getRootEntityCollection()->getPluginEventDispatcher()->dispatch(
+ new OnCheckIsClassEntityCanBeLoad($this->getCurrentRootEntity())
+ )->isClassCanBeLoad();
+ $this->localObjectCache->cacheMethodResult(__METHOD__, $classEntity->getObjectId(), $entityCanBeLoad);
+ return $entityCanBeLoad;
+ }
+
/**
* @throws InvalidConfigurationParameterException
* @throws InvalidArgumentException
@@ -578,6 +629,10 @@ final public function entityCacheIsOutdated(): bool
}
$this->localObjectCache->cacheMethodResult(__METHOD__, $entityName, false);
+ if (!$this->isCurrentEntityCanBeLoad()) {
+ return false;
+ }
+
$cachedDependencies = $this->getCachedEntityDependencies();
if (!$cachedDependencies) {
$entityCacheIsOutdated = true;
@@ -618,10 +673,4 @@ final public function entityCacheIsOutdated(): bool
$this->localObjectCache->cacheMethodResult(__METHOD__, $entityName, $entityCacheIsOutdated);
return $entityCacheIsOutdated;
}
-
- final public function getCacheKey(): string
- {
- $currentRootEntity = $this->getCurrentRootEntity();
- return $currentRootEntity ? md5($this->getCurrentRootEntity()->getName()) : '';
- }
}
diff --git a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php
index 61cf3940..5e46a273 100644
--- a/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php
+++ b/src/LanguageHandler/Php/Parser/Entity/ClassEntity.php
@@ -13,6 +13,7 @@
use BumbleDocGen\Core\Renderer\Context\DocumentTransformableEntityInterface;
use BumbleDocGen\Core\Renderer\EntityDocRenderer\EntityDocRendererInterface;
use BumbleDocGen\Core\Renderer\Twig\Filter\PrepareSourceLink;
+use BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser;
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException;
use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Reflection\ReflectorWrapper;
use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper;
@@ -49,6 +50,7 @@ public function __construct(
private ReflectorWrapper $reflector,
private ClassEntityCollection $classEntityCollection,
private ParserHelper $parserHelper,
+ private ComposerParser $composerParser,
private LocalObjectCache $localObjectCache,
private LoggerInterface $logger,
private string $className,
@@ -75,6 +77,15 @@ public function getObjectId(): string
return $this->className;
}
+ /**
+ * @inheritDoc
+ * @throws \Exception
+ */
+ public function isExternalLibraryEntity(): bool
+ {
+ return !is_null($this->composerParser->getComposerPackageDataByClassName($this->getName()));
+ }
+
public function setReflectionClass(ReflectionClass $reflectionClass): void
{
$this->reflectionClass = $reflectionClass;
@@ -102,6 +113,7 @@ public function getRootEntityCollection(): ClassEntityCollection
* @throws DependencyException
* @throws ReflectionException
* @throws InvalidConfigurationParameterException
+ * @throws \Exception
*/
public function getEntityDependencies(): array
{
@@ -113,8 +125,9 @@ public function getEntityDependencies(): array
$interfaceNames = $this->getInterfaceNames();
$classNames = array_unique(array_merge($parentClassNames, $traitClassNames, $interfaceNames));
+ $classNames = array_filter($classNames, fn(string $className) => !$this->composerParser->getComposerPackageDataByClassName($className));
- $reflections = array_map(fn($className) => $this->getReflector()->reflectClass($className), $classNames);
+ $reflections = array_map(fn(string $className): ReflectionClass => $this->getReflector()->reflectClass($className), $classNames);
$reflections[] = $currentClassEntityReflection;
foreach ($reflections as $reflectionClass) {
$fileName = $reflectionClass->getFileName();
@@ -293,18 +306,15 @@ public function isClassLoad(): bool
/**
* @throws ReflectionException
* @throws InvalidConfigurationParameterException
+ * @throws \Exception
*/
#[CacheableMethod] public function entityDataCanBeLoaded(): bool
{
- if (
- !$this->getRootEntityCollection()->getPluginEventDispatcher()->dispatch(
- new OnCheckIsClassEntityCanBeLoad($this)
- )->isClassCanBeLoad()
- ) {
+ if (!$this->isCurrentEntityCanBeLoad()) {
$this->logger->notice("Class `{$this->getName()}` loading skipped by plugin");
return false;
}
- return $this->isEntityFileCanBeLoad();
+ return !$this->isExternalLibraryEntity() && $this->isEntityFileCanBeLoad();
}
public function getShortName(): string
@@ -457,6 +467,9 @@ public function getInterfacesEntities(): array
*/
#[CacheableMethod] public function getParentClassNames(): array
{
+ if ($this->isExternalLibraryEntity()) {
+ return [];
+ }
if ($this->isInterface()) {
return $this->getInterfaceNames();
} else {
@@ -506,7 +519,9 @@ public function getInterfacesEntities(): array
$parentInterfaceNames = [];
try {
$interfaceEntity = $this->getRootEntityCollection()->getLoadedOrCreateNew($interfaceName);
- $parentInterfaceNames = $interfaceEntity->getInterfaceNames();
+ if (!$interfaceEntity->isExternalLibraryEntity()) {
+ $parentInterfaceNames = $interfaceEntity->getInterfaceNames();
+ }
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
@@ -515,7 +530,9 @@ public function getInterfacesEntities(): array
if (!$this->isInterface() && $parentClass = $this->getParentClass()) {
$parentInterfaceNames = [];
try {
- $parentInterfaceNames = $parentClass->getInterfaceNames();
+ if (!$parentClass->isExternalLibraryEntity()) {
+ $parentInterfaceNames = $parentClass->getInterfaceNames();
+ }
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
@@ -812,7 +829,7 @@ public function getFileContent(): string
*/
#[CacheableMethod] public function isInterface(): bool
{
- return $this->getReflection()->isInterface();
+ return $this->getReflection()->getAst() instanceof InterfaceNode;
}
/**
diff --git a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php
index 79d3b19d..02fb63da 100644
--- a/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php
+++ b/src/LanguageHandler/Php/Parser/Entity/MethodEntity.php
@@ -134,6 +134,10 @@ public function getDocCommentEntity(): MethodEntity
}
$docComment = $this->getDocComment();
$reflectionMethod = $this;
+ if ($reflectionMethod->isImplementedInParentClass()) {
+ $reflectionMethod = $reflectionMethod->getImplementingClass()->getMethodEntity($this->getName());
+ }
+
if (!$docComment || str_contains(mb_strtolower($docComment), '@inheritdoc')) {
$implementingClass = $this->getImplementingClass();
$parentClass = $this->getImplementingClass()->getParentClass();
diff --git a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php
index 2ee030a1..100d70ed 100644
--- a/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php
+++ b/src/LanguageHandler/Php/Parser/Entity/PropertyEntity.php
@@ -107,6 +107,10 @@ public function getDocCommentEntity(): PropertyEntity
}
$docComment = $this->getDocComment();
$reflectionProperty = $this;
+ if ($reflectionProperty->isImplementedInParentClass()) {
+ $reflectionProperty = $reflectionProperty->getImplementingClass()->getPropertyEntity($this->getName());
+ }
+
if (!$docComment || str_contains(mb_strtolower($docComment), '@inheritdoc')) {
$implementingClass = $this->getImplementingClass();
$parentClass = $this->getImplementingClass()->getParentClass();
diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php
index b7904f57..930f34aa 100644
--- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php
+++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpDocumentorStubberPlugin.php
@@ -38,6 +38,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void
$resourceName = "\\{$resourceName}";
}
if (str_starts_with($resourceName, '\\phpDocumentor\\Reflection\\')) {
+ $resourceName = explode('::', $resourceName)[0];
if (
in_array(ltrim($resourceName, '\\'), [
DocBlock::class,
@@ -64,7 +65,6 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void
) {
$resource = str_replace(['\\phpDocumentor\\Reflection\\', '\\'], ['', '/'], $resourceName);
$event->setResourceUrl("https://github.com/phpDocumentor/TypeResolver/blob/master/src/{$resource}.php");
- return;
}
}
}
diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php
index 3ebd5769..e64a32a9 100644
--- a/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php
+++ b/src/LanguageHandler/Php/Plugin/CorePlugin/BasePhpStubber/PhpUnitStubberPlugin.php
@@ -29,6 +29,7 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void
$resourceName = "\\{$resourceName}";
}
if (str_starts_with($resourceName, '\\PHPUnit\\')) {
+ $resourceName = explode('::', $resourceName)[0];
$resourceName = str_replace(['\\PHPUnit\\', '\\'], ['', '/'], $resourceName);
$event->setResourceUrl("https://github.com/sebastianbergmann/phpunit/blob/master/src/{$resourceName}.php");
}
diff --git a/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php b/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php
index 1be4a906..f034b8a9 100644
--- a/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php
+++ b/src/LanguageHandler/Php/Plugin/CorePlugin/ComposerPackagesStubber/StubberPlugin.php
@@ -4,10 +4,9 @@
namespace BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\ComposerPackagesStubber;
-use BumbleDocGen\Core\Configuration\Configuration;
use BumbleDocGen\Core\Plugin\Event\Renderer\OnGettingResourceLink;
use BumbleDocGen\Core\Plugin\PluginInterface;
-use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper;
+use BumbleDocGen\LanguageHandler\Php\Parser\ComposerParser;
use BumbleDocGen\LanguageHandler\Php\Plugin\Event\Entity\OnCheckIsClassEntityCanBeLoad;
/**
@@ -18,7 +17,7 @@ final class StubberPlugin implements PluginInterface
private array $packages = [];
private array $foundLinks = [];
- public function __construct(private Configuration $configuration)
+ public function __construct(private ComposerParser $composerParser)
{
}
@@ -37,9 +36,9 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void
{
if (!$event->getResourceUrl()) {
$resourceName = trim($event->getResourceName());
-
+ $resourceName = explode('::', $resourceName)[0];
if (!isset($this->foundLinks[$resourceName])) {
- $packageData = $this->getPackageDataByName($resourceName);
+ $packageData = $this->composerParser->getComposerPackageDataByClassName($resourceName);
if (!$packageData) {
return;
}
@@ -61,66 +60,8 @@ final public function onGettingResourceLink(OnGettingResourceLink $event): void
*/
final public function onCheckIsClassEntityCanBeLoad(OnCheckIsClassEntityCanBeLoad $event): void
{
- if ($this->getPackageDataByName($event->getEntity()->getName())) {
+ if ($this->composerParser->getComposerPackageDataByClassName($event->getEntity()->getName())) {
$event->disableClassLoading();
}
}
-
- /**
- * @throws \Exception
- */
- private function getComposerPackages(): array
- {
- if ($this->packages) {
- return $this->packages;
- }
- $installedJsonFile = realpath($this->configuration->getProjectRoot() . '/vendor/composer/installed.json');
- $installedPackagesData = json_decode(file_get_contents($installedJsonFile), true);
- foreach ($installedPackagesData['packages'] as $package) {
- if (!isset($package['source']['url'])) {
- continue;
- }
-
- if (str_starts_with($package['source']['url'], 'https://github.com/')) {
- $url = str_replace('.git', '', $package['source']['url']);
- } elseif (str_starts_with($package['source']['url'], 'git@github')) {
- preg_match('/(@)(.*?)(:)(.*?)(.git)/', $package['source']['url'], $matches);
- $url = "https://{$matches[2]}/{$matches[4]}";
- } else {
- continue;
- }
-
- $psr4 = $package['autoload']["psr-4"] ?? [];
- foreach ($psr4 as $namespace => $path) {
- $this->packages[$namespace] = [
- 'path' => $path,
- 'namespace' => $namespace,
- 'url' => $url
- ];
- }
- }
- return $this->packages;
- }
-
- /**
- * @throws \Exception
- */
- private function getPackageDataByName(string $className): ?array
- {
- if (!ParserHelper::isCorrectClassName($className)) {
- return null;
- }
- $packages = $this->getComposerPackages();
- $classParts = explode('\\', $className);
- $namespace = '';
- foreach ($classParts as $part) {
- if ($part) {
- $namespace .= "{$part}\\";
- if (isset($packages[$namespace])) {
- return $packages[$namespace];
- }
- }
- }
- return null;
- }
}
diff --git a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php
index 81ed7dab..e636ca56 100644
--- a/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php
+++ b/src/LanguageHandler/Php/Renderer/EntityDocRenderer/EntityDocRendererHelper.php
@@ -74,20 +74,16 @@ public function getEntityDataByLink(
}
}
- if ($entity) {
+ if ($entity && $entity->entityDataCanBeLoaded()) {
$cursor = '';
if ($classData[1] ?? null) {
$cursorTarget = str_replace(['$', '(', ')'], '', $classData[1]);
- if (
- str_ends_with($classData[1], '()') || $entity->hasMethod($cursorTarget)
- ) {
- $cursor = $classData[1];
- } elseif (
- str_starts_with($classData[1], '$') || $entity->hasProperty($cursorTarget)
- ) {
- $cursor = $classData[1];
- } elseif ($entity->hasConstant($classData[1])) {
- $cursor = $classData[1];
+ if ($entity->hasMethod($cursorTarget)) {
+ $cursor = "{$cursorTarget}()";
+ } elseif ($entity->hasProperty($cursorTarget)) {
+ $cursor = "\${$cursorTarget}";
+ } elseif ($entity->hasConstant($cursorTarget)) {
+ $cursor = $cursorTarget;
}
}
if (in_array(self::CLASS_ENTITY_SHORT_LINK_OPTION, $linkOptions)) {
diff --git a/src/TemplateGenerator/ChatGpt/TemplatesStructureGenerator.php b/src/TemplateGenerator/ChatGpt/TemplatesStructureGenerator.php
deleted file mode 100644
index 7f7c7a8f..00000000
--- a/src/TemplateGenerator/ChatGpt/TemplatesStructureGenerator.php
+++ /dev/null
@@ -1,77 +0,0 @@
- 'system',
- 'content' => file_get_contents(__DIR__ . '/prompts/structureGeneration')
- ],
- ];
-
- if ($additionalPrompt) {
- $messages[] = [
- 'role' => 'user',
- 'content' => "Additional Information: {$additionalPrompt}"
- ];
- }
-
- $namespacesList = array_map(fn(ClassEntity $e) => $e->getNamespaceName(), iterator_to_array($rootEntityCollection));
- $namespacesList = array_unique($namespacesList);
- $messages[] = [
- 'role' => 'user',
- 'content' => implode("\n", $namespacesList),
- ];
-
- $response = $this->openaiClient->chatCompletions()->create(
- new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([
- 'model' => $this->model,
- 'messages' => $messages,
- ])
- )->toModel();
-
- $finalStructure = [
- "/readme.md.twig" => "About the project",
- ];
-
- if ($content = $response->choices[0]->message->content ?? null) {
- $structure = json_decode($content);
- foreach ($structure as $dir => $docName) {
- $finalStructure["{$dir}/index.md.twig"] = $docName;
- }
- }
- $finalStructure["/tech/index.md.twig"] = "Description of the technical part of the project";
- return $finalStructure;
- }
-}
diff --git a/src/TemplateGenerator/ChatGpt/prompts/structureGeneration b/src/TemplateGenerator/ChatGpt/prompts/structureGeneration
deleted file mode 100644
index 45a809d2..00000000
--- a/src/TemplateGenerator/ChatGpt/prompts/structureGeneration
+++ /dev/null
@@ -1,9 +0,0 @@
-You are a documentation generator.
-You will be given a list of PHP namespaces. You need to return the file structure for documentation using these namespaces.
-You should logically group the documentation files by namespaces.
-Each directory must start with /tech, for example: /tech/scripts or /tech/db/entities.
-You should respond in JSON. An example response would be:
-{"/tech": "Technical description", "/tech/events": "Events to call", "/tech/modules": "Project modules", "/tech/modules/module1": "Description of the module1"}
-You must follow these rules very strictly, don't add anything extra.
-You keep the final structure concise and understandable.
-You don't need to make the documentation structure exactly the same as the list of namespaces, you can combine them.
\ No newline at end of file