diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 61f85efc1a..f9d97923e5 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -17,10 +17,14 @@ jobs: contents: read steps: + # Checkout the repo including all git submodules. + # Falls back to the built-in github.token for fork PRs where + # CI_USER_TOKEN_MATECATBOT is not available. - name: Checkout repository uses: actions/checkout@v4 with: token: '${{ secrets.CI_USER_TOKEN_MATECATBOT || github.token }}' + submodules: recursive - name: Setup PHP project uses: ./.github/actions/setup-php-project diff --git a/.gitignore b/.gitignore index a17e03c23e..3d9598462c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,10 @@ nbproject/ webgrind/ _dic_cache .phpunit.result.cache -/docs +/docs/* +!/docs/*.md +!/docs/*.png +!/docs/reviews/ # Configuration files .num_processes diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000..4a2fb272e2 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,50 @@ +# Memory-First Protocol + + +These rules enforce memory-aware behavior for AI coding agents. +If `signet_memory_search` is available, use Signet as the primary memory system. +Otherwise, use your native memory capabilities (MEMORY.md, auto memory, etc.). +The principles below apply regardless of which memory backend is available. + +## 1. Search Memory Before Acting + +- ALWAYS search memory BEFORE reading files, firing agents, or running commands. +- This includes session start: search for recent session summaries to orient before touching files. +- **Certainty is the trigger, not doubt.** If you think "I already know this," that is EXACTLY when you must search. +- Preferred: `signet_memory_search(query, type, limit)` when available. +- Fallback: read MEMORY.md or use native recall. + +## 2. Pre-Action Gate + +- Before running ANY build, test, lint, deploy, or project-specific command, search memory for the verified procedure. +- Use the stored version exactly. Do not add/remove flags from recall. +- If not found in memory, check project files (Makefile, package.json, CI config). If still not found, ask the user. +- NEVER skip to execution because you "remember" the command. + +## 3. Fallback Warning + +When memory search returns insufficient results and you fall back to reading files, inform the user: + +``` +MEMORY FALLBACK: Memory returned insufficient results for "". +Falling back to project files. Consider storing the result for future sessions. +``` + +This keeps the user aware of memory gaps so they can be filled over time. + +## 4. Store Conclusions + +- After any investigation, analysis, decision, debugging finding, or discovery, store the conclusion in memory. +- Store synthesized conclusions, NOT raw data or transcripts. +- Preferred: `signet_memory_store(content, type, tags, importance)` when available. +- Fallback: use your native memory system. +- Always check for duplicates before storing. Update existing entries rather than creating contradictions. + +## 5. Session Lifecycle + +- **Start**: Search memory for session summaries and recent context before touching files. +- **End**: Store a summary of what was accomplished, decisions made, and unfinished work. + +--- + + diff --git a/INSTALL/matecat.sql b/INSTALL/matecat.sql index 506421adf5..2a3f5acc82 100644 --- a/INSTALL/matecat.sql +++ b/INSTALL/matecat.sql @@ -1126,7 +1126,7 @@ CREATE TABLE `segment_metadata` ( `id_segment` bigint(20) NOT NULL, `meta_key` varchar(45) NOT NULL, `meta_value` varchar(255) NOT NULL, - KEY `idx_id_segment_meta_key` (`id_segment`,`meta_key`) + UNIQUE KEY `idx_id_segment_meta_key` (`id_segment`,`meta_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/composer.json b/composer.json index 7f3cac22b6..a269de17c0 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ "defuse/php-encryption": "^2.4", "elasticsearch/elasticsearch": "8.*", "google/apiclient": "^2", + "google-gemini-php/client": "^2.7", "league/oauth2-facebook": "^2.2", "league/oauth2-github": "^3.1", "league/oauth2-linkedin": "^5.1", @@ -17,7 +18,7 @@ "matecat/klein": "^3.2", "matecat/lara-php": "^v2.0.0-beta.1", "matecat/simple-s3": "^v2.0.0", - "matecat/subfiltering": "~v3.0", + "matecat/subfiltering": "~v4.0", "matecat/whole-text-finder": "^2.0", "matecat/xliff-parser": "~v3.0", "matecat/icu-intl": "^v1", @@ -49,8 +50,7 @@ "ext-openssl": "*", "ext-simplexml": "*", "ext-intl": "*", - "ext-redis": "*", - "google-gemini-php/client": "^2.7" + "ext-redis": "*" }, "config": { "use-include-path": true, diff --git a/composer.lock b/composer.lock index d2d1a5e90a..6178188d73 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": "6dca14d9cf05b046c9d1954483d512fd", + "content-hash": "721d1a28e929ccefd7590ca0cacf677a", "packages": [ { "name": "aws/aws-crt-php", @@ -1913,16 +1913,16 @@ }, { "name": "matecat/subfiltering", - "version": "v3.0.6", + "version": "v4.0.3", "source": { "type": "git", "url": "https://github.com/matecat/subfiltering.git", - "reference": "85bf1605302eddaa850478186d9dd13688d25a3b" + "reference": "a64e7a3c6021bd68e7e30f10f2f8ee730f7fe383" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matecat/subfiltering/zipball/85bf1605302eddaa850478186d9dd13688d25a3b", - "reference": "85bf1605302eddaa850478186d9dd13688d25a3b", + "url": "https://api.github.com/repos/matecat/subfiltering/zipball/a64e7a3c6021bd68e7e30f10f2f8ee730f7fe383", + "reference": "a64e7a3c6021bd68e7e30f10f2f8ee730f7fe383", "shasum": "" }, "require": { @@ -1969,9 +1969,9 @@ ], "support": { "issues": "https://github.com/matecat/subfiltering/issues", - "source": "https://github.com/matecat/subfiltering/tree/v3.0.6" + "source": "https://github.com/matecat/subfiltering/tree/v4.0.3" }, - "time": "2026-04-28T15:28:09+00:00" + "time": "2026-04-28T15:20:46+00:00" }, { "name": "matecat/whole-text-finder", @@ -3164,11 +3164,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.53", + "version": "2.1.54", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ef67586798c003274797b288a68b221e4270dca7", - "reference": "ef67586798c003274797b288a68b221e4270dca7", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8be50c3992107dc837b17da4d140fbbdf9a5c5bd", + "reference": "8be50c3992107dc837b17da4d140fbbdf9a5c5bd", "shasum": "" }, "require": { @@ -3213,7 +3213,7 @@ "type": "github" } ], - "time": "2026-04-28T16:09:00+00:00" + "time": "2026-04-29T13:31:09+00:00" }, { "name": "phptal/phptal", diff --git a/docs/2026-03_26-11:16-in-context-review-feature-development-spec.md b/docs/2026-03_26-11:16-in-context-review-feature-development-spec.md new file mode 100644 index 0000000000..9920317401 --- /dev/null +++ b/docs/2026-03_26-11:16-in-context-review-feature-development-spec.md @@ -0,0 +1,789 @@ +# In-Context Review — Feature Development Spec + +> **Branch:** `context-review` +> **Started:** March 2026 +> **Last updated:** 2026-04-03 +> **Reference spec:** `Technical Specification_ Mapping Between Contextual Markup and Translatable Strings.md` + +--- + +## 1. Feature Overview + +In-context review allows reviewers to see translated segments within their original document layout, providing visual +context for translation quality assessment. A project is created **without a flag** declaring that an in-context review +type is enabled — it works like any other normal project. The backend extracts defined attributes from the XLIFF +`` and stores them in `segments_metadata`. + +--- + +## 2. Architecture + +### 2.1 Metadata Pipeline (Backend) + +``` +XLIFF attributes + │ + ▼ +SegmentMetadataMarshaller::isAllowed() ← filter: only 6 keys pass + │ + ▼ +SegmentMetadataMapper::fromTransUnitAttributes() + │ creates DB-ready structs with marshall() + ▼ +SegmentMetadataCollection + │ read-only, iterable, countable, JsonSerializable + ▼ +SegmentStorageService::save() ← foreach struct → SegmentMetadataDao::save() + │ + ▼ +segment_metadata table + │ + ▼ +SegmentMetadataDao::getAll() → SegmentMetadataCollection (typed via jsonSerialize) +SegmentMetadataDao::get() → ?SegmentMetadataStruct (single key lookup) +``` + +### 2.2 Allowed Metadata Keys + +| Enum Case | DB Value (`meta_key`) | Marshall | Unmarshall | +| ------------------ | --------------------- | ----------------------------- | --------------------- | +| `ID_REQUEST` | `id_request` | `string → string` | `string → string` | +| `ID_CONTENT` | `id_content` | `string → string` | `string → string` | +| `ID_ORDER` | `id_order` | `string → string` | `string → string` | +| `ID_ORDER_GROUP` | `id_order_group` | `string → string` | `string → string` | +| `SCREENSHOT` | `screenshot` | `string → string` | `string → string` | +| `SIZE_RESTRICTION` | `sizeRestriction` | `mixed → string` (cast) | `string → int` (cast) | +| `RESNAME` | `resname` | `string → string` | `string → string` | +| `RESTYPE` | `restype` | `string → string` (validated) | `string → string` | +| `X_CLIENT_NAME` | `x-client-name` | `string → string` | `string → string` | + +> `RESTYPE.marshall()` validates via `ContextResType::tryFrom()` — returns `null` for invalid values, mapper skips them. + +### 2.3 Key Design Decisions + +| Decision | Rationale | +| ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- | +| `SegmentMetadataStruct::meta_value` stays `string` | DB-honest — the database column is VARCHAR. No lying about what the DB returns. | +| `Collection::find()` returns `?string` (raw) | Write path — `SegmentExtractor::createSegmentHash(?string $sizeRestriction)` needs raw string. | +| `Collection::findTyped()` returns `mixed` (typed) | Read path — calls `unMarshall()` internally for typed access. | +| `SegmentMetadataMarshaller::unMarshall()` is static | Follows `ProjectsMetadataMarshaller::unMarshall(MetadataStruct)` pattern. Accepts struct, not string. | +| `jsonSerialize()` serves typed values | API sends `sizeRestriction` as `int 42`, not `"42"`. Frontend confirmed safe (JS coercion). | +| No project-level flag | Per requirement: "a project is created without a flag declaring that an in-context review type is enabled." | +| `ProjectManagerModel::isAMetadata()` delegates to marshaller | Single source of truth for allowed keys. | +| `SizeRestrictionChecker::SIZE_RESTRICTION` constant removed | Replaced by `SegmentMetadataMarshaller::SIZE_RESTRICTION->value` across entire codebase. | + +--- + +## 3. Completed Work + +### 3.1 Backend — Commit 1 (`7860617`) + +`✨ feat: centralize segment metadata pipeline with marshaller, mapper, and collection` + +#### Files Created + +| File | Purpose | +| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `lib/Model/Segments/SegmentMetadataMarshaller.php` | Backed enum (8 cases): `isAllowed()`, `marshall()`, static `unmarshall()` | +| `lib/Model/Segments/SegmentMetadataMapper.php` | `fromTransUnitAttributes(array): SegmentMetadataCollection` | +| `lib/Model/Segments/SegmentMetadataCollection.php` | Read-only collection: `find()`, `findTyped()`, `IteratorAggregate`, `Countable`, `JsonSerializable` | +| `tests/unit/Model/Segments/SegmentMetadataMarshallerTest.php` | 22 tests | +| `tests/unit/Model/Segments/SegmentMetadataMapperTest.php` | 10 tests | +| `tests/unit/Model/Segments/SegmentMetadataCollectionTest.php` | 15 tests (9 base + 4 findTyped + 2 jsonSerialize) | + +#### Files Modified + +| File | Change | +| ---------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| `lib/Model/ProjectCreation/ProjectManagerModel.php` | `isAMetadata()` delegates to `SegmentMetadataMarshaller::isAllowed()` | +| `lib/Model/ProjectCreation/SegmentExtractor.php` | Uses mapper + collection, calls `$collection->find()` | +| `lib/Model/ProjectCreation/ProjectManager.php` | Added `use SegmentMetadataMapper` | +| `lib/Model/ProjectCreation/SegmentStorageService.php` | Iterates `SegmentMetadataCollection` via `foreach` | +| `lib/Utils/LQA/QA/SizeRestrictionChecker.php` | Uses `SegmentMetadataMarshaller::SIZE_RESTRICTION->value` (constant removed) | +| `lib/Utils/LQA/QA.php` | `SIZE_RESTRICTION` re-export removed | +| `lib/Controller/API/App/SetTranslationController.php` | Uses marshaller enum value | +| `lib/Controller/API/App/GetWarningController.php` | Uses marshaller enum value | +| `tests/unit/LQA/SizeRestrictionCheckerTest.php` | Updated to use enum | +| `tests/unit/LQA/QATest.php` | Updated to use enum | +| `tests/unit/Model/ProjectCreation/TestableSegmentExtractor.php` | Updated types | +| `tests/unit/Model/ProjectCreation/ExtractSegmentsTest.php` | Updated expectations | +| `tests/unit/Model/ProjectCreation/SegmentStorageServiceTest.php` | Updated expectations | + +### 3.2 Backend — Commit 2 (`bd6b45a`) + +`♻️ refactor: typed segment metadata pipeline — static unmarshall, DAO returns collection, API serves typed values` + +#### Changes + +| File | Change | +| ------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `lib/Model/Segments/SegmentMetadataMarshaller.php` | `unmarshall()` → static, accepts `SegmentMetadataStruct` | +| `lib/Model/Segments/SegmentMetadataCollection.php` | Added `findTyped()`, implemented `JsonSerializable` (typed values) | +| `lib/Model/Segments/SegmentMetadataDao.php` | `getAll()` → returns `SegmentMetadataCollection`; `get()` → returns `?SegmentMetadataStruct` | +| `lib/Controller/API/App/SetTranslationController.php` | Removed `[0] ?? null` | +| `lib/Controller/API/App/GetWarningController.php` | Removed `[0] ?? null` | +| `plugins/translated/lib/Features/Translated.php` | Removed `[0] ?? null`, uses nullsafe `?->` | +| `tests/unit/Model/Segments/SegmentMetadataMarshallerTest.php` | 3 unmarshall tests updated (struct-based) | +| `tests/unit/Model/Segments/SegmentMetadataCollectionTest.php` | 6 tests added (4 findTyped + 2 jsonSerialize) | + +#### Unchanged Files (and why) + +| File | Reason | +| --------------------------------------- | --------------------------------------------------------------------- | +| `SegmentMetadataStruct::meta_value` | Stays `string` (DB-honest) | +| `SegmentExtractor` | Uses `find()` (raw `?string`) — write path, no change | +| `SizeRestrictionChecker` | Receives struct, PHP coercion handles comparison | +| `SegmentMetadataDao::getBySegmentIds()` | Multi-segment, returns `SegmentMetadataStruct[]` — different use case | +| `GetSegmentsController:158` | `JsonSerializable` handles serialization automatically | +| Frontend JS files | All numeric ops use JS coercion — string→int transparent | + +### 3.3 Backend — Commit 3 (pending) + +`✨ feat: add resname/restype context mapping to segment metadata pipeline with ContextResType enum` + +#### Files Created + +| File | Purpose | +| -------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| `lib/Model/Segments/ContextResType.php` | Backed string enum (5 cases): validates `restype` values against allowed lookup strategies | +| `tests/unit/Model/Segments/ContextResTypeTest.php` | 15 tests | + +#### Files Modified + +| File | Change | +| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| `lib/Model/Segments/SegmentMetadataMarshaller.php` | Added `RESNAME` + `RESTYPE` cases; `RESTYPE.marshall()` validates via `ContextResType::tryFrom()` | +| `tests/unit/Model/Segments/SegmentMetadataMarshallerTest.php` | 14 tests added (2 isAllowed + 1 enum cases + 2 resname + 5 valid restype + 4 invalid restype) | + +### 3.4 Frontend (pre-existing, before our session) + +Context review page and supporting infrastructure built in earlier commits (`f4ef2b7`→`2de74713`): + +| File | Purpose | +| ----------------------------------------------------------------- | -------------------------------------------------------- | +| `public/js/pages/ContextReview.js` | Standalone context review page (583 lines) | +| `lib/Controller/Views/ContextReviewController.php` | Server-side view controller | +| `lib/Routes/view_routes.php` | Route registration | +| `lib/View/templates/_context_review.html` | HTML template | +| `public/css/sass/components/pages/ContextReviewPage.scss` | Page styling (205 lines) | +| `public/js/utils/contextReviewUtils.js` | XLIFF parsing, rendering, context extraction (428 lines) | +| `public/js/utils/contextReviewChannel.js` | Cross-tab BroadcastChannel communication (97 lines) | +| `public/js/hooks/useResizable.js` | Resizable panel hook | +| `public/img/icons/EyeIcon.js` | Eye icon component | +| `webpack.config.js` | Build entry point for context review page | +| `Segment.js`, `SegmentsContainer.js`, `Editarea.js`, `CatTool.js` | CAT tool integration points | +| `sample-context-review.html`, `*.xliff`, `equipment.xlf` | Test/demo files | + +--- + +## 4. API Signatures (current) + +### SegmentMetadataMarshaller + +```php +enum SegmentMetadataMarshaller: string +{ + case ID_REQUEST = 'id_request'; + case ID_CONTENT = 'id_content'; + case ID_ORDER = 'id_order'; + case ID_ORDER_GROUP = 'id_order_group'; + case SCREENSHOT = 'screenshot'; + case SIZE_RESTRICTION = 'sizeRestriction'; + case RESNAME = 'resname'; + case RESTYPE = 'restype'; + + public static function isAllowed(string $key): bool; + public function marshall(mixed $value): ?string; + public static function unMarshall(SegmentMetadataStruct $struct): mixed; +} +``` + +### ContextResType + +```php +enum ContextResType: string +{ + case X_PATH = 'x-path'; + case X_CLIENT_NODEPATH = 'x-client_nodepath'; + case X_TAG_ID = 'x-tag-id'; + case X_CSS_CLASS = 'x-css_class'; + case X_ATTRIBUTE_NAME_VALUE = 'x-attribute_name_value'; +} +``` + +### SegmentMetadataCollection + +```php +class SegmentMetadataCollection implements IteratorAggregate, Countable, JsonSerializable +{ + public function __construct(array $structs = []); + public function find(SegmentMetadataMarshaller $key): ?string; // raw value + public function findTyped(SegmentMetadataMarshaller $key): mixed; // typed value + public function getIterator(): ArrayIterator; + public function count(): int; + public function isEmpty(): bool; + public function jsonSerialize(): array; // typed values for API +} +``` + +### SegmentMetadataMapper + +```php +class SegmentMetadataMapper +{ + public static function fromTransUnitAttributes(array $transUnitAttributes): SegmentMetadataCollection; +} +``` + +### SegmentMetadataDao + +```php +class SegmentMetadataDao extends DataAccess_AbstractDao +{ + public static function getAll(int $id_segment, int $ttl = 604800): SegmentMetadataCollection; + public static function getBySegmentIds(array $ids, string $key, int $ttl = 604800): array; + public static function get(int $id_segment, string $key, int $ttl = 604800): ?SegmentMetadataStruct; + public static function save(SegmentMetadataStruct $metadataStruct): void; +} +``` + +--- + +## 5. Test Baseline + +``` +PHPUnit: 2190 tests, 16838 assertions, 0 failures +Command: vendor/bin/phpunit --exclude-group=ExternalServices --no-coverage +``` + +--- + +## 6. Frontend Impact Analysis + +Typed API response (`sizeRestriction` as `int` instead of `"string"`) — confirmed **no breaking changes**. + +| File:Line | Operation | String `"42"` | Int `42` | Safe? | +| -------------------------------- | -------------------------------- | ----------------- | --------------- | ----- | +| `SegmentTarget.js:325` | `.meta_value` read | `"42"` | `42` | Yes | +| `SegmentHeader.js:165` | `counter > limit` | JS coerces | native int | Yes | +| `SegmentHeader.js:167` | `limit - 20` | `"42" - 20 = 22` | `42 - 20 = 22` | Yes | +| `SegmentHeader.js:185` | `limit > 0` | `"42" > 0` = true | `42 > 0` = true | Yes | +| `SegmentHeader.js:189` | `{limit}` | renders "42" | renders "42" | Yes | +| `SegmentFooterTabMessages.js:15` | `meta_key !== 'sizeRestriction'` | key check only | key check only | Yes | + +--- + +## 7. Remaining Work (TODO) + +### 7.1 Context Mapping — Done + +- [x] **Analyze reference spec** — + `Technical Specification_ Mapping Between Contextual Markup and Translatable Strings.md` reviewed. Both XLIFF 1.2 and + 2.0 normalized to use `resname` and `restype` field names. +- [x] **Design decision: ContextResType enum** — Dedicated backed string enum to validate `restype` values against the 5 + allowed lookup strategies. Chosen over `in_array` for type safety, IDE support, and extensibility. +- [x] **Implement ContextResType enum** (TDD) — `lib/Model/Segments/ContextResType.php` with 5 cases. 15 tests. +- [x] **Add RESNAME + RESTYPE to marshaller** (TDD) — Two new cases in `SegmentMetadataMarshaller`. `RESTYPE.marshall()` + validates via `ContextResType::tryFrom()`, returns `null` for invalid values. `RESNAME.marshall()` default string + behavior. 14 tests added. + +### 7.2 Context URL Pipeline — Done + +- [x] **7.2.1a — PSR-1 rename `unmarshall` → `unMarshall`** in `SegmentMetadataMarshaller`, `SegmentMetadataCollection`, + and tests (3 files). Uniform with `ProjectsMetadataMarshaller::unMarshall()` / `JobsMetadataMarshaller::unMarshall()`. +- [x] **7.2.1b — Create `FilesMetadataMarshaller`** — Pattern B enum (`isAllowed` + `marshall` + `unMarshall`); cases: + `INSTRUCTIONS`, `PDF_ANALYSIS`, `CONTEXT_URL`. TDD (16 tests). +- [x] **7.2.1c — Wire `FilesMetadataMarshaller` into `Files\MetadataDao`** — Changed `MetadataStruct::$value` from + `string` to `mixed`; added `unMarshall()` calls in `get()`, `getByJobIdProjectAndIdFile()`, and `insert()`/`update()` + return paths. +- [x] **7.2.2 — Add `CONTEXT_URL = 'context-url'`** to `SegmentMetadataMarshaller` (9th case, Pattern B — falls through + to default string handling) and `ProjectsMetadataMarshaller` (31st case, wired into string-cast branch of + `unMarshall()`). TDD: +8 tests. +- [x] **7.2.3a — ContextUrlResolver** — Stateless static resolver with three-level fallback (segment → file → project). + TDD: 7 tests. +- [x] **7.2.3b — GetSegmentsController integration** — Pre-fetches project/file context-urls before segment loop; + resolves per-segment via `ContextUrlResolver::resolve()`. Returns `context_url` as top-level field on each segment. +- [x] **7.2.3c — Schema migration + `SegmentMetadataDao::upsert()`** — Added `UNIQUE KEY` constraint to + `segment_metadata(id_segment, meta_key)` in 3 SQL files. Added `upsert()` (INSERT ... ON DUPLICATE KEY UPDATE) and + `destroyGetAllCache()` methods. Runtime migration: + `migrations/20260326190000_alter_table_segment_metadata_add_unique_index.php`. +- [x] **7.2.3d — ContextUrlController (3 APIs)** — Single controller with `setForProject()`, `setForFile()`, + `setForSegment()` actions. Routes: `POST /api/app/context-url/{project,file,segment}`. Cache invalidation at all three + levels. + +### 7.3 Implementation Status (updated 2026-04-03) + +> Cross-referenced against actual codebase. Items marked ✅ were implemented by Federico (riccio82) on the frontend. + +#### Completed + +- [x] **Integration: Connect metadata to context review page** — `extractSegmentContextFields()` ( + `contextReviewUtils.js:596`) extracts `context_url`, `resname`, `restype` from segment data. `ContextReview.js:87-98` + builds a `metadataMap` filtering segments with `resname && restype`. +- [x] **Frontend: Extend segment message protocol** — `contextReviewChannel.js:11-30` defines the full protocol. + CatTool→ContextReview messages include `{sid, source, target, context_url, resname, restype}`. Backend ( + `GetSegmentsController`) populates all three fields. +- [x] **Frontend: Implement 5 lookup strategies** — `contextReviewLookup.js:22-71` dispatches via + `findElementByMetadata()`: + - `x-tag-id` → `querySelector('#' + CSS.escape(resname))` + - `x-css_class` → `querySelector('.' + CSS.escape(resname))` + - `x-path` → `document.evaluate()` with `XPathResult` + - `x-attribute_name_value` → parses `attr=value`, queries by attribute selector + - `x-client_nodepath` → stub returning `null` (falls through to text matching) +- [x] **Frontend: Fallback chain** — `contextReviewUtils.js:495-572` implements a 3-pass strategy: (1) metadata lookup + via `findElementByMetadata()`, (2) position-based text matching for untagged segments, (3) N:N broadcast for remaining + unmatched. +- [x] **Cross-tab sync** — `contextReviewChannel.js:1-105` implements a singleton `BroadcastChannel` scoped per + project (`matecat-context-review-${config.password}`). Two-way: `segments`/`highlight`/`updateTranslation` from + CatTool; `segmentClicked`/`requestSegments`/`loadMoreSegments` from ContextReview. Hooks ( + `useContextReviewMessages.js`) subscribe and dispatch. + +#### Not Started + +- [ ] **Screenshot handling** — The `screenshot` metadata key is stored by the backend ( + `SegmentMetadataMarshaller::SCREENSHOT`), but no upload, retrieval, or display flow exists on the frontend. +- [ ] **Context rendering with `id_content` / `id_order`** — Backend stores and serves both fields, but the frontend + does not consume them for document-layout rendering. +- [ ] **Review workflow states** — No state machine, workflow enum, or review-status message types exist. May eventually + need review states (pending, in-progress, approved, rejected). + +#### Deferred + +- [ ] **`getBySegmentIds()` collection support** — Backend method exists (`SegmentMetadataDao::getBySegmentIds()`) + returning `SegmentMetadataStruct[]`. The frontend uses incremental `getSegments()` instead of batch collection. + Converting to `SegmentMetadataCollection` return type deferred until a concrete consumer needs it. + +--- + +## 8. Constraints (active) + +### Architecture & Design + +1. "a project is created without a flag declaring that an in-context review type is enabled like any other normal + project" +2. "I DON'T WANT segmentextractor call any method to unmarshall in SegmentExtractor" +3. "SegmentMetadataMapper::fromTransUnitAttributes is the one who creates the SegmentMetadataStruct, it must create the + definitive segmentstruct" +4. "serve typed" — API returns typed values, not all strings +5. "SegmentMetadataStruct::meta_value MUST stay `string` — DB-honest, typed access only through + `Collection::findTyped()`" +6. "Do NOT perform cross-validation between `resname` and `restype` at storage time" — stored independently, frontend + responsible +7. `context-url` is the field name at all three levels — hyphenated to align with XLIFF attribute conventions +8. `context-url` has dual ingestion: XLIFF trans-unit attributes AND API. `FilesMetadataMarshaller` uses Pattern B (full + pipeline) — ready for future XLIFF `` attribute extraction +9. Fallback resolution order: segment → file → project (read-time, no data duplication) + +### Implementation Guardrails + +7. "we will ignore Equipment.html.xlf Equipment.html files" (not lookup strategies) +8. Do NOT modify files in `mm_bkp/` directory + +### Workflow + +9. "exclude group ExternalServices, you do not have the needed AWS and MyMemory keys" +10. "Before closing a task and decide to commit, YOU MUST RUN ALL the tests" +11. "MANDATORY: ALWAYS use conventional-commit" +12. "Wait my command before start implementing." +13. ALWAYS use `english-checker` skill +14. "use unMarshall, uniform SegmentMetadataMarshaller, stay compliant with PHP PSR-1 Basic Coding Standard" — all + marshallers use `unMarshall()` (camelCase) +15. "ALWAYS follow this pattern: update the document, show me the commit message, WAIT for my authorization, commit" + +--- + +## 9. Related Implementation Plans + +| Plan | Status | Location | +| ----------------------------- | -------- | ------------------------------------------------------------------------- | +| Segment metadata filter | Executed | `docs/superpowers/plans/2026-03-25-segment-metadata-filter.md` | +| Metadata validation hardening | Executed | `docs/superpowers/plans/2026-03-24-metadata-validation-hardening.md` | +| DAO unmarshalling | Executed | `docs/superpowers/plans/2026-03-25-segment-metadata-dao-unmarshalling.md` | + +--- + +## 10. Context Mapping — Technical Analysis + +> Based on analysis of `Technical Specification_ Mapping Between Contextual Markup and Translatable Strings.md` + +### 10.1 Reference Spec Summary + +The specification defines how XLIFF `` attributes map translated segments to their visual positions in the +original document (HTML context). Two attributes are key: + +| Attribute | Purpose | Example | +| --------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `resname` | **Target value** — the identifier/selector/path to locate the element in context HTML | `//html/body/div[2]/p[1]`, `content-block-42`, `product-title` | +| `restype` | **Strategy type** — declares HOW `resname` should be interpreted | `x-path`, `x-tag-id`, `x-css_class` | + +### 10.2 The 5 Lookup Strategies (from spec) + +| `restype` value | Strategy | `resname` contains | Example | +| ------------------------ | ---------------- | ------------------------- | ------------------------------ | +| `x-path` | XPath | Full XPath expression | `//html/body/div[2]/p[1]` | +| `x-client_nodepath` | Client node path | Proprietary CMS path | `root.section[2].paragraph[1]` | +| `x-tag-id` | Element ID | HTML `id` attribute value | `product-title` | +| `x-css_class` | CSS class | CSS class name | `translatable-block` | +| `x-attribute_name_value` | Attribute pair | `name=value` format | `data-trans-id=seg-42` | + +### 10.3 Gap Analysis (updated 2026-04-03) + +| Layer | Status | Detail | +| ---------------------------------- | ------- | ---------------------------------------------------------------------------------------------- | +| **XLIFF Parsing** | ✅ Done | `XliffParserV1/V2` already extract ALL trans-unit attributes including `resname` and `restype` | +| **Storage (marshaller whitelist)** | ✅ Done | `RESNAME` + `RESTYPE` cases added to `SegmentMetadataMarshaller` (Commit 3) | +| **Storage (validation)** | ✅ Done | `ContextResType` enum validates `restype` against 5 allowed strategies (Commit 3) | +| **Frontend message protocol** | ✅ Done | Protocol extended with `context_url`, `resname`, `restype` (`contextReviewChannel.js:11-30`) | +| **Frontend lookup strategies** | ✅ Done | 5-strategy dispatcher in `contextReviewLookup.js:22-71` with 3-pass fallback chain | + +**Full pipeline complete.** XLIFF attributes are extracted → stored → served via API → consumed by frontend lookup +strategies with graceful fallback to text matching. + +### 10.4 Design Decision: `ContextResType` Enum + +**Choice**: Dedicated `ContextResType` backed string enum (over `in_array` validation). + +**Rationale**: + +- Type safety — IDE catches invalid values at write time +- Extensible — new strategies = new enum case (no hunting for array constants) +- Self-documenting — `ContextResType::X_PATH` is clearer than `'x-path'` +- Testable — enum cases are exhaustively testable +- Reusable — frontend lookup strategy dispatch can switch on enum values + +**Implementation**: + +```php +// lib/Model/Segments/ContextResType.php +enum ContextResType: string +{ + case X_PATH = 'x-path'; + case X_CLIENT_NODEPATH = 'x-client_nodepath'; + case X_TAG_ID = 'x-tag-id'; + case X_CSS_CLASS = 'x-css_class'; + case X_ATTRIBUTE_NAME_VALUE = 'x-attribute_name_value'; +} +``` + +**Integration with marshaller**: + +```php +// In SegmentMetadataMarshaller: +case RESNAME = 'resname'; // default string → string +case RESTYPE = 'restype'; // validates via ContextResType::tryFrom() + +public function marshall(mixed $value): ?string +{ + return match ($this) { + self::SIZE_RESTRICTION => ((int)$value > 0) ? (string)(int)$value : null, + self::RESTYPE => ContextResType::tryFrom($value) !== null ? (string)$value : null, + default => (string)$value, + }; +} +``` + +**Behavior**: Invalid `restype` values (e.g. `x-title`, `x-li`) are silently rejected by `marshall()` returning `null` → +mapper skips them. No error thrown, no invalid data stored. + +### 10.5 Cross-Validation Note + +No cross-validation between `resname` and `restype` at storage time. If `restype` is present but `resname` is missing ( +or vice versa), both are stored independently. The consumer (frontend) is responsible for checking that both are present +before attempting a lookup strategy — missing either = graceful fallback to text matching. + +### 10.6 XLIFF Parser Evidence + +``` +// XliffParserV1::extractTransUnitMetadata() +// Already extracts: $xliff['files'][$i]['trans-units'][$j]['attr'] +// Includes ALL attributes: id, resname, restype, maxwidth, size-unit, etc. +// No parser changes needed. +``` + +### 10.7 Updated Allowed Metadata Keys (after implementation) + +| Enum Case | DB Value (`meta_key`) | Marshall | Unmarshall | +| ------------------ | --------------------- | ----------------------------- | --------------------- | +| `ID_REQUEST` | `id_request` | `string → string` | `string → string` | +| `ID_CONTENT` | `id_content` | `string → string` | `string → string` | +| `ID_ORDER` | `id_order` | `string → string` | `string → string` | +| `ID_ORDER_GROUP` | `id_order_group` | `string → string` | `string → string` | +| `SCREENSHOT` | `screenshot` | `string → string` | `string → string` | +| `SIZE_RESTRICTION` | `sizeRestriction` | `mixed → string` (cast) | `string → int` (cast) | +| `RESNAME` | `resname` | `string → string` | `string → string` | +| `RESTYPE` | `restype` | `string → string` (validated) | `string → string` | +| `X_CLIENT_NAME` | `x-client-name` | `string → string` | `string → string` | + +> `RESTYPE.marshall()` returns `null` for values not in `ContextResType` — mapper skips invalid entries. + +### 10.8 Frontend Status (updated 2026-04-03) + +> Reflects work done by Federico (riccio82) during March–April 2026. + +| Component | Status | Detail | +| ------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------- | +| `contextReviewUtils.js:tagSegments()` | ✅ 3-pass | (1) Metadata lookup via `findElementByMetadata()`, (2) position-based text match, (3) N:N broadcast for remaining | +| Segment message protocol | ✅ Extended | `{sid, source, target, context_url, resname, restype}` — all metadata fields included | +| `contextReviewLookup.js` | ✅ Implemented | 5-strategy dispatcher: `x-tag-id`, `x-css_class`, `x-path`, `x-attribute_name_value`, `x-client_nodepath` (stub) | +| XPath lookup | ✅ Done | `document.evaluate()` with `XPathResult.FIRST_ORDERED_NODE_TYPE` | +| ID lookup | ✅ Done | `querySelector('#' + CSS.escape(resname))` | +| CSS class lookup | ✅ Done | `querySelector('.' + CSS.escape(resname))` | +| Custom path (`x-client_nodepath`) | ⚠️ Stub | Returns `null` — falls through to text matching | +| Attribute pair lookup | ✅ Done | Parses `attr=value` format, queries `[attr="value"]` | +| Fallback chain | ✅ Done | Strategy-first → text match → broadcast (graceful degradation) | +| Cross-tab BroadcastChannel | ✅ Done | Singleton per project, 5 message types, bidirectional | +| `extractSegmentContextFields()` | ✅ Done | Extracts `context_url`, `resname`, `restype` from segment data | +| Screenshot display | ❌ Not started | Backend stores field, no frontend consumer | +| `id_content` / `id_order` rendering | ❌ Not started | Backend serves fields, no frontend consumer | +| Review workflow states | ❌ Not started | No state machine or status transitions | + +--- + +## 11. Context URL — Architecture & Design + +### 11.1 Problem Statement + +When a user wants in-context review, the system needs a URL to fetch the context HTML file. Three real-world scenarios +exist: + +| Scenario | Granularity | Example | +| ------------------------------------------------ | ----------- | ------------------------------------------------------------------ | +| Different segments refer to different HTML pages | Per-segment | An XLIFF where each trans-unit has its own `context-url` attribute | +| Each XLIFF file refers to a different HTML page | Per-file | Two XLIFF files, each translating a different web page | +| All segments in a project share the same context | Per-project | One XLIFF, one HTML context page | + +### 11.2 Storage: Three-Level Metadata + +The `context-url` key is stored at all three metadata levels: + +| Level | Table | DAO | Key | +| ----------- | ------------------ | ---------------------- | ------------- | +| **Segment** | `segment_metadata` | `SegmentMetadataDao` | `context-url` | +| **File** | `file_metadata` | `Files\MetadataDao` | `context-url` | +| **Project** | `project_metadata` | `Projects\MetadataDao` | `context-url` | + +> **Naming convention**: hyphenated (`context-url`) to align with XLIFF attribute conventions (`x-path`, `x-tag-id`, +> `x-css_class`). + +### 11.3 Dual Ingestion Paths + +`context-url` can enter the system from two directions: + +| Source | Segment level | File level | Project level | +| ------------------------------ | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | +| **XLIFF trans-unit attribute** | ✅ Extracted via `SegmentMetadataMarshaller` pipeline | ⚠️ Future — XLIFF parser does not yet extract `` attributes, but `FilesMetadataMarshaller` is designed ready for it. Test XLIFF files include a second `` with `context-url` attribute for when parser support lands. | ❌ No XLIFF source | +| **API (user-submitted)** | ✅ API 1 | ✅ API 2 | ✅ API 3 | + +### 11.4 Fallback Resolution (read-time) + +When the GetSegments API returns segment data, `context-url` is resolved with this priority: + +``` +1. segment_metadata (most specific — per-segment context) +2. file_metadata (mid-level — per-file context) +3. project_metadata (broadest — project-wide context) +``` + +Resolution happens at **read time**, not write time. No data duplication. If the project-level URL changes via API, all +segments without their own context-url immediately inherit the new value. + +**Performance**: project-level and file-level context-urls are fetched **once** before the segment loop. Per-segment +check is a `Collection::find()` on the already-loaded collection — no extra query. + +### 11.5 FilesMetadataMarshaller — Design Decision + +**Current state**: `Files\MetadataDao` has NO marshaller. Values stored/retrieved as raw strings. Existing keys: +`instructions`, `mtc:instructions` (legacy), `pdfAnalysis` (JSON). + +**Decision**: Create `FilesMetadataMarshaller` using **Pattern B** (full pipeline, same as `SegmentMetadataMarshaller`): + +| Method | Purpose | +| ------------------------------------------- | --------------------------------------------------------------------- | +| `isAllowed(string $key): bool` | Whitelist gate — ready for future XLIFF `` attribute extraction | +| `marshall(mixed $value): ?string` | Write validation — returns `null` to reject invalid values | +| `unmarshall(MetadataStruct $struct): mixed` | Read-time type restoration | + +**Rationale**: Although the XLIFF parser does not yet extract ``-element attributes, future versions will. +Designing with full pipeline now avoids retrofitting later. Consistent interface across all three marshallers. + +**Initial cases**: + +| Enum Case | DB Value (`key`) | Marshall | Unmarshall | +| -------------- | ---------------- | ------------------------ | ------------------------------ | +| `INSTRUCTIONS` | `instructions` | `string → string` | `string → string` | +| `PDF_ANALYSIS` | `pdfAnalysis` | `string → string` (JSON) | `string → array` (json_decode) | +| `CONTEXT_URL` | `context-url` | `string → string` (URL) | `string → string` | + +### 11.6 Three APIs + +| API | Input | Stores in | Notes | +| ------------------- | -------------------------------------------------------------------------- | ------------------ | ---------------------------------- | +| **API 1** (segment) | `context_url`, `segment_id`, `file_id` (optional), `project_id` (optional) | `segment_metadata` | Most specific override | +| **API 2** (file) | `context_url`, `file_id`, `project_id` (optional) | `file_metadata` | Applies to all segments in file | +| **API 3** (project) | `context_url`, `project_id` | `project_metadata` | Broadest — all segments in project | + +### 11.7 Deep Analysis — Files\MetadataDao Consumer Impact + +> Based on deep analysis of all `Files\MetadataDao` consumers and `pdfAnalysis` data flow (2 parallel explore agents). + +#### Read Path Consumers + +| Consumer | Method | Usage | Impact | +| -------------------------- | ---------------------------- | ------------------------------------ | ------------------------------------------------------------ | +| `FilesInfoUtility:56-64` | `getByJobIdProjectAndIdFile` | `$metadata[$key] = $value` | ✅ Safe — direct assignment works with both string and array | +| `AbstractStatus:223` | `getByJobIdProjectAndIdFile` | Passes to `AnalysisFile` constructor | ✅ Safe — wraps key/value pairs | +| `MetaDataController:122` | `getByJobIdProjectAndIdFile` | `$stdClass->$key = $value` | ✅ Safe — direct property assignment | +| `FilesInfoUtility:114-124` | `get` | Returns instructions `.value` | ✅ Safe — instructions stay string | +| `FilesInfoUtility:141-144` | `get` + `insert`/`update` | Instructions CRUD | ✅ Safe — instructions stay string | + +#### Write Path (not affected by unmarshalling) + +| Consumer | Method | Key | Value Format | +| -------------------------- | ------------ | ----------------------- | ----------------------------------- | +| `SegmentExtractor:257` | `insert` | `mtc:references` | Raw string | +| `SegmentExtractor:265` | `insert` | `data-type` | Raw string | +| `FileInsertionService:327` | `insert` | `pdfAnalysis` | `json_encode($array)` → JSON string | +| `ProjectManager:1007` | `insert` | `instructions` | Raw string | +| `FilesInfoUtility:144` | `insert` | `instructions` | Raw string | +| `SegmentExtractor:282` | `bulkInsert` | XLIFF custom attributes | Raw strings | + +#### pdfAnalysis Data Flow + +``` +ConversionHandler → array → ConvertedFileModel → Redis (serialized) + → FileInsertionService → json_encode($array) → DB (JSON string) + → MetadataDao::get() → MetadataStruct (raw JSON string) + → FilesInfoUtility / MetaDataController → API response (string in JSON body) +``` + +**After unmarshalling**: `MetadataDao::get()` returns decoded array. All consumers do direct assignment ( +`$metadata[$key] = $value`), so `response->json()` handles arrays correctly. **Zero frontend JS references +to `pdfAnalysis`** — safe to change. + +#### Conclusion + +**No breaking changes.** All read-path consumers use direct assignment, which works with both string and mixed types. No +PHP code calls `json_decode()` on Files metadata values (unlike Projects `MMT.php:129` which is a different DAO). The +change is fully backward-compatible. + +### 11.8 PSR-1 Method Naming Normalization + +`SegmentMetadataMarshaller::unmarshall()` violates PSR-1 §4.3 ("Method names MUST be declared in camelCase"). Must +rename to `unMarshall()` to match `ProjectsMetadataMarshaller::unMarshall()` and `JobsMetadataMarshaller::unMarshall()`. + +**Files affected:** + +| File | Change | +| ------------------------------------------------------------- | ----------------------------------------------- | +| `lib/Model/Segments/SegmentMetadataMarshaller.php` | Method definition: `unmarshall` → `unMarshall` | +| `lib/Model/Segments/SegmentMetadataCollection.php` | 2 call sites: `findTyped()` + `jsonSerialize()` | +| `tests/unit/Model/Segments/SegmentMetadataMarshallerTest.php` | 5 test calls + 1 comment | + +### 11.9 GetSegmentsController Change (implemented) + +**Pre-fetch (before segment loop):** + +```php +$projectContextUrl = $projectMetadata->setCacheTTL(60 * 60 * 24)->get( + $project->id, ProjectsMetadataMarshaller::CONTEXT_URL->value +)?->value; +$filesMetadataDao = new FilesMetadataDao(); +$fileContextUrls = []; +``` + +**Per-file lookup (inside `!isset($res[$id_file])` block):** + +```php +$fileContextUrls[$id_file] = $filesMetadataDao->setCacheTTL(60 * 60 * 24)->get( + $project->id, $id_file, FilesMetadataMarshaller::CONTEXT_URL->value +)?->value; +``` + +**Per-segment resolution (replaced old line 158):** + +```php +$segmentMetadata = SegmentMetadataDao::getAll($seg['sid']); +$seg['metadata'] = $segmentMetadata->jsonSerialize(); +$seg['context_url'] = ContextUrlResolver::resolve( + $segmentMetadata, $fileContextUrls[$id_file] ?? null, $projectContextUrl +); +``` + +The resolved `context-url` is returned as a **top-level field** per segment (not nested in metadata), since it may come +from file or project level rather than segment metadata. + +### 11.10 ContextUrlController (implemented) + +Three POST endpoints under `/api/v3/context-url/`: + +| Route | Action | DAO Method | Cache Invalidation | +| --------------- | ----------------- | ------------------------------------- | --------------------------------------- | +| `POST /project` | `setForProject()` | `ProjectsMetadataDao::set()` | Internal (DAO handles it) | +| `POST /file` | `setForFile()` | `FilesMetadataDao::get/insert/update` | `destroyCacheByJobIdProjectAndIdFile()` | +| `POST /segment` | `setForSegment()` | `SegmentMetadataDao::upsert()` | `destroyGetAllCache()` | + +All endpoints require `LoginValidator` authentication. Segment-level validates through +`SegmentMetadataMarshaller::CONTEXT_URL->marshall()`. Project/file levels store raw strings (Pattern A marshallers — no +`marshall()` method). + +### 11.11 Schema Migration (implemented) + +`segment_metadata` table index `idx_id_segment_meta_key(id_segment, meta_key)` upgraded from `KEY` to `UNIQUE KEY` in: + +- `lib/Model/matecat.sql` +- `INSTALL/matecat.sql` +- `tests/inc/unittest_matecat_local.sql` + +Runtime migration: `migrations/20260326190000_alter_table_segment_metadata_add_unique_index.php` (user-created). + +### 11.12 Cache Management Architecture Document (added 2026-03-27) + +`docs/cache-management-architecture.md` — standalone technical reference covering `DaoCacheTrait` (all 8 methods), +`AbstractDao` cache integration (`_fetchObjectMap`, `_destroyObjectCache`), the three invalidation strategies (surgical +reverse-lookup, nuclear direct delete, surgical field removal), the `Pager`/`getAllPaginated` pagination pattern with +`PaginationParameters`, and `SessionTokenStoreHandler` as the sole non-DAO consumer of the trait. + +### 11.13 Test Resources — In-Context Review (added 2026-04-03) + +All in-context review test files are organized under `tests/resources/files/in-context-review/`: + +| File | Purpose | +| ---------------------------------------- | ---------------------------------------------------------------- | +| `test-context-mapping.xlf` | XLIFF 1.2 — all 5 restype strategies + `x-client-name` (2 files) | +| `test-context-mapping-2.0.xlf` | XLIFF 2.0 — same content with `matecat:` namespace (2 files) | +| `test-context-mapping.html` | Context HTML for file 1 (`sample-document.html`) | +| `test-context-mapping-product-page.html` | Context HTML for file 2 (`product-page.html`) | + +**Second `` section** (t13–t18) exercises: + +- **File-level `context-url`** — prepares for future `` attribute extraction (§11.3) +- **`screenshot` attribute** on t18 — segment-level metadata the backend stores but frontend does not consume yet +- **`x-path`**, **`x-tag-id`**, **`x-css_class`** strategies against a product page DOM + +### 11.14 Integration Tests — In-Context Review (added 2026-04-03) + +Two test classes in `tests/unit/Model/Segments/InContextReview/`: + +| Class | What it verifies | +| -------------------------------- | -------------------------------------------------------------------------------------------------- | +| `XliffToMetadataIntegrationTest` | Full pipeline: XLIFF bytes → `XliffParser` → `SegmentMetadataMapper` → `SegmentMetadataCollection` | +| `XPathResolutionContractTest` | Every `restype="x-path"` trans-unit resolves against its context HTML and matches the XLIFF source | + +**XliffToMetadataIntegrationTest** (14 tests): + +- XLIFF 1.2 and 2.0 produce identical metadata after namespace stripping +- Multi-file XLIFF parsed correctly (12 + 6 trans-units) +- Every trans-unit has `resname` and `restype` +- All 5 restype strategies pass through the marshaller +- `x-client-name` extracted alongside `x-client_nodepath` +- `screenshot` attribute extracted on t18 +- Non-metadata attributes (`id`, `xml:lang`, `approved`) filtered out + +**XPathResolutionContractTest** (11 tests): + +- Data provider dynamically extracts all `x-path` trans-units from the XLIFF 1.2 fixture +- Each XPath is evaluated via `DOMXPath` against the corresponding context HTML file +- Attribute-targeting XPaths (`/@alt`, `/@title`, `/@placeholder`) resolve `DOMAttr::nodeValue` +- Element-targeting XPaths resolve `DOMElement::textContent` +- XML entity normalization (`©` → `©`) via `html_entity_decode` for semantic comparison +- Coverage guard: asserts the provider covers every `x-path` trans-unit in the fixture diff --git a/docs/Technical Specification_ Mapping Between Contextual Markup and Translatable Strings.md b/docs/Technical Specification_ Mapping Between Contextual Markup and Translatable Strings.md new file mode 100644 index 0000000000..d0dc9e952d --- /dev/null +++ b/docs/Technical Specification_ Mapping Between Contextual Markup and Translatable Strings.md @@ -0,0 +1,361 @@ +# **Technical Specification: Mapping Between Contextual Markup and Translatable Strings** + +## Table of Contents + +1. [Terms and Definitions](#terms-and-definitions) +2. [Key Principles](#key-principles) + - [Requirements for `nodePath`](#requirements-for-nodepath) + - [Resource Type (`restype`) Reference](#resource-type-restype-reference) + - [Algorithm Factory for Custom Node Paths](#algorithm-factory-for-custom-node-paths) +3. [File Formats](#file-formats) + - [XLIFF Format (Recommended)](#xliff-format-recommended) + - [Extending the Namespace in XLIFF 2.0](#extending-the-namespace-in-xliff-20) + - [JSON Format](#json-format) +4. [Context File (HTML/XHTML)](#context-file-htmlxhtml) + - [HTML Correspondence Example](#html-correspondence-example) + - [Selecting an Attribute with XPath](#selecting-an-attribute-with-xpath) +5. [Connector/Filter Behavior](#connectorfilter-behavior) +6. [Operational Checklist](#operational-checklist) + +--- + +This document defines the technical requirements to ensure a functional and reversible mapping between a context DOM/markup and the strings submitted for translation. The goal is to ensure that every translatable segment can be unambiguously traced back to its origin in the context document. + +## **Terms and Definitions** + +- **nodePath**: A unique identifier (preferably XPath) that locates a leaf node in the markup. +- **Leaf Node**: A leaf node in the markup tree that contains the translatable string. +- **Trans-unit**: A unit of translation, especially in XLIFF format. +- **Filter/Connector**: A software component that extracts, prepares, and reintegrates translatable content to and from the original format. +- **Algorithm Factory**: A Matecat-side dispatcher that, given a factory key, instantiates the registered path interpreter responsible for parsing a custom `nodePath` string of type `x-client_nodepath`. +- **Factory Key / Client Name**: The short, stable identifier passed via `x-client-name` (XLIFF 1.2) or `matecat:x-client-name` (XLIFF 2.0) that selects the correct algorithm in the Algorithm Factory. Must be previously agreed upon with Matecat. + +## **Key Principles** + +1) **Unique Identification**: Every string submitted for translation must have a `nodePath` that uniquely identifies it within the context document. As an alternative, the string submitted for translation can be uniquely identified by an ID, a CSS class, or any other *unique* attribute. +2) **Reversibility**: The mapping must be reversible to allow the automatic reintegration of the translation in the correct position. Two reversibility models are supported: + 1) **Path-based reversibility**: The connector provides a nodePath (e.g., XPath or a custom path algorithm). Matecat uses this path to locate the corresponding node in the context HTML file without requiring any modification to the HTML markup itself. + 2) **Identifier-based reversibility**: The connector provides an identifier (e.g., `id`, CSS class, or custom attribute value). In this case, the corresponding identifier **must be present as an attribute on the target HTML node** (e.g., `id="node_id"`, `class="unique-class"`, `data-custom-id="xyz-123"`). Matecat will use this attribute to locate the node directly. +3) **Metadata Preservation**: The `nodePath` must be treated as metadata and preserved throughout the entire translation cycle. +4) **Consistency**: The context document and the `nodePath` values must be consistent and derived from the same state of the content. + +### **Requirements for `nodePath`** + +- **Mandatory**: Every translatable string must have an associated `nodePath`. +- **Uniqueness**: The `nodePath` must be unique within the scope of the file. +- **Standard**: The use of **XPath** is recommended. If an alternative format is used, formal and reversible documentation of the generation algorithm must be provided. +- **Target**: The `nodePath` must always point to a **leaf node**, not to intermediate nodes. + +### **Resource Type (`restype`) Reference** + +The `restype` attribute (or `matecat:restype` in XLIFF 2.0) defines the method used to identify the resource or node in the context document. The possible values are described below: + +- **`x-path`**: + + - **Description**: The `resname` (or `matecat:resname` in XLIFF 2.0) value contains an XPath expression that uniquely points to the leaf node or attribute in the context document. + - **Example**: `resname="/html/body/div[2]/p[1]"` + - **Notes**: This is the most powerful and standard method. + + +- **`x-client_nodepath`**: + + - **Description**: Indicates that the `resname` contains an identifier generated by a custom, non-standard algorithm that has been previously agreed upon with Matecat. + - **Example**: `resname="html.body.div_2.p_1"` + - **Notes**: Requires the `x-client-name` attribute (XLIFF 1.2) or `matecat:x-client-name` (XLIFF 2.0) to be + present on the same `` / `` element. Matecat uses this value as a factory key to load + the correct path interpreter. See [Algorithm Factory for Custom Node Paths](#algorithm-factory-for-custom-node-paths). + + +- **`x-tag-id`**: + + - **Description**: The `resname` contains the unique ID of an HTML element. Corresponds to locating an element via its `id` attribute. + - **Example**: `resname="node_id"` (corresponds to `id="node_id"` in the HTML). + - **Notes**: This is a very robust method, as IDs should be unique by definition. + + +- **`x-css_class`**: + + - **Description**: The `resname` contains a CSS class name that uniquely identifies the element. + - **Example**: `resname="unique-class"` (corresponds to `class="unique-class"`). + - **Notes**: Only works reliably if the class is used by a single element in the document; otherwise identification is not unique. + + +- **`x-attribute_name_value`**: + + - **Description**: The `resname` contains a `name=value` pair that identifies an attribute and its value. + - **Example**: `resname="data-custom-id=xyz-123"` (corresponds to `
...
`). + - **Notes**: Useful for custom attributes (`data-*`) or other attributes that guarantee uniqueness. + +### **Algorithm Factory for Custom Node Paths** + +When `restype="x-client_nodepath"` is used, Matecat cannot infer which parsing algorithm to apply from +the path string alone. A dedicated **client-name** attribute MUST therefore be present on the same +`` (XLIFF 1.2) or `` (XLIFF 2.0) element. Matecat uses this value as a **factory key** +to instantiate the correct path interpreter at processing time. + +| Format | Required attribute | Trigger condition | +|-----------|-------------------------|-------------------------------------------------| +| XLIFF 1.2 | `x-client-name` | `restype="x-client_nodepath"` | +| XLIFF 2.0 | `matecat:x-client-name` | `matecat:restype="x-client_nodepath"` | + +The value is a short, stable identifier (e.g. `"dot-notation"`, `"acme-crm"`) previously agreed upon +with Matecat that uniquely names the algorithm used to parse the custom path string. + +**XLIFF 1.2:** + +```xml + + Text in the second div, first paragraph. + +``` + +**XLIFF 2.0:** + +```xml + + + Text in the second div, first paragraph. + + +``` + +## **File Formats** + +### **XLIFF Format (Recommended)** + +Every trans-unit (or unit in XLIFF 2.0) must include an attribute containing the nodePath. +For XLIFF 2.0, the specification does not allow adding custom attributes by prefixing them with `x-*`; you must explicitly declare a namespace in the XML and use that namespace in the attribute name. + +- **XLIFF 1.2**: + +```xml + + + + + + + + + + + + + + + +``` + +- **XLIFF 2.0**: + +```xml + +.... + + + + + + + + + + + + + + + + +``` + +### **Extending the Namespace in XLIFF 2.0** + +The XLIFF 2.0 specification does not permit adding vendor-specific attributes with a bare `x-` prefix; +every extension attribute **must** belong to a declared XML namespace. + +#### **The Matecat namespace** + +Matecat provides its own namespace for all extension attributes: + +```xml +xmlns:matecat="https://www.matecat.com" +``` + +Declare it on the root `` element alongside the standard XLIFF namespace: + +```xml + +``` + +All Matecat-specific attributes (`matecat:resname`, `matecat:restype`, `matecat:x-client-name`) are +scoped to this namespace and are guaranteed not to conflict with other extensions. + +#### **Adding a connector-specific namespace** + +A connector may declare its own namespace alongside the Matecat namespace to carry proprietary metadata. +The pattern is identical — choose a unique URI and a unique prefix: + +```xml + + + + + Informational text. + + + +``` + +**Rules:** + +- Each namespace MUST use a unique URI and a unique prefix. +- The Matecat namespace URI (`https://www.matecat.com`) and prefix (`matecat`) MUST NOT be reused by + third-party connectors for attributes unrelated to Matecat. +- Every custom namespace MUST be documented in the connector's technical specification. + +### **JSON Format** + +For every key containing translatable text, a corresponding key for the `nodePath` must exist, preferably at the same hierarchical level. + +```json +{ + "source": "Welcome", + "source_path": "/html/body/h1", + "path_type": "x-path" +} +``` + +The `path_type` field accepts one of the following values: + +| Value | Equivalent XLIFF `restype` | Description | +|--------------------------|----------------------------------|--------------------------------------------------| +| `x-path` | `x-path` | XPath expression to a leaf node or attribute | +| `x-client_nodepath` | `x-client_nodepath` | Custom path algorithm (requires `path_algorithm`)| +| `x-tag-id` | `x-tag-id` | HTML element `id` attribute value | +| `x-css_class` | `x-css_class` | Unique CSS class name | +| `x-attribute_name_value` | `x-attribute_name_value` | `name=value` attribute pair | + +When `path_type` is `x-client_nodepath`, a `path_algorithm` key **MUST** also be present at the same +level to identify the factory key for the path interpreter (equivalent to `x-client-name` in XLIFF 1.2 +and `matecat:x-client-name` in XLIFF 2.0): + +```json +{ + "source": "Text in the second div, first paragraph.", + "source_path": "html.body.div_3.p_1", + "path_type": "x-client_nodepath", + "path_algorithm": "dot-notation" +} +``` + +If the JSON file must contain both the source and target language, the connector should structure it to clearly distinguish between the two, for example by replicating the source structure under a `"target"` key. + +## **Context File (HTML/XHTML)** + +The context file provided must be the exact version of the DOM against which the `nodePath` values were calculated. If custom identifiers are used instead of XPath, these must also be present in the markup of the context file to allow the engine to locate the corresponding section. + +### **HTML Correspondence Example** + +Below is an example HTML document illustrating the correspondence between the `nodePath` values used in the XLIFF examples and the actual elements in the markup. + +```html + + + + + Sample Document + + +

Title

+ + +
+

Informational text.

+
+ +
+

Paragraph in the first div.

+
+ + +
+

Text in the second div, first paragraph.

+ + + Text identified by an ID. + + +

This paragraph is identified by a unique CSS class.

+ + +
Content identified by a custom attribute.
+
+ + +``` + +### **Selecting an Attribute with XPath** + +Sometimes the text to translate is not the content of a node, but the value of an attribute (such as `title`, `alt`, `placeholder`). To point to a specific attribute, the `@` symbol is used. + +**Example HTML:** + +```html + + +``` + +**XPath examples for attributes:** + +1. **Select an element via its attribute:** + + - `//img[@id='logo']` + - **Description**: Selects the `` element that has the `id` attribute equal to `'logo'`. + + + +2. **Extract the value of an attribute:** + + - `//img[@id='logo']/@alt` + - **Description**: Locates the `` element with `id='logo'` and then selects its `alt` attribute directly. The result of this XPath is the string `"Company Logo"`. + - `//input/@placeholder` + - **Description**: Selects the `placeholder` attribute of the first `` element found in the document. The result is the string `"Search the site..."`. + +## **Connector/Filter Behavior** + +- **Extraction**: The filter must read the `nodePath` values from the input files (XLIFF or JSON) and associate them as metadata with each segment sent to the translation system. +- **Reintegration**: Upon return of the translation, the connector must use the `nodePath` to reinsert the translated text in the correct position. +- **Validation (Recommended)**: + - Verify the presence and uniqueness of the `nodePath` for each segment. + - Check that the `nodePath` points to a leaf node. + - Validate XPath syntax, if used. + +## **Operational Checklist** + +1. **Document algorithms**: If XPath is not used, provide detailed documentation of the path generation algorithm. +2. **Verify consistency**: Ensure that `nodePath` values are always aligned with the provided context document. +3. **Register the factory key**: When `x-client_nodepath` is used, ensure that the `x-client-name` value is + documented and registered with Matecat before processing. Verify that the attribute is present on every + `` / `` (XLIFF) or every object with `"path_type": "x-client_nodepath"` (JSON) that + uses this restype. + diff --git a/docs/featureset-hooks-changelog.md b/docs/featureset-hooks-changelog.md new file mode 100644 index 0000000000..b4cc7ec29b --- /dev/null +++ b/docs/featureset-hooks-changelog.md @@ -0,0 +1,295 @@ +# FeatureSet Hooks — What Changed + +> **Date:** 2026-04-08 | **Branch:** `context-review` | **Author:** Domenico Lupinetti + +--- + +## TL;DR + +- **20 unused hooks removed** — they had zero handler implementations across all plugins +- **5 hooks renamed** from `snake_case` to `camelCase` +- All remaining **44 hooks are now camelCase** +- **5 vendor SubFiltering hooks** (`fromLayer*`) are unchanged + +--- + +## Removed Hooks (20) + +These hooks were dispatched but **no plugin ever handled them**. The dispatch calls and `@method` annotations have been +deleted. + +**Filter hooks removed (12):** + +`filterCreationStatus`, `overrideConversionResult`, `filterGlobalWarnings`, `filterSegmentWarnings`, +`filterSetTranslationResult`, `prepareAllNotes`, `processExtractedJsonNotes`, `filterIsChunkCompletionUndoable`, +`doNotManageAlternativeTranslations`, `filter_team_for_project_creation`, `filterProjectDependencies`, +`filterFeaturesMerged` + +**Run hooks removed (8):** + +`project_password_changed`, `processZIPDownloadPreview`, `checkSplitAccess`, `afterTMAnalysisCloseProject`, +`fastAnalysisComplete`, `bootstrapCompleted`, `postProjectCommit`, `handleTUContextGroups` + +### If you had a handler for any of these + +You don't — we verified across uber, airbnb, translated, aligner, and all internal features. If you see a method with +one of these names in your code, it's dead code — delete it. + +--- + +## Renamed Hooks (5) + +| Old Name (snsake_case) | New Name (camelCase) | +| ---------------------------------------- | ----------------------------------- | +| `filter_job_password_to_review_password` | `filterJobPasswordToReviewPassword` | +| `job_password_changed` | `jobPasswordChanged` | +| `review_password_changed` | `reviewPasswordChanged` | +| `project_completion_event_saved` | `projectCompletionEventSaved` | +| `alter_chunk_review_struct` | `alterChunkReviewStruct` | + +### What to do + +Rename your handler method to match. Example: + +```php +// Before: +public function job_password_changed(JobStruct $job, string $oldPassword): void + +// After: +public function jobPasswordChanged(JobStruct $job, string $oldPassword): void +``` + +Already done in: `AbstractRevisionFeature`, `ProjectCompletion`, dispatch sites in `ChangePasswordController`, +`TranslatorsModel`, `CompletionEventController`, `EventModel`, `ProjectCompletionStatusModel`. + +--- + +## Remaining Active Hooks (44) + +All hooks listed in `FeatureSet.php` `@method` annotations are active and have at least one handler. Full list: + +**Filter (29):** `isAnInternalUser`, `outsourceAvailableInfo`, `projectUrls`, `filterCreateProjectFeatures`, +`encodeInstructions`, `decodeInstructions`, `filterActivityLogEntry`, `filterContributionStructOnSetTranslation`, +`filterContributionStructOnMTSet`, `filterGetSegmentsResult`, `prepareNotesForRendering`, +`filterJobPasswordToReviewPassword`, `filterRevisionChangeNotificationList`, `filterMyMemoryGetParameters`, +`characterLengthCount`, `injectExcludedTagsInQa`, `checkTagMismatch`, `checkTagPositions`, +`analysisBeforeMTGetContribution`, `filterPayableRates`, `wordCount`, `populatePreTranslations`, +`sanitizeOriginalDataMap`, `correctTagErrors`, `appendFieldToAnalysisObject`, `handleJsonNotesBeforeInsert`, +`rewriteContributionContexts`, `appendInitialTemplateVars`, `fromLayer0ToLayer1` (vendor) + +**Run (15):** `setTranslationCommitted`, `postAddSegmentTranslation`, `chunkReviewUpdated`, `jobPasswordChanged`, +`reviewPasswordChanged`, `projectCompletionEventSaved`, `tmAnalysisDisabled`, `postJobSplitted`, `postJobMerged`, +`validateJobCreation`, `validateProjectCreation`, `beforeProjectCreation`, `postProjectCreate`, +`filterProjectNameModified`, `alterChunkReviewStruct` + +--- + +## Real Examples From the Codebase + +**Filter hook — call site** (`JobCreationService.php`): + +```php +// Before: +$rates = $this->featureSet->filter('filterPayableRates', $rates, $source, $target); + +// After: +$event = $this->featureSet->dispatchFilter(new FilterPayableRatesEvent($rates, $source, $target)); +$rates = $event->getRates(); +``` + +**Filter hook — handler** (`Uber.php`): + +```php +// Before: +public function filterPayableRates(array $rates, string $source, string $target): array { + $rates['key'] = 'modified'; + return $rates; +} + +// After: +public function filterPayableRates(FilterPayableRatesEvent $event): void { + $rates = $event->getRates(); + $rates['key'] = 'modified'; + $event->setRates($rates); +} +``` + +**Run hook — call site** (`ChangePasswordController.php`): + +```php +// Before: +$this->featureSet->run('jobPasswordChanged', $jStruct, $actual_pwd); + +// After: +$this->featureSet->dispatchRun(new JobPasswordChangedEvent($jStruct, $actual_pwd)); +``` + +**Run hook — handler** (`AbstractRevisionFeature.php`): + +```php +// Before: +public function jobPasswordChanged(JobStruct $job, string $old_password): void { ... } + +// After: +public function jobPasswordChanged(JobPasswordChangedEvent $event): void { + $job = $event->job; + $old_password = $event->oldPassword; + ... +} +``` + +--- + +## How to Create a New Hook + +New hooks use **typed Event DTOs**. Follow this process: + +### 1. Create the event class + +Pick the right base class: + +- **`FilterEvent`** — handler transforms data (mutable subject) +- **`RunEvent`** — handler performs side effects (fire-and-forget) + +Add `@see` pointing to where the hook is dispatched — this enables **one-click IDE navigation** from the event to its caller(s). + +```php +data; } + public function setData(array $data): void { $this->data = $data; } + public function getContext(): string { return $this->context; } +} +``` + +For run hooks — same pattern, readonly properties only: + +```php +featureSet->dispatchFilter(new MyNewHookEvent($data, $context)); +$data = $event->getData(); // get the (possibly modified) result + +// Run — fire-and-forget: +$this->featureSet->dispatchRun(new SomethingHappenedEvent($entityId, 'created')); +``` + +### 3. Handle in your plugin + +Add a method on your `BaseFeature` subclass. Method name **must match `hookName()`**. + +```php +// plugins/uber/lib/Features/Uber.php +public function myNewHook(MyNewHookEvent $event): void +{ + $data = $event->getData(); + $data['extra'] = 'added by Uber'; + $event->setData($data); +} +``` + +### IDE Navigation + +Every event class has `@see` annotations pointing to its dispatch site(s). This gives you **full traceability** without searching: + +``` +Event class (@see) → Dispatch call site (Find Usages on Event) → Handler methods +``` + +- **From event → caller:** Ctrl+click the `@see` reference +- **From caller → handler:** "Find Usages" (Alt+F7) on the Event class → shows handler type-hints +- **From handler → caller:** "Find Usages" on the Event class in the parameter → shows `new Event(...)` at dispatch + +Real example from the codebase: + +```php +/** + * @see \Model\ProjectCreation\JobCreationService::getPayableRates() — dispatch site + */ +final class FilterPayableRatesEvent extends FilterEvent { ... } + +// JobCreationService.php — Ctrl+click @see lands here: +$event = $this->features->dispatchFilter(new FilterPayableRatesEvent($rates, $source, $target)); + +// Uber.php — "Find Usages" on FilterPayableRatesEvent shows this: +public function filterPayableRates(FilterPayableRatesEvent $event): void { ... } +``` + +### Rules + +| Rule | Details | +| ------------------------------ | ------------------------------------------------------------------------------------------------------------------ | +| **Naming** | camelCase only (PSR-1). `hookName()` return value = handler method name | +| **Filter events** | First constructor arg is the mutable subject (gets a setter). Remaining args are `readonly` context (getters only) | +| **Run events** | All constructor args are `readonly` | +| **Handler signature** | Single event parameter, `void` return. Mutate the event, don't return a value | +| **One event class = one hook** | No reuse of event classes across different hooks | +| **Event classes are `final`** | Don't extend concrete events | +| **Location** | `lib/Model/FeaturesBase/Hook/Event/Filter/` or `.../Run/` | + +### Checklist for a new hook + +- [ ] Event class created in the right directory +- [ ] `hookName()` returns camelCase name +- [ ] `@see` annotation points to dispatch call site(s) +- [ ] Dispatch call uses `dispatchFilter()` or `dispatchRun()` +- [ ] Handler method name matches `hookName()` exactly +- [ ] Handler accepts the event object as sole parameter, returns `void` +- [ ] PHPStan passes at level 8 + +### Legacy `filter()` / `run()` — Removed + +The string-based `filter('hookName', $arg)` and `run('hookName', $arg)` methods have been removed from FeatureSet. + +The `matecat/subfiltering` package (v4.0+) now uses 6 typed pipeline customization methods: + +``` +customizeFromLayer0ToLayer1(Pipeline): Pipeline +customizeFromLayer1ToLayer2(Pipeline): Pipeline +customizeFromLayer2ToLayer1(Pipeline): Pipeline +customizeFromRawXliffToLayer0(Pipeline): Pipeline +customizeFromLayer0ToRawXliff(Pipeline): Pipeline +customizeFromLayer1ToLayer0(Pipeline): Pipeline +``` + +These are implemented on FeatureSet by wrapping the internal event dispatch. Subfiltering is now a pure library — zero knowledge of the event system. + +MyMemory uses `matecat/subfiltering` v2.4+ (PHP 7.4 backport) with the same typed interface. diff --git a/docs/read-through-with-xfetch-early-recomputation.md b/docs/read-through-with-xfetch-early-recomputation.md new file mode 100644 index 0000000000..eb7fa48267 --- /dev/null +++ b/docs/read-through-with-xfetch-early-recomputation.md @@ -0,0 +1,891 @@ +# Read-Through with XFetch Early Recomputation + +> Hashset-based read-through cache with reverse-pointer O(1) invalidation and XFetch probabilistic early expiration to prevent cache stampede. + +| Property | Value | +|----------|-------| +| **Cache model** | Redis hashset per DAO method + parameter scope | +| **Read path** | Read-through — transparent population on miss via `_fetchObjectMap` | +| **Write path** | Cache-aside — explicit eviction via `_destroyObjectCache` / `_deleteCacheByKey` | +| **Invalidation** | O(1) via reverse pointer (`md5 → keyMap → DEL`) | +| **Stampede prevention** | XFetch probabilistic early expiration (Vattani et al., 2015) | +| **Consumers** | 47 DAO subclasses, Pager, SessionTokenStoreHandler | + +--- + +## Table of Contents + +1. [Introduction & Overview](#1-introduction--overview) +2. [DaoCacheTrait — The Foundation](#2-daocachetrait--the-foundation) +3. [AbstractDao — Cache Integration](#3-abstractdao--cache-integration) +4. [The Three Invalidation Strategies](#4-the-three-invalidation-strategies) +5. [Pager & getAllPaginated Pattern](#5-pager--getallpaginated-pattern) +6. [SessionTokenStoreHandler — Non-DAO Consumer](#6-sessiontokenstorehandler--non-dao-consumer) +7. [XFetch — Probabilistic Early Expiration](#7-xfetch--probabilistic-early-expiration) +8. [XFetch in Practice](#8-xfetch-in-practice) + +--- + +## 1. Introduction & Overview + +### What the cache layer does + +When a DAO method executes a SQL query, the result set is serialized and stored in Redis under a namespaced hashset key. On subsequent calls with identical parameters, the result is deserialized directly from Redis without touching the database. Each entry carries a TTL; invalidation is triggered explicitly by write operations. + +### Architecture + +``` +Controller / Service + │ + ▼ + DAO subclass + (e.g., Jobs\MetadataDao) + │ + ▼ + AbstractDao::_fetchObjectMap() + ├── auto-generates keyMap via debug_backtrace() + ├── builds query fingerprint: queryString + params + fetchClass + └── calls DaoCacheTrait methods + │ + ├── _getFromCacheMap(keyMap, fingerprint) ──► Redis HGET + │ │ + │ ├── XFetchEnvelope? ─► _shouldRecompute() + │ │ ├── YES → treat as miss (early recompute) + │ │ └── NO → return envelope.value + │ │ + │ └── raw array? → return as-is (backward compat) + │ + └── on miss: execute PDO, fetch rows [measures δ] + │ + └── _setInCacheMap(keyMap, fingerprint, result) + ├── XFetch active? → wrap in XFetchEnvelope(value, now, δ) + └── Redis HSET + EXPIRE + SETEX +``` + +``` +Invalidation path: + DAO write method (upsert/save/delete) + │ + ├── _destroyObjectCache(stmt, fetchClass, params) ← surgical + │ └── _deleteCacheByKey(md5, isReverseKeyMap=true) + │ └── GET md5 → keyMap → DEL keyMap + DEL md5 + │ + └── _deleteCacheByKey(keyMap, isReverseKeyMap=false) ← nuclear + └── DEL keyMap (direct) +``` + +### Three Consumers + +| Consumer | Class | Use Case | +|----------|-------|----------| +| **AbstractDao** | `abstract class AbstractDao uses DaoCacheTrait` | SQL query result caching — inherited by ~47 DAO subclasses | +| **Pager** | `class Pager uses DaoCacheTrait` | Paginated query caching — cache is opt-in, keyed explicitly | +| **SessionTokenStoreHandler** | `class SessionTokenStoreHandler uses DaoCacheTrait` | Login cookie token storage — no SQL, uses Redis hashset as a pure KV store | + +### Key Design Decisions + +- **Hashset-based storage**: All results for a given DAO method + parameter combination live inside one Redis hashset. This groups related cache entries under a single namespace, making it possible to invalidate all of them with a single `DEL`. +- **Reverse pointer**: Every stored entry creates a second Redis key (`md5` → `keyMap`), enabling surgical invalidation without knowing the keyMap name. +- **Auto-generated keyMaps**: `AbstractDao` uses `debug_backtrace()` to derive the keyMap name from the calling class and method. This eliminates manual keyMap management for the ~47 DAO subclasses. +- **Opt-in TTL**: Cache is disabled by default (`$cacheTTL = 0`). DAOs explicitly opt in via `setCacheTTL($seconds)` chained before read calls. +- **Probabilistic early expiration**: Each cache hit runs the XFetch algorithm to determine if the entry should be refreshed before its TTL expires, preventing cache stampede without coordination or distributed locks. + +--- + +## 2. DaoCacheTrait — The Foundation + +`lib/Model/DataAccess/DaoCacheTrait.php` + +The trait owns the Redis connection and all low-level cache operations. It is consumed by three classes: `AbstractDao`, `Pager`, and `SessionTokenStoreHandler`. + +### Properties + +```php +protected static ?Client $cache_con; // Shared Redis client (Predis) +protected int $cacheTTL = 0; // 0 = cache disabled +``` + +`$cache_con` is `static` — all instances of a given class share the same connection within a request. + +### Methods + +| # | Method | Visibility | Responsibility | +|---|--------|-----------|----------------| +| 1 | `_cacheSetConnection()` | protected | Lazy Redis connection init. Creates a `RedisHandler` and calls `getConnection()`. Sets `self::$cache_con`. On failure, sets it to `null` and re-throws. | +| 2 | `_logCache(string $type, string $key, mixed $value, string $sqlQuery)` | protected | Structured debug log to the `query_cache` channel. Can be overridden per consumer (see §6). | +| 3 | `_getFromCacheMap(string $keyMap, string $query)` | protected | **Read**: `HGET $keyMap md5($query)`. Deserializes via `unserialize()`. Returns `null` on miss or when cache is disabled (`$cacheTTL == 0`). Short-circuits immediately if `AppConfig::$SKIP_SQL_CACHE` is `true`. | +| 4 | `_setInCacheMap(string $keyMap, string $query, array $value)` | protected | **Write**: Performs THREE Redis operations (see below). No-ops if `$cacheTTL == 0`. | +| 5 | `setCacheTTL(?int $cacheSecondsTTL)` | public | Fluent TTL setter. Returns `$this` for method chaining. Respects `AppConfig::$SKIP_SQL_CACHE` — if the kill switch is on, the TTL is left at `0` (cache stays disabled). | +| 6 | `_serializeForCacheKey(array $params)` | protected | Casts ALL array values to `(string)` before calling `serialize()`. Ensures `1` and `"1"` produce the same cache key (type-safe determinism). | +| 7 | `_removeObjectCacheMapElement(string $keyMap, string $keyElementName)` | protected | **Surgical field removal**: `DEL md5($keyElementName)` (reverse pointer) + `HDEL $keyMap [md5($keyElementName)]` (one field from hashset). The only way to remove a single entry without destroying the entire hashset. | +| 8 | `_deleteCacheByKey(string $key, ?bool $isReverseKeyMap = true)` | protected | **Two modes**: `true` → reverse lookup (`GET $key` → find hashset → `DEL hashset + DEL $key`); `false` → nuclear (`DEL $key` directly). | + +### The Three Redis Operations in `_setInCacheMap` + +```php +protected function _setInCacheMap(string $keyMap, string $query, array $value) +{ + if ($this->cacheTTL == 0) { return null; } + + if (isset(self::$cache_con) && !empty(self::$cache_con)) { + $key = md5($query); + self::$cache_con->hset($keyMap, $key, serialize($value)); // ① store result + self::$cache_con->expire($keyMap, $this->cacheTTL); // ② refresh hashset TTL + self::$cache_con->setex($key, $this->cacheTTL, $keyMap); // ③ reverse pointer + } +} +``` + +**① `HSET $keyMap $md5 $serialized`** — stores the result inside the hashset under a deterministic field key. + +**② `EXPIRE $keyMap $ttl`** — keeps the hashset alive. Called on every write to reset the sliding window; the hashset outlives any single entry as long as reads keep coming. + +**③ `SETEX $md5 $ttl $keyMap`** — stores the reverse pointer: given `md5`, you can look up which hashset owns it. This is what `_deleteCacheByKey(md5, isReverseKeyMap=true)` uses to find and delete the parent hashset during surgical invalidation. + +### Redis Data Structure + +``` +Redis state after one cached query: + + Key: "Jobs\MetadataDao::getByIdJob-42:mt_engine" ← hashset (keyMap) + Type: hash + Fields: + "a1b2c3d4..." → serialized([MetadataStruct, ...]) + TTL: 86400 + + Key: "a1b2c3d4..." ← reverse pointer + Type: string + Value: "Jobs\MetadataDao::getByIdJob-42:mt_engine" + TTL: 86400 + +Lookup: + READ: HGET "Jobs\MetadataDao::..." "a1b2c3d4..." → unserialize → objects + WRITE: HSET + EXPIRE + SETEX (see above) + INVALIDATE: GET "a1b2c3d4..." → "Jobs\MetadataDao::..." → DEL that hashset + DEL "a1b2c3d4..." +``` + +### `_serializeForCacheKey` — Why String Casting Matters + +PHP's `serialize()` distinguishes types: `serialize([1])` and `serialize(["1"])` produce different strings. Bind parameters often originate from HTTP requests (strings) or domain code (integers); without normalization, equivalent queries would miss the cache depending on the call site's type. The string cast resolves this: + +```php +protected function _serializeForCacheKey(array $params): string +{ + foreach ($params as $key => $value) { + $params[$key] = (string)$value; // int 1 → string "1" + } + return serialize($params); +} +``` + +### `setCacheTTL` and the Kill Switch + +```php +public function setCacheTTL(?int $cacheSecondsTTL): static +{ + if (!AppConfig::$SKIP_SQL_CACHE) { + $this->cacheTTL = $cacheSecondsTTL ?? 0; + } + return $this; +} +``` + +`AppConfig::$SKIP_SQL_CACHE` is a global flag (typically set in test environments or under specific deployment conditions) that silently disables caching across the entire application. When set, `setCacheTTL()` is a no-op and `$cacheTTL` stays at `0`, which causes all `_getFromCacheMap` and `_setInCacheMap` calls to short-circuit. + +--- + +## 3. AbstractDao — Cache Integration + +`lib/Model/DataAccess/AbstractDao.php` + +`AbstractDao` is the base class for all DAO subclasses (~47 in `lib/`). It uses `DaoCacheTrait` and exposes two cache-related methods to subclasses: `_fetchObjectMap` (cache-through read) and `_destroyObjectCache` (surgical invalidation). + +### `_fetchObjectMap` — The Cache-Through Read + +```php +protected function _fetchObjectMap( + PDOStatement $stmt, + string $fetchClass, + array $bindParams, + string $keyMap = null +): array +``` + +**Step-by-step flow:** + +**Step 1 — Derive keyMap** (if not provided): + +```php +if (empty($keyMap)) { + $trace = debug_backtrace(!DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS, 2); + $keyMap = $trace[1]['class'] . "::" . $trace[1]['function'] . "-" . implode(":", $bindParams); +} +``` + +Frame `[1]` is the *calling* method (not `_fetchObjectMap` itself). So if `MetadataDao::getByIdJob(42, 'mt_engine')` calls `_fetchObjectMap`, the auto-generated keyMap is: + +``` +"Model\Jobs\MetadataDao::getByIdJob-42:mt_engine" +``` + +**Step 2 — Build fingerprint** for the HSET field: + +```php +$fingerprint = $stmt->queryString . $this->_serializeForCacheKey($bindParams) . $fetchClass; +``` + +This string uniquely identifies: which SQL template + which parameter values + which hydration class. + +**Step 3 — Cache check:** + +```php +$_cacheResult = $this->_getFromCacheMap($keyMap, $fingerprint); +if (!is_null($_cacheResult)) { + return $_cacheResult; // cache hit — return immediately +} +``` + +**Step 4 — On miss: execute and cache:** + +```php +$stmt->setFetchMode(PDO::FETCH_CLASS, $fetchClass); +$stmt->execute($bindParams); +$result = $stmt->fetchAll(); +$this->_setInCacheMap($keyMap, $fingerprint, $result); +return $result; +``` + +The result is an array of `$fetchClass` instances, stored in the hashset and returned. + +### `_destroyObjectCache` — Surgical Invalidation + +```php +protected function _destroyObjectCache(PDOStatement $stmt, string $fetchClass, array $bindParams): bool +{ + return $this->_deleteCacheByKey( + md5($stmt->queryString . $this->_serializeForCacheKey($bindParams) . $fetchClass) + ); +} +``` + +The caller **must** pass a `PDOStatement` (obtained via `$this->_getStatementForQuery($query)`). The method reconstructs the same fingerprint that `_fetchObjectMap` stored, takes its `md5`, and uses it as the reverse pointer key to find and delete the parent hashset. + +`_deleteCacheByKey` with `isReverseKeyMap=true` (the default): + +``` +GET md5 → keyMap name → DEL keyMap → DEL md5 +``` + +> **Important**: `_destroyObjectCache` deletes the **entire hashset**, not just one field. Every query variation cached under the same keyMap (e.g., all calls to `getByIdJob` for user `42`) is evicted together. This is correct because a write operation (e.g., `set()`) invalidates all read variants for that scope. + +### `_getStatementForQuery` — The Bridge + +```php +protected function _getStatementForQuery($query): PDOStatement +{ + $conn = Database::obtain()->getConnection(); + return $conn->prepare($query); +} +``` + +DAOs call this to convert a query string constant into a `PDOStatement` before passing it to `_fetchObjectMap` or `_destroyObjectCache`. This is the standard pattern throughout the codebase. + +### Gold Standard Example — `Jobs\MetadataDao` + +`lib/Model/Jobs/MetadataDao.php` demonstrates the full pattern cleanly: + +```php +class MetadataDao extends AbstractDao +{ + const string TABLE = 'job_metadata'; + + // Query constants — single source of truth for SQL strings + const string _query_metadata_by_job_id_key = + "SELECT * FROM job_metadata WHERE id_job = :id_job AND `key` = :key "; + + const string _query_metadata_by_job_password_key = + "SELECT * FROM job_metadata WHERE id_job = :id_job AND password = :password AND `key` = :key "; + + // Cache-through read + public function getByIdJob(int $id_job, string $key, int $ttl = 0): array + { + $stmt = $this->_getStatementForQuery(self::_query_metadata_by_job_id_key); + + return $this->setCacheTTL($ttl)->_fetchObjectMap($stmt, MetadataStruct::class, [ + 'id_job' => $id_job, + 'key' => $key, + ]); + } + + // Surgical invalidation — same stmt + params as the read + public function destroyCacheByJobId(int $id_job, string $key): bool + { + $stmt = $this->_getStatementForQuery(self::_query_metadata_by_job_id_key); + + return $this->_destroyObjectCache($stmt, MetadataStruct::class, [ + 'id_job' => $id_job, + 'key' => $key, + ]); + } + + // Write method — explicitly invalidates all affected caches + public function set(int $id_job, string $password, string $key, string $value): ?MetadataStruct + { + // ... execute INSERT ON DUPLICATE KEY UPDATE ... + + $this->destroyCacheByJobAndPassword($id_job, $password); + $this->destroyCacheByJobAndPasswordAndKey($id_job, $password, $key); + + return $this->get($id_job, $password, $key); + } +} +``` + +The pattern: +1. Declare query as a class constant. +2. In read methods: `_getStatementForQuery(self::_query_*)` → `setCacheTTL($ttl)` → `_fetchObjectMap(...)`. +3. In destroy methods: same `_getStatementForQuery(self::_query_*)` → `_destroyObjectCache(...)`. +4. Write methods call destroy methods explicitly before (or after) the write. + +--- + +## 4. The Three Invalidation Strategies + +### Comparison + +| # | Strategy | Method | Precision | When to Use | +|---|----------|--------|-----------|-------------| +| 1 | **Surgical reverse-lookup** | `_destroyObjectCache()` → `_deleteCacheByKey(md5, true)` | Deletes entire hashset via reverse pointer | Standard case: query string and bind params are known at invalidation time | +| 2 | **Nuclear direct delete** | `_deleteCacheByKey($keyMap, false)` | Deletes hashset by name directly | Dynamic SQL: query string cannot be reconstructed (e.g., variable-length IN clauses) | +| 3 | **Surgical field removal** | `_removeObjectCacheMapElement($keyMap, $fieldKey)` | Removes ONE field from hashset; leaves the rest intact | Per-entry invalidation in a shared hashset (non-DAO usage) | + +--- + +### Strategy 1: Surgical Reverse-Lookup + +**Used by**: All ~47 `AbstractDao` subclasses via `_destroyObjectCache`. + +**How it works**: + +``` +Call: _destroyObjectCache($stmt, MetadataStruct::class, ['id_job' => 42, 'key' => 'mt_engine']) + │ + ├── fingerprint = md5(queryString + serialize(["id_job"=>"42","key"=>"mt_engine"]) + "MetadataStruct") + │ = "a1b2c3d4..." + │ + └── _deleteCacheByKey("a1b2c3d4...", isReverseKeyMap=true) + │ + ├── GET "a1b2c3d4..." → "Jobs\MetadataDao::getByIdJob-42:mt_engine" + ├── DEL "Jobs\MetadataDao::getByIdJob-42:mt_engine" (hashset gone) + └── DEL "a1b2c3d4..." (reverse pointer gone) +``` + +**Example** (`Jobs\MetadataDao::destroyCacheByJobId`): + +```php +public function destroyCacheByJobId(int $id_job, string $key): bool +{ + $stmt = $this->_getStatementForQuery(self::_query_metadata_by_job_id_key); + return $this->_destroyObjectCache($stmt, MetadataStruct::class, [ + 'id_job' => $id_job, + 'key' => $key, + ]); +} +``` + +--- + +### Strategy 2: Nuclear Direct Delete + +**Used by**: DAOs with dynamic SQL that cannot be reconstructed for `_destroyObjectCache`. + +**Why surgical is impossible here**: + +`SegmentMetadataDao::getBySegmentIds` bakes segment IDs directly into the SQL string: + +```php +public static function getBySegmentIds(array $ids, string $key, int $ttl = 604800): array +{ + // IDs are interpolated into the SQL — NOT passed as bind params + $stmt = $conn->prepare( + "SELECT * FROM segment_metadata WHERE id_segment IN (" . implode(', ', $ids) . ") and meta_key = ?" + ); + + return $thisDao->setCacheTTL($ttl)->_fetchObjectMap($stmt, SegmentMetadataStruct::class, [$key]); +} +``` + +At invalidation time, `destroyGetBySegmentIdsCache($key)` only knows the meta key — not which set of IDs was used in the original query. Without the exact `$stmt->queryString`, the `md5` fingerprint cannot be reconstructed and `_destroyObjectCache` cannot be used. + +**Solution**: Target the keyMap by name directly. + +```php +const string _keymap_get_by_segment_ids = "Model\\Segments\\SegmentMetadataDao::getBySegmentIds-"; + +public static function destroyGetBySegmentIdsCache(string $key): bool +{ + $thisDao = new self(); + $keyMap = self::_keymap_get_by_segment_ids . $key; + + return $thisDao->_deleteCacheByKey($keyMap, false); // isReverseKeyMap=false → DEL keyMap directly +} +``` + +The constant `_keymap_get_by_segment_ids` mirrors the prefix that `_fetchObjectMap` auto-generates via `debug_backtrace`: `"ClassName::methodName-"`. Since the only bind param is `$key`, the auto-generated keyMap is `"...::getBySegmentIds-{$key}"`. The constant captures this prefix so the destroy method can reconstruct the keyMap name without `debug_backtrace`. + +The tradeoff: all segment ID combinations cached under the same meta key are invalidated together, regardless of which specific IDs were involved in the write. + +--- + +### Strategy 3: Surgical Field Removal + +**Used by**: `SessionTokenStoreHandler` (the only consumer). + +**How it works**: + +```php +protected function _removeObjectCacheMapElement(string $keyMap, string $keyElementName): bool +{ + $this->_cacheSetConnection(); + if (isset(self::$cache_con) && !empty(self::$cache_con)) { + self::$cache_con->del(md5($keyElementName)); // remove reverse pointer + return (bool)self::$cache_con->hdel($keyMap, [md5($keyElementName)]); // remove one HSET field + } + return false; +} +``` + +Removes a single field from a hashset and deletes its corresponding reverse pointer, without touching the rest of the hashset. The comment in the source is explicit: "let the hashset expire by himself instead of calling HLEN and DEL" — there is no automatic cleanup of the containing hashset. + +**When to use**: Only when you need to remove individual entries from a shared cache namespace (e.g., one login token from a user's token store) while preserving unrelated entries in the same hashset. + +--- + +### Decision Guide + +``` +Can you reconstruct the exact SQL statement and bind params at invalidation time? +│ +├── YES → Use _destroyObjectCache() [Strategy 1 — surgical reverse-lookup] +│ +└── NO → Does the keyMap name have a predictable, known format? + │ + ├── YES → Use _deleteCacheByKey($keyMap, false) [Strategy 2 — nuclear] + │ (e.g., SegmentMetadataDao, paginated DAOs) + │ + └── Need to remove ONLY ONE entry from a shared hashset? + │ + └── YES → Use _removeObjectCacheMapElement() [Strategy 3 — surgical field] + (SessionTokenStoreHandler only) +``` + +--- + +## 5. Pager & getAllPaginated Pattern + +### How Pager Differs from AbstractDao + +| Aspect | AbstractDao | Pager | +|--------|-------------|-------| +| keyMap source | Auto-generated via `debug_backtrace()` | Explicit — provided by DAO via `PaginationParameters::setCache()` | +| Cache methods called | `_fetchObjectMap` (wraps trait calls) | `_getFromCacheMap` / `_setInCacheMap` directly | +| Invalidation | `_destroyObjectCache` (reverse lookup) | `_deleteCacheByKey($keyMap, false)` (nuclear) | +| Cache is | Implicit in `_fetchObjectMap` | Opt-in — only if `getCacheKeyMap()` returns non-null | + +### PaginationParameters — The Value Object + +`lib/Model/Pagination/PaginationParameters.php` + +```php +class PaginationParameters +{ + protected string $fetchClass; + protected int $current; + protected int $pagination; + protected string $baseRoute; + protected ?string $cacheKeyMap; // null = no cache + protected ?int $ttl; + protected array $bindParams; + protected string $query; + + public function __construct( + string $query, + array $bindParams, + string $fetchClass, + string $baseRoute, + ?int $current = 1, + ?int $pagination = 20 + ) { ... } + + // Cache is OPT-IN — not set in constructor + public function setCache(string $cacheKeyMap, ?int $ttl = 60 * 60 * 24): void + { + $this->cacheKeyMap = $cacheKeyMap; + $this->ttl = $ttl; + } + + public function getCacheKeyMap(): ?string { return $this->cacheKeyMap; } + public function getTtl(): ?int { return $this->ttl; } + // ... getQuery(), getBindParams(), getFetchClass(), getCurrent(), getPagination(), getBaseRoute() +} +``` + +`$cacheKeyMap` is nullable and `null` by default — if `setCache()` is never called, `Pager` will not cache. The default TTL when `setCache()` is called without a second argument is 86,400 seconds (24 hours). + +### How Pager Uses the Cache + +`lib/Model/Pagination/Pager.php` + +```php +public function getPagination(int $totals, PaginationParameters $paginationParameters): array +{ + $this->setCacheTTL($paginationParameters->getTtl()); + + // ... compute pages, offset, prev, next ... + + $paginationStatement = $this->connection->prepare( + sprintf($paginationParameters->getQuery(), $paginationParameters->getPagination(), $offset) + ); + + $fingerprint = $paginationStatement->queryString + . $this->_serializeForCacheKey($paginationParameters->getBindParams()) + . $paginationParameters->getFetchClass(); + + // Check cache — only if keyMap was configured + if (!empty($paginationParameters->getCacheKeyMap())) { + $_cacheResult = $this->_getFromCacheMap($paginationParameters->getCacheKeyMap(), $fingerprint); + + if (!empty($_cacheResult)) { + return $this->format(..., $_cacheResult, ...); + } + } + + $paginationStatement->execute($paginationParameters->getBindParams()); + $result = $paginationStatement->fetchAll(); + + // Store — only if keyMap was configured + if (!empty($paginationParameters->getCacheKeyMap())) { + $this->_setInCacheMap($paginationParameters->getCacheKeyMap(), $fingerprint, $result); + } + + return $this->format(..., $result, ...); +} +``` + +Pager calls `_getFromCacheMap` / `_setInCacheMap` directly, using the keyMap provided by `PaginationParameters`. It never calls `_fetchObjectMap` or uses `debug_backtrace`. + +### The `paginated_map_key` Constant Pattern + +Every paginated DAO declares a class constant that encodes the keyMap prefix: + +```php +const string paginated_map_key = __CLASS__ . "::getAllPaginated"; +// → "Model\Projects\ProjectTemplateDao::getAllPaginated" +``` + +Per-user keyMaps append the user ID: + +```php +$paginationParameters->setCache(self::paginated_map_key . ":" . $uid, $ttl); +// → "Model\Projects\ProjectTemplateDao::getAllPaginated:123" +``` + +Invalidation targets the same key: + +```php +self::getInstance()->_deleteCacheByKey(self::paginated_map_key . ":" . $uid, false); +// DEL "Model\Projects\ProjectTemplateDao::getAllPaginated:123" +``` + +### Full Flow — `ProjectTemplateDao::getAllPaginated` + +`lib/Model/Projects/ProjectTemplateDao.php` + +```php +const string query_paginated = "SELECT * FROM " . self::TABLE . " WHERE uid = :uid ORDER BY id LIMIT %u OFFSET %u "; +const string paginated_map_key = __CLASS__ . "::getAllPaginated"; + +public static function getAllPaginated( + int $uid, + string $baseRoute, + int $current = 1, + int $pagination = 20, + int $ttl = 60 * 60 * 24 +): array { + $pdo = Database::obtain()->getConnection(); + + $pager = new Pager($pdo); + + // Step 1: count total rows (not cached — always fresh) + $totals = $pager->count( + "SELECT count(id) FROM " . self::TABLE . " WHERE uid = :uid", + ['uid' => $uid] + ); + + // Step 2: configure pagination with cache + $paginationParameters = new PaginationParameters( + static::query_paginated, + ['uid' => $uid], + ProjectTemplateStruct::class, + $baseRoute, + $current, + $pagination + ); + $paginationParameters->setCache(self::paginated_map_key . ":" . $uid, $ttl); + + // Step 3: fetch with cache (Pager handles cache check + store) + return $pager->getPagination($totals, $paginationParameters); +} + +// Invalidation — called from save(), update(), delete() +private static function destroyQueryPaginated(int $uid): void +{ + self::getInstance()->_deleteCacheByKey(self::paginated_map_key . ":" . $uid, false); +} +``` + +The count query is always executed fresh — it is never cached, because it drives pagination math (total pages, `prev`/`next` links). Only the page contents are cached. + +### DAOs Implementing This Pattern + +All seven paginated DAOs follow the same structure: + +| DAO | Table | Entity | +|-----|-------|--------| +| `ProjectTemplateDao` | `project_templates` | `ProjectTemplateStruct` | +| `FiltersConfigTemplateDao` | `filters_config_templates` | `FiltersConfigTemplateStruct` | +| `XliffConfigTemplateDao` | `xliff_config_templates` | `XliffConfigTemplateStruct` | +| `MTQEPayableRateTemplateDao` | `payable_rate_templates` | (MTQE) | +| `MTQEWorkflowTemplateDao` | `workflow_templates` | (MTQE) | +| `CustomPayableRateDao` | `payable_rate_templates` | `CustomPayableRateStruct` | +| `QAModelTemplateDao` | `qa_model_template` | `QAModelTemplateStruct` | + +Each declares `const string paginated_map_key = __CLASS__ . "::getAllPaginated"`, `getAllPaginated(...)`, and `destroyQueryPaginated(int $uid)`. + +--- + +## 6. SessionTokenStoreHandler — Non-DAO Consumer + +`lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php` + +### Why a Non-DAO Uses DaoCacheTrait + +`SessionTokenStoreHandler` has no SQL queries and no `AbstractDao` inheritance. It uses `DaoCacheTrait` purely for its Redis hashset primitives — repurposing them as a structured token store. A Redis hashset keyed per user ID maps each login cookie value to itself, allowing efficient lookup and surgical removal of individual tokens without affecting other active sessions. + +### How It Differs from DAO Usage + +| Aspect | DAO usage | SessionTokenStoreHandler | +|--------|-----------|--------------------------| +| Data stored | Serialized SQL result sets | Login cookie token values | +| keyMap source | Auto-generated (debug_backtrace) or explicit constant | `sprintf('active_user_login_tokens:%s', $userId)` | +| TTL | Set via `setCacheTTL()` (respects kill switch) | Set directly in constructor: `$this->cacheTTL = 60 * 60 * 24 * 7` (7 days) | +| `_logCache` channel | `query_cache` | Overridden → `login_cookie_cache` | +| Invalidation used | Strategies 1 or 2 | Strategy 3 exclusively (`_removeObjectCacheMapElement`) | + +The constructor bypasses `setCacheTTL()` (and therefore the `AppConfig::$SKIP_SQL_CACHE` kill switch) by setting `$this->cacheTTL` directly. This ensures tokens are always stored, regardless of whether SQL caching is globally disabled. + +The `_logCache` override is a lightweight customization — same structured log format, different channel name, allowing login token cache activity to be filtered and monitored separately from SQL caching. + +### Operations + +**Store a token** (on successful login): + +```php +public function setCookieLoginTokenActive(int $userId, string $loginCookieValue): void +{ + $key = sprintf(self::ACTIVE_USER_LOGIN_TOKENS_MAP, $userId); + // ACTIVE_USER_LOGIN_TOKENS_MAP = 'active_user_login_tokens:%s' + + $this->_cacheSetConnection(); + $this->_setInCacheMap($key, $loginCookieValue, [$loginCookieValue]); + // Redis: + // HSET "active_user_login_tokens:42" md5($cookie) serialize([$cookie]) + // EXPIRE "active_user_login_tokens:42" 604800 (7 days) + // SETEX md5($cookie) 604800 "active_user_login_tokens:42" +} +``` + +**Validate a token** (on browser request with cookie): + +```php +public function isLoginCookieStillActive(int $userId, string $loginCookieValue): bool +{ + return $this->_getFromCacheMap( + sprintf(self::ACTIVE_USER_LOGIN_TOKENS_MAP, $userId), + $loginCookieValue + ) !== null; + // Redis: HGET "active_user_login_tokens:42" md5($cookie) → non-null = active +} +``` + +**Remove a token** (on logout): + +```php +public function removeLoginCookieFromStore(int $userId, string $loginCookieValue): void +{ + if (empty($loginCookieValue)) { return; } + + $key = sprintf(self::ACTIVE_USER_LOGIN_TOKENS_MAP, $userId); + $this->_removeObjectCacheMapElement($key, $loginCookieValue); + // Redis: + // DEL md5($cookie) ← remove reverse pointer + // HDEL "active_user_login_tokens:42" [md5($cookie)] ← remove one field from hashset + // Other tokens in the hashset are unaffected. +} +``` + +### Why Surgical Field Removal Is Correct Here + +A user may have multiple active sessions across different devices. If logout on one device used `_deleteCacheByKey($keyMap, false)` (nuclear), all other sessions would be invalidated. `_removeObjectCacheMapElement` removes exactly one token, leaving the user's other active sessions intact. + +This is the **only place** in the codebase that calls `_removeObjectCacheMapElement`. + +--- + +## 7. XFetch — Probabilistic Early Expiration + +### Problem — Cache Stampede + +When a popular cache entry expires, many concurrent requests simultaneously miss the cache and hit the database with the same query. This thundering herd can spike DB load and degrade response times. + +### Solution — XFetch Algorithm + +Instead of all requests waiting until TTL expiry, each request probabilistically decides whether to recompute the entry *before* it expires. The probability increases as the entry approaches its TTL, spreading recomputation across time so that (statistically) only one request refreshes the entry before expiration. + +### Formula + +``` +shouldRecompute = now ≥ storedAt + TTL − δ · β · |log(rand())| +``` + +Where: +- `storedAt` — timestamp when the entry was cached +- `TTL` — cache time-to-live in seconds +- `δ` (delta) — measured recomputation time (seconds the DB query took) +- `β` (beta) — tuning parameter (default `1.0`, optimal per Vattani et al.) +- `rand()` — uniform random in (0, 1] +- `|log(rand())|` — always positive, creates an exponentially distributed gap + +The **early recomputation window** is proportional to δ, not TTL. For a typical δ of 0.05s, the window is ~0.05–0.25s before expiry regardless of whether TTL is 60s or 86400s. + +### Constants + +| Constant | Value | Purpose | +|----------|-------|---------| +| `XFETCH_BETA` | `1.0` | Tuning parameter — theoretically optimal | +| `XFETCH_MIN_TTL_THRESHOLD` | `10` | Auto-disable XFetch below this TTL (seconds) | +| `XFETCH_FALLBACK_DELTA` | `0.05` | Default δ when no measurement available | + +### Cache Envelope Format + +When XFetch is active (TTL ≥ 10s, `$xfetchEnabled = true`), `_setInCacheMap` wraps the value in an `XFetchEnvelope` object: + +```php +// lib/Model/DataAccess/XFetchEnvelope.php +final readonly class XFetchEnvelope +{ + public function __construct( + public array $value, // The actual cached data (array of IDaoStruct objects) + public float $storedAt, // microtime(true) when stored + public float $delta, // Measured recomputation time in seconds + ) {} +} + +// Stored in Redis as: +serialize(new XFetchEnvelope($value, microtime(true), $delta)) +``` + +On read, `_getFromCacheMap` detects the envelope via `instanceof XFetchEnvelope` — no fragile key-checking needed. + +When XFetch is inactive (TTL < 10s or `$xfetchEnabled = false`), the value is stored as a raw serialized array, preserving backward compatibility. + +### δ (Delta) Measurement + +`AbstractDao::_fetchObjectMap()` wraps `microtime(true)` around `$stmt->execute()` + `$stmt->fetchAll()` and calls `_setLastComputeDelta()` to pass the measurement to the trait. The private property `$lastComputeDelta` is consumed-and-reset by `_setInCacheMap()` when building the envelope. + +Callers that bypass `_fetchObjectMap()` (e.g., `Pager::getPagination()`) get the fallback δ of 0.05s. + +### Backward Compatibility + +`_getFromCacheMap()` detects the envelope via `$unserialized instanceof XFetchEnvelope`. Old entries (stored as plain serialized arrays) fail this check and are returned as-is — no XFetch logic applied. They naturally refresh on expiry and get the new envelope format on the next write. + +### Exclusions + +- **`SessionTokenStoreHandler`** — sets `$xfetchEnabled = false` in its constructor. Session tokens are written/read explicitly (not computed from queries), so probabilistic early expiration has no semantic meaning. +- **TTL < 10s** — XFetch auto-disables. The early recomputation window could exceed the remaining TTL, causing perpetual recomputation. +- **`AppConfig::$SKIP_SQL_CACHE = true`** — All caching (including XFetch) is bypassed. + +### References + +- Vattani, A., Chierichetti, F., Lowenstein, K. — *"Optimal Probabilistic Cache Stampede Prevention"* (2015) +- Redis documentation on cache stampede mitigation + +--- + +## 8. XFetch in Practice + +### The `|log(rand)|` Curve + +The XFetch multiplier `|log(rand)|` for uniform random `rand ∈ (0, 1]` determines how far before expiry a request might trigger early recomputation: + +![XFetch |log(x)| curve](xfetch-log-curve.png) + +> **Figure 1** — The `|log(x)|` curve for uniform random `x ∈ (0, 1]`. Most draws produce values below 1 (right side), making `δ · |log(rand)|` smaller than δ itself. Only rare draws near zero (left tail) produce large multipliers — which is why early recomputation triggers only in the final fractions of a second before expiry. + +### Probability Table + +Given `δ = 0.05s` (fallback), `β = 1.0`, `TTL = 86,400s` (1 day): + +| Time before expiry | P(recompute) | Why | +|--------------------|--------------|-----| +| 5 seconds | ≈ 0% | 5s is ~100× δ — `\|log(rand)\|` almost never reaches 100 | +| 1 second | ≈ 2% | 1s is ~20× δ — requires a rare left-tail draw | +| 0.25 seconds | ≈ 18% | 0.25s is ~5× δ — starting to enter reachable range | +| 0.1 seconds | ≈ 39% | 0.1s is ~2× δ — roughly a coin flip | +| 0.05 seconds | ≈ 63% | 0.05s equals δ — majority of draws clear this gap | + +The early recomputation window scales with δ, not TTL. A query that takes 50ms to execute will start triggering recomputes ~0.05–0.25s before expiry, regardless of whether TTL is 60s or 86,400s. + +### Timeline: How XFetch Prevents a Stampede + +``` +Given: TTL = 86,400s (1 day), δ = 38ms (measured query time), β = 1.0 + +t = 0s + Cache populated. Envelope stored: value + storedAt + δ. + +t = 43,200s (12 hours in) + Request hits cache. Time remaining: 43,200s. + P(recompute) ≈ 0%. Served from cache. + +t = 86,399.7s (0.3s before expiry) + Request hits cache. XFetch multiplies δ (38ms) by |log(rand)|, where + rand ∈ (0, 1]. Most values of |log(rand)| are small (near zero), so + 38ms × |log(rand)| rarely exceeds 0.3s — only 8% probability. + This math calculation probably doesn't trigger a recompute; the result is served from cache. + +t = 86,399.92s (0.08s before expiry) + Same draw, but only 0.08s to cover. 38ms × |log(rand)| clears that + about 45% of the time. This math calculation likely triggers a recomputation. + Query re-executed (δ = 41ms). Fresh envelope stored. TTL resets to 86,400s. + +t = 86,399.95s + Three more requests hit cache. Fresh entry — 86,400s remaining. + P(recompute) ≈ 0% for all three. Served from cache. + +t = 86,400s + Original TTL would have expired here. + Entry already refreshed 0.08s ago. No stampede. No thundering herd. +``` + +### Pattern Comparison + +| Pattern | Read miss | Write | Stampede prevention | MateCat | +|---------|-----------|-------|---------------------|---------| +| Cache-aside | App fetches DB, stores in cache | App evicts cache | None | Write path ✓ | +| Read-through | Cache layer fetches on miss | — | None | Read path ✓ | +| Write-through | — | Cache writes to DB + cache | N/A | ✗ | +| Refresh-ahead | Background timer refreshes | — | Full (timer-based) | ✗ | +| **XFetch hybrid** | Cache layer fetches on miss | App evicts cache | Probabilistic (per-request) | **Full system** | + +MateCat's pattern is a deliberate hybrid: read-through on the read path, cache-aside on the write path, with XFetch probabilistic early expiration layered on top. It requires no background processes, no distributed locks, and no coordination between requests. diff --git a/docs/reviews/2026-04-03-codebase-review.md b/docs/reviews/2026-04-03-codebase-review.md new file mode 100644 index 0000000000..d467db93df --- /dev/null +++ b/docs/reviews/2026-04-03-codebase-review.md @@ -0,0 +1,568 @@ +# Matecat Codebase Review + +**Date:** 2026-04-03 +**Scope:** `lib/` (737 PHP files), `tests/` (211 PHP files) +**Method:** Static analysis, grep-based metrics, manual sampling of key files +**Verdict:** C+ — Solid bones, real technical debt in the seams. Active improvement trajectory. + +--- + +## Table of Contents + +1. [Codebase at a Glance](#codebase-at-a-glance) +2. [What Is Good](#what-is-good) +3. [What Is Shit — The Critical Issues](#what-is-shit--the-critical-issues) +4. [What Is Annoying But Manageable](#what-is-annoying-but-manageable) +5. [Scores by Area](#scores-by-area) +6. [Prioritised Remediation Roadmap](#prioritised-remediation-roadmap) + +--- + +## Codebase at a Glance + +| Metric | Value | +| ------------------------------------------ | ----------------------------------------------------------------- | +| PHP source files (`lib/`) | 737 | +| PHP test files (`tests/`) | 211 | +| Test-to-source file ratio | ~29% | +| Commits since 2025-01-01 | 2,332 | +| Commits since 2024-01-01 | 4,549 | +| Commits since 2023-01-01 | 5,619 | +| `Database::obtain()` call sites | 324 across 99 files (in `lib/`); 751 across 266 files (full repo) | +| `$_POST`/`$_GET`/`$_REQUEST` direct access | 43 usages in `lib/` | +| TODO / FIXME / HACK markers | 19 | +| `mixed` typed properties | 21 | +| `mixed` return types | 30 | + +--- + +## What Is Good + +### 1. No Global Variables + +```bash +$ grep -rn "global \$" lib/ | wc -l +0 +``` + +Zero `global $var` in the entire codebase. For a ~10-year-old PHP project, this is genuinely impressive and suggests the architecture was intentionally designed to avoid procedural patterns. + +--- + +### 2. Clean Namespace Structure + +`lib/` is consistently namespaced under `Controller\`, `Model\`, `Utils\`, and `Plugins\`. No spaghetti files at the root. The directory layout maps directly to namespaces. A developer can find anything in under 30 seconds. + +``` +lib/ +├── Controller/API/{V1,V2,V3,App,GDrive}/ +├── Model/{Projects,Jobs,Segments,Users,Analysis,...}/ +├── Utils/{Engines,Tools,AsyncTasks,Redis,...}/ +└── Plugins/Features/{ReviewExtended,TranslationVersions,...}/ +``` + +--- + +### 3. PDO Throughout, No Legacy `mysql_*` + +All database access goes through PDO with `ERRMODE_EXCEPTION`. No `mysql_query()`, no `mysqli_*`. Prepared statements are the norm. + +```php +// lib/Model/DataAccess/Database.php +$this->connection = new PDO( + "mysql:host=$this->server;dbname=$this->database", + $this->user, $this->password, + [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ...] +); +``` + +--- + +### 4. `IDatabase` Interface Exists + +`AbstractDao` accepts an optional `IDatabase $con` in its constructor, making DAOs technically mockable in tests: + +```php +// lib/Model/DataAccess/AbstractDao.php +public function __construct(?IDatabase $con = null) +{ + if ($con == null) { + $con = Database::obtain(); // fallback to singleton — see Issue #1 + } + $this->database = $con; +} +``` + +The interface was the right architectural decision. The problem is that callers rarely pass it. + +--- + +### 5. Feature/Plugin System Is Thoughtfully Designed + +`FeatureSet::filter()` and `FeatureSet::run()` implement a clean WordPress-style hook system: + +```php +// Plugins override behaviour without touching core: +$newStruct = $this->featureSet->filter( + 'filterContributionStructOnMTSet', + $contributionStruct, + $_Translation, + $this->data['segment'], + $this->filter +); +``` + +This is used in 142 places across the codebase, enabling the Airbnb plugin and others to inject behaviour cleanly. The pattern is consistent and well-understood by the team. + +--- + +### 6. `ProjectStructure` Enforces a Closed Schema + +`AbstractDaoObjectStruct::__set()` throws a `DomainException` on writes to unknown properties: + +```php +public function __set($name, $value) +{ + if (!property_exists($this, $name)) { + throw new DomainException('Unknown property ' . $name); + } + $this->$name = $value; +} +``` + +This prevents silent state drift via typos or dynamic property creation. `ProjectStructure`'s 83 fields are at least all explicitly declared and grouped by lifecycle phase (see Issue #2 for why it's still a problem). + +--- + +### 7. ProjectCreation Test Suite Is Genuinely Good + +`tests/unit/Model/ProjectCreation/` has 30+ focused unit tests with proper mocking patterns: + +```php +// TestableProjectManager bypasses the heavy constructor +class TestableProjectManager extends ProjectManager +{ + public function __construct() {} // intentionally empty + + public function initForTest( + MateCatFilter $filter, + FeatureSet $features, + MetadataDao $filesMetadataDao, + MatecatLogger $logger, + ): void { ... } +} +``` + +Test coverage breakdown is documented inline. PHPUnit 12.4 (current). This area shows what the rest of the codebase should look like. + +--- + +### 8. Active Development Velocity + +2,332 commits in 2025, with conventional commits now being adopted. Ongoing refactoring of `ProjectManager` into focused services (`SegmentExtractor`, `FileInsertionService`, `JobCreationService`, etc.) shows the team is aware of the debt and is paying it down. + +--- + +## What Is Shit — The Critical Issues + +### Issue 1: `Database::obtain()` Singleton — 324 Call Sites in 99 Files (`lib/` only; 751 across 266 files repo-wide) + +**Severity: 🔴 Critical** + +```php +// Appears 324 times across 99 files: +$conn = Database::obtain()->getConnection(); +$db = Database::obtain(); +Database::obtain()->begin(); +Database::obtain()->commit(); +``` + +`Database::obtain()` is a classic Singleton that acts as a hidden global. Even though `IDatabase` exists, most code bypasses it: + +- `AbstractDao` falls back to `Database::obtain()` when no `$con` is passed +- Controllers call `Database::obtain()->begin()` directly for transactions +- DAOs call `Database::obtain()->getConnection()` to write raw PDO queries + +**Consequences:** + +- Unit tests that need DB interaction must either spin up a real DB or fight the singleton +- The singleton carries a single connection across the entire request lifecycle; re-entrant transactions are impossible +- No connection pooling; no read/write split is achievable without refactoring 99 files + +**What it should be:** Pass `IDatabase` through constructors everywhere. The interface already exists — it just needs to be wired properly. + +--- + +### Issue 2: `ProjectStructure` Is an 83-Property God Object + +**Severity: 🔴 Critical** + +```php +// lib/Model/ProjectCreation/ProjectStructure.php — 83 public properties: +// Group A (49 keys): init-only input +public ?string $project_name = null; +public ?array $target_language = null; +// ... + +// Group B (10 keys): mutable pipeline state +public mixed $xliff_parameters = []; +public mixed $session = null; + +// Group C (14 keys): per-file transient data +public array $segments = []; +public array $translations = []; + +// Group D: output/result keys +public array $result = ['errors' => [], 'data' => []]; +public array $array_jobs = ['job_list' => [], ...]; +``` + +All four groups live in the same object, which is passed **by reference** through the entire creation pipeline and mutated by every service. This means: + +- `SegmentExtractor` reads from Group A and writes to Group C +- `JobCreationService` reads from Groups A+C and writes to Group D +- `ProjectMetadataService` reads from Groups A+B +- Nothing enforces which stage can write to which group + +**Consequences:** + +- Impossible to reason about what state the object is in at any given point +- Tests must pre-populate all 83 fields or leave them in potentially invalid defaults +- Serialisation to the job queue (via `JsonSerializable`) ships ALL state, including transient per-file data + +**What it should be:** Three or four distinct, immutable-input DTOs passed to specific services, with a separate output result type. + +--- + +### Issue 3: Massive Controllers That Mix All Concerns + +**Severity: 🔴 Critical** + +| File | Lines | Methods | +| ------------------------------------------------- | ----- | ------- | +| `Controller/API/V1/NewController.php` | 1,337 | 25 | +| `Controller/API/App/SetTranslationController.php` | 1,030 | 17 | +| `Controller/API/App/CreateProjectController.php` | 897 | 21 | +| `Controller/API/V2/DownloadController.php` | 957 | 17 | + +`NewController::validateTheRequest()` alone is **281 lines** — it validates every possible parameter for project creation in a single method. It handles language pairs, QA models, MT engines, XLIFF parameters, glossaries, filters, and payable rates all in one giant array-building function. + +`SetTranslationController` combines: HTTP parsing, translation validation, segment fetching, TM contribution, MT contribution, activity logging, propagation, and error handling. + +**Consequence:** These cannot be unit-tested. Changes in one area risk breaking unrelated behaviour. + +--- + +### Issue 4: God Utility Classes + +**Severity: 🟠 High** + +| File | Lines | Static Methods | Responsibilities | +| -------------------------- | ----- | -------------- | ------------------------------------------------------------------------------------------------- | +| `Utils/Tools/CatUtils.php` | 1,067 | 35 | Regex placeholders, word count, segment splitting, CJK detection, filter calls, tag manipulation | +| `Utils/Tools/Utils.php` | 925 | 34 | Password hashing, IP detection, file naming, email sending, UUID generation, timestamp formatting | + +These are untestable bags of static functions with no cohesion. They accumulate every utility that didn't fit elsewhere: + +```php +// CatUtils — totally unrelated concerns in one class: +CatUtils::isCJK($lang); +CatUtils::getWordCount($segment, $lang, ...); +CatUtils::placeholderToLayer1($segment); +CatUtils::checkParallelTokenConsistency($s, $t); +``` + +--- + +### Issue 5: `SegmentDao` and `TMAnalysisWorker` Are Monoliths + +**Severity: 🟠 High** + +| File | Lines | Methods | +| -------------------------------------------------------- | ----- | ------- | +| `Model/Segments/SegmentDao.php` | 1,108 | 10 | +| `Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php` | 1,055 | 18 | + +`SegmentDao` is a 1,108-line DAO with 10 methods — some returning raw arrays, some returning `SegmentStruct[]`, some running complex multi-join queries inline. At that size, a DAO is no longer just data access; it's accumulated business logic with nowhere else to go. + +`TMAnalysisWorker` at 1,055 lines handles: queue message decoding, TM lookup, MT fallback, match scoring, segment update, pre-translation logic, and analysis data persistence — in one class. + +--- + +### Issue 6: `FeatureSet::filter()` Uses Unsafe Variadic Dispatch + +**Severity: 🟠 High** + +```php +public function filter(string $method, mixed $filterable): mixed +{ + $args = array_slice(func_get_args(), 1); // ← grabs ALL args dynamically + + foreach ($this->features as $feature) { + $obj = $feature->toNewObject(); + if (method_exists($obj, $method)) { + array_shift($args); + array_unshift($args, $filterable); // ← manual arg shifting each iteration + $filterable = call_user_func_array([$obj, $method], $args); + } + } + return $filterable; +} +``` + +Problems: + +- `func_get_args()` is invisible to static analysis (PHPStan/Psalm cannot infer types) +- The `array_shift` / `array_unshift` dance mutates `$args` each iteration — adding extra args beyond `$filterable` requires careful counting +- Plugin authors have no type-safe contract for what `$filterable` is +- The return type is `mixed`, so callers must cast + +This is used in 142 places across the codebase. + +--- + +### Issue 7: `ProjectStruct` Is Both a DAO Struct and an Active Record + +**Severity: 🟠 High** + +`ProjectStruct` (the DB-mapped entity, not `ProjectStructure`) directly instantiates DAOs and makes DB calls: + +```php +// lib/Model/Projects/ProjectStruct.php +public function setMetadata(string $key, string $value): bool +{ + $dao = new MetadataDao(Database::obtain()); // ← DB call inside a "value object" + return $dao->set($this->id, $key, $value); +} + +public function getJobs(int $ttl = 0): array +{ + return $this->cachable(__METHOD__, function () use ($ttl) { + return JobDao::getByProjectId($this->id, $ttl); // ← static DAO call + }); +} +``` + +This happens in 6 methods across `ProjectStruct`. The struct is neither a pure DTO nor a clean Active Record — it's a hybrid that makes side effects invisible to callers. + +--- + +### Issue 8: A Confirmed Bug Commented with TODO and Never Fixed + +**Severity: 🟠 High** + +```php +// lib/Model/DataAccess/Database.php:319 +foreach ($data as $key => $value) { + // ... + $valuesToBind[":dupUpdate_" . $key] = $value; + //TODO this is a bug: bind values are not returned and not inserted in the mask +} +``` + +There is a known bug in the `Database` layer itself — in the `ON DUPLICATE KEY UPDATE` path — that has been commented as `TODO` and left unfixed. The scope of this bug is unclear but it affects any code that uses `upsert`-style queries. + +Additionally: + +```php +// lib/Model/DataAccess/Database.php:364 +/** + * TODO this trim should be removed and ALL codebase migrated from $db->escape() + * to prepared Statements + */ +``` + +Manual escaping via `->escape()` is still used in `UserDao` and `SearchModel` despite the comment explicitly saying all code should be migrated to prepared statements. + +--- + +## What Is Annoying But Manageable + +### A. `$_POST` / `$_GET` / `$_REQUEST` Direct Access — 43 Usages + +Most are concentrated in the legacy `lib/View/fileupload/UploadHandler.php` (a vendor-ish file). A handful appear in newer V3 controllers. The modern controllers use `$this->request->param()` properly. + +```php +// lib/Controller/API/V3/DeepLGlossaryController.php:58 +$name = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS, ...); +``` + +**Fix:** Move these to the Klein request abstraction already used elsewhere. + +--- + +### B. `mixed` Type Overuse — 21 Properties, 30 Return Types + +`ProjectStructure` contributes heavily here: + +```php +public mixed $qa_model_template = null; +public mixed $qa_model = null; +public mixed $filters_extraction_parameters = null; +public mixed $session = null; +``` + +These fields have been `mixed` because they carry heterogeneous data that was never properly typed. Each is a candidate for a specific DTO or union type. + +--- + +### C. `old_tests/` — 36 Dead Test Files + +`old_tests/` contains 36 PHP test files that are not in the PHPUnit configuration and are not run in CI. They are dead code and create confusion. + +**Fix:** Delete the directory. + +--- + +### D. Static Initializer Magic in `TMAnalysisWorker` and Others + +Several workers and DAOs use static state that persists across test runs: + +```php +// lib/Model/DataAccess/AbstractDao.php +protected static array $auto_increment_field = []; + +public function __construct(?IDatabase $con = null) +{ + // ... + self::$auto_increment_field = []; // reset on every construction +} +``` + +Static arrays reset in the constructor is a code smell — it indicates state is being managed at the wrong scope level. + +--- + +### E. `VersionHandlerInterface` Uses Array Shape Docblock Instead of Typed Contract + +```php +// lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php +/** + * @param array{ + * translation: SegmentTranslationStruct, + * old_translation: SegmentTranslationStruct, + * propagation: array, + * chunk: JobStruct, + * user: UserStruct, + * source_page_code: int, + * features: FeatureSet, + * } $data + */ +public function handle(array $data): void; +``` + +The `array $data` parameter is shaped only in a docblock. PHP has no runtime enforcement. An implementing class that reads `$data['chunk']` has no IDE guarantee it's a `JobStruct`. + +**Fix:** Define a proper `VersionHandlerData` value object and type the parameter. + +--- + +## Scores by Area + +| Area | Grade | Rationale | +| ------------------------------- | ----------------------- | ---------------------------------------------------------------------------- | +| Namespace / directory structure | **B+** | Clean, consistent, navigable | +| Database / SQL safety | **C** | PDO ✓, singleton ✗, confirmed bug ✗, manual escaping ✗ | +| Dependency injection | **C** | `IDatabase` interface exists but fallback to singleton dominates (99 files) | +| Type safety | **C+** | Improving; `mixed` overuse (21+30); no generics | +| God objects / SRP | **D** | `ProjectStructure` (83 props), `CatUtils` (35 statics), `Utils` (34 statics) | +| Controller size / separation | **D** | `NewController` 1337 lines, `SetTranslationController` 1030 lines | +| DAO layer | **C** | 1108-line SegmentDao, Active Record leak in ProjectStruct | +| Plugin system | **B** | Clever hook design; type-unsafe dispatch | +| Test coverage | **C+** | Good for ProjectCreation, sparse elsewhere (29% file ratio) | +| Test quality | **B** (where it exists) | Proper mocking, `TestableProjectManager` pattern is correct | +| Technical debt visibility | **C** | 19 TODOs; one confirmed DB bug unaddressed | +| Development velocity | **A** | Active, improving; conventional commits adopted | + +**Overall: C+** + +--- + +## Prioritised Remediation Roadmap + +### Priority 1 — Fix the Confirmed Bug + +**File:** `lib/Model/DataAccess/Database.php:319` +The `ON DUPLICATE KEY UPDATE` bind-values bug must be diagnosed and fixed before it causes silent data corruption. It has a TODO comment but no corresponding issue or fix. + +--- + +### Priority 2 — Break the `Database::obtain()` Singleton Dependency + +**Goal:** All 99 files that call `Database::obtain()` should receive `IDatabase` via constructor injection. + +**Approach:** + +1. Audit all 99 files; start with the DAOs (they already accept `IDatabase` in constructors) +2. Wire the `IDatabase` instance from a central bootstrap / DI container +3. Remove the `Database::obtain()` fallback in `AbstractDao::__construct()` +4. The singleton can remain in `bootstrap.php` as the single creation site + +**Impact:** Every DAO becomes unit-testable without a real DB. + +--- + +### Priority 3 — Split `ProjectStructure` Into Phase-Specific DTOs + +**Goal:** Eliminate the 83-property god object. + +**Approach:** + +1. Extract a `ProjectCreationInput` immutable DTO (current Group A) +2. Extract a `ProjectCreationResult` DTO (current Group D) +3. Keep pipeline mutable state internal to `ProjectManager` (not in a shared bag) +4. Remove `JsonSerializable` from the DTO; use an explicit serialiser for queue transport + +--- + +### Priority 4 — Break Up the Monolith Controllers + +**Target files:** + +- `NewController.php` (1337 lines) → extract `ProjectCreationRequestParser`, `ProjectCreationOrchestrator` +- `SetTranslationController.php` (1030 lines) → extract `TranslationSaver`, `ContributionDispatcher` + +`validateTheRequest()` at 281 lines alone should be a dedicated request-validator class. + +--- + +### Priority 5 — Dissolve `CatUtils` and `Utils` God Classes + +Break them up by actual responsibility: + +- `CatUtils` → `SegmentFormatter`, `WordCounter`, `LanguageUtils`, `TagReplacer` +- `Utils` → `AuthHelper`, `FileHelper`, `NetworkHelper`, `DateHelper` + +Make them instance classes (or at least group related statics under narrowly-scoped classes) so they can be tested and injected. + +--- + +### Priority 6 — Type the FeatureSet Filter Dispatch + +Replace: + +```php +public function filter(string $method, mixed $filterable): mixed +``` + +with a typed, contract-based dispatch. Each hook point should have a named interface (`FilterContributionStructInterface`, etc.) with a typed method signature. Static analysis can then verify plugin implementations. + +--- + +### Priority 7 — Delete `old_tests/`, Fix `$_REQUEST` Usages + +Small wins: + +- Delete `old_tests/` (36 dead files, zero CI value) +- Move remaining `$_POST`/`$_GET` direct accesses to the Klein request abstraction +- Replace `->escape()` in `UserDao` and `SearchModel` with PDO bound parameters + +--- + +_Review conducted via static analysis and manual code sampling. No profiling or runtime analysis was performed._ + +--- + +### Verification Note + +_All quantitative claims in this document were cross-validated on 2026-04-03 against the actual codebase at commit `953e0d02b8` (branch `context-review`). Line counts were verified with `wc -l`, method counts with `grep -c "function "`, property counts by manual inspection, and grep-based metrics with exact shell commands. Original inaccuracies (overstated method counts, inflated `$_POST`/`mixed` metrics) have been corrected. The `->filter()` usage count was originally underreported (47 → 142) and has been updated._ diff --git a/docs/reviews/old-tests-valuable-scenarios.md b/docs/reviews/old-tests-valuable-scenarios.md new file mode 100644 index 0000000000..49fd07a0d6 --- /dev/null +++ b/docs/reviews/old-tests-valuable-scenarios.md @@ -0,0 +1,392 @@ +# Old Tests — Valuable Scenario Reference + +> **Purpose**: This document preserves test scenarios extracted from the legacy `old_tests/` directory before its deletion. +> These are **not runnable tests** — they are a reference catalog of behaviors that were once tested and should be +> covered by modern integration tests when the relevant subsystems are modified. +> +> **Date**: 2026-04-07 +> **Source**: `old_tests/` (deleted in same commit as this document) + +--- + +## How to Read This Document + +Each entry lists: + +- **Origin file** — the deleted test file path +- **What it tested** — plain-English description of the behavior under test +- **Test methods** — number of distinct test cases +- **Tier** — `A` (high value, complex workflow, no modern equivalent) or `B` (moderate value, simpler assertions) + +--- + +## Tier A — High Value + +These test complex, multi-step workflows with no modern coverage. Prioritize these when writing new integration tests. + +### 1. Split & Merge with Review Preservation + +| | | +|---|---| +| **Origin** | `old_tests/Features/ReviewImproved/SplitAndMergeTest.php` | +| **Tests** | 3 | +| **Tier** | A | + +**Scenarios**: +- Splitting a job preserves review passwords on both resulting chunks +- Splitting a job preserves penalty points on both resulting chunks +- Merging split chunks recombines review state correctly + +**Why it matters**: Split/merge is a destructive operation on job structure. Losing review passwords or penalty points silently would corrupt the review workflow. + +--- + +### 2. QA Review Record Lifecycle + +| | | +|---|---| +| **Origin** | `old_tests/Features/ReviewImproved/CreateRecordInQaJobReviewsTest.php` | +| **Tests** | 4 | +| **Tier** | A | + +**Scenarios**: +- Creating a QA review record inserts into `qa_chunk_reviews` with correct initial state +- Splitting a job creates review records for each resulting chunk +- Merging chunks consolidates review records +- Review record totals (penalty points, reviewed word count) update correctly after split/merge + +**Why it matters**: `qa_chunk_reviews` is the source of truth for revision quality metrics. Incorrect records after split/merge would produce wrong quality scores. + +--- + +### 3. Translation Versioning on Change + +| | | +|---|---| +| **Origin** | `old_tests/Features/TranslationVersions/setTranslationWithVersioningEnabledTest.php` | +| **Tests** | 4 | +| **Tier** | A | + +**Scenarios**: +- Setting a translation creates a new version record with the previous text +- Setting the same translation text again does NOT create a duplicate version (no-op guard) +- Propagated translations also create version records in target segments +- Version number increments correctly across multiple edits + +**Why it matters**: Translation versioning is the backbone of revision history. Silent version loss means reviewers cannot see what changed. + +--- + +### 4. Project Completion State Machine + +| | | +|---|---| +| **Origin** | `old_tests/API/V2/ProjectCompletionStatusTest.php` | +| **Tests** | 4 | +| **Tier** | A | + +**Scenarios**: +- A newly created project reports `DOING` status +- Translating all segments transitions project to translate-complete +- Completing revision transitions project to revise-complete +- Split jobs: completion requires ALL chunks to be complete + +**Why it matters**: Project completion drives notifications, billing, and delivery workflows. A stuck or premature completion state breaks the entire delivery pipeline. + +--- + +### 5. Project Creation Option Defaults + +| | | +|---|---| +| **Origin** | `old_tests/CreateProjectController/defaultProjectOptionTest.php` | +| **Tests** | 10 | +| **Tier** | A | + +**Scenarios**: +- `speech2text` defaults to `true` for supported language pairs, `false` otherwise +- `lexiqa` defaults to `true` for supported language pairs, `false` otherwise +- `tag_projection` defaults to `true` for supported language pairs, `false` otherwise +- Each option can be explicitly overridden to `true` or `false` regardless of language pair +- Options are stored correctly in `job_metadata` +- Unsupported language pairs do not silently enable features + +**Why it matters**: Feature flags per job affect translation editor behavior. Wrong defaults mean translators see broken UI panels or miss available tools. + +--- + +## Tier B — Moderate Value + +Simpler assertions, often API contract tests. Useful as a checklist when modifying the relevant endpoints. + +### 6. Version Number Increment & Propagation + +| | | +|---|---| +| **Origin** | `old_tests/Features/TranslationVersions/increaseVersionNumberTest.php` | +| **Tests** | 2 | +| **Tier** | B | + +**Scenarios**: +- Version number increments by 1 on each translation change +- Propagated segments maintain consistent version numbers with their source + +--- + +### 7. Versioning Disabled — No Records Created + +| | | +|---|---| +| **Origin** | `old_tests/Features/TranslationVersions/setTranslationWithVersioningDisabledTest.php` | +| **Tests** | 2 | +| **Tier** | B | + +**Scenarios**: +- When versioning is disabled, setting a translation does NOT insert version records +- Propagated translations also skip version creation when disabled + +--- + +### 8. QA Model Assignment + +| | | +|---|---| +| **Origin** | `old_tests/Features/ReviewImproved/AssignQualityModelToProjectTest.php` | +| **Tests** | 1 | +| **Tier** | B | + +**Scenarios**: +- Assigning a QA model to a project stores the model ID in project metadata + +--- + +### 9. Segment Notes Extraction + +| | | +|---|---| +| **Origin** | `old_tests/Features/SegmentNotes/SegmentNotesCreationTest.php` | +| **Tests** | 3 | +| **Tier** | B | + +**Scenarios**: +- Notes are extracted from SDLXLIFF `` elements and stored per-segment +- Notes are extracted from XLIFF files with `` elements +- Empty or missing notes do not create spurious records + +--- + +### 10. Job Merge API + +| | | +|---|---| +| **Origin** | `old_tests/API/V2/JobMergeTest.php` | +| **Tests** | 2 | +| **Tier** | B | + +**Scenarios**: +- `POST /api/v2/jobs/{id}/merge` merges split chunks back into a single job +- Chunk-specific options (speech2text, etc.) are cleaned up after merge + +--- + +### 11. Translation Versions API + +| | | +|---|---| +| **Origin** | `old_tests/API/V2/SegmentVersionTest.php` | +| **Tests** | 1 | +| **Tier** | B | + +**Scenarios**: +- `GET /api/v2/jobs/{id}/segments/{sid}/translation-versions` returns version array with correct structure + +--- + +### 12. Chunk Options API + +| | | +|---|---| +| **Origin** | `old_tests/API/V2/ChunkOptionsControllerTest.php` | +| **Tests** | 3 | +| **Tier** | B | + +**Scenarios**: +- `GET` returns current speech2text, tag_projection, lexiqa settings +- `POST` updates individual options +- Invalid option names are rejected + +--- + +### 13. Project Update API + +| | | +|---|---| +| **Origin** | `old_tests/API/V2/ProjectUpdateTest.php` | +| **Tests** | 3 | +| **Tier** | B | + +**Scenarios**: +- Setting project assignee via API +- Unsetting project assignee (null) +- Changing project name + +--- + +### 14. Team Creation API + +| | | +|---|---| +| **Origin** | `old_tests/API/V2/CreateTeamTest.php` | +| **Tests** | 1 | +| **Tier** | B | + +**Scenarios**: +- Creating a team with member UIDs returns the new team with members attached + +--- + +### 15. Project URLs API + +| | | +|---|---| +| **Origin** | `old_tests/API/V2/ProjectUrlsTest.php` | +| **Tests** | 1 | +| **Tier** | B | + +**Scenarios**: +- `GET /api/v2/projects/{id}/urls` returns translate and revise URLs for all jobs + +--- + +### 16. API Key Authentication (V1) + +| | | +|---|---| +| **Origin** | `old_tests/API/V1/NewWithOwnershipTest.php` | +| **Tests** | 3 | +| **Tier** | B | + +**Scenarios**: +- Valid API key creates project owned by the key's user +- Invalid API key returns 401 +- No API key creates project under anonymous/default assignment + +--- + +### 17. Project Status API (V1) + +| | | +|---|---| +| **Origin** | `old_tests/API/V1/StatusTest.php` | +| **Tests** | 3 | +| **Tier** | B | + +**Scenarios**: +- `/api/status` on a new project returns `DOING` with 0% progress +- `/api/status` on a fully translated project returns appropriate completion percentage +- Response includes `analyze`, `create`, and `translate` phase information + +--- + +### 18. Language Code Validation (V1) + +| | | +|---|---| +| **Origin** | `old_tests/API/V1/ValidateSourceAndTargetLanguagesTest.php` | +| **Tests** | 2 | +| **Tier** | B | + +**Scenarios**: +- Valid RFC 5646 language codes are accepted +- Invalid language codes return a validation error + +--- + +### 19. Project Type Metadata (V1) + +| | | +|---|---| +| **Origin** | `old_tests/API/V1/NewWithRevisionTypeTest.php` | +| **Tests** | 1 | +| **Tier** | B | + +**Scenarios**: +- `project_type` parameter is stored in project metadata + +--- + +### 20. Personal Team Assignment (V1) + +| | | +|---|---| +| **Origin** | `old_tests/API/V1/NewWithTeamTest.php` | +| **Tests** | 1 | +| **Tier** | B | + +**Scenarios**: +- Project created via API is assigned to the user's personal team + +--- + +### 21. TM Key Association (V1) + +| | | +|---|---| +| **Origin** | `old_tests/API/V1/NewWithPrivateTMKeyTest.php` | +| **Tests** | 1 | +| **Tier** | B | + +**Scenarios**: +- Providing a private TM key during project creation associates it with the project + +--- + +### 22. TM Key via UI Flow + +| | | +|---|---| +| **Origin** | `old_tests/CreateProjectController/setPrivateTMKeyTest.php` | +| **Tests** | 2 | +| **Tier** | B | + +**Scenarios**: +- TM key set through the project creation form is stored +- Multiple TM keys can be associated + +--- + +### 23. Language Validation via UI Flow + +| | | +|---|---| +| **Origin** | `old_tests/CreateProjectController/sourceAndTargetLangValidationTest.php` | +| **Tests** | 2 | +| **Tier** | B | + +**Scenarios**: +- Invalid source language in the creation form returns error +- Invalid target language in the creation form returns error + +--- + +## Support Infrastructure Notes + +The deleted `old_tests/` also contained helper code worth noting for anyone writing future integration tests: + +- **`old_tests/functions.php`** (324 lines) — Helper functions `integrationCreateTestProject()`, `splitJob()`, `mergeJob()` that encode real workflow sequences (create project → wait for analysis → split → translate → merge). These sequences document the correct API call order for end-to-end testing. + +- **`old_tests/FixturesLoader.php`** — A YAML-to-DAO fixture insertion pattern. File paths were broken but the pattern (load YAML, hydrate structs, insert via DAO) is worth considering for future test data setup. + +- **All data/fixture files** (`old_tests/resources/`, `old_tests/support/`) — 100% redundant with `tests/resources/`. No unique test data was lost. + +--- + +## Summary + +| Tier | Scenarios | Test Methods | +|---|---|---| +| A (High Value) | 5 | 25 | +| B (Moderate Value) | 18 | 31 | +| **Total** | **23** | **56** | + +Three additional test files (`GetSegmentsTest`, `Functions_Test`, `FixturesLoader`) were classified as **dead code** — empty classes, broken fixtures, or utility-only with no assertions — and are not included above. diff --git a/docs/reviews/remaining-actionable-items.md b/docs/reviews/remaining-actionable-items.md new file mode 100644 index 0000000000..9ab0fdf1b2 --- /dev/null +++ b/docs/reviews/remaining-actionable-items.md @@ -0,0 +1,72 @@ +# Remaining Actionable Items + +> **Branch:** `context-review` +> **Created:** 2026-04-07 +> **Source:** `.sisyphus/drafts/codebase-remediation.md`, feature spec §10.8, `old-tests-valuable-scenarios.md` + +--- + +## B — Codebase Remediation + +> Source document: `docs/reviews/2026-04-03-codebase-review.md` +> Validated: 2026-04-07 (3 parallel explore agents cross-checked all claims) + +### Tier 1 — Quick Wins (hours each) + +| # | Item | Scope | Detail | Status | +| ---- | ------------------------------ | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| QW-1 | Delete `old_tests/` | 102 files | Scenarios extracted to `old-tests-valuable-scenarios.md` | ✅ Done | +| QW-2 | Fix `->escape()` calls | 7 calls, 2 files | `SearchModel.php:209,239,245` + `UserDao.php:407-410` — replace with parameterized queries | ✅ Done | +| QW-3 | Fix `$_POST/$_GET/$_FILES` | 9 files | Replace `$_POST` with `$this->params` (3 files) + replace `$_FILES` with Klein `$this->request->files()` (6 files) + refactor `TMSService::uploadFile()` and `UploadHandler` to accept injected file arrays | ✅ Done | +| QW-4 | Type `VersionHandlerInterface` | 1 interface | Add `@return array{...}` shape docblock to `propagateTranslation()` | ✅ Done | + +### Tier 2 — Targeted Fixes (days each) + +| # | Item | Scope | Detail | Status | +| ---- | ------------------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- | +| TF-1 | Fix `Database.php` bug line 319 | 1 file, 2 callers | ON DUPLICATE KEY bind values lost — **data corruption risk** | ✅ Done | +| TF-2 | Fix `$_POST/$_GET/$_REQUEST/$_SERVER` in moderate controllers | 6 files, 11 replacements | Replaced superglobals in diagnostic/logging code across `DownloadOriginalController`, `DownloadController`, `GetTagProjectionController`, `SetTranslationController`, `ChangeJobsStatusController`, `OutsourceTo/AbstractController` — TDD regression guard added (`SuperglobalEliminationTest`) | ✅ Done | +| TF-3 | Extract `SetTranslationController::translate()` | 314-line method | Decomposed into 5 private methods (`prepareTranslation`, `buildNewTranslation`, `persistTranslation`, `buildResult`, `finalizeTranslation`) — translate() now a ~25-line orchestrator. Strategy B+C with structural regression guard + TDD. 6 unit tests, 42 assertions. | ✅ Done | + +### Tier 3 — Structural Refactors (weeks/months) + +| # | Item | Scope | Detail | Status | +| ---- | ------------------------------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- | +| SR-1 | `Database::obtain()` singleton | 311 calls in 99 files | Replace with injected connection | ⬜ | +| SR-2 | Split `ProjectStructure` | 83 properties, 6 lifecycle groups | God object decomposition | ⬜ | +| SR-3 | Break up Controllers | 4,221 total lines, 4 controllers | `NewController` 1337 LOC, `SetTranslationController` 1030 LOC | ⬜ | +| SR-4 | Dissolve `CatUtils` + `Utils` | 1,992 lines, 69 static methods | Static utility god classes | ⬜ | +| SR-5 | Type FeatureSet dispatch | 44 hooks, 46 new files | **Complete.** Phase 1: @method annotations + 5 inconsistencies fixed. Phase 1.5: 20 unused hooks removed, 5 snake_case→camelCase. Phase 2: typed Event DTOs (`FilterEvent`/`RunEvent` base + 44 event classes), `dispatchFilter()`/`dispatchRun()` on FeatureSet, all call sites + handlers migrated. Zero string dispatch remaining. See `docs/featureset-hooks-changelog.md` | ✅ Done | + +--- + +## C — In-Context Review Feature + +> Source: feature spec `docs/2026-03_26-11:16-in-context-review-feature-development-spec.md` §10.8 + +| # | Item | Status | Detail | +| --- | ---------------------------------------- | -------------- | --------------------------------------------------------------------------- | +| C.1 | Screenshot display | ❌ Not started | Backend stores `screenshot` field, no frontend consumer | +| C.2 | `id_content` / `id_order` rendering | ❌ Not started | Backend serves fields, no frontend consumer | +| C.3 | Review workflow states | ❌ Not started | No state machine or status transitions | +| C.4 | `x-client_nodepath` strategy | ⚠️ Stub | Returns `null` — falls through to text matching | +| C.5 | File-level `` attribute extraction | ⚠️ Future | Parser doesn't extract `` attributes; `FilesMetadataMarshaller` ready | + +--- + +## D — Test Coverage Expansion + +> Source: `docs/reviews/old-tests-valuable-scenarios.md` + +23 test scenario families (56 test methods) extracted from `old_tests/` as candidates for reimplementation in the modern `tests/` suite. These are a reference catalog, not active tasks. Consult the document when expanding test coverage. + +--- + +## Priority Matrix + +| Priority | Items | Key risk | +| -------------- | ------------------------------------------------ | ---------------------------------------- | +| **High** | ~~TF-1~~ (Database bug) | Data corruption on ON DUPLICATE KEY | +| **Medium** | ~~QW-2~~, ~~QW-3~~, ~~QW-4~~, ~~TF-2~~, ~~TF-3~~ | Tech debt / SQL injection surface | +| **Low / Team** | C.1–C.5 (frontend features) | Depends on frontend team | +| **Long-term** | SR-1 through SR-4 (SR-5 done) | Architectural debt, needs appetite check | diff --git a/docs/reviews/sr5-featureset-hook-typing-roadmap.md b/docs/reviews/sr5-featureset-hook-typing-roadmap.md new file mode 100644 index 0000000000..e7cb199075 --- /dev/null +++ b/docs/reviews/sr5-featureset-hook-typing-roadmap.md @@ -0,0 +1,151 @@ +# SR-5: Type FeatureSet Hook Dispatch — Roadmap + +> **Created:** 2026-04-07 +> **Phase 1:** @method annotations on FeatureSet.php + inconsistency fixes (COMPLETE) +> **Phase 2:** Interface contracts per domain (FUTURE) + +--- + +## Current State + +`FeatureSet::filter()` and `FeatureSet::run()` dispatch hooks via string names and `func_get_args()` + +`call_user_func_array()`. Zero type safety at dispatch time. + +### Inventory + +| Metric | Count | +|-----------------------------|--------------------| +| Unique hook names | 62 | +| Filter hooks | 40 (52 call sites) | +| Run hooks | 22 (23 call sites) | +| Hooks with handlers in repo | 11 (18%) | +| Hooks with NO handler | 51 (82%) | +| Plugin classes | 5 active | + +### Plugin Hierarchy + +``` +IBaseFeature (interface) + └─ BaseFeature (abstract) + ├─ AbstractRevisionFeature + │ ├─ ReviewExtended + │ └─ SecondPassReview + ├─ ProjectCompletion + ├─ TranslationVersions + └─ UnknownFeature +``` + +### Handler Typing State (existing handlers only) + +- Parameter types: 85% covered +- Return types: 100% covered +- PHPDoc: 43% covered +- Dispatch-time validation: **0%** + +--- + +## Phase 2 — Interface Contracts per Domain (FUTURE) + +### Goal + +Replace `method_exists()` discovery with `instanceof` checks against typed interfaces. Plugins implement domain-specific +interfaces instead of matching method names by convention. + +### Domain Grouping + +| Interface | Hooks | Count | +|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------| +| `TranslationHooksInterface` | setTranslationCommitted, postAddSegmentTranslation, filterSetTranslationResult, rewriteContributionContexts, filterContributionStructOnSetTranslation, filterContributionStructOnMTSet | 6 | +| `ProjectLifecycleHooksInterface` | validateProjectCreation, beforeProjectCreation, postProjectCreate, postProjectCommit, filterCreateProjectFeatures, filter_team_for_project_creation, handleJsonNotesBeforeInsert, handleTUContextGroups, filterProjectDependencies | 9 | +| `JobManagementHooksInterface` | validateJobCreation, postJobSplitted, postJobMerged, checkSplitAccess, job_password_changed, review_password_changed, project_password_changed | 7 | +| `AnalysisHooksInterface` | analysisBeforeMTGetContribution, afterTMAnalysisCloseProject, tmAnalysisDisabled, fastAnalysisComplete, filterPayableRates, wordCount | 6 | +| `QAValidationHooksInterface` | checkTagMismatch, checkTagPositions, injectExcludedTagsInQa, characterLengthCount, filterGlobalWarnings, filterSegmentWarnings | 6 | +| `ReviewHooksInterface` | chunkReviewUpdated, alter_chunk_review_struct, filterIsChunkCompletionUndoable, filter_job_password_to_review_password, project_completion_event_saved, filterRevisionChangeNotificationList | 6 | +| `SegmentHooksInterface` | filterGetSegmentsResult, prepareNotesForRendering, prepareAllNotes, processExtractedJsonNotes, populatePreTranslations, doNotManageAlternativeTranslations | 6 | +| `ProjectCreationHooksInterface` | sanitizeOriginalDataMap, correctTagErrors, appendFieldToAnalysisObject, decodeInstructions, encodeInstructions | 5 | +| `UIHooksInterface` | appendInitialTemplateVars, filterActivityLogEntry, filterCreationStatus, filterProjectNameModified, outsourceAvailableInfo, projectUrls, isAnInternalUser, overrideConversionResult | 8 | +| `InternalHooksInterface` | filterFeaturesMerged, bootstrapCompleted, processZIPDownloadPreview, filterMyMemoryGetParameters | 4 | + +### Migration Strategy + +1. Create interfaces with typed method signatures +2. Make `BaseFeature` implement all interfaces with default no-op methods +3. In `FeatureSet`, add `instanceof` check before `method_exists()` — both paths work during migration +4. Gradually remove `method_exists()` fallback as all plugins are migrated +5. External/proprietary plugins get a migration window + +### Effort + +- **1-2 weeks** +- 10+ new interface files +- Modify BaseFeature, all plugin subclasses +- Modify FeatureSet dispatch logic +- Risk: **Medium** (external plugin compatibility) + +### Key Constraint + +51 of 62 hooks have no handler in this repository — they're implemented by external/proprietary plugins. Any Phase 3 +change MUST maintain backward compatibility with those unseen plugins via the `method_exists()` fallback path during +migration. + +--- + +## Hook Naming Convention + +### Current State + +Hook names follow two conventions with no clear migration path: + +| Convention | Count | Examples | +|----------------|-------|---------------------------------------------------------------------------------------------------| +| **camelCase** | ~45 | `filterGetSegmentsResult`, `postProjectCreate`, `handleTUContextGroups`, `outsourceAvailableInfo` | +| **snake_case** | ~17 | `filter_team_for_project_creation`, `job_password_changed`, `alter_chunk_review_struct` | + +### Domain Clustering + +Snake_case hooks cluster around specific domains: + +- **Password lifecycle:** `job_password_changed`, `review_password_changed`, `project_password_changed` +- **Team/project creation:** `filter_team_for_project_creation` +- **Review/completion:** `alter_chunk_review_struct`, `filter_job_password_to_review_password`, + `project_completion_event_saved` + +### Decision: Document, Don't Rename + +Renaming hooks is a **backward-incompatible change** — every plugin implementing the hook by method name would break. +Since 51 of 62 hooks are implemented by external/proprietary plugins outside this repository, renaming is not viable +without a coordinated migration. + +**Policy:** + +- **Existing hooks:** Keep current naming as-is (camelCase or snake_case) +- **New hooks:** Use **camelCase** (aligns with PHP PSR-1 method naming and the 73% majority) +- **Phase 3 interfaces:** Will normalize naming through typed interface method names, decoupling the string hook name + from the PHP method name + +--- + +## Inconsistencies Found & Resolved + +1. **`rewriteContributionContexts`** — `@method` annotation param named `$contextData`, handlers use `$postInput`, call + sites pass `$this->data`/`$request`. All carry `context_before`/`context_after` keys. + - **Resolution:** ✅ Renamed annotation param to `$requestData` (reflects both call sites accurately) + +2. **Hook naming conventions are mixed** — ~45 camelCase vs ~17 snake_case. + - **Resolution:** ✅ Documented in "Hook Naming Convention" section above. Policy: keep existing, new hooks use + camelCase. + +3. **`filterProjectNameModified` ignores return value** — caller uses `filter()` but discards result, making it + effectively a run hook. + - **Resolution:** ✅ Changed call site from `filter()` to `run()`, moved `@method` annotation to run section with + `void` return. + +4. **`handleTUContextGroups` ignores return value** — same pattern. Object mutation via reference makes filter + unnecessary. + - **Resolution:** ✅ Changed call site from `filter()` to `run()`, moved `@method` annotation to run section with + `void` return. + +5. **`alter_chunk_review_struct` ignores return value** — handler in `AbstractRevisionFeature` mutates + `CompletionEventStruct` properties directly via reference. + - **Resolution:** ✅ Changed call site from `filter()` to `run()`, moved `@method` annotation to run section with + `void` return. diff --git a/docs/xfetch-log-curve.png b/docs/xfetch-log-curve.png new file mode 100644 index 0000000000..5bb1956c53 Binary files /dev/null and b/docs/xfetch-log-curve.png differ diff --git a/lib/Bootstrap.php b/lib/Bootstrap.php index b00ef4ec5a..f40cec7366 100644 --- a/lib/Bootstrap.php +++ b/lib/Bootstrap.php @@ -68,7 +68,6 @@ private function __construct(SplFileInfo $config_file = null, SplFileInfo $task_ $this->initMandatoryPlugins(); - $this->notifyBootCompleted(); $this->unsetVariables(); } @@ -158,11 +157,6 @@ private function initMandatoryPlugins(): void $this->autoLoadedFeatureSet = new FeatureSet(); } - private function notifyBootCompleted(): void - { - $this->autoLoadedFeatureSet->run('bootstrapCompleted'); - } - /** * @throws Exception */ diff --git a/lib/Controller/API/App/ChangeJobsStatusController.php b/lib/Controller/API/App/ChangeJobsStatusController.php index 3c08cfa688..d9636528ed 100644 --- a/lib/Controller/API/App/ChangeJobsStatusController.php +++ b/lib/Controller/API/App/ChangeJobsStatusController.php @@ -35,7 +35,7 @@ public function changeStatus(): void try { $project = ProjectDao::findByIdAndPassword($request['res_id'], $request['password']); } catch (Exception) { - $msg = "Error : wrong password provided for Change Project Status \n\n " . var_export($_POST, true) . "\n"; + $msg = "Error : wrong password provided for Change Project Status \n\n " . var_export($this->request->paramsPost()->all(), true) . "\n"; $this->logger->debug($msg); Utils::sendErrMailReport($msg); throw new NotFoundException("Job not found"); @@ -53,7 +53,7 @@ public function changeStatus(): void try { $firstChunk = ChunkDao::getByIdAndPassword($request['res_id'], $request['password']); } catch (Exception) { - $msg = "Error : wrong password provided for Change Job Status \n\n " . var_export($_POST, true) . "\n"; + $msg = "Error : wrong password provided for Change Job Status \n\n " . var_export($this->request->paramsPost()->all(), true) . "\n"; $this->logger->debug($msg); Utils::sendErrMailReport($msg); throw new NotFoundException("Job not found"); diff --git a/lib/Controller/API/App/CompletionEventController.php b/lib/Controller/API/App/CompletionEventController.php index 9826019cad..1074f57da3 100644 --- a/lib/Controller/API/App/CompletionEventController.php +++ b/lib/Controller/API/App/CompletionEventController.php @@ -17,8 +17,8 @@ use Model\ChunksCompletion\ChunkCompletionEventStruct; use Model\DataAccess\Database; use Model\Exceptions\NotFoundException; +use Model\FeaturesBase\Hook\Event\Run\AlterChunkReviewStructEvent; use Model\Jobs\JobStruct; -use Model\Projects\ProjectStruct; class CompletionEventController extends KleinController { @@ -28,11 +28,6 @@ class CompletionEventController extends KleinController */ protected JobStruct $chunk; - /** - * @var ProjectStruct - */ - protected ProjectStruct $project; - /** * @var ChunkCompletionEventStruct */ @@ -54,11 +49,8 @@ protected function afterConstruct(): void } $this->chunk = $Validator->getChunk(); - - $project = $this->chunk->getProject(60 * 60); - $this->project = $project; $this->event = $event; - $this->featureSet->loadForProject($project); + $this->featureSet->loadForProject($this->chunk->getProject(60 * 60)); }); $this->appendValidator($Validator); @@ -69,15 +61,9 @@ protected function afterConstruct(): void */ public function delete(): void { - $undoable = $this->featureSet->filter('filterIsChunkCompletionUndoable', true, $this->project, $this->chunk); - - if ($undoable) { - $this->__performUndo(); - $this->response->code(200); - $this->response->send(); - } else { - $this->response->code(400); - } + $this->__performUndo(); + $this->response->code(200); + $this->response->send(); } /** @@ -90,10 +76,10 @@ private function __performUndo(): void /** * This method means to allow project_completion to work alone, the undo feature belongs to AbstractRevisionFeature */ - $this->featureSet->filter('alter_chunk_review_struct', $this->event); + $this->featureSet->dispatchRun(new AlterChunkReviewStructEvent($this->event)); (new ChunkCompletionEventDao())->deleteEvent($this->event); Database::obtain()->commit(); } -} \ No newline at end of file +} diff --git a/lib/Controller/API/App/ContextUrlController.php b/lib/Controller/API/App/ContextUrlController.php new file mode 100644 index 0000000000..0bf3920692 --- /dev/null +++ b/lib/Controller/API/App/ContextUrlController.php @@ -0,0 +1,124 @@ +appendValidator(new LoginValidator($this)); + } + + /** + * @throws Exception + */ + public function setForProject(): void + { + $idProject = filter_var($this->request->param('id_project'), FILTER_VALIDATE_INT); + $contextUrl = trim((string)$this->request->param('context_url')); + + if (empty($idProject)) { + throw new InvalidArgumentException('Missing or invalid id_project', 400); + } + + if (empty($contextUrl)) { + throw new InvalidArgumentException('Missing or empty context_url', 400); + } + + $dao = new ProjectsMetadataDao(); + $dao->set($idProject, ProjectsMetadataMarshaller::CONTEXT_URL->value, $contextUrl); + + $this->response->json([ + 'level' => 'project', + 'id_project' => (int)$idProject, + 'context_url' => $contextUrl, + ]); + } + + /** + * @throws Exception + */ + public function setForFile(): void + { + $idProject = filter_var($this->request->param('id_project'), FILTER_VALIDATE_INT); + $idFile = filter_var($this->request->param('id_file'), FILTER_VALIDATE_INT); + $contextUrl = trim((string)$this->request->param('context_url')); + + if (empty($idFile)) { + throw new InvalidArgumentException('Missing or invalid id_file', 400); + } + + if (empty($contextUrl)) { + throw new InvalidArgumentException('Missing or empty context_url', 400); + } + + if (empty($idProject)) { + $file = FileDao::getById($idFile); + if (!$file) { + throw new InvalidArgumentException('File not found for id_file: ' . $idFile, 404); + } + $idProject = $file->id_project; + } + + $dao = new FilesMetadataDao(); + $existing = $dao->get($idProject, $idFile, FilesMetadataMarshaller::CONTEXT_URL->value); + if ($existing) { + $dao->update($idProject, $idFile, FilesMetadataMarshaller::CONTEXT_URL->value, $contextUrl); + } else { + $dao->insert($idProject, $idFile, FilesMetadataMarshaller::CONTEXT_URL->value, $contextUrl); + } + + $this->response->json([ + 'level' => 'file', + 'id_project' => (int)$idProject, + 'id_file' => (int)$idFile, + 'context_url' => $contextUrl, + ]); + } + + /** + * @throws Exception + */ + public function setForSegment(): void + { + $idSegment = filter_var($this->request->param('id_segment'), FILTER_VALIDATE_INT); + $contextUrl = trim((string)$this->request->param('context_url')); + + if (empty($idSegment)) { + throw new InvalidArgumentException('Missing or invalid id_segment', 400); + } + + if (empty($contextUrl)) { + throw new InvalidArgumentException('Missing or empty context_url', 400); + } + + $marshalled = SegmentMetadataMarshaller::CONTEXT_URL->marshall($contextUrl); + if ($marshalled === null) { + throw new InvalidArgumentException('Invalid context_url value', 400); + } + + SegmentMetadataDao::upsert( + $idSegment, + SegmentMetadataMarshaller::CONTEXT_URL->value, + $marshalled + ); + + $this->response->json([ + 'level' => 'segment', + 'id_segment' => (int)$idSegment, + 'context_url' => $contextUrl, + ]); + } +} diff --git a/lib/Controller/API/App/CreateProjectController.php b/lib/Controller/API/App/CreateProjectController.php index c7cf4fc3c8..78a339b8f4 100644 --- a/lib/Controller/API/App/CreateProjectController.php +++ b/lib/Controller/API/App/CreateProjectController.php @@ -12,6 +12,7 @@ use Matecat\Locales\Languages; use Model\ConnectedServices\GDrive\Session; use Model\DataAccess\Database; +use Model\FeaturesBase\Hook\Event\Filter\FilterCreateProjectFeaturesEvent; use Model\FilesStorage\FilesStorageFactory; use Model\Jobs\JobsMetadataMarshaller; use Model\LQA\QAModelTemplate\QAModelTemplateDao; @@ -731,12 +732,10 @@ private function appendFeaturesToProject(int $mt_engine): array { $projectFeatures = []; - return $this->featureSet->filter( - 'filterCreateProjectFeatures', - $projectFeatures, - $this, - $mt_engine - ); + $filterCreateProjectFeaturesEvent = new FilterCreateProjectFeaturesEvent($projectFeatures, $this); + $this->featureSet->dispatchFilter($filterCreateProjectFeaturesEvent); + + return $filterCreateProjectFeaturesEvent->getProjectFeatures(); } /** @@ -893,4 +892,4 @@ private function assignLastCreatedPid($pid): void $_SESSION['redeem_project'] = false; $_SESSION['last_created_pid'] = $pid; } -} \ No newline at end of file +} diff --git a/lib/Controller/API/App/FilesController.php b/lib/Controller/API/App/FilesController.php index 7af3eaf261..61b736dec8 100644 --- a/lib/Controller/API/App/FilesController.php +++ b/lib/Controller/API/App/FilesController.php @@ -26,12 +26,12 @@ class FilesController extends AbstractStatefulKleinController public function segments(): void { // `file_part_id` has the priority - if (isset($_POST['file_part_id'])) { - $filePartId = $_POST['file_part_id']; + if (isset($this->params['file_part_id'])) { + $filePartId = $this->params['file_part_id']; $this->validateInteger($filePartId); $this->getFirstAndLastSegmentFromFilePartId($filePartId); - } elseif (isset($_POST['file_id'])) { - $fileId = $_POST['file_id']; + } elseif (isset($this->params['file_id'])) { + $fileId = $this->params['file_id']; $this->validateInteger($fileId); $this->getFirstAndLastSegmentFromFileId($fileId); } else { diff --git a/lib/Controller/API/App/GetContributionController.php b/lib/Controller/API/App/GetContributionController.php index b9eaa7a148..303ea70ad9 100644 --- a/lib/Controller/API/App/GetContributionController.php +++ b/lib/Controller/API/App/GetContributionController.php @@ -12,6 +12,7 @@ use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\RewriteContributionContextsEvent; use Model\Files\FilesPartsDao; use Model\Jobs\ChunkDao; use Model\Jobs\JobsMetadataMarshaller; @@ -325,7 +326,10 @@ private function rewriteContributionContexts(array &$request, MateCatFilter $Fil ] ); - $featureSet->filter('rewriteContributionContexts', $segmentsList, $request); + $rewriteContributionContextsEvent = new RewriteContributionContextsEvent($segmentsList, $request); + $featureSet->dispatchFilter($rewriteContributionContextsEvent); + $segmentsList = $rewriteContributionContextsEvent->getSegmentsList(); + $request = $rewriteContributionContextsEvent->getRequestData(); if ($segmentsList->id_before) { $request['context_before'] = $Filter->fromLayer0ToLayer1($segmentsList->id_before->segment); @@ -352,4 +356,4 @@ private function getCrossLanguages($cross_language): array { return !empty($cross_language) ? explode(",", rtrim($cross_language[0], ',')) : []; } -} \ No newline at end of file +} diff --git a/lib/Controller/API/App/GetSearchController.php b/lib/Controller/API/App/GetSearchController.php index 103d39bc9b..0f16820229 100644 --- a/lib/Controller/API/App/GetSearchController.php +++ b/lib/Controller/API/App/GetSearchController.php @@ -10,6 +10,7 @@ use Matecat\SubFiltering\MateCatFilter; use Model\DataAccess\Database; use Model\Exceptions\NotFoundException; +use Model\FeaturesBase\Hook\Event\Run\SetTranslationCommittedEvent; use Model\Jobs\ChunkDao; use Model\Jobs\JobStruct; use Model\Jobs\MetadataDao; @@ -300,7 +301,7 @@ private function getSegmentForUndoReplaceAll(ReplaceHistory $srh): array /** * @param array{ - * queryParams: string, + * queryParams: SearchQueryParamsStruct, * source?: string, * target?: string, * status_only?: bool, @@ -313,7 +314,9 @@ private function getSegmentForUndoReplaceAll(ReplaceHistory $srh): array */ private function doSearch(array $request): array { - $queryParams = $request['queryParams']; + $queryParams = $request['queryParams'] instanceof SearchQueryParamsStruct + ? $request['queryParams'] + : new SearchQueryParamsStruct($request['queryParams']); if (!empty($request['source']) and !empty($request['target'])) { $queryParams['key'] = 'coupled'; @@ -458,7 +461,7 @@ private function updateSegments(array $search_results, int $id_job, string $pass // setTranslationCommitted try { - $this->featureSet->run('setTranslationCommitted', [ + $this->featureSet->dispatchRun(new SetTranslationCommittedEvent([ 'translation' => $new_translation, 'old_translation' => $old_translation, 'propagated_ids' => $propagationTotal['propagated_ids'], @@ -466,7 +469,7 @@ private function updateSegments(array $search_results, int $id_job, string $pass 'segment' => $segment, 'user' => $this->user, 'source_page_code' => ReviewUtils::revisionNumberToSourcePage($revisionNumber) - ]); + ])); } catch (Exception $e) { $this->logger->debug("Exception in setTranslationCommitted callback . " . $e->getMessage() . "\n" . $e->getTraceAsString()); diff --git a/lib/Controller/API/App/GetSegmentsController.php b/lib/Controller/API/App/GetSegmentsController.php index 505f7f6851..2ff5f4d9dd 100644 --- a/lib/Controller/API/App/GetSegmentsController.php +++ b/lib/Controller/API/App/GetSegmentsController.php @@ -13,11 +13,16 @@ use Matecat\SubFiltering\MateCatFilter; use Model\Conversion\ZipArchiveHandler; use Model\Exceptions\ValidationError; +use Model\FeaturesBase\Hook\Event\Filter\FilterGetSegmentsResultEvent; +use Model\FeaturesBase\Hook\Event\Filter\PrepareNotesForRenderingEvent; +use Model\Files\FilesMetadataMarshaller; +use Model\Files\MetadataDao as FilesMetadataDao; use Model\Jobs\ChunkDao; use Model\Jobs\MetadataDao; use Model\Projects\MetadataDao as ProjectMetadataDao; use Model\Projects\ProjectsMetadataMarshaller; use Model\Segments\ContextGroupDao; +use Model\Segments\ContextUrlResolver; use Model\Segments\SegmentDao; use Model\Segments\SegmentMetadataDao; use Model\Segments\SegmentNoteDao; @@ -92,6 +97,14 @@ public function segments(): void $projectMetadata = new ProjectMetadataDao(); $icu_enabled = $projectMetadata->setCacheTTL(60 * 60 * 24)->get($project->id, ProjectsMetadataMarshaller::ICU_ENABLED->value)?->value ?? false; + $projectContextUrl = $projectMetadata->setCacheTTL(60 * 60 * 24)->get( + $project->id, + ProjectsMetadataMarshaller::CONTEXT_URL->value + )?->value; + + $filesMetadataDao = new FilesMetadataDao(); + $fileContextUrls = []; + foreach ($data as $seg) { $id_file = $seg['id_file']; @@ -103,6 +116,12 @@ public function segments(): void $res[$id_file]['source_code'] = $job->source; $res[$id_file]['target_code'] = $job->target; $res[$id_file]['segments'] = []; + + $fileContextUrls[$id_file] = $filesMetadataDao->setCacheTTL(60 * 60 * 24)->get( + $project->id, + $id_file, + FilesMetadataMarshaller::CONTEXT_URL->value + )?->value; } if (isset($seg['edit_distance'])) { @@ -156,7 +175,13 @@ public function segments(): void $seg['translation'] = $Filter->fromLayer1ToLayer2($Filter->realignIDInLayer1($seg['segment'], $seg['translation'])); $seg['segment'] = $Filter->fromLayer1ToLayer2($seg['segment']); - $seg['metadata'] = SegmentMetadataDao::getAll($seg['sid']); + $segmentMetadata = SegmentMetadataDao::getAll($seg['sid']); + $seg['metadata'] = $segmentMetadata->jsonSerialize(); + $seg['context_url'] = ContextUrlResolver::resolve( + $segmentMetadata, + $fileContextUrls[$id_file] ?? null, + $projectContextUrl + ); $this->attachNotes($seg, $segment_notes); $this->attachContexts($seg, $contexts); @@ -170,7 +195,9 @@ public function segments(): void $result['data']['files'] = $res; $result['data']['where'] = $where; - $result['data'] = $featureSet->filter('filterGetSegmentsResult', $result['data'], $job); + $filterGetSegmentsResultEvent = new FilterGetSegmentsResultEvent($result['data'], $job); + $featureSet->dispatchFilter($filterGetSegmentsResultEvent); + $result['data'] = $filterGetSegmentsResultEvent->getData(); $this->response->json($result); } @@ -226,7 +253,9 @@ private function attachNotes(SegmentUIStruct &$segment, array $segment_notes): v $notes = $segment_notes[(int)$segment['sid']] ?? null; if (is_array($notes)) { - $notes = $this->featureSet->filter('prepareNotesForRendering', $notes); + $prepareNotesForRenderingEvent = new PrepareNotesForRenderingEvent($notes); + $this->featureSet->dispatchFilter($prepareNotesForRenderingEvent); + $notes = $prepareNotesForRenderingEvent->getNotes(); } $segment['notes'] = $notes; @@ -245,11 +274,6 @@ private function attachContexts(SegmentUIStruct &$segment, array $contexts): voi * @param $segments * * @return array - * @throws AuthenticationError - * @throws \Model\Exceptions\NotFoundException - * @throws ValidationError - * @throws EndQueueException - * @throws ReQueueException */ private function prepareNotes($segments): array { @@ -258,15 +282,6 @@ private function prepareNotes($segments): array $last = end($segments); $stop = $last['sid']; - if ($this->featureSet->filter('prepareAllNotes', false)) { - $segment_notes = SegmentNoteDao::getAllAggregatedBySegmentIdInInterval($start, $stop); - foreach ($segment_notes as $k => $noteObj) { - $segment_notes[$k][0]['json'] = json_decode($noteObj[0]['json'], true); - } - - return $this->featureSet->filter('processExtractedJsonNotes', $segment_notes); - } - return SegmentNoteDao::getAggregatedBySegmentIdInInterval($start, $stop); } @@ -291,4 +306,4 @@ private function getContextGroups($segments): array return []; } -} \ No newline at end of file +} diff --git a/lib/Controller/API/App/GetTagProjectionController.php b/lib/Controller/API/App/GetTagProjectionController.php index ae435e9bce..2f22c030cd 100644 --- a/lib/Controller/API/App/GetTagProjectionController.php +++ b/lib/Controller/API/App/GetTagProjectionController.php @@ -116,7 +116,7 @@ private function validateTheRequest(): array } if (empty($id_job)) { - $msg = "\n\n Critical. Quit. \n\n " . var_export($_POST, true); + $msg = "\n\n Critical. Quit. \n\n " . var_export($this->request->paramsPost()->all(), true); $this->logger->debug($msg); Utils::sendErrMailReport($msg); diff --git a/lib/Controller/API/App/GetWarningController.php b/lib/Controller/API/App/GetWarningController.php index 883b149daf..d9cf62a1a4 100644 --- a/lib/Controller/API/App/GetWarningController.php +++ b/lib/Controller/API/App/GetWarningController.php @@ -18,6 +18,7 @@ use Model\Jobs\MetadataDao; use Model\Segments\SegmentDao; use Model\Segments\SegmentMetadataDao; +use Model\Segments\SegmentMetadataMarshaller; use Model\Segments\SegmentOriginalDataDao; use Model\Translations\WarningDao; use Utils\LQA\ICUSourceSegmentChecker; @@ -66,10 +67,6 @@ public function global(): void $qa->render() ); - $result = $this->featureSet->filter('filterGlobalWarnings', $result, [ - 'chunk' => $chunk, - ]); - $this->response->json($result); } catch (Exception) { $this->response->json([ @@ -157,7 +154,7 @@ public function local(): void $QA->setTargetSegLang($chunk->target); if (!$this->sourceContainsIcu && isset($characters_counter)) { - $QA->setCharactersCount($characters_counter, SegmentMetadataDao::get($id, QA::SIZE_RESTRICTION)[0] ?? null); + $QA->setCharactersCount($characters_counter, SegmentMetadataDao::get($id, SegmentMetadataMarshaller::SIZE_RESTRICTION->value)[0] ?? null); } $QA->performConsistencyCheck(); @@ -167,7 +164,6 @@ public function local(): void 'data' => [], 'errors' => [] ], - $this->invokeLocalWarningsOnFeatures($chunk, $src_content, $trg_content), (new QALocalWarning( $QA, $id, @@ -243,26 +239,4 @@ private function getChunk($id_job, $password): ?JobStruct return $chunk; } - /** - * @param JobStruct $chunk - * @param $src_content - * @param $trg_content - * - * @return array - * @throws Exception - */ - private function invokeLocalWarningsOnFeatures(JobStruct $chunk, $src_content, $trg_content): array - { - $data = []; - $data = $this->featureSet->filter('filterSegmentWarnings', $data, [ - 'src_content' => $src_content, - 'trg_content' => $trg_content, - 'project' => $chunk->getProject(), - 'chunk' => $chunk - ]); - - return [ - 'data' => $data - ]; - } } diff --git a/lib/Controller/API/App/SetTranslationController.php b/lib/Controller/API/App/SetTranslationController.php index f31a0f1149..6720d83a75 100644 --- a/lib/Controller/API/App/SetTranslationController.php +++ b/lib/Controller/API/App/SetTranslationController.php @@ -19,6 +19,11 @@ use Model\EditLog\EditLogSegmentStruct; use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; +use Model\FeaturesBase\Hook\Event\Filter\FilterContributionStructOnMTSetEvent; +use Model\FeaturesBase\Hook\Event\Filter\FilterContributionStructOnSetTranslationEvent; +use Model\FeaturesBase\Hook\Event\Filter\RewriteContributionContextsEvent; +use Model\FeaturesBase\Hook\Event\Run\PostAddSegmentTranslationEvent; +use Model\FeaturesBase\Hook\Event\Run\SetTranslationCommittedEvent; use Model\Files\FilesPartsDao; use Model\Jobs\ChunkDao; use Model\Jobs\JobDao; @@ -28,6 +33,7 @@ use Model\Projects\ProjectStruct; use Model\Segments\SegmentDao; use Model\Segments\SegmentMetadataDao; +use Model\Segments\SegmentMetadataMarshaller; use Model\Segments\SegmentOriginalDataDao; use Model\Segments\SegmentStruct; use Model\Translations\SegmentTranslationDao; @@ -64,34 +70,36 @@ class SetTranslationController extends AbstractStatefulKleinController /** * @var array{ - * id_job: numeric-string, + * id_job: string, * password: string, * received_password: string, * id_segment: string, - * time_to_edit: int|numeric-string, + * time_to_edit: int|string, * id_translator: string, * translation: string, * segment: ?SegmentStruct, * segmentString: string, - * version: numeric-string|null, - * chosen_suggestion_index: int|numeric-string|null, + * version: string|null, + * chosen_suggestion_index: int|string|null, * suggestion_array: string|null, * splitStatuses: string|null, * context_before: string, * context_after: string, - * id_before: numeric-string|null, - * id_after: numeric-string|null, + * id_before: string|null, + * id_after: string|null, * revisionNumber: int|null, * guess_tag_used: bool|null, - * characters_counter: numeric-string|null, + * characters_counter: string|null, * propagate: bool|null, - * client_target_version: int|numeric-string, + * client_target_version: int|string, * status: string, * split_statuses: array, * chunk: JobStruct, * project: ProjectStruct, * id_project: int, - * segment_contains_icu: bool + * segment_contains_icu: bool, + * split_num: string|null, + * split_chunk_lengths: array|null * } */ protected array $data; @@ -114,7 +122,7 @@ class SetTranslationController extends AbstractStatefulKleinController protected MateCatFilter $filter; /** - * @var ?TranslationVersionsHandler + * @var ?VersionHandlerInterface */ protected ?VersionHandlerInterface $VersionsHandler = null; @@ -124,327 +132,450 @@ protected function afterConstruct(): void } /** - * @throws ReQueueException * @throws AuthenticationError - * @throws ValidationError - * @throws NotFoundException * @throws EndQueueException + * @throws NotFoundException + * @throws ReQueueException * @throws ReflectionException - * @throws Exception + * @throws ValidationError */ public function translate(): void { $db = Database::obtain(); try { - $this->data = $this->validateTheRequest(); - $this->checkIfSegmentIsNotDisabled(); - $this->setSubFilteringBehavior(); - $this->checkSegmentSplitData(); - $this->initVersionHandler(); - $this->getContexts(); - - $segment = $this->filter->fromLayer0ToLayer1($this->data['segment']['segment']); // this segment comes from the database when getting contexts - $translation = (empty($this->data['translation']) and !is_numeric($this->data['translation'])) ? "" : $this->filter->fromLayer2ToLayer1( - $this->data['translation'] - ); // is_numeric check is needed to allow "0" strings - - $check = $this->setQaChecks($segment, $translation); - $check->performConsistencyCheck(); - - if ($check->thereAreWarnings()) { - $err_json = $check->getWarningsJSON(); - $translation = $this->filter->fromLayer1ToLayer0($translation); - } else { - $err_json = ''; - $targetNormalized = $check->getTrgNormalized(); - $translation = $this->filter->fromLayer1ToLayer0($targetNormalized); - } - - //PATCH TO FIX BOM INSERTIONS - $translation = Utils::stripBOM($translation); + $prepared = $this->prepareTranslation(); + $translation = $prepared['translation']; + $check = $prepared['check']; + $err_json = $prepared['err_json']; /* - * begin stat counter - * - * It works well with default InnoDB Isolation level - * - * REPEATABLE-READ offering a row level lock for this id_segment - * - */ - $db->begin(); - - $old_translation = $this->getOldTranslation(); - - $client_suggestion_array = json_decode($this->data['suggestion_array'] ?? '[]', true); - $client_chosen_suggestion_params = ($this->data['chosen_suggestion_index'] !== null && isset($client_suggestion_array[$this->data['chosen_suggestion_index'] - 1])) ? $client_suggestion_array[$this->data['chosen_suggestion_index'] - 1] : []; - $client_chosen_suggestion = new ShapelessConcreteStruct($client_chosen_suggestion_params); - - $new_translation = new SegmentTranslationStruct(); - $new_translation->id_segment = $this->data['id_segment']; - $new_translation->id_job = $this->data['id_job']; - $new_translation->status = $this->data['status']; - $new_translation->segment_hash = $this->data['segment']->segment_hash; - $new_translation->translation = $translation; - $new_translation->serialized_errors_list = $err_json; - $new_translation->suggestions_array = ($this->data['chosen_suggestion_index'] !== null ? $this->data['suggestion_array'] : $old_translation->suggestions_array); - $new_translation->suggestion_position = ($this->data['chosen_suggestion_index'] !== null ? $this->data['chosen_suggestion_index'] : $old_translation->suggestion_position); - $new_translation->warning = $check->thereAreWarnings(); - $new_translation->translation_date = date("Y-m-d H:i:s"); - $new_translation->suggestion = $old_translation->suggestion; //IMPORTANT: raw_translation is in layer 0 and suggestion too - $new_translation->suggestion_source = $old_translation->suggestion_source; - $new_translation->suggestion_match = $old_translation->suggestion_match; - - // update suggestion - if ($this->canUpdateSuggestion($new_translation, $client_chosen_suggestion)) { - $new_translation->suggestion = !empty($client_chosen_suggestion->raw_translation) ? $client_chosen_suggestion->raw_translation : $old_translation->suggestion; //IMPORTANT: raw_translation is in layer 0 and suggestion too - - // update suggestion match - if ($client_chosen_suggestion->match == EngineConstants::MT) { - /** - * @var $project ProjectStruct - */ - $project = $this->data['project']; - // case 1. is MT - $new_translation->suggestion_match = $project->getMetadataValue(ProjectsMetadataMarshaller::MT_QUALITY_VALUE_IN_EDITOR->value) ?? 85; - $new_translation->suggestion_source = EngineConstants::MT; - } elseif ($client_chosen_suggestion->match == InternalMatchesConstants::NO_MATCH) { - // case 2. no match - $new_translation->suggestion_source = InternalMatchesConstants::NO_MATCH; - } else { - // case 3. otherwise is TM - $new_translation->suggestion_match = (int)$client_chosen_suggestion->match; // cast '71%' to int 71 - $new_translation->suggestion_source = EngineConstants::TM; - } - } - - $new_translation->time_to_edit = $this->data['time_to_edit']; - - /** - * Update Time to Edit and + * begin stat counter * - * Evaluate new Avg post-editing effort for the job: - * - get old translation - * - get suggestion - * - evaluate $_seg_oldPEE and normalize it on the number of words for this segment + * It works well with default InnoDB Isolation level * - * - Get a new translation - * - Evaluate $_seg_newPEE and normalize it on the number of words for this segment + * REPEATABLE-READ offering a row level lock for this id_segment * - * - Get $_jobTotalPEE - * - Evaluate $_jobTotalPEE - $_seg_oldPEE + $_seg_newPEE and save it into the job's row */ - $this->updateJobPEE($old_translation->toArray(), $new_translation->toArray()); + $db->begin(); - // if saveVersionAndIncrement() return true it means that it was persisted a new version of the parent segment - $this->VersionsHandler->saveVersionAndIncrement($new_translation, $old_translation); + $translations = $this->buildNewTranslation($translation, $err_json, $check); + $new_translation = $translations['new']; + $old_translation = $translations['old']; - /** - * when the status of the translation changes, the auto propagation flag - * must be removed - */ - if ($new_translation->translation != $old_translation->translation or - $this->data['status'] == TranslationStatus::STATUS_TRANSLATED or - $this->data['status'] == TranslationStatus::STATUS_APPROVED or - $this->data['status'] == TranslationStatus::STATUS_APPROVED2 - ) { - $new_translation->autopropagated_from = null; - } + $propagationTotal = $this->persistTranslation($new_translation, $old_translation, $translation, $err_json, $check); - /** - * Translation is inserted here. - */ - CatUtils::addSegmentTranslation($new_translation, $this->isRevision()); + $db->commit(); - /** - * @see ProjectCompletion - */ - $this->featureSet->run('postAddSegmentTranslation', [ - 'chunk' => $this->data['chunk'], - 'is_review' => $this->isRevision(), - 'logged_user' => $this->user - ]); - - $propagationTotal = [ - 'totals' => [], - 'propagated_ids' => [], - 'segments_for_propagation' => [] - ]; + $result = $this->buildResult($new_translation, $old_translation, $propagationTotal, $check); - if ($this->data['propagate'] && in_array($this->data['status'], [ - TranslationStatus::STATUS_TRANSLATED, - TranslationStatus::STATUS_APPROVED, - TranslationStatus::STATUS_APPROVED2, - TranslationStatus::STATUS_REJECTED - ]) - ) { - //propagate translations - $TPropagation = new SegmentTranslationStruct(); - $TPropagation['status'] = $this->data['status']; - $TPropagation['id_job'] = $this->data['id_job']; - $TPropagation['translation'] = $translation; - $TPropagation['autopropagated_from'] = $this->data['id_segment']; - $TPropagation['serialized_errors_list'] = $err_json; - $TPropagation['warning'] = $check->thereAreWarnings(); - $TPropagation['segment_hash'] = $old_translation['segment_hash']; - $TPropagation['translation_date'] = Utils::mysqlTimestamp(time()); - $TPropagation['match_type'] = $old_translation['match_type']; - $TPropagation['locked'] = $old_translation['locked']; - - $propagationTotal = $this->VersionsHandler->propagateTranslation($TPropagation); - } + $this->finalizeTranslation($new_translation, $old_translation, $propagationTotal, $result); - if ($this->isSplittedSegment()) { - /* put the split inside the transaction if they are present */ - $translationStruct = SegmentSplitStruct::getStruct(); - $translationStruct->id_segment = $this->data['id_segment']; - $translationStruct->id_job = $this->data['id_job']; + $this->response->json($result); + } catch (Exception $exception) { + $db->rollback(); + throw $exception; + } + } + + /** + * Phase 1-3: Validate request, set up filters, run QA checks, and prepare the cleaned translation. + * + * @return array{segment: string, translation: string, check: QA, err_json: string} + * @throws Exception + */ + private function prepareTranslation(): array + { + $this->data = $this->validateTheRequest(); + $this->checkIfSegmentIsNotDisabled(); + $this->setSubFilteringBehavior(); + $this->checkSegmentSplitData(); + $this->initVersionHandler(); + $this->getContexts(); + + if ($this->data['segment'] === null) { + throw new Exception('Segment not found for id_segment: ' . $this->data['id_segment']); + } - $translationStruct->target_chunk_lengths = [ - 'len' => $this->data['split_chunk_lengths'], - 'statuses' => $this->data['split_statuses'] - ]; + $segment = $this->filter->fromLayer0ToLayer1($this->data['segment']['segment']); + $translation = (empty($this->data['translation']) and !is_numeric($this->data['translation'])) ? "" : $this->filter->fromLayer2ToLayer1( + $this->data['translation'] + ); - $translationDao = new SplitDAO(Database::obtain()); - $translationDao->atomicUpdate($translationStruct); - } + $check = $this->setQaChecks($segment, $translation); + $check->performConsistencyCheck(); - //COMMIT THE TRANSACTION - /* - * Hooked by TranslationVersions, which manage translation versions - * - * This is also the init handler of all R1/R2 handling and Qr score calculation by - * by TranslationEventsHandler and BatchReviewProcessor - */ - $this->VersionsHandler->storeTranslationEvent([ - 'translation' => $new_translation, - 'old_translation' => $old_translation, - 'propagation' => $propagationTotal, - 'chunk' => $this->chunk, - 'user' => $this->user, - 'source_page_code' => ReviewUtils::revisionNumberToSourcePage($this->data['revisionNumber']), - 'features' => $this->featureSet, - 'project' => $this->data['project'] - ]); - - //COMMIT THE TRANSACTION - $db->commit(); + if ($check->thereAreWarnings()) { + $err_json = $check->getWarningsJSON(); + $translation = $this->filter->fromLayer1ToLayer0($translation); + } else { + $err_json = ''; + $targetNormalized = $check->getTrgNormalized(); + $translation = $this->filter->fromLayer1ToLayer0($targetNormalized); + } - $newTotals = WordCountStruct::loadFromJob($this->data['chunk']); + //PATCH TO FIX BOM INSERTIONS + $translation = Utils::stripBOM($translation); - $job_stats = CatUtils::getFastStatsForJob($newTotals); - $job_stats['analysis_complete'] = ( - $this->data['project']['status_analysis'] == ProjectStatus::STATUS_DONE or - $this->data['project']['status_analysis'] == ProjectStatus::STATUS_NOT_TO_ANALYZE - ); + return [ + 'segment' => $segment, + 'translation' => $translation, + 'check' => $check, + 'err_json' => $err_json, + ]; + } - $file_stats = []; - $result = []; + /** + * Phase 4-6: Fetch old translation, build new SegmentTranslationStruct, apply suggestion logic. + * + * @param string $translation The cleaned translation string + * @param string $errJson Serialized QA warnings (or empty string) + * @param QA $check The QA checker instance + * + * @return array{new: SegmentTranslationStruct, old: SegmentTranslationStruct} + * @throws ReflectionException + */ + private function buildNewTranslation(string $translation, string $errJson, QA $check): array + { + $old_translation = $this->getOldTranslation(); - $result['stats'] = $job_stats; - $result['file_stats'] = $file_stats; - $result['code'] = 1; - $result['data'] = "OK"; - $result['version'] = date_create($new_translation['translation_date'])->getTimestamp(); - $result['translation'] = $this->getTranslationObject($new_translation); + $client_suggestion_array = json_decode($this->data['suggestion_array'] ?? '[]', true); + $chosenIndex = $this->data['chosen_suggestion_index'] !== null ? (int)$this->data['chosen_suggestion_index'] : null; + $client_chosen_suggestion_params = ($chosenIndex !== null && isset($client_suggestion_array[$chosenIndex - 1])) ? $client_suggestion_array[$chosenIndex - 1] : []; + $client_chosen_suggestion = new ShapelessConcreteStruct($client_chosen_suggestion_params); - /* FIXME: added for code compatibility with front-end. Remove. */ - $_warn = $check->getWarnings(); - $warning = $_warn[0]; - /* */ + $new_translation = new SegmentTranslationStruct(); + $new_translation->id_segment = (int)$this->data['id_segment']; + $new_translation->id_job = (int)$this->data['id_job']; + $new_translation->status = $this->data['status']; - $result['warning']['cod'] = $warning->outcome; - if ($warning->outcome > 0) { - $result['warning']['id'] = $this->data['id_segment']; + if ($this->data['segment'] === null) { + throw new RuntimeException('Segment must not be null in buildNewTranslation'); + } + $new_translation->segment_hash = $this->data['segment']->segment_hash; + $new_translation->translation = $translation; + $new_translation->serialized_errors_list = $errJson; + $new_translation->suggestions_array = ($chosenIndex !== null ? $this->data['suggestion_array'] : $old_translation->suggestions_array); + $new_translation->suggestion_position = ($chosenIndex !== null ? $chosenIndex : $old_translation->suggestion_position); + $new_translation->warning = $check->thereAreWarnings(); + $new_translation->translation_date = date("Y-m-d H:i:s"); + $new_translation->suggestion = $old_translation->suggestion; //IMPORTANT: raw_translation is in layer 0 and suggestion too + $new_translation->suggestion_source = $old_translation->suggestion_source; + $new_translation->suggestion_match = $old_translation->suggestion_match; + + // update suggestion + if ($this->canUpdateSuggestion($new_translation, $client_chosen_suggestion)) { + $new_translation->suggestion = !empty($client_chosen_suggestion->raw_translation) ? $client_chosen_suggestion->raw_translation : $old_translation->suggestion; //IMPORTANT: raw_translation is in layer 0 and suggestion too + + // update suggestion match + if ($client_chosen_suggestion->match == EngineConstants::MT) { + /** @var ProjectStruct $project */ + $project = $this->data['project']; + // case 1. is MT + $new_translation->suggestion_match = (string)($project->getMetadataValue(ProjectsMetadataMarshaller::MT_QUALITY_VALUE_IN_EDITOR->value) ?? 85); + $new_translation->suggestion_source = EngineConstants::MT; + } elseif ($client_chosen_suggestion->match == InternalMatchesConstants::NO_MATCH) { + // case 2. no match + $new_translation->suggestion_source = InternalMatchesConstants::NO_MATCH; } else { - $result['warning']['id'] = 0; + // case 3. otherwise is TM + $new_translation->suggestion_match = (string)(int)$client_chosen_suggestion->match; // cast '71%' to int 71 + $new_translation->suggestion_source = EngineConstants::TM; } + } + + $new_translation->time_to_edit = (int)$this->data['time_to_edit']; - $this->featureSet->run('setTranslationCommitted', [ - 'translation' => $new_translation, - 'old_translation' => $old_translation, - 'propagated_ids' => $propagationTotal['segments_for_propagation']['propagated_ids'] ?? null, - 'chunk' => $this->data['chunk'], - 'segment' => $this->data['segment'], - 'user' => $this->user, - 'source_page_code' => ReviewUtils::revisionNumberToSourcePage($this->data['revisionNumber']) - ]); - - $result = $this->featureSet->filter('filterSetTranslationResult', $result, [ - 'translation' => $new_translation, - 'old_translation' => $old_translation, - 'propagated_ids' => $propagationTotal['segments_for_propagation']['propagated_ids'] ?? null, - 'chunk' => $this->data['chunk'], - 'segment' => $this->data['segment'] - ]); - - - //EVERY time a user changes a row in his job when the job is completed, - // a query to do the update is executed... - // Avoid this by setting a key on redis with a reasonable TTL - $redisHandler = new RedisHandler(); - $job_status = $redisHandler->getConnection()->get('job_completeness:' . $this->data['id_job']); - if ( + return [ + 'new' => $new_translation, + 'old' => $old_translation, + ]; + } + + /** + * Phase 7-15: Persist translation, handle propagation, splits, and version events. + * + * @param SegmentTranslationStruct $newTranslation The new translation struct + * @param SegmentTranslationStruct $oldTranslation The old translation struct + * @param string $translation The cleaned translation string + * @param string $errJson Serialized QA warnings (or empty string) + * @param QA $check The QA checker instance + * + * @return array + * @throws Exception + */ + private function persistTranslation( + SegmentTranslationStruct $newTranslation, + SegmentTranslationStruct $oldTranslation, + string $translation, + string $errJson, + QA $check + ): array { + /** + * Update Time to Edit and + * + * Evaluate new Avg post-editing effort for the job: + * - get old translation + * - get suggestion + * - evaluate $_seg_oldPEE and normalize it on the number of words for this segment + * + * - Get a new translation + * - Evaluate $_seg_newPEE and normalize it on the number of words for this segment + * + * - Get $_jobTotalPEE + * - Evaluate $_jobTotalPEE - $_seg_oldPEE + $_seg_newPEE and save it into the job's row + */ + $this->updateJobPEE($oldTranslation->toArray(), $newTranslation->toArray()); + + // if saveVersionAndIncrement() return true it means that it was persisted a new version of the parent segment + /** @var VersionHandlerInterface $versionsHandler */ + $versionsHandler = $this->VersionsHandler; + $versionsHandler->saveVersionAndIncrement($newTranslation, $oldTranslation); + + /** + * when the status of the translation changes, the auto propagation flag + * must be removed + */ + if ($newTranslation->translation != $oldTranslation->translation or + $this->data['status'] == TranslationStatus::STATUS_TRANSLATED or + $this->data['status'] == TranslationStatus::STATUS_APPROVED or + $this->data['status'] == TranslationStatus::STATUS_APPROVED2 + ) { + $newTranslation->autopropagated_from = null; + } + + /** + * Translation is inserted here. + */ + CatUtils::addSegmentTranslation($newTranslation, (bool)$this->isRevision()); + + /** + * @see ProjectCompletion + */ + $this->getFeatureSet()->dispatchRun(new PostAddSegmentTranslationEvent([ + 'chunk' => $this->data['chunk'], + 'is_review' => (bool)$this->isRevision(), + 'logged_user' => $this->user + ])); + + $propagationTotal = [ + 'totals' => [], + 'propagated_ids' => [], + 'segments_for_propagation' => [] + ]; + + if ($this->data['propagate'] && in_array($this->data['status'], [ + TranslationStatus::STATUS_TRANSLATED, + TranslationStatus::STATUS_APPROVED, + TranslationStatus::STATUS_APPROVED2, + TranslationStatus::STATUS_REJECTED + ]) + ) { + //propagate translations + $TPropagation = new SegmentTranslationStruct(); + $TPropagation['status'] = $this->data['status']; + $TPropagation['id_job'] = $this->data['id_job']; + $TPropagation['translation'] = $translation; + $TPropagation['autopropagated_from'] = (int)$this->data['id_segment']; + $TPropagation['serialized_errors_list'] = $errJson; + $TPropagation['warning'] = $check->thereAreWarnings(); + $TPropagation['segment_hash'] = $oldTranslation['segment_hash']; + $TPropagation['translation_date'] = Utils::mysqlTimestamp(time()); + $TPropagation['match_type'] = $oldTranslation['match_type']; + $TPropagation['locked'] = $oldTranslation['locked']; + + $propagationTotal = $versionsHandler->propagateTranslation($TPropagation); + } + + if ($this->isSplittedSegment()) { + /* put the split inside the transaction if they are present */ + $translationStruct = SegmentSplitStruct::getStruct(); + $translationStruct->id_segment = (int)$this->data['id_segment']; + $translationStruct->id_job = (int)$this->data['id_job']; + + $translationStruct->target_chunk_lengths = [ + 'len' => $this->data['split_chunk_lengths'], + 'statuses' => $this->data['split_statuses'] + ]; + + $translationDao = new SplitDAO(Database::obtain()); + $translationDao->atomicUpdate($translationStruct); + } + + //COMMIT THE TRANSACTION + /* + * Hooked by TranslationVersions, which manage translation versions + * + * This is also the init handler of all R1/R2 handling and Qr score calculation by + * by TranslationEventsHandler and BatchReviewProcessor + */ + $versionsHandler->storeTranslationEvent([ + 'translation' => $newTranslation, + 'old_translation' => $oldTranslation, + 'propagation' => $propagationTotal, + 'chunk' => $this->chunk, + 'user' => $this->user, + 'source_page_code' => ReviewUtils::revisionNumberToSourcePage($this->data['revisionNumber']), + 'features' => $this->featureSet, + 'project' => $this->data['project'] + ]); + + return $propagationTotal; + } + + /** + * Phase 16-18: Build the result array with job stats, translation data, warnings, + * and run the setTranslationCommitted / filterSetTranslationResult hooks. + * + * IMPORTANT: setTranslationCommitted MUST be called BEFORE filterSetTranslationResult. + * + * @param SegmentTranslationStruct $newTranslation + * @param SegmentTranslationStruct $oldTranslation + * @param array $propagationTotal + * @param QA $check + * + * @return array + * @throws AuthenticationError + * @throws EndQueueException + * @throws NotFoundException + * @throws ReQueueException + * @throws ValidationError + * @throws Exception + */ + private function buildResult( + SegmentTranslationStruct $newTranslation, + SegmentTranslationStruct $oldTranslation, + array $propagationTotal, + QA $check + ): array { + $newTotals = WordCountStruct::loadFromJob($this->data['chunk']); + + $job_stats = CatUtils::getFastStatsForJob($newTotals); + $job_stats['analysis_complete'] = ( + $this->data['project']['status_analysis'] == ProjectStatus::STATUS_DONE or + $this->data['project']['status_analysis'] == ProjectStatus::STATUS_NOT_TO_ANALYZE + ); + + $file_stats = []; + $result = []; + + $result['stats'] = $job_stats; + $result['file_stats'] = $file_stats; + $result['code'] = 1; + $result['data'] = "OK"; + $translationDate = date_create($newTranslation['translation_date']); + $result['version'] = $translationDate !== false ? $translationDate->getTimestamp() : time(); + $result['translation'] = $this->getTranslationObject($newTranslation); + + /* FIXME: added for code compatibility with front-end. Remove. */ + $_warn = $check->getWarnings(); + $warning = $_warn[0]; + /* */ + + $result['warning']['cod'] = $warning->outcome; + if ($warning->outcome > 0) { + $result['warning']['id'] = $this->data['id_segment']; + } else { + $result['warning']['id'] = 0; + } + + $this->getFeatureSet()->dispatchRun(new SetTranslationCommittedEvent([ + 'translation' => $newTranslation, + 'old_translation' => $oldTranslation, + 'propagated_ids' => $propagationTotal['segments_for_propagation']['propagated_ids'] ?? null, + 'chunk' => $this->data['chunk'], + 'segment' => $this->data['segment'], + 'user' => $this->user, + 'source_page_code' => ReviewUtils::revisionNumberToSourcePage($this->data['revisionNumber']) + ])); + + return $result; + } + + /** + * Phase 19-20: Check Redis job completeness, add propagation totals to result, + * and evaluate the TM contribution for this translation. + * + * @param SegmentTranslationStruct $newTranslation + * @param SegmentTranslationStruct $oldTranslation + * @param array $propagationTotal + * @param array $result Passed by reference — adds 'propagation' key + * + * @return void + * @throws AuthenticationError + * @throws EndQueueException + * @throws NotFoundException + * @throws ReQueueException + * @throws ReflectionException + * @throws ValidationError + */ + private function finalizeTranslation( + SegmentTranslationStruct $newTranslation, + SegmentTranslationStruct $oldTranslation, + array $propagationTotal, + array &$result + ): void { + //EVERY time a user changes a row in his job when the job is completed, + // a query to do the update is executed... + // Avoid this by setting a key on redis with a reasonable TTL + $redisHandler = new RedisHandler(); + $job_status = $redisHandler->getConnection()->get('job_completeness:' . $this->data['id_job']); + if ( + ( ( - ( - $job_stats[ProjectsMetadataMarshaller::WORD_COUNT_RAW->value]['draft'] + - $job_stats[ProjectsMetadataMarshaller::WORD_COUNT_RAW->value]['new'] == 0 - ) - and empty($job_status) + $result['stats'][ProjectsMetadataMarshaller::WORD_COUNT_RAW->value]['draft'] + + $result['stats'][ProjectsMetadataMarshaller::WORD_COUNT_RAW->value]['new'] == 0 ) - ) { - $redisHandler->getConnection()->setex('job_completeness:' . $this->data['id_job'], 60 * 60 * 24 * 15, true); //15 days - - try { - JobDao::setJobComplete($this->data['chunk']); - } catch (Exception) { - $msg = "\n\n Error setJobCompleteness \n\n " . var_export($_POST, true); - $redisHandler->getConnection()->del('job_completeness:' . $this->data['id_job']); - $this->logger->debug($msg); - } - } - - $result['propagation'] = $propagationTotal; - $this->evalSetContribution($new_translation, $old_translation); + and empty($job_status) + ) + ) { + $redisHandler->getConnection()->setex('job_completeness:' . $this->data['id_job'], 60 * 60 * 24 * 15, true); //15 days - $this->response->json($result); - } catch (Exception $exception) { - $db->rollback(); - $this->logger->error($exception->getMessage()); - throw $exception; + try { + JobDao::setJobComplete($this->data['chunk']); + } catch (Exception) { + $msg = "\n\n Error setJobCompleteness \n\n " . var_export($this->request->paramsPost()->all(), true); + $redisHandler->getConnection()->del('job_completeness:' . $this->data['id_job']); + $this->logger->debug($msg); + } } + + $result['propagation'] = $propagationTotal; + $this->evalSetContribution($newTranslation, $oldTranslation); } /** * @return array{ - * id_job: numeric-string, + * id_job: string, * password: string, * received_password: string, * id_segment: string, - * time_to_edit: int|numeric-string, + * time_to_edit: int|string, * id_translator: string, * translation: string, * segment: ?SegmentStruct, * segmentString: string, - * version: numeric-string|null, - * chosen_suggestion_index: int|numeric-string|null, + * version: string|null, + * chosen_suggestion_index: int|string|null, * suggestion_array: string|null, * splitStatuses: string|null, * context_before: string, * context_after: string, - * id_before: numeric-string|null, - * id_after: numeric-string|null, + * id_before: string|null, + * id_after: string|null, * revisionNumber: int|null, * guess_tag_used: bool|null, - * characters_counter: numeric-string|null, + * characters_counter: string|null, * propagate: bool|null, - * client_target_version: int|numeric-string, + * client_target_version: int|string, * status: string, * split_statuses: array, * chunk: JobStruct, * project: ProjectStruct, * id_project: int, - * segment_contains_icu: bool + * segment_contains_icu: bool, + * split_num: string|null, + * split_chunk_lengths: array|null * } * @throws Exception */ @@ -452,14 +583,14 @@ private function validateTheRequest(): array { $id_job = filter_var($this->request->param('id_job'), FILTER_SANITIZE_NUMBER_INT); $password = filter_var($this->request->param('password'), FILTER_SANITIZE_SPECIAL_CHARS, ['flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH]); - $received_password = filter_var($this->request->param('current_password'), FILTER_SANITIZE_SPECIAL_CHARS, ['flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH]); + $received_password = (string)filter_var($this->request->param('current_password'), FILTER_SANITIZE_SPECIAL_CHARS, ['flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH]); $propagate = filter_var($this->request->param('propagate'), FILTER_VALIDATE_BOOLEAN, ['flags' => FILTER_NULL_ON_FAILURE]); $id_segment = filter_var($this->request->param('id_segment'), FILTER_SANITIZE_NUMBER_INT); // FILTER_SANITIZE_NUMBER_INT leaves untouched segments id with the split flag. Ex: 123-1 $time_to_edit = filter_var($this->request->param('time_to_edit'), FILTER_SANITIZE_NUMBER_INT, ['filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_REQUIRE_SCALAR | FILTER_NULL_ON_FAILURE] ) ?? 0; - $id_translator = filter_var($this->request->param('id_translator'), FILTER_SANITIZE_SPECIAL_CHARS, ['flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH]); - $translation = filter_var($this->request->param('translation'), FILTER_UNSAFE_RAW); - $segmentString = filter_var($this->request->param('segment'), FILTER_UNSAFE_RAW); + $id_translator = (string)filter_var($this->request->param('id_translator'), FILTER_SANITIZE_SPECIAL_CHARS, ['flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH]); + $translation = (string)filter_var($this->request->param('translation'), FILTER_UNSAFE_RAW); + $segmentString = (string)filter_var($this->request->param('segment'), FILTER_UNSAFE_RAW); $version = filter_var($this->request->param('version'), FILTER_SANITIZE_NUMBER_INT); $chosen_suggestion_index = filter_var( $this->request->param('chosen_suggestion_index'), @@ -473,8 +604,8 @@ private function validateTheRequest(): array ); $status = filter_var($this->request->param('status'), FILTER_SANITIZE_SPECIAL_CHARS, ['flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH]); $splitStatuses = filter_var($this->request->param('splitStatuses'), FILTER_SANITIZE_SPECIAL_CHARS, ['flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH]); - $context_before = filter_var($this->request->param('context_before'), FILTER_UNSAFE_RAW); - $context_after = filter_var($this->request->param('context_after'), FILTER_UNSAFE_RAW); + $context_before = (string)filter_var($this->request->param('context_before'), FILTER_UNSAFE_RAW); + $context_after = (string)filter_var($this->request->param('context_after'), FILTER_UNSAFE_RAW); $id_before = filter_var($this->request->param('id_before'), FILTER_SANITIZE_NUMBER_INT); $id_after = filter_var($this->request->param('id_after'), FILTER_SANITIZE_NUMBER_INT); $revisionNumber = filter_var($this->request->param('revision_number'), FILTER_SANITIZE_NUMBER_INT); @@ -486,9 +617,9 @@ private function validateTheRequest(): array * check the propagation flag if it is null the client not sent it, leave default true, otherwise set the value */ $propagate = $propagate ?? null; /* do nothing */ - $client_target_version = $version ?? 0; - $status = strtoupper($status); - $split_statuses = explode(",", strtoupper($splitStatuses)); //strtoupper transforms null to "" + $client_target_version = $version ?: 0; + $status = strtoupper((string)$status); + $split_statuses = explode(",", strtoupper((string)$splitStatuses)); //strtoupper transforms null to "" if (empty($id_job)) { throw new InvalidArgumentException("Missing id job", -2); @@ -516,9 +647,9 @@ private function validateTheRequest(): array $dao = new SegmentDao(Database::obtain()); $this->segment = $dao->getById((int)$id_segment); // Cast to int to remove eventually split positions. Ex: id_segment = 123-1 - $this->id_job = $id_job; - $this->password = $password; - $this->request_password = $received_password; + $this->id_job = (int)$id_job; + $this->password = (string)$password; + $this->request_password = (string)$received_password; $this->sourceContainsIcu($chunk->getProject(), $chunk, $segmentString); @@ -532,17 +663,17 @@ private function validateTheRequest(): array 'translation' => $translation, 'segment' => $this->segment, 'segmentString' => $segmentString, - 'version' => $version, + 'version' => $version ?: null, 'chosen_suggestion_index' => $chosen_suggestion_index, - 'suggestion_array' => $suggestion_array, - 'splitStatuses' => $splitStatuses, + 'suggestion_array' => $suggestion_array ?: null, + 'splitStatuses' => $splitStatuses ?: null, 'context_before' => $context_before, 'context_after' => $context_after, - 'id_before' => $id_before, - 'id_after' => $id_after, - 'revisionNumber' => $revisionNumber !== null ? (int)$revisionNumber : null, + 'id_before' => $id_before ?: null, + 'id_after' => $id_after ?: null, + 'revisionNumber' => ($revisionNumber !== false && $revisionNumber !== '') ? (int)$revisionNumber : null, 'guess_tag_used' => $guess_tag_used, - 'characters_counter' => $characters_counter, + 'characters_counter' => $characters_counter ?: null, 'propagate' => $propagate, 'client_target_version' => $client_target_version, 'status' => $status, @@ -550,6 +681,9 @@ private function validateTheRequest(): array 'chunk' => $chunk, 'project' => $chunk->getProject(), 'id_project' => $chunk->id_project, + 'segment_contains_icu' => $this->sourceContainsIcu, + 'split_num' => null, + 'split_chunk_lengths' => null, ]; $this->logger->debug($data); @@ -610,8 +744,8 @@ protected function checkSegmentSplitData(): void [$__translation, $this->data['split_chunk_lengths']] = CatUtils::parseSegmentSplit($this->data['translation'], '', $this->filter); if (is_null($__translation) || $__translation === '') { - $this->logger->debug("Empty Translation \n\n" . var_export($_POST, true)); - throw new RuntimeException("Empty Translation \n\n" . var_export($_POST, true), 0); + $this->logger->debug("Empty Translation \n\n" . var_export($this->request->paramsPost()->all(), true)); + throw new RuntimeException("Empty Translation \n\n" . var_export($this->request->paramsPost()->all(), true), 0); } $explodeIdSegment = explode("-", $this->data['id_segment']); @@ -635,21 +769,24 @@ protected function checkSegmentSplitData(): void */ protected function setSubFilteringBehavior(): void { - /** @var $projectStruct ProjectStruct */ + /** @var ProjectStruct $projectStruct */ $projectStruct = $this->data['project']; $featureSet = $this->getFeatureSet(); $featureSet->loadForProject($projectStruct); - /** @var MateCatFilter $filter */ $metadata = new JobsMetadataDao(); $filter = MateCatFilter::getInstance( $featureSet, $this->data['chunk']->source, $this->data['chunk']->target, SegmentOriginalDataDao::getSegmentDataRefMap((int)$this->data['id_segment']), - $metadata->getSubfilteringCustomHandlers($this->id_job, $this->password), + $metadata->getSubfilteringCustomHandlers($this->id_job, $this->password ?? ''), $this->sourceContainsIcu ); + + if (!$filter instanceof MateCatFilter) { + throw new RuntimeException('Expected MateCatFilter instance from getInstance()'); + } $this->filter = $filter; } @@ -664,7 +801,7 @@ protected function setQaChecks(string $segment, string $translation): QA $check = new QA( $segment, $translation, - MessagePatternComparator::fromValidators( + ($this->icuSourcePatternValidator !== null) ? MessagePatternComparator::fromValidators( $this->icuSourcePatternValidator, new MessagePatternValidator( $this->data['chunk']->target, @@ -672,20 +809,20 @@ protected function setQaChecks(string $segment, string $translation): QA (new CtrlCharsPlaceHoldToAscii())->transform($translation) ) - ), + ) : null, // ICU syntax is enabled for this project, and the translation content must contain valid ICU syntax $this->sourceContainsIcu ); // Layer 1 here $check->setChunk($this->data['chunk']); - $check->setFeatureSet($this->featureSet); + $check->setFeatureSet($this->getFeatureSet()); $check->setSourceSegLang($this->data['chunk']->source); $check->setTargetSegLang($this->data['chunk']->target); if (isset($this->data['characters_counter']) and is_numeric($this->data['characters_counter'])) { $check->setCharactersCount( - $this->data['characters_counter'], - SegmentMetadataDao::get($this->data['id_segment'], QA::SIZE_RESTRICTION)[0] ?? null + (int)$this->data['characters_counter'], + SegmentMetadataDao::get((int)$this->data['id_segment'], SegmentMetadataMarshaller::SIZE_RESTRICTION->value) ); } @@ -695,11 +832,11 @@ protected function setQaChecks(string $segment, string $translation): QA /** * Throws exception if status is not valid. * - * @param $status + * @param string $status * * @throws Exception */ - private function checkStatus($status): void + private function checkStatus(string $status): void { switch ($status) { case TranslationStatus::STATUS_TRANSLATED: @@ -712,7 +849,7 @@ private function checkStatus($status): void break; default: - $msg = "Error Hack Status \n\n " . var_export($_POST, true); + $msg = "Error Hack Status \n\n " . var_export($this->request->paramsPost()->all(), true); throw new Exception($msg, -1); } } @@ -731,7 +868,9 @@ private function getContexts(): void ] ); - $this->featureSet->filter('rewriteContributionContexts', $segmentsList, $this->data); + $event = new RewriteContributionContextsEvent($segmentsList, $this->data); + $this->getFeatureSet()->dispatchFilter($event); + $segmentsList = $event->getSegmentsList(); if (isset($segmentsList->id_before->segment)) { $this->data['context_before'] = $this->filter->fromLayer0ToLayer1($segmentsList->id_before->segment); @@ -747,16 +886,16 @@ private function getContexts(): void */ private function initVersionHandler(): void { - $this->VersionsHandler = TranslationVersions::getVersionHandlerNewInstance($this->data['chunk'], $this->user, $this->data['project'], $this->data['id_segment']); + $this->VersionsHandler = TranslationVersions::getVersionHandlerNewInstance($this->data['chunk'], $this->user, $this->data['project'], (int)$this->data['id_segment']); } /** - * @return SegmentTranslationStruct|null + * @return SegmentTranslationStruct * @throws ReflectionException */ - private function getOldTranslation(): ?SegmentTranslationStruct + protected function getOldTranslation(): SegmentTranslationStruct { - $old_translation = SegmentTranslationDao::findBySegmentAndJob($this->data['id_segment'], $this->data['id_job']); + $old_translation = SegmentTranslationDao::findBySegmentAndJob((int)$this->data['id_segment'], (int)$this->data['id_job']); if (empty($old_translation)) { $old_translation = new SegmentTranslationStruct(); @@ -765,14 +904,19 @@ private function getOldTranslation(): ?SegmentTranslationStruct // If volume analysis is not enabled and no translation rows exist, create the row if (!AppConfig::$VOLUME_ANALYSIS_ENABLED && empty($old_translation['status'])) { + + if ($this->segment === null) { + throw new Exception('Segment not found'); + } + $translation = new SegmentTranslationStruct(); $translation->id_segment = (int)$this->data['id_segment']; $translation->id_job = (int)$this->data['id_job']; $translation->status = TranslationStatus::STATUS_NEW; - $translation->segment_hash = $this->data['segment']['segment_hash']; - $translation->translation = $this->data['segment']['segment']; - $translation->standard_word_count = $this->data['segment']['raw_word_count']; + $translation->segment_hash = $this->segment->segment_hash; + $translation->translation = $this->segment->segment; + $translation->standard_word_count = $this->segment->raw_word_count; $translation->serialized_errors_list = ''; $translation->suggestion_position = 0; @@ -780,7 +924,7 @@ private function getOldTranslation(): ?SegmentTranslationStruct $translation->translation_date = date("Y-m-d H:i:s"); try { - CatUtils::addSegmentTranslation($translation, $this->isRevision()); + CatUtils::addSegmentTranslation($translation, (bool)$this->isRevision()); } catch (Exception $e) { Database::obtain()->rollback(); throw new RuntimeException($e->getMessage()); @@ -825,8 +969,8 @@ private function canUpdateSuggestion(SegmentTranslationStruct $new_translation, } /** - * @param array $old_translation - * @param array $new_translation + * @param array $old_translation + * @param array $new_translation */ private function updateJobPEE(array $old_translation, array $new_translation): void { @@ -836,6 +980,9 @@ private function updateJobPEE(array $old_translation, array $new_translation): v $jobTotalTTEForTranslation += $new_translation['time_to_edit']; } + if ($this->segment === null) { + throw new RuntimeException('Segment must not be null in updateJobPEE'); + } $segmentRawWordCount = $this->segment->raw_word_count; $editLogSegmentStruct = new EditLogSegmentStruct( [ @@ -901,12 +1048,12 @@ private function updateJobPEE(array $old_translation, array $new_translation): v * This method returns a representation of the saved translation which * should be as much as possible compliant with the future API v2. * - * @param $saved_translation + * @param SegmentTranslationStruct $saved_translation * - * @return array + * @return array * @throws Exception */ - private function getTranslationObject($saved_translation): array + private function getTranslationObject(SegmentTranslationStruct $saved_translation): array { return [ 'version_number' => $saved_translation['version_number'] ?? null, @@ -941,16 +1088,20 @@ private function evalSetContribution(SegmentTranslationStruct $_Translation, Seg $ownerUid = JobDao::getOwnerUid((int)$this->data['id_job'], $this->data['password']); $filesParts = (new FilesPartsDao())->getBySegmentId((int)$this->data['id_segment']); // Cast to int to remove eventually split positions. Ex: id_segment = 123-1 + if ($this->data['segment'] === null) { + throw new RuntimeException('Segment must not be null in evalSetContribution'); + } + /** * Set the new contribution in the queue */ $contributionStruct = new SetContributionRequest(); $contributionStruct->jobStruct = $this->chunk; - $contributionStruct->fromRevision = $this->isRevision(); - $contributionStruct->id_file = $filesParts->id_file ?? null; - $contributionStruct->id_job = $this->data['id_job']; + $contributionStruct->fromRevision = (bool)$this->isRevision(); + $contributionStruct->id_file = $filesParts->id_file ?? 0; + $contributionStruct->id_job = (int)$this->data['id_job']; $contributionStruct->job_password = $this->data['password']; - $contributionStruct->id_segment = $this->data['id_segment']; + $contributionStruct->id_segment = (int)$this->data['id_segment']; $contributionStruct->segment = $this->filter->fromLayer0ToLayer1($this->data['segment']['segment']); $contributionStruct->translation = ($_Translation['translation'] !== null) ? $this->filter->fromLayer0ToLayer1($_Translation['translation']) : ""; $contributionStruct->api_key = AppConfig::$MYMEMORY_API_KEY; @@ -975,18 +1126,19 @@ private function evalSetContribution(SegmentTranslationStruct $_Translation, Seg * - the segment has one or more repetitions and the user chooses to propagate it * - the segment has one or more repetitions, it is not modified, it doesn't have translation conflicts and a change status is requested */ - $contributionStruct->propagationRequest = $this->data['propagate']; + $contributionStruct->propagationRequest = (bool)$this->data['propagate']; $contributionStruct->id_mt = $this->data['chunk']->id_mt_engine; $contributionStruct->context_after = $this->data['context_after']; $contributionStruct->context_before = $this->data['context_before']; - $this->featureSet->filter( - 'filterContributionStructOnSetTranslation', + $setTranslationEvent = new FilterContributionStructOnSetTranslationEvent( $contributionStruct, $this->data['project'], $this->data['segment'] ); + $this->getFeatureSet()->dispatchFilter($setTranslationEvent); + $contributionStruct = $setTranslationEvent->getContributionStruct(); //assert there is not an exception by following the flow Set::contribution($contributionStruct); @@ -995,13 +1147,14 @@ private function evalSetContribution(SegmentTranslationStruct $_Translation, Seg /** * @see Airbnb::filterContributionStructOnMTSet */ - $newContributionStruct = $this->featureSet->filter( - 'filterContributionStructOnMTSet', + $newContributionStructEvent = new FilterContributionStructOnMTSetEvent( $contributionStruct, $_Translation, $this->data['segment'], $this->filter ); + $this->getFeatureSet()->dispatchFilter($newContributionStructEvent); + $newContributionStruct = $newContributionStructEvent->getContributionStruct(); Set::contributionMT($newContributionStruct); } @@ -1035,7 +1188,7 @@ protected function getOriginalSuggestionProvider(SegmentTranslationStruct $new_t // Check if the old translation's status is `STATUS_NEW` or `STATUS_DRAFT`. if (in_array($old_translation->status, [TranslationStatus::STATUS_NEW, TranslationStatus::STATUS_DRAFT])) { // Decode the suggestion array from the new translation. - $suggestion_array = json_decode($new_translation->suggestions_array); + $suggestion_array = json_decode($new_translation->suggestions_array ?? '[]'); // Retrieve the `created_by` field based on the suggestion position, or use the first suggestion as a fallback. if ($new_translation->suggestion_position) { diff --git a/lib/Controller/API/App/TMXFileController.php b/lib/Controller/API/App/TMXFileController.php index 196fdfd81c..690dee3d33 100644 --- a/lib/Controller/API/App/TMXFileController.php +++ b/lib/Controller/API/App/TMXFileController.php @@ -30,7 +30,7 @@ public function import(): void { $request = $this->validateTheRequest(); $TMService = new TMSService(); - $file = $TMService->uploadFile($request['disable_upload_limit']); + $file = $TMService->uploadFile($this->request->files()->all(), $request['disable_upload_limit']); $uuids = []; diff --git a/lib/Controller/API/App/XliffToTargetConverterController.php b/lib/Controller/API/App/XliffToTargetConverterController.php index 99772e589f..42abcb0c56 100644 --- a/lib/Controller/API/App/XliffToTargetConverterController.php +++ b/lib/Controller/API/App/XliffToTargetConverterController.php @@ -20,8 +20,9 @@ class XliffToTargetConverterController extends KleinController public function convert(): void { - $file_path = $_FILES['xliff']['tmp_name'] . '.xlf'; - move_uploaded_file($_FILES['xliff']['tmp_name'], $file_path); + $xliff = $this->request->files()->get('xliff'); + $file_path = $xliff['tmp_name'] . '.xlf'; + move_uploaded_file($xliff['tmp_name'], $file_path); $filters = (new Filters()); $conversion = $filters->xliffToTarget([ diff --git a/lib/Controller/API/Commons/Validators/InternalUserValidator.php b/lib/Controller/API/Commons/Validators/InternalUserValidator.php index 081ee02def..7da92deca8 100644 --- a/lib/Controller/API/Commons/Validators/InternalUserValidator.php +++ b/lib/Controller/API/Commons/Validators/InternalUserValidator.php @@ -12,6 +12,7 @@ use Controller\API\Commons\Exceptions\AuthenticationError; use Controller\API\Commons\Exceptions\AuthorizationError; use Exception; +use Model\FeaturesBase\Hook\Event\Filter\IsAnInternalUserEvent; class InternalUserValidator extends LoginValidator { @@ -24,11 +25,11 @@ class InternalUserValidator extends LoginValidator public function _validate(): void { parent::_validate(); - $this->controller->getFeatureSet()->filter( - "isAnInternalUser", - $this->controller->getUser()->email - ) ?: throw new AuthorizationError('Forbidden, please contact support for generating a valid API key'); + $event = $this->controller->getFeatureSet()->dispatchFilter( + new IsAnInternalUserEvent($this->controller->getUser()->email) + ); + $event->isInternal() ?: throw new AuthorizationError('Forbidden, please contact support for generating a valid API key'); } -} \ No newline at end of file +} diff --git a/lib/Controller/API/Commons/Validators/IsOwnerInternalUserValidator.php b/lib/Controller/API/Commons/Validators/IsOwnerInternalUserValidator.php index 5f62a71aaf..a657b3c836 100644 --- a/lib/Controller/API/Commons/Validators/IsOwnerInternalUserValidator.php +++ b/lib/Controller/API/Commons/Validators/IsOwnerInternalUserValidator.php @@ -13,6 +13,7 @@ use Controller\API\Commons\Exceptions\AuthenticationError; use Controller\API\Commons\Exceptions\AuthorizationError; use Exception; +use Model\FeaturesBase\Hook\Event\Filter\IsAnInternalUserEvent; use Model\Jobs\JobStruct; class IsOwnerInternalUserValidator extends Base @@ -34,11 +35,11 @@ public function __construct(KleinController $controller, JobStruct $jobStruct) */ public function _validate(): void { - $this->controller->getFeatureSet()->filter( - "isAnInternalUser", - $this->jobStruct->owner - ) ?: throw new AuthorizationError('Forbidden, Lara Think only accepts requests from internal users'); + $event = $this->controller->getFeatureSet()->dispatchFilter( + new IsAnInternalUserEvent($this->jobStruct->owner) + ); + $event->isInternal() ?: throw new AuthorizationError('Forbidden, Lara Think only accepts requests from internal users'); } -} \ No newline at end of file +} diff --git a/lib/Controller/API/V1/NewController.php b/lib/Controller/API/V1/NewController.php index a51c087ff6..dc0801df97 100644 --- a/lib/Controller/API/V1/NewController.php +++ b/lib/Controller/API/V1/NewController.php @@ -11,20 +11,19 @@ use InvalidArgumentException; use Matecat\Locales\LanguageDomains; use Matecat\Locales\Languages; -use Matecat\SubFiltering\Enum\InjectableFiltersTags; -use Matecat\SubFiltering\HandlersSorter; use Model\Conversion\FilesConverter; use Model\Conversion\Upload; use Model\DataAccess\Database; use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; use Model\FeaturesBase\BasicFeatureStruct; +use Model\FeaturesBase\Hook\Event\Filter\EncodeInstructionsEvent; +use Model\FeaturesBase\Hook\Event\Filter\FilterCreateProjectFeaturesEvent; use Model\FilesStorage\AbstractFilesStorage; use Model\FilesStorage\FilesStorageFactory; use Model\Filters\FiltersConfigTemplateDao; use Model\Filters\FiltersConfigTemplateStruct; use Model\Jobs\JobsMetadataMarshaller; -use Model\Jobs\MetadataDao as JobsMetadataDao; use Model\LQA\ModelDao; use Model\LQA\ModelStruct; use Model\LQA\QAModelTemplate\QAModelTemplateDao; @@ -37,13 +36,12 @@ use Model\PayableRates\CustomPayableRateStruct; use Model\ProjectCreation\ProjectManager; use Model\ProjectCreation\ProjectStructure; -use Model\Projects\MetadataDao; use Model\Projects\ProjectsMetadataMarshaller; -use Model\Users\UserStruct; use Model\Teams\MembershipDao; use Model\Teams\TeamStruct; use Model\TmKeyManagement\MemoryKeyDao; use Model\TmKeyManagement\MemoryKeyStruct; +use Model\Users\UserStruct; use Model\Xliff\XliffConfigTemplateDao; use Plugins\Features\ProjectCompletion; use ReflectionException; @@ -199,11 +197,11 @@ public function create(): void * submission, project sanitization) are intentionally left in * {@see create()}. * - * @param array $request Validated request data from validateTheRequest() - * @param array $filesFound Output of getFilesList() with 'arrayFiles' and 'arrayFilesMeta' - * @param string $uploadToken Upload directory token - * @param UserStruct $user Authenticated user - * @param AbstractEngine $engine MT engine instance (for getConfigurationParameters()) + * @param array $request Validated request data from validateTheRequest() + * @param array $filesFound Output of getFilesList() with 'arrayFiles' and 'arrayFilesMeta' + * @param string $uploadToken Upload directory token + * @param UserStruct $user Authenticated user + * @param AbstractEngine $engine MT engine instance (for getConfigurationParameters()) * * @return ProjectStructure */ @@ -401,7 +399,10 @@ private function validateTheRequest(): array /** * Uber plugin callback */ - return $this->featureSet->filter('encodeInstructions', $value); + $encodeInstructionsEvent = new EncodeInstructionsEvent($value); + $this->featureSet->dispatchFilter($encodeInstructionsEvent); + + return $encodeInstructionsEvent->getValue(); } ] ) ?: null; @@ -604,9 +605,23 @@ private function validateMetadataParam($metadata = null): array $metadata = html_entity_decode($metadata); $validatorObject = new JSONValidatorObject($metadata); - $validator = new JSONValidator('project_metadata.json', true); + $validator = new JSONValidator('project_metadata.json'); $validator->validate($validatorObject); + if (!$validator->isValid()) { + throw new InvalidArgumentException( + 'Invalid Metadata. ' . implode( + "", + array_map( + function ($exception) { + return $exception->getMessage(); + }, + $validator->getExceptions() + ) + ) + ); + } + $depth = 2; $parsedMetadata = json_decode($metadata, true, $depth); @@ -776,12 +791,10 @@ private function appendFeaturesToProject(bool $project_completion, int $mt_engin $projectFeatures[$feature->feature_code] = $feature; } - return $this->featureSet->filter( - 'filterCreateProjectFeatures', - $projectFeatures, - $this, - $mt_engine - ); + $filterCreateProjectFeaturesEvent = new FilterCreateProjectFeaturesEvent($projectFeatures, $this); + $this->featureSet->dispatchFilter($filterCreateProjectFeaturesEvent); + + return $filterCreateProjectFeaturesEvent->getProjectFeatures(); } /** diff --git a/lib/Controller/API/V2/ChangePasswordController.php b/lib/Controller/API/V2/ChangePasswordController.php index 7dbd4afcd4..66edca4df3 100644 --- a/lib/Controller/API/V2/ChangePasswordController.php +++ b/lib/Controller/API/V2/ChangePasswordController.php @@ -7,6 +7,8 @@ use Exception; use InvalidArgumentException; use Model\DataAccess\Database; +use Model\FeaturesBase\Hook\Event\Run\JobPasswordChangedEvent; +use Model\FeaturesBase\Hook\Event\Run\ReviewPasswordChangedEvent; use Model\Jobs\JobDao; use Model\Jobs\JobStruct; use Model\LQA\ChunkReviewDao; @@ -97,8 +99,6 @@ private function changeThePassword(UserStruct $user, $res, $id, $actual_pwd, $ne $pDao->changePassword($pStruct, $new_password); $pDao->destroyCacheById($id); $pDao->destroyCacheForProjectData($pStruct->id, $pStruct->password); - - $pStruct->getFeaturesSet()->run('project_password_changed', $pStruct, $actual_pwd); } else { // change job passwords Database::obtain()->begin(); @@ -119,7 +119,7 @@ private function changeThePassword(UserStruct $user, $res, $id, $actual_pwd, $ne $dao->destroyCacheForJobIdReviewPasswordAndSourcePage($id, $actual_pwd, $source_page); $jStruct->getProject() ->getFeaturesSet() - ->run('review_password_changed', $id, $actual_pwd, $new_password, $revision_number); + ->dispatchRun(new ReviewPasswordChangedEvent((int)$id, $actual_pwd, $new_password, (int)$revision_number)); } else { // change job password $jStruct = JobDao::getByIdAndPassword($id, $actual_pwd); @@ -130,7 +130,7 @@ private function changeThePassword(UserStruct $user, $res, $id, $actual_pwd, $ne $jDao->changePassword($jStruct, $new_password); $jStruct->getProject() ->getFeaturesSet() - ->run('job_password_changed', $jStruct, $actual_pwd); + ->dispatchRun(new JobPasswordChangedEvent($jStruct, $actual_pwd)); } // invalidate ChunkReviewDao cache for the job @@ -166,4 +166,4 @@ private function checkUserPermissions(ProjectStruct $project, UserStruct $user): throw new Exception('The logged user does not belong to the right team', 403); } } -} \ No newline at end of file +} diff --git a/lib/Controller/API/V2/ChangeProjectNameController.php b/lib/Controller/API/V2/ChangeProjectNameController.php index b209f6a428..918fc0fa7c 100644 --- a/lib/Controller/API/V2/ChangeProjectNameController.php +++ b/lib/Controller/API/V2/ChangeProjectNameController.php @@ -8,6 +8,7 @@ use Controller\API\Commons\Validators\ProjectPasswordValidator; use Exception; use InvalidArgumentException; +use Model\FeaturesBase\Hook\Event\Run\FilterProjectNameModifiedEvent; use Model\Projects\ProjectDao; use Model\Projects\ProjectStruct; use Model\Teams\MembershipDao; @@ -56,7 +57,7 @@ public function changeName(): void $ownerEmail = $this->project->id_customer; $this->changeProjectName($id, $password, $name); - $this->featureSet->filter('filterProjectNameModified', $id, $name, $password, $ownerEmail); + $this->featureSet->dispatchRun(new FilterProjectNameModifiedEvent((int)$id, $name, $password, $ownerEmail)); $this->response->status()->setCode(200); $this->response->json([ @@ -102,4 +103,4 @@ private function checkUserPermissions(ProjectStruct $project, UserStruct $user): throw new Exception('The logged user does not belong to the right team', 403); } } -} \ No newline at end of file +} diff --git a/lib/Controller/API/V2/DownloadController.php b/lib/Controller/API/V2/DownloadController.php index 72d10a4742..0ede3ad2e4 100644 --- a/lib/Controller/API/V2/DownloadController.php +++ b/lib/Controller/API/V2/DownloadController.php @@ -380,20 +380,6 @@ private function processDownload(): void $files_to_be_converted[$fileID]['output_filename'] ); - /** - * Because of a bug in the filters for the cjk languages ( Exception when downloading translations ) - * we add an hook to allow some plugins to force the conversion parameters ( languages for example ) - * - * We restore the right language here - * - * TODO: ( 25/05/2018 ) Remove when the issue will be fixed - */ - $output_content[$fileID]['document_content'] = $this->featureSet->filter( - 'overrideConversionResult', - $output_content[$fileID]['document_content'], - Languages::getInstance()->getLangRegionCode($jobData['target']) - ); - //in the case of .strings, they are required to be in UTF-16 //get extension to perform file detection $extension = AbstractFilesStorage::pathinfo_fix($output_content[$fileID]['output_filename'], PATHINFO_EXTENSION); @@ -448,8 +434,6 @@ private function processDownload(): void } else { $output_content = $this->getOutputContentsWithZipFiles($output_content); - $this->featureSet->run('processZIPDownloadPreview', $this, $output_content); - if (count($output_content) > 1) { // cast $output_content elements to ZipContentObject foreach ($output_content as $key => $__output_content_elem) { @@ -486,7 +470,7 @@ private function processDownload(): void } } catch (Exception $e) { $msg = "\n\n Error retrieving file content, Conversion failed??? \n\n Error: {$e->getMessage()} \n\n" . var_export($e->getTraceAsString(), true); - $msg .= "\n\n Get: " . var_export($_REQUEST, true); + $msg .= "\n\n Get: " . var_export($this->request->params(), true); LoggerFactory::getLogger('conversion')->debug($msg); $this->unlockToken( [ diff --git a/lib/Controller/API/V2/DownloadOriginalController.php b/lib/Controller/API/V2/DownloadOriginalController.php index bb4a3f4f2c..1b898c54b6 100644 --- a/lib/Controller/API/V2/DownloadOriginalController.php +++ b/lib/Controller/API/V2/DownloadOriginalController.php @@ -44,10 +44,6 @@ public function index() $__postInput = filter_var_array($this->request->params(), $filterArgs); - //NOTE: This is for debug purpose only, - //NOTE: Global $_POST Overriding from CLI Test scripts - //$__postInput = filter_var_array( $_POST, $filterArgs ); - $this->_user_provided_filename = $__postInput['filename']; $this->id_job = $__postInput['id_job']; $this->password = $__postInput['password']; @@ -63,7 +59,7 @@ public function index() // check for Password correctness if (empty($jobData)) { - $msg = "Error : wrong password provided for download \n\n " . var_export($_POST, true) . "\n"; + $msg = "Error : wrong password provided for download \n\n " . var_export($this->request->paramsPost()->all(), true) . "\n"; $this->logger->debug($msg); return null; diff --git a/lib/Controller/API/V2/GlossaryFilesController.php b/lib/Controller/API/V2/GlossaryFilesController.php index f3fc10611b..0ba1a5d1bd 100644 --- a/lib/Controller/API/V2/GlossaryFilesController.php +++ b/lib/Controller/API/V2/GlossaryFilesController.php @@ -88,7 +88,7 @@ protected function validateRequest(): void */ public function check(): void { - $stdResult = $this->TMService->uploadFile(); + $stdResult = $this->TMService->uploadFile($this->request->files()->all()); // validation on request parameters has been performed by $this->validateRequest if (!isset($this->tm_key) or $this->tm_key === "") { @@ -121,7 +121,7 @@ public function check(): void */ public function import(): void { - $stdResult = $this->TMService->uploadFile(); + $stdResult = $this->TMService->uploadFile($this->request->files()->all()); // validation on request parameters has been performed by $this->validateRequest if (!isset($this->tm_key) or $this->tm_key === "") { diff --git a/lib/Controller/API/V2/ProjectCreationStatusController.php b/lib/Controller/API/V2/ProjectCreationStatusController.php index 5d9f4add02..1dc5d9f432 100644 --- a/lib/Controller/API/V2/ProjectCreationStatusController.php +++ b/lib/Controller/API/V2/ProjectCreationStatusController.php @@ -41,16 +41,13 @@ public function get(): void throw new Exception($error['message'], (int)$error['code']); } } else { - // project is created, find it with password + // project is created, verify password authorization try { - $project = ProjectDao::findByIdAndPassword($this->request->param('id_project'), $this->request->param('password')); + ProjectDao::findByIdAndPassword($this->request->param('id_project'), $this->request->param('password')); } catch (NotFoundException) { throw new AuthorizationError('Not Authorized.'); } - $featureSet = $project->getFeaturesSet(); - $result = $featureSet->filter('filterCreationStatus', $result, $project); - if (empty($result['id_project'])) { $this->_letsWait(); } else { diff --git a/lib/Controller/API/V2/SplitJobController.php b/lib/Controller/API/V2/SplitJobController.php index bef6a69cf3..8da779e35a 100644 --- a/lib/Controller/API/V2/SplitJobController.php +++ b/lib/Controller/API/V2/SplitJobController.php @@ -114,7 +114,7 @@ private function checkSplit(array $request): array $project = $projectStructure['project']; $count_type = $projectStructure['count_type']; - $this->checkSplitAccess($project, $request['job_id'], $request['job_pass'], $project->getJobs()); + $this->checkSplitAccess($request['job_id'], $request['job_pass'], $project->getJobs()); $data->jobToSplit = $request['job_id']; $data->jobToSplitPass = $request['job_pass']; @@ -210,22 +210,19 @@ private function checkMergeAccess(int $jid, array $jobList): array } /** - * @param ProjectStruct $project_struct * @param int $jid * @param string $job_pass * @param array $jobList * * @throws AuthenticationError */ - private function checkSplitAccess(ProjectStruct $project_struct, int $jid, string $job_pass, array $jobList): void + private function checkSplitAccess(int $jid, string $job_pass, array $jobList): void { $jobToSplit = $this->filterJobsById($jid, $jobList); if (array_shift($jobToSplit)->password != $job_pass) { throw new InvalidArgumentException("Access denied", -10); } - - $project_struct->getFeaturesSet()->run('checkSplitAccess', $jobList); } /** diff --git a/lib/Controller/API/V2/UrlsController.php b/lib/Controller/API/V2/UrlsController.php index 03740d6b16..2f6111585b 100644 --- a/lib/Controller/API/V2/UrlsController.php +++ b/lib/Controller/API/V2/UrlsController.php @@ -12,6 +12,7 @@ use Controller\API\Commons\Validators\LoginValidator; use Controller\API\Commons\Validators\ProjectPasswordValidator; use Exception; +use Model\FeaturesBase\Hook\Event\Filter\ProjectUrlsEvent; use Model\Projects\ProjectDao; use View\API\V2\Json\ProjectUrls; @@ -52,7 +53,9 @@ public function urls(): void $formatted = new ProjectUrls($projectData); - $formatted = $this->featureSet->filter('projectUrls', $formatted); + $projectUrlsEvent = new ProjectUrlsEvent($formatted); + $this->featureSet->dispatchFilter($projectUrlsEvent); + $formatted = $projectUrlsEvent->getFormatted(); $this->response->json(['urls' => $formatted->render()]); } @@ -68,4 +71,4 @@ protected function afterConstruct(): void $this->appendValidator(new LoginValidator($this)); } -} \ No newline at end of file +} diff --git a/lib/Controller/API/V3/DeepLGlossaryController.php b/lib/Controller/API/V3/DeepLGlossaryController.php index 6eed35a5fc..7369070f56 100644 --- a/lib/Controller/API/V3/DeepLGlossaryController.php +++ b/lib/Controller/API/V3/DeepLGlossaryController.php @@ -55,12 +55,11 @@ public function create(): void { $this->validateCreateGlossaryPayload(); - $name = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW | FILTER_FLAG_STRIP_HIGH); + $name = filter_var($this->params['name'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW | FILTER_FLAG_STRIP_HIGH); $uploadManager = new Upload(); - $uploadedFiles = $uploadManager->uploadFiles($_FILES); + $uploadedFiles = $uploadManager->uploadFiles($this->request->files()->all()); - /** @noinspection PhpUndefinedFieldInspection */ $glossary = CSVParser::extract($uploadedFiles->glossary, "DEEPL_EXCEL_GLOSS_"); // validate @@ -99,11 +98,11 @@ public function create(): void */ private function validateCreateGlossaryPayload(): void { - if (!isset($_FILES['glossary'])) { + if (!$this->request->files()->exists('glossary')) { throw new Exception('Missing `glossary`', 400); } - if (!isset($_POST['name'])) { + if (!isset($this->params['name'])) { throw new Exception('Missing `name`', 400); } } diff --git a/lib/Controller/API/V3/FileInfoController.php b/lib/Controller/API/V3/FileInfoController.php index b8dec9f3a6..c757a11f68 100644 --- a/lib/Controller/API/V3/FileInfoController.php +++ b/lib/Controller/API/V3/FileInfoController.php @@ -17,6 +17,7 @@ use Controller\Traits\ChunkNotFoundHandlerTrait; use InvalidArgumentException; use Model\Exceptions\ValidationError; +use Model\FeaturesBase\Hook\Event\Filter\DecodeInstructionsEvent; use Model\Files\FilesInfoUtility; use Model\Projects\ProjectStruct; use ReflectionException; @@ -112,7 +113,9 @@ public function setInstructions(): void $instructions = $this->request->param('instructions'); $filesInfoUtility = new FilesInfoUtility($this->chunk); - $instructions = $this->featureSet->filter('decodeInstructions', $instructions); + $decodeInstructionsEvent = new DecodeInstructionsEvent($instructions); + $this->featureSet->dispatchFilter($decodeInstructionsEvent); + $instructions = $decodeInstructionsEvent->getValue(); if (empty($instructions)) { throw new InvalidArgumentException("Empty instructions provided"); @@ -129,4 +132,4 @@ public function setInstructions(): void } // GET https://dev.matecat.com/api/v3/jobs/32/f7ac6b279743/file/35/instructions -// POST https://dev.matecat.com/api/v3/jobs/32/f7ac6b279743/file/35/instructions \ No newline at end of file +// POST https://dev.matecat.com/api/v3/jobs/32/f7ac6b279743/file/35/instructions diff --git a/lib/Controller/API/V3/ModernMTController.php b/lib/Controller/API/V3/ModernMTController.php index 0e15027e8e..67014a96a1 100644 --- a/lib/Controller/API/V3/ModernMTController.php +++ b/lib/Controller/API/V3/ModernMTController.php @@ -66,16 +66,15 @@ public function importGlossary(): void { $this->validateImportGlossaryParams(); - if (!isset($_POST['memoryId'])) { + if (!isset($this->params['memoryId'])) { throw new Exception('Missing `memoryId` param', 400); } - $memoryId = filter_var($_POST['memoryId'], FILTER_SANITIZE_NUMBER_INT); + $memoryId = filter_var($this->params['memoryId'], FILTER_SANITIZE_NUMBER_INT); $uploadManager = new Upload(); - $uploadedFiles = $uploadManager->uploadFiles($_FILES); + $uploadedFiles = $uploadManager->uploadFiles($this->request->files()->all()); - /** @noinspection PhpUndefinedFieldInspection */ $glossary = $this->extractCSV($uploadedFiles->glossary); @@ -132,13 +131,13 @@ public function modifyGlossary(): void */ public function createMemory(): void { - if (!isset($_POST['name'])) { + if (!isset($this->params['name'])) { throw new Exception('Missing `name` param', 400); } - $name = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW); - $description = isset($_POST['description']) ? filter_var($_POST['description'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW) : null; - $externalId = isset($_POST['external_id']) ? filter_var($_POST['external_id'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW) : null; + $name = filter_var($this->params['name'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW); + $description = isset($this->params['description']) ? filter_var($this->params['description'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW) : null; + $externalId = isset($this->params['external_id']) ? filter_var($this->params['external_id'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW) : null; $engineId = filter_var($this->request->param('engineId'), FILTER_SANITIZE_NUMBER_INT); $MMTClient = $this->getModernMTClient($engineId); @@ -155,11 +154,11 @@ public function createMemoryAndImportGlossary(): void { $this->validateImportGlossaryParams(); - if (!isset($_POST['name'])) { + if (!isset($this->params['name'])) { throw new Exception('Missing `name` param', 400); } - $name = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW); + $name = filter_var($this->params['name'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW); $engineId = filter_var($this->request->param('engineId'), FILTER_SANITIZE_NUMBER_INT); $MMTClient = $this->getModernMTClient($engineId); @@ -172,7 +171,7 @@ public function createMemoryAndImportGlossary(): void // upload glossary $uploadManager = new Upload(); - $uploadedFiles = $uploadManager->uploadFiles($_FILES); + $uploadedFiles = $uploadManager->uploadFiles($this->request->files()->all()); $glossary = $this->extractCSV($uploadedFiles->glossary); @@ -198,11 +197,11 @@ public function createMemoryAndImportGlossary(): void */ public function updateMemory(): void { - if (!isset($_POST['name'])) { + if (!isset($this->params['name'])) { throw new Exception('Missing `name` param', 400); } - $name = filter_var($_POST['name'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW); + $name = filter_var($this->params['name'], FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_ENCODE_LOW); $memoryId = filter_var($this->request->param('memoryId'), FILTER_SANITIZE_NUMBER_INT); $engineId = filter_var($this->request->param('engineId'), FILTER_SANITIZE_NUMBER_INT); $MMTClient = $this->getModernMTClient($engineId); @@ -231,7 +230,7 @@ public function deleteMemory(): void */ private function validateImportGlossaryParams(): void { - if (!isset($_FILES['glossary'])) { + if (!$this->request->files()->exists('glossary')) { throw new Exception('Missing `glossary` files', 400); } } diff --git a/lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php b/lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php index bdec96e6d3..d889565ce9 100644 --- a/lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php +++ b/lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php @@ -35,6 +35,9 @@ class SessionTokenStoreHandler public function __construct() { $this->cacheTTL = 60 * 60 * 24 * 7; // 7 days + // Session tokens are written explicitly (not computed from queries), + // so probabilistic early expiration has no semantic meaning here. + $this->xFetchEnabled = false; } /** diff --git a/lib/Controller/Abstracts/BaseKleinViewController.php b/lib/Controller/Abstracts/BaseKleinViewController.php index 474eb7c5ac..ae8467aca2 100644 --- a/lib/Controller/Abstracts/BaseKleinViewController.php +++ b/lib/Controller/Abstracts/BaseKleinViewController.php @@ -4,6 +4,7 @@ use Controller\API\Commons\ViewValidators\MandatoryKeysValidator; use Exception; +use Model\FeaturesBase\Hook\Event\Filter\IsAnInternalUserEvent; use Klein\App; use Klein\Request; use Klein\Response; @@ -88,7 +89,7 @@ public function setView(string $template_name, array $params = [], int $code = 2 $this->view->{'user_plugins'} = new PHPTalMap($this->featureSet->getCodes()); $this->view->{'isLoggedIn'} = new PHPTalBoolean($this->isLoggedIn()); $this->view->{'userMail'} = $this->getUser()->email; - $this->view->{'isAnInternalUser'} = new PHPTalBoolean($this->featureSet->filter("isAnInternalUser", $this->getUser()->email ?? '')); + $this->view->{'isAnInternalUser'} = new PHPTalBoolean($this->featureSet->dispatchFilter(new IsAnInternalUserEvent($this->getUser()->email ?? ''))->isInternal()); $this->view->{'footer_js'} = []; $this->view->{'config_js'} = []; @@ -163,4 +164,4 @@ public function redirectToWantedUrl(): never exit; } -} \ No newline at end of file +} diff --git a/lib/Controller/Traits/SegmentDisabledTrait.php b/lib/Controller/Traits/SegmentDisabledTrait.php index 6b1ca91110..d12101b9f1 100644 --- a/lib/Controller/Traits/SegmentDisabledTrait.php +++ b/lib/Controller/Traits/SegmentDisabledTrait.php @@ -12,20 +12,20 @@ trait SegmentDisabledTrait { use DaoCacheTrait; - const CACHE_TTL = 3600; + const int CACHE_TTL = 3600; /** * Removes the "translation_disabled" metadata for a given segment and clears the related cache. * + * @param int $id_job * @param int $id_segment The unique identifier of the segment to clear metadata and cache for. * @return void * @throws ReflectionException - * @throws PDOException */ protected function destroySegmentDisabledCache(int $id_job, int $id_segment): void { SegmentMetadataDao::delete($id_segment, 'translation_disabled'); - SegmentMetadataDao::destroyCache($id_segment, 'translation_disabled'); + SegmentMetadataDao::destroyGetCache($id_segment, 'translation_disabled'); SegmentMetadataDao::destroyGetAllCache($id_segment); $cache = $this->cacheKeyAndQuery($id_job, $id_segment); @@ -69,6 +69,7 @@ protected function isSegmentDisabled(int $id_job, int $id_segment): bool * * @return void * @throws ReflectionException + * @throws Exception */ protected function saveSegmentDisabledInCache(int $id_job, int $id_segment): void { @@ -101,6 +102,7 @@ private function cacheKeyAndQuery(int $id_job, int $id_segment): array */ private function cacheInit(): void { + $this->xFetchEnabled = false; $this->setCacheTTL(self::CACHE_TTL); $this->_cacheSetConnection(); } diff --git a/lib/Controller/Views/AnalyzeController.php b/lib/Controller/Views/AnalyzeController.php index f3a8f8cc67..4514d1b99a 100644 --- a/lib/Controller/Views/AnalyzeController.php +++ b/lib/Controller/Views/AnalyzeController.php @@ -16,6 +16,7 @@ use Model\ActivityLog\Activity; use Model\ActivityLog\ActivityLogStruct; use Model\Analysis\Status; +use Model\FeaturesBase\Hook\Event\Filter\AppendInitialTemplateVarsEvent; use Model\Jobs\ChunkDao; use Model\Jobs\JobDao; use Model\Projects\ProjectDao; @@ -121,12 +122,15 @@ public function renderView() $model = $analysisStatus->fetchData()->getResult(); + $appendInitialTemplateVarsEvent = new AppendInitialTemplateVarsEvent($this->featureSet->getCodes()); + $this->featureSet->dispatchFilter($appendInitialTemplateVarsEvent); + $this->addParamsToView([ 'pid' => $projectStruct->id, 'project_status' => $projectStruct->status_analysis, 'outsource_service_login' => $this->_outsource_login_API, 'showModalBoxLogin' => new PHPTalBoolean(!$this->isLoggedIn()), - 'project_plugins' => new PHPTalMap($this->featureSet->filter('appendInitialTemplateVars', $this->featureSet->getCodes()) ?? []), + 'project_plugins' => new PHPTalMap($appendInitialTemplateVarsEvent->getCodes() ?? []), 'num_segments' => $model->getSummary()->getTotalSegments(), 'num_segments_analyzed' => $model->getSummary()->getSegmentsAnalyzed(), 'daemon_misconfiguration' => new PHPTalBoolean(Health::thereIsAMisconfiguration()), @@ -147,4 +151,4 @@ public function renderView() $this->render(); } -} \ No newline at end of file +} diff --git a/lib/Controller/Views/CattoolController.php b/lib/Controller/Views/CattoolController.php index c67468311b..8e9604c5ba 100644 --- a/lib/Controller/Views/CattoolController.php +++ b/lib/Controller/Views/CattoolController.php @@ -19,6 +19,7 @@ use Model\Engines\EngineDAO; use Model\Engines\Structs\EngineStruct; use Model\Exceptions\NotFoundException; +use Model\FeaturesBase\Hook\Event\Filter\AppendInitialTemplateVarsEvent; use Model\Jobs\ChunkDao; use Model\Jobs\LexiQaAndTagProjectionLanguages; use Model\Jobs\JobStruct; @@ -266,8 +267,10 @@ function ($chunkReviewStruct) use ($chunkStruct) { // reset the feature set and load only the features for the current project (plus the autoloaded ones) $this->featureSet->loadForProject($chunkStruct->getProject()); + $appendInitialTemplateVarsEvent = new AppendInitialTemplateVarsEvent($this->featureSet->getCodes()); + $this->featureSet->dispatchFilter($appendInitialTemplateVarsEvent); $this->addParamsToView([ - 'project_plugins' => new PHPTalMap($this->featureSet->filter('appendInitialTemplateVars', $this->featureSet->getCodes())), + 'project_plugins' => new PHPTalMap($appendInitialTemplateVarsEvent->getCodes()), ]); $this->featureSet->appendDecorators( diff --git a/lib/Controller/Views/ContextReviewController.php b/lib/Controller/Views/ContextReviewController.php new file mode 100644 index 0000000000..8ebcaa7f49 --- /dev/null +++ b/lib/Controller/Views/ContextReviewController.php @@ -0,0 +1,49 @@ +appendValidator(new ViewLoginRedirectValidator($this)); + } + + /** + * @throws Exception + */ + public function renderView(): void + { + $request = $this->validateTheRequest(); + + $this->setView('context_preview.html', [ + 'id_project' => $request['id_project'], + 'password' => $request['password'], + ]); + $this->render(); + } + + /** + * @return false|array|null + */ + protected function validateTheRequest(): false|array|null + { + $filterArgs = [ + 'id_project' => ['filter' => FILTER_SANITIZE_NUMBER_INT], + 'password' => [ + 'filter' => FILTER_SANITIZE_SPECIAL_CHARS, + 'flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH + ] + ]; + + return filter_var_array($this->request->paramsNamed()->all(), $filterArgs); + } + +} + diff --git a/lib/Controller/Views/OutsourceTo/AbstractController.php b/lib/Controller/Views/OutsourceTo/AbstractController.php index 4b14422a19..e100e69da8 100644 --- a/lib/Controller/Views/OutsourceTo/AbstractController.php +++ b/lib/Controller/Views/OutsourceTo/AbstractController.php @@ -119,8 +119,8 @@ protected function validateTheRequest() $this->data_key_content = $__getInput[$this->dataKeyName]; - $this->logger->debug($_GET); - $this->logger->debug($_SERVER['QUERY_STRING']); + $this->logger->debug($this->request->paramsGet()->all()); + $this->logger->debug($this->request->server()->get('QUERY_STRING')); } protected function afterConstruct(): void diff --git a/lib/Model/Analysis/AbstractStatus.php b/lib/Model/Analysis/AbstractStatus.php index 63f5bccb64..9608ba349f 100644 --- a/lib/Model/Analysis/AbstractStatus.php +++ b/lib/Model/Analysis/AbstractStatus.php @@ -10,6 +10,7 @@ use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\OutsourceAvailableInfoEvent; use Model\Files\MetadataDao as FileMetadataDao; use Model\Jobs\ChunkDao; use Model\Jobs\JobStruct; @@ -151,7 +152,9 @@ public function fetchData(): AbstractStatus */ protected function isOutsourceEnabled($targetLang, $id_customer, $idJob): bool { - $outsourceAvailableInfo = $this->featureSet->filter('outsourceAvailableInfo', $targetLang, $id_customer, $idJob); + $outsourceAvailableInfoEvent = new OutsourceAvailableInfoEvent($targetLang, (string)$id_customer, (int)$idJob); + $this->featureSet->dispatchFilter($outsourceAvailableInfoEvent); + $outsourceAvailableInfo = $outsourceAvailableInfoEvent->getFilterable(); // if any plugin does not trigger the hook if (!is_array($outsourceAvailableInfo) or empty($outsourceAvailableInfo)) { @@ -318,4 +321,4 @@ private function getAnalyzeLink(): string ]); } -} \ No newline at end of file +} diff --git a/lib/Model/Conversion/Upload.php b/lib/Model/Conversion/Upload.php index 050cf3b113..aed3180a8a 100644 --- a/lib/Model/Conversion/Upload.php +++ b/lib/Model/Conversion/Upload.php @@ -17,7 +17,7 @@ *
  *   if( 'requestMethod' == 'POST' ) {
  *       $uploadInstance = new Upload();
- *       $uploadInstance->uploadFiles( $_FILES );
+ *       $uploadInstance->uploadFiles( $request->files()->all() );
  *   }
  * 
* @@ -132,7 +132,7 @@ public static function getUniformGlobalFilesStructure(array $filesToUpload): Upl } /** - * Upload File from $_FILES + * Upload File from request files array * $RegistryKeyIndex MUST BE form name Element * * @param UploadElement $fileUp diff --git a/lib/Model/DataAccess/AbstractDao.php b/lib/Model/DataAccess/AbstractDao.php index d18ff90577..0c97c5b5e8 100644 --- a/lib/Model/DataAccess/AbstractDao.php +++ b/lib/Model/DataAccess/AbstractDao.php @@ -231,8 +231,11 @@ protected function _fetchObjectMap(PDOStatement $stmt, string $fetchClass, array } $stmt->setFetchMode(PDO::FETCH_CLASS, $fetchClass); + + $t0 = microtime(true); $stmt->execute($bindParams); $result = $stmt->fetchAll(); + $this->_setLastComputeDelta(microtime(true) - $t0); $this->_setInCacheMap($keyMap, $stmt->queryString . $this->_serializeForCacheKey($bindParams) . $fetchClass, $result); @@ -259,11 +262,11 @@ protected function _buildResult(array $array_result) * * @param array $on_duplicate_fields * - * @return string + * @return array{0: string, 1: array} [sql, dupBindValues] * @throws Exception * @internal param array $options of options for the SQL statement */ - public static function buildInsertStatement(array $attrs, array &$mask = [], bool $ignore = false, bool $no_nulls = false, array $on_duplicate_fields = []): string + public static function buildInsertStatement(array $attrs, array &$mask = [], bool $ignore = false, bool $no_nulls = false, array $on_duplicate_fields = []): array { return Database::buildInsertStatement(static::TABLE, $attrs, $mask, $ignore, $no_nulls, $on_duplicate_fields); } @@ -420,11 +423,11 @@ public static function insertStruct(IDaoStruct $struct, ?array $options = []): i $mask = array_keys($struct->toArray()); $mask = array_diff($mask, static::$auto_increment_field); - $sql = self::buildInsertStatement($struct->toArray(), $mask, $ignore, $no_nulls, $on_duplicate_fields); + [$sql, $dupBindValues] = self::buildInsertStatement($struct->toArray(), $mask, $ignore, $no_nulls, $on_duplicate_fields); $conn = Database::obtain()->getConnection(); $stmt = $conn->prepare($sql); - $data = $struct->toArray($mask); + $data = array_merge($struct->toArray($mask), $dupBindValues); LoggerFactory::getLogger('dao')->debug(["SQL" => $sql, "values" => $data]); diff --git a/lib/Model/DataAccess/DaoCacheTrait.php b/lib/Model/DataAccess/DaoCacheTrait.php index c8bded756c..b4f2425d4c 100644 --- a/lib/Model/DataAccess/DaoCacheTrait.php +++ b/lib/Model/DataAccess/DaoCacheTrait.php @@ -11,6 +11,7 @@ use Exception; use Predis\Client; +use Random\RandomException; use ReflectionException; use Utils\Logger\LoggerFactory; use Utils\Redis\RedisHandler; @@ -30,6 +31,50 @@ trait DaoCacheTrait */ protected int $cacheTTL = 0; + /** + * XFetch β (beta) tuning parameter. + * Controls how aggressively early recomputation triggers. + * 1.0 is the theoretically optimal value per Vattani et al. (2015). + */ + protected const float XFETCH_BETA = 1.0; + + /** + * Minimum TTL (seconds) for XFetch to activate. + * Below this threshold, XFetch auto-disables because the early + * recomputation window could exceed the remaining TTL. + */ + protected const int XFETCH_MIN_TTL_THRESHOLD = 10; + + /** + * Fallback δ (seconds) when no measured recomputation time is available. + * Used by callers that bypass _fetchObjectMap (e.g., Pager). + */ + protected const float XFETCH_FALLBACK_DELTA = 0.05; + + /** + * Whether XFetch probabilistic early expiration is active for this class. + * Override to false in classes that use DaoCacheTrait for non-query storage + * (e.g., SessionTokenStoreHandler). + */ + protected bool $xFetchEnabled = true; + + /** + * Last measured recomputation time (δ) in seconds. + * Set via _setLastComputeDelta() from AbstractDao::_fetchObjectMap(). + * Consumed-and-reset internally by _setInCacheMap() when building the envelope. + */ + private float $lastComputeDelta = 0.0; + + /** + * Set the last measured recomputation time (δ). + * + * @param float $delta Recomputation time in seconds + */ + protected function _setLastComputeDelta(float $delta): void + { + $this->lastComputeDelta = $delta; + } + /** * Cache Initialization * @@ -49,6 +94,17 @@ protected function _cacheSetConnection(): void } } + /** + * Sets the cache connection instance. + * + * @param Client|null $connection The cache connection instance to set, or null to unset. + * @return void + */ + public static function setCacheConnection(?Client $connection): void + { + self::$cache_con = $connection; + } + /** @noinspection PhpUnusedParameterInspection */ protected function _logCache(string $type, string $key, mixed $value, string $sqlQuery): void @@ -63,6 +119,32 @@ protected function _logCache(string $type, string $key, mixed $value, string $sq ); } + /** + * XFetch probabilistic early expiration check. + * + * Returns true if the cache entry should be recomputed early to prevent stampede. + * Formula: now - δ · β · log(rand) ≥ storedAt + TTL + * + * @param float $storedAt Timestamp when the entry was cached + * @param float $delta Recomputation time (δ) in seconds + * @param int $ttl Cache TTL in seconds + * + * @return bool True if early recomputation should happen + * + * @throws RandomException + * @see https://en.wikipedia.org/wiki/Cache_stampede#Optimal_probabilistic_early_expiration + */ + protected function _shouldRecompute(float $storedAt, float $delta, int $ttl): bool + { + if ($delta <= 0.0) { + return false; + } + + // XFetch formula: recompute when now - δ · β · log(rand()) ≥ expiry + // log(rand()) is always ≤ 0 for rand() in (0, 1], so subtracting it adds a positive jitter window. + return (microtime(true) - $delta * static::XFETCH_BETA * log(random_int(1, PHP_INT_MAX) / PHP_INT_MAX)) >= ($storedAt + $ttl); + } + /** * @template T of IDaoStruct * @param string $keyMap @@ -80,14 +162,32 @@ protected function _getFromCacheMap(string $keyMap, string $query): ?array $this->_cacheSetConnection(); - $value = null; - if (isset(self::$cache_con) && !empty(self::$cache_con)) { - $key = md5($query); - $value = unserialize(self::$cache_con->hget($keyMap, $key) ?? ''); - $this->_logCache("GETMAP: " . $keyMap, $key, $value, $query); + $key = md5($query); + $raw = self::$cache_con->hget($keyMap, $key); + + if ($raw === null) { + $this->_logCache("GETMAP_MISS: " . $keyMap, $key, null, $query); + return null; } - return !is_bool($value) ? $value : null; + $unserialized = unserialize($raw); + + if ($unserialized instanceof XFetchEnvelope) { + if ( + $this->xFetchEnabled + && $this->cacheTTL >= static::XFETCH_MIN_TTL_THRESHOLD + && $this->_shouldRecompute($unserialized->storedAt, $unserialized->delta, $this->cacheTTL) + ) { + $this->_logCache("GETMAP_XFETCH_RECOMPUTE: " . $keyMap, $key, null, $query); + return null; + } + + $unserialized = $unserialized->value; + } + + $this->_logCache("GETMAP: " . $keyMap, $key, $unserialized, $query); + + return is_array($unserialized) ? $unserialized : null; } /** @@ -101,6 +201,7 @@ protected function _getFromCacheMap(string $keyMap, string $query): ?array * @param $value T[] * * @return void|null + * @throws Exception */ protected function _setInCacheMap(string $keyMap, string $query, array $value) { @@ -110,7 +211,17 @@ protected function _setInCacheMap(string $keyMap, string $query, array $value) if (isset(self::$cache_con) && !empty(self::$cache_con)) { $key = md5($query); - self::$cache_con->hset($keyMap, $key, serialize($value)); + + if ($this->xFetchEnabled && $this->cacheTTL >= static::XFETCH_MIN_TTL_THRESHOLD) { + $delta = $this->lastComputeDelta > 0.0 ? $this->lastComputeDelta : static::XFETCH_FALLBACK_DELTA; + $this->lastComputeDelta = 0.0; + $storable = serialize(new XFetchEnvelope($value, microtime(true), $delta)); + } else { + $this->lastComputeDelta = 0.0; + $storable = serialize($value); + } + + self::$cache_con->hset($keyMap, $key, $storable); self::$cache_con->expire($keyMap, $this->cacheTTL); self::$cache_con->setex($key, $this->cacheTTL, $keyMap); $this->_logCache("SETMAP: " . $keyMap, $key, $value, $query); diff --git a/lib/Model/DataAccess/Database.php b/lib/Model/DataAccess/Database.php index 3c930b3251..01b45d9f27 100644 --- a/lib/Model/DataAccess/Database.php +++ b/lib/Model/DataAccess/Database.php @@ -265,7 +265,7 @@ public function update(string $table, array $data, array $where = ['1' => '0']): */ public function insert(string $table, array $data, array &$mask = [], $ignore = false, $no_nulls = false, array $onDuplicateKey = []): string { - $query = static::buildInsertStatement($table, $data, $mask, $ignore, $no_nulls, $onDuplicateKey); + [$query, $dupBindValues] = static::buildInsertStatement($table, $data, $mask, $ignore, $no_nulls, $onDuplicateKey); $preparedStatement = $this->getConnection()->prepare($query); @@ -273,6 +273,7 @@ public function insert(string $table, array $data, array &$mask = [], $ignore = return isset($mask[$key]); }, ARRAY_FILTER_USE_KEY); + $valuesToBind = array_merge($valuesToBind, $dupBindValues); // Execute it $preparedStatement->execute($valuesToBind); @@ -293,11 +294,11 @@ public function insert(string $table, array $data, array &$mask = [], $ignore = * * @param array $on_duplicate_fields * - * @return string + * @return array{0: string, 1: array} [sql, dupBindValues] * @throws Exception * @internal param array $options of options for the SQL statement */ - public static function buildInsertStatement(string $table, array $attrs, array &$mask = [], bool $ignore = false, bool $no_nulls = false, array $on_duplicate_fields = []): string + public static function buildInsertStatement(string $table, array $attrs, array &$mask = [], bool $ignore = false, bool $no_nulls = false, array $on_duplicate_fields = []): array { if (empty($table)) { throw new Exception('TABLE constant is not defined'); @@ -312,6 +313,7 @@ public static function buildInsertStatement(string $table, array $attrs, array & $sql_ignore = $ignore ? " IGNORE " : ""; + $valuesToBind = []; $duplicate_statement = ""; if (!empty($on_duplicate_fields)) { $duplicate_statement = " ON DUPLICATE KEY UPDATE "; @@ -344,7 +346,7 @@ public static function buildInsertStatement(string $table, array $attrs, array & } else { //bind to PDO $duplicate_statement .= ":dupUpdate_" . $key; - $valuesToBind[":dupUpdate_" . $key] = $value; //TODO this is a bug: bind values are not returned and not inserted in the mask + $valuesToBind[":dupUpdate_" . $key] = $value; } $duplicate_statement .= ", "; } @@ -368,7 +370,7 @@ public static function buildInsertStatement(string $table, array $attrs, array & } } - return "INSERT $sql_ignore INTO " . $table . + $sql = "INSERT $sql_ignore INTO " . $table . " (" . implode(', ', $first) . ") VALUES (" . @@ -376,6 +378,8 @@ public static function buildInsertStatement(string $table, array $attrs, array & ") $duplicate_statement ; "; + + return [$sql, $valuesToBind]; } /** @@ -387,18 +391,6 @@ public function last_insert(): false|string return $this->getConnection()->lastInsertId(); } - - /** - * TODO this trim should be removed and ALL codebase migrated from $db->escape() to prepared Statements - * @deprecated - * @Override - * {@inheritdoc} - */ - public function escape(string $string): string - { - return substr($this->getConnection()->quote($string), 1, -1); - } - /** * @param string $sequence_name * @param int $seqIncrement diff --git a/lib/Model/DataAccess/IDatabase.php b/lib/Model/DataAccess/IDatabase.php index b95d2c8b3f..7c5faccc3f 100644 --- a/lib/Model/DataAccess/IDatabase.php +++ b/lib/Model/DataAccess/IDatabase.php @@ -103,17 +103,6 @@ public function insert(string $table, array $data): string; public function last_insert(): false|string; - /** - * Sanitize a input string - * This function is not required with the PDO extension. However, it's added for legacy support. - * and it may not work as expected. - * - * @param string $string String to clean - * - * @return string Sanitized string - */ - public function escape(string $string): string; - /** * Get the number of rows affected by the last update/insert query */ diff --git a/lib/Model/DataAccess/XFetchEnvelope.php b/lib/Model/DataAccess/XFetchEnvelope.php new file mode 100644 index 0000000000..1b6b8e509f --- /dev/null +++ b/lib/Model/DataAccess/XFetchEnvelope.php @@ -0,0 +1,28 @@ +|string|null */ public string|array|null $options; @@ -31,9 +32,9 @@ public function getFullyQualifiedClassName(): ?string } /** - * @return IBaseFeature + * @return BaseFeature */ - public function toNewObject(): IBaseFeature + public function toNewObject(): BaseFeature { $name = PluginsLoader::getPluginClass($this->feature_code); diff --git a/lib/Model/FeaturesBase/FeatureSet.php b/lib/Model/FeaturesBase/FeatureSet.php index 8e591d6b44..de92af09c6 100644 --- a/lib/Model/FeaturesBase/FeatureSet.php +++ b/lib/Model/FeaturesBase/FeatureSet.php @@ -7,11 +7,14 @@ use Controller\Views\TemplateDecorator\AbstractDecorator; use Controller\Views\TemplateDecorator\Arguments\ArgumentInterface; use Exception; +use Matecat\SubFiltering\Commons\Pipeline; use Matecat\SubFiltering\Contracts\FeatureSetInterface; use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; +use Model\FeaturesBase\Hook\Event\Filter\FromLayer0ToLayer1Event; +use Model\FeaturesBase\Hook\FilterEvent; +use Model\FeaturesBase\Hook\RunEvent; use Model\OwnerFeatures\OwnerFeatureDao; -use Model\Projects\MetadataDao; use Model\Projects\ProjectsMetadataMarshaller; use Model\Projects\ProjectStruct; use PHPTAL; @@ -23,10 +26,13 @@ use Utils\TaskRunner\Exceptions\ReQueueException; /** - * Created by PhpStorm. - * User: fregini/ostico - * Date: 3/11/16 - * Time: 11:00 AM + * Class FeatureSet + * + * Represents a set of features provided in the system. This class allows the + * management of features, including loading, merging, filtering, and various + * dependency-related operations for projects and users. + * + * Implements FeatureSetInterface. */ class FeatureSet implements FeatureSetInterface { @@ -49,33 +55,29 @@ public function getFeaturesStructs(): array * Initializes a new FeatureSet. If $features param is provided, FeaturesSet is populated with the given params. * Otherwise, it is populated with mandatory features. * - * @param $features + * @param BasicFeatureStruct[]|null $features * * @throws Exception */ - public function __construct($features = null) + public function __construct(?array $features = null) { if (is_null($features)) { $this->loadFromMandatory(); } else { $_features = []; foreach ($features as $feature) { - if (property_exists($feature, 'feature_code')) { - $_features[$feature->feature_code] = $feature; - } else { - throw new Exception('`feature_code` property not found on ' . var_export($feature, true)); - } + $_features[$feature->feature_code] = $feature; } $this->merge($_features); } } /** - * @return array + * @return array */ public function getCodes(): array { - return array_values(array_map(function ($feature) { + return array_values(array_map(function (BasicFeatureStruct $feature): string { return $feature->feature_code; }, $this->features)); } @@ -145,25 +147,16 @@ public function clear(): void } /** - * @param array $metadata + * Load additional feature dependencies from project metadata. * - * @throws AuthenticationError - * @throws EndQueueException - * @throws NotFoundException - * @throws ReQueueException - * @throws ValidationError - * @throws Exception + * Note: The filterProjectDependencies hook was removed (no handler existed). + * This method is kept as a public extension point — override in subclasses if needed. + * + * @param array $metadata */ public function loadProjectDependenciesFromProjectMetadata(array $metadata): void { - $project_dependencies = []; - $project_dependencies = $this->filter('filterProjectDependencies', $project_dependencies, $metadata); - $features = []; - foreach ($project_dependencies as $dependency) { - $features [$dependency] = new BasicFeatureStruct(['feature_code' => $dependency]); - } - - $this->merge($features); + // no-op: filterProjectDependencies hook removed (zero handlers in all plugins) } /** @@ -227,79 +220,118 @@ public function loadAutoActivableOwnerFeatures(string $id_customer): void { $features = OwnerFeatureDao::getByIdCustomer($id_customer); - $objs = array_map(function ($feature) { - /* @var $feature BasicFeatureStruct */ + $objs = array_map(function (BasicFeatureStruct $feature): BaseFeature { return $feature->toNewObject(); }, $features); - $returnable = array_filter($objs, function (?BaseFeature $obj) { + $returnable = array_filter($objs, function (BaseFeature $obj): bool { return $obj->isAutoActivableOnProject(); }); - $this->merge(array_map(function (BaseFeature $feature) { + $this->merge(array_map(function (BaseFeature $feature): BasicFeatureStruct { return $feature->getFeatureStruct(); }, $returnable)); } /** - * Returns the filtered subject variable passed to all enabled features. - * - * @param string $method - * @param mixed $filterable - * - * @return mixed - * - * @throws NotFoundException - * @throws ValidationError + * @throws EndQueueException * @throws AuthenticationError * @throws ReQueueException + * @throws ValidationError + * @throws NotFoundException + */ + public function customizeFromLayer0ToLayer1(Pipeline $pipeline): Pipeline + { + $event = $this->dispatchFilter(new FromLayer0ToLayer1Event($pipeline)); + + /** @var FromLayer0ToLayer1Event $event */ + return $event->getChannel(); + } + + public function customizeFromLayer1ToLayer2(Pipeline $pipeline): Pipeline + { + return $pipeline; + } + + public function customizeFromLayer2ToLayer1(Pipeline $pipeline): Pipeline + { + return $pipeline; + } + + public function customizeFromRawXliffToLayer0(Pipeline $pipeline): Pipeline + { + return $pipeline; + } + + public function customizeFromLayer0ToRawXliff(Pipeline $pipeline): Pipeline + { + return $pipeline; + } + + public function customizeFromLayer1ToLayer0(Pipeline $pipeline): Pipeline + { + return $pipeline; + } + + /** + * @template T of FilterEvent + * @param T $event + * @return T + * * @throws EndQueueException + * @throws AuthenticationError + * @throws ReQueueException + * @throws ValidationError + * @throws NotFoundException */ - public function filter(string $method, mixed $filterable): mixed + public function dispatchFilter(FilterEvent $event): FilterEvent { - $args = array_slice(func_get_args(), 1); + $hookName = $event::hookName(); foreach ($this->features as $feature) { $obj = $feature->toNewObject(); - if (method_exists($obj, $method)) { - array_shift($args); - array_unshift($args, $filterable); - + if (method_exists($obj, $hookName)) { try { - /** - * There may be the need to avoid a filter to be executed before or after other ones. - * To solve this problem, we could always pass the last argument to call_user_func_array which - * contains a list of executed feature codes. - * - * Example: $args + [ $executed_features ] - * - * This way plugins have the chance to decide whether to change the value, throw an exception or - * do whatever they need to based on the behaviour of the other features. - * - */ - $filterable = call_user_func_array([$obj, $method], $args); - } /** @noinspection PhpRedundantCatchClauseInspection */ - catch (ValidationError|NotFoundException|AuthenticationError|ReQueueException|EndQueueException $e) { + $obj->$hookName($event); + } catch (ValidationError|NotFoundException|AuthenticationError|ReQueueException|EndQueueException $e) { throw $e; } catch (Exception $e) { - LoggerFactory::getLogger('feature_set')->error("Exception running filter " . $method . ": " . $e->getMessage()); + LoggerFactory::getLogger('feature_set')->error("Exception running filter " . $hookName . ": " . $e->getMessage()); } } } - return $filterable; + return $event; } - /** - * @param string $method + * @template T of RunEvent + * @param RunEvent $event + * @throws AuthenticationError + * @throws EndQueueException + * @throws NotFoundException + * @throws ReQueueException + * @throws ValidationError */ - public function run(string $method): void + public function dispatchRun(RunEvent $event): void { - $args = array_slice(func_get_args(), 1); + $hookName = $event::hookName(); + foreach ($this->features as $feature) { - $this->runOnFeature($method, $feature, $args); + $obj = $feature->toNewObject(); + + if (method_exists($obj, $hookName)) { + try { + $obj->$hookName($event); + } catch (ValidationError|NotFoundException|AuthenticationError|ReQueueException|EndQueueException $e) { + throw $e; + } catch (Exception $e) { + LoggerFactory::getLogger('feature_set')->error( + "Exception running hook " . $hookName . ": " . $e->getMessage() + ); + } + } } } @@ -403,7 +435,7 @@ private function loadFeatureDependencies(): void * Updates the PluginsLoader array with new features. Ensures no duplicates are created. * Loads dependencies as needed. * - * @param $new_features BasicFeatureStruct[] + * @param array $new_features * * @throws Exception */ @@ -448,10 +480,14 @@ private function merge(array $new_features): void } } - $this->features = $this->filter('filterFeaturesMerged', $this->features); $this->sortFeatures(); } + /** + * @param string $string + * + * @return array + */ public static function splitString(string $string): array { return array_filter(explode(',', trim($string))); @@ -471,7 +507,7 @@ private function loadFromMandatory(): void } /** - * @return array + * @return array */ private function getAutoloadPlugins(): array { @@ -486,25 +522,4 @@ private function getAutoloadPlugins(): array return $features; } - /** - * Runs a command on a single feautre - * - * @param string $method - * @param BasicFeatureStruct $feature - * @param array $args - * - * @return void - */ - private function runOnFeature(string $method, BasicFeatureStruct $feature, array $args): void - { - $name = PluginsLoader::getPluginClass($feature->feature_code); - if ($name) { - $obj = new $name($feature); - - if (method_exists($obj, $method)) { - call_user_func_array([$obj, $method], $args); - } - } - } - -} \ No newline at end of file +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/AnalysisBeforeMTGetContributionEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/AnalysisBeforeMTGetContributionEvent.php new file mode 100644 index 0000000000..a3f3ab4b05 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/AnalysisBeforeMTGetContributionEvent.php @@ -0,0 +1,42 @@ +config; + } + public function setConfig(array $config): void + { + $this->config = $config; + } + + public function getMtEngine(): mixed + { + return $this->mtEngine; + } + + public function getQueueElement(): mixed + { + return $this->queueElement; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/AppendFieldToAnalysisObjectEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/AppendFieldToAnalysisObjectEvent.php new file mode 100644 index 0000000000..c621d39d3d --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/AppendFieldToAnalysisObjectEvent.php @@ -0,0 +1,37 @@ +metadata; + } + public function setMetadata(array $metadata): void + { + $this->metadata = $metadata; + } + + public function getProjectStructure(): ProjectStructure + { + return $this->projectStructure; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/AppendInitialTemplateVarsEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/AppendInitialTemplateVarsEvent.php new file mode 100644 index 0000000000..ec6a3c2ab2 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/AppendInitialTemplateVarsEvent.php @@ -0,0 +1,31 @@ +codes; + } + public function setCodes(array $codes): void + { + $this->codes = $codes; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/CharacterLengthCountEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/CharacterLengthCountEvent.php new file mode 100644 index 0000000000..6e434f01b2 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/CharacterLengthCountEvent.php @@ -0,0 +1,33 @@ +filterable; + } + + public function setFilterable(mixed $filterable): void + { + $this->filterable = $filterable; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/CheckTagMismatchEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/CheckTagMismatchEvent.php new file mode 100644 index 0000000000..972031b45a --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/CheckTagMismatchEvent.php @@ -0,0 +1,39 @@ +errorCode; + } + + public function setErrorCode(int $errorCode): void + { + $this->errorCode = $errorCode; + } + + public function getQaInstance(): mixed + { + return $this->qaInstance; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/CheckTagPositionsEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/CheckTagPositionsEvent.php new file mode 100644 index 0000000000..121bc369f3 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/CheckTagPositionsEvent.php @@ -0,0 +1,39 @@ +errorCode; + } + + public function setErrorCode(bool $errorCode): void + { + $this->errorCode = $errorCode; + } + + public function getQaInstance(): mixed + { + return $this->qaInstance; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/CorrectTagErrorsEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/CorrectTagErrorsEvent.php new file mode 100644 index 0000000000..c356266612 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/CorrectTagErrorsEvent.php @@ -0,0 +1,37 @@ +segment; + } + + public function setSegment(string $segment): void + { + $this->segment = $segment; + } + public function getOriginalDataMap(): array + { + return $this->originalDataMap; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/DecodeInstructionsEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/DecodeInstructionsEvent.php new file mode 100644 index 0000000000..60e1515da3 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/DecodeInstructionsEvent.php @@ -0,0 +1,34 @@ +value; + } + + public function setValue(mixed $value): void + { + $this->value = $value; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/EncodeInstructionsEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/EncodeInstructionsEvent.php new file mode 100644 index 0000000000..6d04012784 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/EncodeInstructionsEvent.php @@ -0,0 +1,33 @@ +value; + } + + public function setValue(mixed $value): void + { + $this->value = $value; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterActivityLogEntryEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterActivityLogEntryEvent.php new file mode 100644 index 0000000000..5ad792ed96 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterActivityLogEntryEvent.php @@ -0,0 +1,34 @@ +record; + } + + public function setRecord(ActivityLogStruct $record): void + { + $this->record = $record; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterContributionStructOnMTSetEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterContributionStructOnMTSetEvent.php new file mode 100644 index 0000000000..97666f3274 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterContributionStructOnMTSetEvent.php @@ -0,0 +1,51 @@ +contributionStruct; + } + + public function setContributionStruct(mixed $contributionStruct): void + { + $this->contributionStruct = $contributionStruct; + } + + public function getTranslation(): mixed + { + return $this->translation; + } + + public function getSegment(): mixed + { + return $this->segment; + } + + public function getFilter(): mixed + { + return $this->filter; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterContributionStructOnSetTranslationEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterContributionStructOnSetTranslationEvent.php new file mode 100644 index 0000000000..36f287bff6 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterContributionStructOnSetTranslationEvent.php @@ -0,0 +1,46 @@ +contributionStruct; + } + + public function setContributionStruct(mixed $contributionStruct): void + { + $this->contributionStruct = $contributionStruct; + } + + public function getProject(): ProjectStruct + { + return $this->project; + } + + public function getSegment(): mixed + { + return $this->segment; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterCreateProjectFeaturesEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterCreateProjectFeaturesEvent.php new file mode 100644 index 0000000000..cb017f3de0 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterCreateProjectFeaturesEvent.php @@ -0,0 +1,37 @@ +projectFeatures; + } + public function setProjectFeatures(array $projectFeatures): void + { + $this->projectFeatures = $projectFeatures; + } + + public function getController(): mixed + { + return $this->controller; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterGetSegmentsResultEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterGetSegmentsResultEvent.php new file mode 100644 index 0000000000..80f7e60c7e --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterGetSegmentsResultEvent.php @@ -0,0 +1,37 @@ +data; + } + public function setData(array $data): void + { + $this->data = $data; + } + + public function getChunk(): JobStruct + { + return $this->chunk; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterJobPasswordToReviewPasswordEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterJobPasswordToReviewPasswordEvent.php new file mode 100644 index 0000000000..f62f164df8 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterJobPasswordToReviewPasswordEvent.php @@ -0,0 +1,39 @@ +password; + } + + public function setPassword(string $password): void + { + $this->password = $password; + } + + public function getIdJob(): int + { + return $this->idJob; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterMyMemoryGetParametersEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterMyMemoryGetParametersEvent.php new file mode 100644 index 0000000000..a627ce2f8c --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterMyMemoryGetParametersEvent.php @@ -0,0 +1,35 @@ +parameters; + } + public function setParameters(array $parameters): void + { + $this->parameters = $parameters; + } + public function getConfig(): array + { + return $this->config; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterPayableRatesEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterPayableRatesEvent.php new file mode 100644 index 0000000000..3ea54ec30b --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterPayableRatesEvent.php @@ -0,0 +1,42 @@ +rates; + } + public function setRates(array $rates): void + { + $this->rates = $rates; + } + + public function getSourceLanguage(): string + { + return $this->sourceLanguage; + } + + public function getTargetLanguage(): string + { + return $this->targetLanguage; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FilterRevisionChangeNotificationListEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterRevisionChangeNotificationListEvent.php new file mode 100644 index 0000000000..b10216674a --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FilterRevisionChangeNotificationListEvent.php @@ -0,0 +1,30 @@ +emails; + } + public function setEmails(array $emails): void + { + $this->emails = $emails; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/FromLayer0ToLayer1Event.php b/lib/Model/FeaturesBase/Hook/Event/Filter/FromLayer0ToLayer1Event.php new file mode 100644 index 0000000000..54e2dc9c96 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/FromLayer0ToLayer1Event.php @@ -0,0 +1,31 @@ +channel; + } + + public function setChannel(Pipeline $channel): void + { + $this->channel = $channel; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/HandleJsonNotesBeforeInsertEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/HandleJsonNotesBeforeInsertEvent.php new file mode 100644 index 0000000000..f086d2fda9 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/HandleJsonNotesBeforeInsertEvent.php @@ -0,0 +1,34 @@ +projectStructure; + } + + public function setProjectStructure(ProjectStructure $projectStructure): void + { + $this->projectStructure = $projectStructure; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/InjectExcludedTagsInQaEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/InjectExcludedTagsInQaEvent.php new file mode 100644 index 0000000000..655e6dcc84 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/InjectExcludedTagsInQaEvent.php @@ -0,0 +1,30 @@ +excludedTags; + } + public function setExcludedTags(array $excludedTags): void + { + $this->excludedTags = $excludedTags; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/IsAnInternalUserEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/IsAnInternalUserEvent.php new file mode 100644 index 0000000000..4db90ec524 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/IsAnInternalUserEvent.php @@ -0,0 +1,42 @@ +email; + } + + public function isInternal(): bool + { + return $this->isInternal; + } + + public function setIsInternal(bool $isInternal): void + { + $this->isInternal = $isInternal; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/OutsourceAvailableInfoEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/OutsourceAvailableInfoEvent.php new file mode 100644 index 0000000000..8f159d39ca --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/OutsourceAvailableInfoEvent.php @@ -0,0 +1,46 @@ +filterable; + } + + public function setFilterable(mixed $filterable): void + { + $this->filterable = $filterable; + } + + public function getIdCustomer(): string + { + return $this->idCustomer; + } + + public function getIdJob(): int + { + return $this->idJob; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/PopulatePreTranslationsEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/PopulatePreTranslationsEvent.php new file mode 100644 index 0000000000..3677d2f15a --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/PopulatePreTranslationsEvent.php @@ -0,0 +1,33 @@ +default; + } + + public function setDefault(bool $default): void + { + $this->default = $default; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/PrepareNotesForRenderingEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/PrepareNotesForRenderingEvent.php new file mode 100644 index 0000000000..4730ff6fc2 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/PrepareNotesForRenderingEvent.php @@ -0,0 +1,30 @@ +notes; + } + public function setNotes(array $notes): void + { + $this->notes = $notes; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/ProjectUrlsEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/ProjectUrlsEvent.php new file mode 100644 index 0000000000..ea0d44f6ff --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/ProjectUrlsEvent.php @@ -0,0 +1,34 @@ +formatted; + } + + public function setFormatted(mixed $formatted): void + { + $this->formatted = $formatted; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/RewriteContributionContextsEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/RewriteContributionContextsEvent.php new file mode 100644 index 0000000000..7ca12ec63d --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/RewriteContributionContextsEvent.php @@ -0,0 +1,38 @@ +segmentsList; + } + + public function setSegmentsList(mixed $segmentsList): void + { + $this->segmentsList = $segmentsList; + } + public function getRequestData(): array + { + return $this->requestData; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/SanitizeOriginalDataMapEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/SanitizeOriginalDataMapEvent.php new file mode 100644 index 0000000000..5af7c2b57a --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/SanitizeOriginalDataMapEvent.php @@ -0,0 +1,30 @@ +originalDataMap; + } + public function setOriginalDataMap(array $originalDataMap): void + { + $this->originalDataMap = $originalDataMap; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Filter/WordCountEvent.php b/lib/Model/FeaturesBase/Hook/Event/Filter/WordCountEvent.php new file mode 100644 index 0000000000..44ca339a40 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Filter/WordCountEvent.php @@ -0,0 +1,33 @@ +wordCount; + } + + public function setWordCount(mixed $wordCount): void + { + $this->wordCount = $wordCount; + } +} diff --git a/lib/Model/FeaturesBase/Hook/Event/Run/AlterChunkReviewStructEvent.php b/lib/Model/FeaturesBase/Hook/Event/Run/AlterChunkReviewStructEvent.php new file mode 100644 index 0000000000..cf1a797cf7 --- /dev/null +++ b/lib/Model/FeaturesBase/Hook/Event/Run/AlterChunkReviewStructEvent.php @@ -0,0 +1,24 @@ + is_string($value) ? $value : json_encode($value), + default => (string)$value, + }; + } + + public static function unMarshall(MetadataStruct $struct): mixed + { + return match ($struct->key) { + self::PDF_ANALYSIS->value => json_validate($struct->value) + ? json_decode($struct->value, true) + : $struct->value, + default => $struct->value, + }; + } +} diff --git a/lib/Model/Files/MetadataDao.php b/lib/Model/Files/MetadataDao.php index 85e795f3c0..1e2990cc26 100644 --- a/lib/Model/Files/MetadataDao.php +++ b/lib/Model/Files/MetadataDao.php @@ -17,6 +17,8 @@ class MetadataDao extends AbstractDao const string TABLE = 'file_metadata'; const string _query_metadata_by_project_id_file = "SELECT * FROM " . self::TABLE . " WHERE id_project = :id_project AND id_file = :id_file "; + const string _query_get_by_key = "SELECT * FROM " . self::TABLE . " WHERE id_project = :id_project AND id_file = :id_file AND `key` = :key "; + const string _query_get_by_key_and_parts = "SELECT * FROM " . self::TABLE . " WHERE id_project = :id_project AND id_file = :id_file AND `key` = :key AND `files_parts_id` = :files_parts_id "; /** * @param int $id_project @@ -30,10 +32,18 @@ public function getByJobIdProjectAndIdFile(int $id_project, int $id_file, int $t { $stmt = $this->_getStatementForQuery(self::_query_metadata_by_project_id_file); - return $this->setCacheTTL($ttl)->_fetchObjectMap($stmt, MetadataStruct::class, [ + $list = $this->setCacheTTL($ttl)->_fetchObjectMap($stmt, MetadataStruct::class, [ 'id_project' => $id_project, 'id_file' => $id_file, ]); + + if ($list) { + foreach ($list as $metaStruct) { + $metaStruct->value = FilesMetadataMarshaller::unMarshall($metaStruct); + } + } + + return $list; } /** @@ -46,6 +56,34 @@ public function destroyCacheByJobIdProjectAndIdFile(int $id_project, int $id_fil return $this->_destroyObjectCache($stmt, MetadataStruct::class, ['id_project' => $id_project, 'id_file' => $id_file,]); } + /** + * Destroy cached result for a specific get() call. + * + * Must reconstruct the same query and params used in get() so that + * _destroyObjectCache computes the matching cache key. + * + * @throws ReflectionException + */ + public function destroyGetCache(int $id_project, int $id_file, string $key, ?int $filePartsId = null): bool + { + $params = [ + 'id_project' => $id_project, + 'id_file' => $id_file, + 'key' => $key, + ]; + + if ($filePartsId) { + $query = self::_query_get_by_key_and_parts; + $params['files_parts_id'] = $filePartsId; + } else { + $query = self::_query_get_by_key; + } + + $stmt = $this->_getStatementForQuery($query); + + return $this->_destroyObjectCache($stmt, MetadataStruct::class, $params); + } + /** * @param int $id_project * @param int $id_file @@ -58,11 +96,6 @@ public function destroyCacheByJobIdProjectAndIdFile(int $id_project, int $id_fil */ public function get(int $id_project, int $id_file, string $key, ?int $filePartsId = null, int $ttl = 0): ?MetadataStruct { - $query = "SELECT * FROM " . self::TABLE . " WHERE " . - " id_project = :id_project " . - " AND id_file = :id_file " . - " AND `key` = :key "; - $params = [ 'id_project' => $id_project, 'id_file' => $id_file, @@ -70,13 +103,21 @@ public function get(int $id_project, int $id_file, string $key, ?int $filePartsI ]; if ($filePartsId) { - $query .= " AND `files_parts_id` = :files_parts_id"; + $query = self::_query_get_by_key_and_parts; $params['files_parts_id'] = $filePartsId; + } else { + $query = self::_query_get_by_key; } $stmt = $this->_getStatementForQuery($query); - return $this->setCacheTTL($ttl)->_fetchObjectMap($stmt, MetadataStruct::class, $params)[0] ?? null; + $result = $this->setCacheTTL($ttl)->_fetchObjectMap($stmt, MetadataStruct::class, $params)[0] ?? null; + + if ($result) { + $result->value = FilesMetadataMarshaller::unMarshall($result); + } + + return $result; } /** @@ -106,6 +147,9 @@ public function insert(int $id_project, int $id_file, string $key, string $value 'value' => $value ]); + $this->destroyCacheByJobIdProjectAndIdFile($id_project, $id_file); + $this->destroyGetCache($id_project, $id_file, $key, $filePartsId); + return $this->get($id_project, $id_file, $key, $filePartsId); } @@ -141,6 +185,9 @@ public function update(int $id_project, int $id_file, string $key, string $value $stmt->execute($args); + $this->destroyCacheByJobIdProjectAndIdFile($id_project, $id_file); + $this->destroyGetCache($id_project, $id_file, $key, $filePartsId); + return $this->get($id_project, $id_file, $key, $filePartsId); } @@ -151,6 +198,7 @@ public function update(int $id_project, int $id_file, string $key, string $value * @param int|null $filePartsId * * @return bool|null + * @throws ReflectionException */ public function bulkInsert(int $id_project, int $id_file, array $metadata = [], ?int $filePartsId = null): bool|null { @@ -181,9 +229,18 @@ public function bulkInsert(int $id_project, int $id_file, array $metadata = [], $conn = Database::obtain()->getConnection(); $stmt = $conn->prepare($sql); - return $stmt->execute($bind_values); + $result = $stmt->execute($bind_values); + + $this->destroyCacheByJobIdProjectAndIdFile($id_project, $id_file); + foreach ($metadata as $key => $value) { + if ($value !== null and $value !== '') { + $this->destroyGetCache($id_project, $id_file, $key, $filePartsId); + } + } + + return $result; } return null; } -} \ No newline at end of file +} diff --git a/lib/Model/Files/MetadataStruct.php b/lib/Model/Files/MetadataStruct.php index 71976d3ccc..95a2a7d803 100644 --- a/lib/Model/Files/MetadataStruct.php +++ b/lib/Model/Files/MetadataStruct.php @@ -18,5 +18,5 @@ class MetadataStruct extends AbstractDaoSilentStruct implements IDaoStruct public ?int $files_parts_id = null; public int $id_file; public string $key; - public string $value; + public mixed $value; } diff --git a/lib/Model/JobSplitMerge/JobSplitMergeService.php b/lib/Model/JobSplitMerge/JobSplitMergeService.php index 761df62f2b..e22577887e 100644 --- a/lib/Model/JobSplitMerge/JobSplitMergeService.php +++ b/lib/Model/JobSplitMerge/JobSplitMergeService.php @@ -8,6 +8,8 @@ use Model\Concerns\LogsMessages; use Model\DataAccess\IDatabase; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Run\PostJobMergedEvent; +use Model\FeaturesBase\Hook\Event\Run\PostJobSplittedEvent; use Model\Jobs\JobDao; use Model\Jobs\JobStruct; use Model\Jobs\JobsMetadataMarshaller; @@ -505,7 +507,7 @@ public function splitJob(SplitMergeProjectData $data, ?int $uid = null): void $this->getCart()->deleteCart(); - $this->features->run('postJobSplitted', $data); + $this->features->dispatchRun(new PostJobSplittedEvent($data)); } /** @@ -601,7 +603,7 @@ public function mergeALL(SplitMergeProjectData $data, array $jobStructs): void $wCountManager->initializeJobWordCount((int)$first_job['id'], (string)$first_job['password']); $chunk = new JobStruct($first_job->toArray()); - $this->features->run('postJobMerged', $data, $chunk); + $this->features->dispatchRun(new PostJobMergedEvent($data, $chunk)); $jobDao = $this->createJobDao(); diff --git a/lib/Model/OwnerFeatures/OwnerFeatureDao.php b/lib/Model/OwnerFeatures/OwnerFeatureDao.php index a867412126..ff75f39572 100644 --- a/lib/Model/OwnerFeatures/OwnerFeatureDao.php +++ b/lib/Model/OwnerFeatures/OwnerFeatureDao.php @@ -44,7 +44,7 @@ public function create(IDaoStruct $obj): ?OwnerFeatureStruct $values = array_diff_key($obj->toArray(), ['id' => null]); $stmt->execute($values); - $record = $this->getById($conn->lastInsertId()); + $record = $this->getById((int) $conn->lastInsertId()); $conn->commit(); return $record; @@ -52,10 +52,10 @@ public function create(IDaoStruct $obj): ?OwnerFeatureStruct /** * @param string $id_customer - * * @param int $ttl * - * @return IDaoStruct[]|OwnerFeatureStruct[] + * @return OwnerFeatureStruct[] + * * @throws ReflectionException */ public static function getByIdCustomer(string $id_customer, int $ttl = 3600): array @@ -66,18 +66,18 @@ public static function getByIdCustomer(string $id_customer, int $ttl = 3600): ar return $thisDao->setCacheTTL($ttl)->_fetchObjectMap($stmt, OwnerFeatureStruct::class, [ 'id_customer' => $id_customer - ]) ?? []; + ]); } /** * Destroy a cached object * - * @param $id_customer + * @param string $id_customer * * @return bool * @throws ReflectionException */ - public static function destroyCacheByIdCustomer($id_customer): bool + public static function destroyCacheByIdCustomer(string $id_customer): bool { $thisDao = new self(); $stmt = $thisDao->_getStatementForQuery(self::query_by_user_email); @@ -86,6 +86,8 @@ public static function destroyCacheByIdCustomer($id_customer): bool } /** + * @return OwnerFeatureStruct[] + * * @throws ReflectionException */ public static function getByUserId(?int $uid, int $ttl = 3600): array @@ -100,7 +102,7 @@ public static function getByUserId(?int $uid, int $ttl = 3600): array return $thisDao->setCacheTTL($ttl)->_fetchObjectMap($stmt, OwnerFeatureStruct::class, [ 'uid' => $uid - ]) ?? []; + ]); } /** diff --git a/lib/Model/ProjectCreation/JobCreationService.php b/lib/Model/ProjectCreation/JobCreationService.php index c672bdc1c4..155aa4e528 100644 --- a/lib/Model/ProjectCreation/JobCreationService.php +++ b/lib/Model/ProjectCreation/JobCreationService.php @@ -7,6 +7,8 @@ use Model\ConnectedServices\GDrive\Session; use Model\ConnectedServices\Oauth\Google\GoogleProvider; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\FilterPayableRatesEvent; +use Model\FeaturesBase\Hook\Event\Run\ValidateJobCreationEvent; use Model\Files\FileDao; use Model\Jobs\JobDao; use Model\Jobs\JobsMetadataMarshaller; @@ -70,8 +72,11 @@ private function resolvePayableRates(ProjectStructure $projectStructure, string // Branch 4: default — use static PayableRates with feature filtering $rates = PayableRates::getPayableRates((string)$projectStructure->source_language, $target); + $filterPayableRatesEvent = new FilterPayableRatesEvent($rates, (string)$projectStructure->source_language, $target); + $this->features->dispatchFilter($filterPayableRatesEvent); + return [ - (string)json_encode($this->features->filter('filterPayableRates', $rates, $projectStructure->source_language, $target)), + (string)json_encode($filterPayableRatesEvent->getRates()), null, ]; } @@ -260,7 +265,7 @@ public function createJobsForTargetLanguages( $tmKeysJson = $this->buildTmKeysJson($projectStructure); $job = $this->buildJobStruct($projectStructure, $target, $payableRates, $tmKeysJson, $minMaxSegmentsId, $filesWordCount); - $this->features->run('validateJobCreation', $job, $projectStructure); + $this->features->dispatchRun(new ValidateJobCreationEvent($job, $projectStructure)); $job = $this->insertJob($job); $this->updateJobTracking($projectStructure, $job, $payableRates, $minMaxSegmentsId); diff --git a/lib/Model/ProjectCreation/ProjectManager.php b/lib/Model/ProjectCreation/ProjectManager.php index 876a0d055d..63d40a43aa 100644 --- a/lib/Model/ProjectCreation/ProjectManager.php +++ b/lib/Model/ProjectCreation/ProjectManager.php @@ -15,7 +15,11 @@ use Model\Exceptions\ValidationError; use Model\FeaturesBase\BasicFeatureStruct; use Model\FeaturesBase\FeatureSet; - +use Model\FeaturesBase\Hook\Event\Filter\DecodeInstructionsEvent; +use Model\FeaturesBase\Hook\Event\Filter\HandleJsonNotesBeforeInsertEvent; +use Model\FeaturesBase\Hook\Event\Run\BeforeProjectCreationEvent; +use Model\FeaturesBase\Hook\Event\Run\PostProjectCreateEvent; +use Model\FeaturesBase\Hook\Event\Run\ValidateProjectCreationEvent; use Model\Files\MetadataDao; use Model\FilesStorage\AbstractFilesStorage; use Model\FilesStorage\FilesStorageFactory; @@ -25,6 +29,7 @@ use Model\Projects\ProjectDao; use Model\Projects\ProjectsMetadataMarshaller; use Model\Projects\ProjectStruct; +use Model\Segments\SegmentMetadataMapper; use Model\Teams\TeamDao; use Model\Teams\TeamStruct; use Model\Users\UserStruct; @@ -157,6 +162,7 @@ protected function getSegmentExtractor(): SegmentExtractor $this->filter, $this->features, $this->filesMetadataDao, + new SegmentMetadataMapper(), $this->logger, ); } @@ -343,9 +349,7 @@ protected function checkForProjectAssignment(): void $teamData = $this->projectStructure->team instanceof TeamStruct ? $this->projectStructure->team->getArrayCopy() : (array)$this->projectStructure->team; - $this->projectStructure->team = new TeamStruct( - $this->features->filter('filter_team_for_project_creation', $teamData) - ); + $this->projectStructure->team = new TeamStruct($teamData); //clean the cache for the team member list of assigned projects $teamDao = $this->getTeamDao(); @@ -435,7 +439,7 @@ private function validateBeforeCreation(): void $this->checkForProjectAssignment(); SecondPassReview::loadAndValidateQualityFramework($this->projectStructure); - $this->features->run('validateProjectCreation', $this->projectStructure); + $this->features->dispatchRun(new ValidateProjectCreationEvent($this->projectStructure)); if (count($this->projectStructure->result['errors']) > 0) { $this->log($this->projectStructure->result['errors']); @@ -582,11 +586,13 @@ private function resolveFilesExtractSegmentsAndStoreData( ); } - $this->features->run("beforeProjectCreation", $this->projectStructure, [ + $this->features->dispatchRun(new BeforeProjectCreationEvent( + $this->projectStructure, + [ 'total_project_segments' => $this->total_segments, - 'files_raw_wc' => $this->files_word_count + 'files_raw_wc' => $this->files_word_count, ] - ); + )); $this->createProjectRecord(); $this->saveFeaturesInMetadata(); @@ -748,7 +754,7 @@ private function finalizeProjectInTransaction(): void (new ProjectDao())->destroyCacheForProjectData((int)$this->projectStructure->id_project, $this->projectStructure->ppassword); (new ProjectDao())->setCacheTTL(60 * 60 * 24)->getProjectData((int)$this->projectStructure->id_project, $this->projectStructure->ppassword); - $this->features->run('postProjectCreate', $this->projectStructure); + $this->features->dispatchRun(new PostProjectCreateEvent($this->projectStructure)); ProjectDao::updateAnalysisStatus( $this->projectStructure->id_project, @@ -763,8 +769,6 @@ private function finalizeProjectInTransaction(): void $db->rollback(); throw $e; } - - $this->features->run('postProjectCommit', $this->projectStructure); } /** @@ -1012,7 +1016,9 @@ private function syncCountersFromExtractor(): void */ protected function insertInstructions(int $fid, array|string $value): void { - $value = $this->features->filter('decodeInstructions', $value); + $event = new DecodeInstructionsEvent($value); + $this->features->dispatchFilter($event); + $value = $event->getValue(); $this->filesMetadataDao->insert((int)$this->projectStructure->id_project, $fid, 'instructions', (string)$value); } @@ -1033,25 +1039,18 @@ protected function storeSegments(int $fid): void */ private function insertSegmentNotesForFile(): void { - $this->projectStructure = $this->features->filter('handleJsonNotesBeforeInsert', $this->projectStructure); + $event = new HandleJsonNotesBeforeInsertEvent($this->projectStructure); + $this->features->dispatchFilter($event); + $this->projectStructure = $event->getProjectStructure(); $this->getProjectManagerModel()->bulkInsertSegmentNotesAndMetadata($this->projectStructure->notes); } - /** - * @throws AuthenticationError - * @throws EndQueueException - * @throws NotFoundException - * @throws ReQueueException - * @throws ValidationError - * @throws Exception - */ private function insertContextsForFile(): void { - $this->features->filter('handleTUContextGroups', $this->projectStructure); $this->getProjectManagerModel()->bulkInsertContextsGroups( (int)$this->projectStructure->id_project, $this->projectStructure->context_group, ); } -} \ No newline at end of file +} diff --git a/lib/Model/ProjectCreation/ProjectManagerModel.php b/lib/Model/ProjectCreation/ProjectManagerModel.php index 8cfecc36ad..b16a8fbafc 100644 --- a/lib/Model/ProjectCreation/ProjectManagerModel.php +++ b/lib/Model/ProjectCreation/ProjectManagerModel.php @@ -3,10 +3,12 @@ namespace Model\ProjectCreation; use Exception; +use InvalidArgumentException; use Model\Concerns\LogsMessages; use Model\DataAccess\IDatabase; use Model\Projects\ProjectDao; use Model\Projects\ProjectStruct; +use Model\Segments\SegmentMetadataMarshaller; use PDO; use PDOException; use PDOStatement; @@ -255,15 +257,7 @@ public function bulkInsertSegmentNotesAndMetadata(array $notes): void */ private static function isAMetadata(string $metaKey): bool { - $metaDataKeys = [ - 'id_request', - 'id_content', - 'id_order', - 'id_order_group', - 'screenshot' - ]; - - return in_array($metaKey, $metaDataKeys); + return SegmentMetadataMarshaller::isAllowed($metaKey); } /** @@ -312,13 +306,13 @@ public function bulkInsertContextsGroups(int $idProject, array $contextGroups): * @param int $idProject * @param int $batchSize Max rows per batched DELETE (must be >= 1) * - * @throws \InvalidArgumentException if $batchSize < 1 + * @throws InvalidArgumentException if $batchSize < 1 * @throws PDOException */ public function deleteProject(int $idProject, int $batchSize = 200): void { if ($batchSize < 1) { - throw new \InvalidArgumentException("batchSize must be >= 1, got $batchSize"); + throw new InvalidArgumentException("batchSize must be >= 1, got $batchSize"); } $conn = $this->dbHandler->getConnection(); diff --git a/lib/Model/ProjectCreation/SegmentExtractor.php b/lib/Model/ProjectCreation/SegmentExtractor.php index ddbcf36af1..f83fea3b8d 100644 --- a/lib/Model/ProjectCreation/SegmentExtractor.php +++ b/lib/Model/ProjectCreation/SegmentExtractor.php @@ -12,14 +12,17 @@ use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\PopulatePreTranslationsEvent; +use Model\FeaturesBase\Hook\Event\Filter\WordCountEvent; use Model\Files\FilesPartsDao; use Model\Files\FilesPartsStruct; use Model\Files\MetadataDao; use Model\FilesStorage\AbstractFilesStorage; use Model\FilesStorage\S3FilesStorage; -use Model\Segments\SegmentMetadataStruct; +use Model\Segments\SegmentMetadataMarshaller; use Model\Segments\SegmentOriginalDataStruct; use Model\Segments\SegmentStruct; +use Model\Segments\SegmentMetadataMapper; use Model\Xliff\DTO\XliffRuleInterface; use Model\Xliff\DTO\XliffRulesModel; use ReflectionException; @@ -79,6 +82,7 @@ public function __construct( private readonly MateCatFilter $filter, private readonly FeatureSet $features, private readonly MetadataDao $filesMetadataDao, + private readonly SegmentMetadataMapper $segmentMetadataMapper, MatecatLogger $logger, ) { $this->logger = $logger; @@ -320,7 +324,9 @@ private function processSegSourceTransUnit( $show_in_cattool = 1; $wordCount = CatUtils::segment_raw_word_count($seg_source['raw-content'], $this->sourceLanguage, $this->filter); - $wordCount = $this->features->filter('wordCount', $wordCount); + $wordCountEvent = new WordCountEvent($wordCount); + $this->features->dispatchFilter($wordCountEvent); + $wordCount = $wordCountEvent->getWordCount(); $sourceLayer0 = $this->filter->fromRawXliffToLayer0($seg_source['raw-content']); @@ -487,22 +493,6 @@ public static function getTargetStatesFromTransUnit(array $trans_unit, ?int $pos // ── Private helpers ───────────────────────────────────────────── - /** - * Extract the sizeRestriction value from a trans-unit's attributes. - * - * Returns the value as an int if present and > 0, null otherwise. - * - * @param array $xliff_trans_unit - */ - private function getSizeRestrictionValue(array $xliff_trans_unit): ?int - { - if (isset($xliff_trans_unit['attr']['sizeRestriction']) && $xliff_trans_unit['attr']['sizeRestriction'] > 0) { - return (int)$xliff_trans_unit['attr']['sizeRestriction']; - } - - return null; - } - /** * Build a dataRef map from the trans-unit's original-data entries. * @@ -548,7 +538,9 @@ protected function detectPreTranslation( ?int $position, ProjectStructure $projectStructure, ): ?array { - if (!$this->features->filter('populatePreTranslations', true)) { + $populatePreTranslationsEvent = new PopulatePreTranslationsEvent(true); + $this->features->dispatchFilter($populatePreTranslationsEvent); + if (!$populatePreTranslationsEvent->getDefault()) { return null; } @@ -686,14 +678,12 @@ private function buildAndAppendSegment( ?string $xliffMrkExtSuccTags = null, ?string $xliffExtSuccTags = null, ): array { - // --- Segment metadata (sizeRestriction) --- - $metadataStruct = new SegmentMetadataStruct(); - $sizeRestriction = $this->getSizeRestrictionValue($xliff_trans_unit); - if ($sizeRestriction !== null) { - $metadataStruct->meta_key = 'sizeRestriction'; - $metadataStruct->meta_value = (string)$sizeRestriction; - } - $projectStructure->segments_meta_data[$fid][] = $metadataStruct; + // --- Segment metadata (mapped from trans-unit attributes) --- + $metadataCollection = $this->segmentMetadataMapper->fromTransUnitAttributes($xliff_trans_unit['attr'] ?? []); + $projectStructure->segments_meta_data[$fid][] = $metadataCollection; + + // Extract sizeRestriction meta_value for hash computation + $sizeRestriction = $metadataCollection->find(SegmentMetadataMarshaller::SIZE_RESTRICTION); // --- Segment original data --- $segmentOriginalDataStruct = (new SegmentOriginalDataStruct())->setMap($dataRefMap); @@ -733,7 +723,7 @@ private function buildAndAppendSegment( * * @param array|null $dataRefMap */ - private function createSegmentHash(string $rawContent, ?array $dataRefMap = null, ?int $sizeRestriction = null): string + private function createSegmentHash(string $rawContent, ?array $dataRefMap = null, ?string $sizeRestriction = null): string { $segmentToBeHashed = $rawContent; @@ -898,6 +888,10 @@ protected function resolveTranslationRule( /** @var XliffRulesModel $configModel */ $configModel = $projectStructure->xliff_parameters; + if (is_array($configModel)) { + $configModel = new XliffRulesModel($configModel); + } + $rule = $configModel->getMatchingRule( $projectStructure->current_xliff_info[$file_id]['version'], $state, @@ -930,8 +924,7 @@ private function manageAlternativeTranslations(array $xliff_trans_unit, ?array $ !isset($xliff_trans_unit['alt-trans']) || empty($xliff_file_attributes['source-language']) || empty($xliff_file_attributes['target-language']) || - empty($privateTmKeys) || - $this->features->filter('doNotManageAlternativeTranslations', true, $xliff_trans_unit, $xliff_file_attributes) + empty($privateTmKeys) ) { return; } diff --git a/lib/Model/ProjectCreation/SegmentStorageService.php b/lib/Model/ProjectCreation/SegmentStorageService.php index d10eace2c4..a4b832bebf 100644 --- a/lib/Model/ProjectCreation/SegmentStorageService.php +++ b/lib/Model/ProjectCreation/SegmentStorageService.php @@ -10,8 +10,12 @@ use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\AppendFieldToAnalysisObjectEvent; +use Model\FeaturesBase\Hook\Event\Filter\CorrectTagErrorsEvent; +use Model\FeaturesBase\Hook\Event\Filter\SanitizeOriginalDataMapEvent; use Model\Jobs\JobStruct; use Model\Segments\SegmentDao; +use Model\Segments\SegmentMetadataCollection; use Model\Segments\SegmentMetadataDao; use Model\Segments\SegmentMetadataStruct; use Model\Segments\SegmentOriginalDataDao; @@ -153,22 +157,25 @@ private function prepareAndPersistSegment( if (!empty($originalDataMap)) { // We add two filters here (sanitizeOriginalDataMap and correctTagErrors) // to allow the correct tag handling by the plugins - $map = $this->features->filter('sanitizeOriginalDataMap', $originalDataMap); + $sanitizeEvent = new SanitizeOriginalDataMapEvent($originalDataMap); + $this->features->dispatchFilter($sanitizeEvent); + $map = $sanitizeEvent->getOriginalDataMap(); // persist an original data map if present $this->insertOriginalDataRecord($id_segment, $map); - $projectStructure->segments[$fid][$position]->segment = $this->features->filter( - 'correctTagErrors', + $correctTagErrorsEvent = new CorrectTagErrorsEvent( $projectStructure->segments[$fid][$position]->segment, $map ); + $this->features->dispatchFilter($correctTagErrorsEvent); + $projectStructure->segments[$fid][$position]->segment = $correctTagErrorsEvent->getSegment(); } - /** @var ?SegmentMetadataStruct $segmentMetadataStruct */ - $segmentMetadataStruct = $projectStructure->segments_meta_data[$fid][$position] ?? null; + /** @var SegmentMetadataCollection $metadataCollection */ + $metadataCollection = $projectStructure->segments_meta_data[$fid][$position] ?? new SegmentMetadataCollection(); - if ($segmentMetadataStruct !== null) { + foreach ($metadataCollection as $segmentMetadataStruct) { $this->saveSegmentMetadata($id_segment, $segmentMetadataStruct); } @@ -193,7 +200,10 @@ private function prepareAndPersistSegment( * This hook allows plugins to manipulate data analysis content, should be not allowed to change existing data * but only to eventually add new fields */ - return $this->features->filter('appendFieldToAnalysisObject', $metadata, $projectStructure); + $appendFieldEvent = new AppendFieldToAnalysisObjectEvent($metadata, $projectStructure); + $this->features->dispatchFilter($appendFieldEvent); + + return $appendFieldEvent->getMetadata(); } /** diff --git a/lib/Model/Projects/ProjectsMetadataMarshaller.php b/lib/Model/Projects/ProjectsMetadataMarshaller.php index 0b0848f262..32a1dfe260 100644 --- a/lib/Model/Projects/ProjectsMetadataMarshaller.php +++ b/lib/Model/Projects/ProjectsMetadataMarshaller.php @@ -46,6 +46,7 @@ enum ProjectsMetadataMarshaller: string case SEGMENTATION_RULE = 'segmentation_rule'; case WPML = 'WPML'; + case CONTEXT_URL = 'context-url'; public static function unMarshall(MetadataStruct $struct): mixed { @@ -69,7 +70,8 @@ public static function unMarshall(MetadataStruct $struct): mixed ProjectsMetadataMarshaller::INTENTO_PROVIDER->value, ProjectsMetadataMarshaller::DEEPL_FORMALITY->value, ProjectsMetadataMarshaller::DEEPL_ID_GLOSSARY->value, - ProjectsMetadataMarshaller::DEEPL_ENGINE_TYPE->value => fn() => (string)$struct->value, + ProjectsMetadataMarshaller::DEEPL_ENGINE_TYPE->value, + ProjectsMetadataMarshaller::CONTEXT_URL->value => fn() => (string)$struct->value, // backward compatibility, old projects could have JSON glossaries encoded as HTML entities ProjectsMetadataMarshaller::LARA_GLOSSARIES->value => fn() => json_decode(html_entity_decode((string)$struct->value), true), default => fn() => json_validate((string)$struct->value) ? json_decode((string)$struct->value, true) : (string)$struct->value, diff --git a/lib/Model/Search/SearchModel.php b/lib/Model/Search/SearchModel.php index ffd380fdab..47398ded6f 100644 --- a/lib/Model/Search/SearchModel.php +++ b/lib/Model/Search/SearchModel.php @@ -61,13 +61,17 @@ public function search(bool $inCurrentChunkOnly): array { switch ($this->queryParams->key) { case 'source': - $results = $this->_getQuery($this->_loadSearchInSourceQuery($inCurrentChunkOnly)); + [$sql, $params] = $this->_loadSearchInSourceQuery($inCurrentChunkOnly); + $results = $this->_getQuery($sql, $params); break; case 'target': - $results = $this->_getQuery($this->_loadSearchInTargetQuery($inCurrentChunkOnly)); + [$sql, $params] = $this->_loadSearchInTargetQuery($inCurrentChunkOnly); + $results = $this->_getQuery($sql, $params); break; case 'coupled': - $rawResults = array_merge_recursive($this->_getQuery($this->_loadSearchInSourceQuery($inCurrentChunkOnly)), $this->_getQuery($this->_loadSearchInTargetQuery($inCurrentChunkOnly))); + [$sqlSrc, $paramsSrc] = $this->_loadSearchInSourceQuery($inCurrentChunkOnly); + [$sqlTrg, $paramsTrg] = $this->_loadSearchInTargetQuery($inCurrentChunkOnly); + $rawResults = array_merge_recursive($this->_getQuery($sqlSrc, $paramsSrc), $this->_getQuery($sqlTrg, $paramsTrg)); $results = []; // in this case, $results is the merge of two queries results, @@ -78,7 +82,8 @@ public function search(bool $inCurrentChunkOnly): array break; case 'status_only': - $results = $this->_getQuery($this->_loadSearchStatusOnlyQuery()); + [$sql, $params] = $this->_loadSearchStatusOnlyQuery(); + $results = $this->_getQuery($sql, $params); break; default: $results = []; @@ -174,16 +179,17 @@ private function find(string $haystack, string $needle): array } /** - * @param $sql + * @param string $sql + * @param array $params * * @return array * @throws Exception */ - protected function _getQuery($sql): array + protected function _getQuery(string $sql, array $params = []): array { try { $stmt = $this->db->getConnection()->prepare($sql); - $stmt->execute(); + $stmt->execute($params); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { LoggerFactory::doJsonLog($e->getMessage()); @@ -206,8 +212,7 @@ protected function _loadParams(): void $this->queryParams->where_status = ""; if ($this->queryParams->status != 'all') { - $this->queryParams->status = $this->db->escape($this->queryParams->status); //escape: hardcoded - $this->queryParams->where_status = "AND st.status = '{$this->queryParams->status}'"; + $this->queryParams->where_status = "AND st.status = :status"; } $this->queryParams->matchCase = new stdClass(); @@ -229,79 +234,93 @@ protected function _loadParams(): void $this->queryParams->exactMatch->Space_Left = $this->queryParams->exactMatch->Space_Right = ""; // we want to search for all occurrences in a string: the word mod will take two matches: "mod" and "mod modifier" } - /** - * Escape Meta-characters to use in regular expression (LIKE STATEMENT is treated inside MySQL as a Regexp pattern) - * - */ - if (isset($this->queryParams->source)) { - $escaped = preg_quote((string)$this->queryParams->source, '#'); - $this->queryParams->_regexpNotEscapedSrc = $escaped; - $this->queryParams->regexpEscapedSrc = $this->db->escape($escaped); - } - - if (isset($this->queryParams->target)) { - $escaped = preg_quote((string)$this->queryParams->target, '#'); - $this->queryParams->_regexpEscapedTrg = $escaped; - $this->queryParams->regexpEscapedTrg = $this->db->escape($escaped); - } } /** * @param bool $inCurrentChunkOnly * - * @return string + * @return array */ - protected function _loadSearchInTargetQuery(bool $inCurrentChunkOnly = false): string + protected function _loadSearchInTargetQuery(bool $inCurrentChunkOnly = false): array { $this->_loadParams(); - $password_where = ($inCurrentChunkOnly) ? ' AND st.id_segment between j.job_first_segment and j.job_last_segment AND j.password = "' . $this->queryParams->password . '"' : ''; + $params = ['job' => $this->queryParams->job]; + $password_where = ''; + if ($inCurrentChunkOnly) { + $password_where = ' AND st.id_segment BETWEEN j.job_first_segment AND j.job_last_segment AND j.password = :password'; + $params['password'] = $this->queryParams->password; + } - return " + if ($this->queryParams->status != 'all') { + $params['status'] = $this->queryParams->status; + } + + $sql = " SELECT st.id_segment as id, st.translation as text, od.map as original_map FROM segment_translations st INNER JOIN jobs j ON j.id = st.id_job LEFT JOIN segment_original_data od on od.id_segment = st.id_segment - WHERE st.id_job = {$this->queryParams->job} + WHERE st.id_job = :job {$password_where} AND st.status != 'NEW' {$this->queryParams->where_status} GROUP BY st.id_segment"; + + return [$sql, $params]; } /** * @param bool $inCurrentChunkOnly * - * @return string + * @return array */ - protected function _loadSearchInSourceQuery(?bool $inCurrentChunkOnly = false): string + protected function _loadSearchInSourceQuery(?bool $inCurrentChunkOnly = false): array { $this->_loadParams(); - $password_where = ($inCurrentChunkOnly) ? ' AND s.id between j.job_first_segment and j.job_last_segment AND j.password = "' . $this->queryParams->password . '"' : ''; + $params = ['job' => $this->queryParams->job]; + $password_where = ''; + if ($inCurrentChunkOnly) { + $password_where = ' AND s.id BETWEEN j.job_first_segment AND j.job_last_segment AND j.password = :password'; + $params['password'] = $this->queryParams->password; + } - return " + if ($this->queryParams->status != 'all') { + $params['status'] = $this->queryParams->status; + } + + $sql = " SELECT s.id, s.segment as text, od.map as original_map FROM segments s INNER JOIN files_job fj on s.id_file=fj.id_file INNER JOIN jobs j ON j.id = fj.id_job LEFT JOIN segment_translations st on st.id_segment = s.id AND st.id_job = fj.id_job LEFT JOIN segment_original_data od on od.id_segment = s.id - WHERE fj.id_job = {$this->queryParams->job} + WHERE fj.id_job = :job {$password_where} AND show_in_cattool = 1 {$this->queryParams->where_status} GROUP BY s.id"; + + return [$sql, $params]; } - protected function _loadSearchStatusOnlyQuery(): string + protected function _loadSearchStatusOnlyQuery(): array { $this->_loadParams(); + $params = ['job' => $this->queryParams->job]; - return " + if ($this->queryParams->status != 'all') { + $params['status'] = $this->queryParams->status; + } + + $sql = " SELECT st.id_segment as id FROM segment_translations as st - WHERE st.id_job = {$this->queryParams->job} + WHERE st.id_job = :job {$this->queryParams->where_status} "; + + return [$sql, $params]; } -} \ No newline at end of file +} diff --git a/lib/Model/Segments/ContextResType.php b/lib/Model/Segments/ContextResType.php new file mode 100644 index 0000000000..6bdd2d013f --- /dev/null +++ b/lib/Model/Segments/ContextResType.php @@ -0,0 +1,12 @@ +find(SegmentMetadataMarshaller::CONTEXT_URL) + ?? $fileContextUrl + ?? $projectContextUrl; + } +} diff --git a/lib/Model/Segments/SegmentMetadataCollection.php b/lib/Model/Segments/SegmentMetadataCollection.php new file mode 100644 index 0000000000..7e231f7ff0 --- /dev/null +++ b/lib/Model/Segments/SegmentMetadataCollection.php @@ -0,0 +1,82 @@ + */ +class SegmentMetadataCollection implements IteratorAggregate, Countable, JsonSerializable +{ + /** @var SegmentMetadataStruct[] */ + private array $structs; + + /** + * @param SegmentMetadataStruct[] $structs + */ + public function __construct(array $structs = []) + { + $this->structs = $structs; + } + + /** + * Searches for a match in the internal structs array where the meta_key equals the given key's value. + * + * @param SegmentMetadataMarshaller $key The object containing the value to be matched against struct meta_key. + * @return string|null Returns the corresponding meta_value if a match is found, or null if no match exists. + */ + public function find(SegmentMetadataMarshaller $key): ?string + { + foreach ($this->structs as $struct) { + if ($struct->meta_key === $key->value) { + return $struct->meta_value; + } + } + + return null; + } + + /** + * Finds and returns a typed object based on the provided key. + * + * @param SegmentMetadataMarshaller $key The key used to find the matching typed object. + * @return mixed The unmarshalled typed object if found, or null if no match exists. + */ + public function findTyped(SegmentMetadataMarshaller $key): mixed + { + foreach ($this->structs as $struct) { + if ($struct->meta_key === $key->value) { + return SegmentMetadataMarshaller::unMarshall($struct); + } + } + + return null; + } + + /** @return ArrayIterator */ + public function getIterator(): ArrayIterator + { + return new ArrayIterator($this->structs); + } + + public function count(): int + { + return count($this->structs); + } + + public function isEmpty(): bool + { + return empty($this->structs); + } + + public function jsonSerialize(): array + { + return array_map(fn(SegmentMetadataStruct $s) => [ + 'id_segment' => $s->id_segment, + 'meta_key' => $s->meta_key, + 'meta_value' => SegmentMetadataMarshaller::unMarshall($s), + ], $this->structs); + } +} diff --git a/lib/Model/Segments/SegmentMetadataDao.php b/lib/Model/Segments/SegmentMetadataDao.php index 511ffb4d3f..4e51c2860f 100644 --- a/lib/Model/Segments/SegmentMetadataDao.php +++ b/lib/Model/Segments/SegmentMetadataDao.php @@ -9,48 +9,33 @@ class SegmentMetadataDao extends AbstractDao { - private static string $sql_get_all = "SELECT * FROM segment_metadata WHERE id_segment = ? "; - private static string $sql_find_by_id_segment_and_key = "SELECT * FROM segment_metadata WHERE id_segment = ? and meta_key = ? "; + const string TABLE = 'segment_metadata'; + const string _query_get_all = "SELECT * FROM " . self::TABLE . " WHERE id_segment = ? "; + const string _query_get = "SELECT * FROM " . self::TABLE . " WHERE id_segment = ? and meta_key = ? "; + const string _keymap_get_by_segment_ids = "Model\\Segments\\SegmentMetadataDao::getBySegmentIds-"; + /** - * get all meta + * Get all metadata for a segment. * * @param int $id_segment - * @param int $ttl - * - * NOTE: 604,800 sec = 1 week + * @param int $ttl Cache TTL in seconds (default: 1 week) * - * @return SegmentMetadataStruct[] + * @return SegmentMetadataCollection * @throws ReflectionException */ - public static function getAll(int $id_segment, int $ttl = 604800): array + public static function getAll(int $id_segment, int $ttl = 86400): SegmentMetadataCollection { $thisDao = new self(); $conn = $thisDao->getDatabaseHandler(); - $stmt = $conn->getConnection()->prepare(self::$sql_get_all); + $stmt = $conn->getConnection()->prepare(self::_query_get_all); - return $thisDao->setCacheTTL($ttl)->_fetchObjectMap( + $results = $thisDao->setCacheTTL($ttl)->_fetchObjectMap( $stmt, SegmentMetadataStruct::class, [$id_segment] ); - } - - /** - * Destroys the cached metadata for the specified segment. - * - * @param int $id_segment The ID of the segment whose cache needs to be destroyed. - * - * @return bool True if the cache was successfully destroyed, false otherwise. - * @throws ReflectionException - * @throws PDOException - */ - public static function destroyGetAllCache(int $id_segment): bool - { - $thisDao = new self(); - $conn = Database::obtain()->getConnection(); - $stmt = $conn->prepare(self::$sql_get_all); - return $thisDao->_destroyObjectCache($stmt, SegmentMetadataStruct::class, [$id_segment]); + return new SegmentMetadataCollection($results); } /** @@ -61,7 +46,7 @@ public static function destroyGetAllCache(int $id_segment): bool * @return SegmentMetadataStruct[] * @throws ReflectionException */ - public static function getBySegmentIds(array $ids, string $key, int $ttl = 604800): array + public static function getBySegmentIds(array $ids, string $key, int $ttl = 86400): array { $thisDao = new self(); $conn = $thisDao->getDatabaseHandler(); @@ -75,47 +60,28 @@ public static function getBySegmentIds(array $ids, string $key, int $ttl = 60480 } /** - * get key + * Get a single metadata entry by segment ID and key. * * @param int $id_segment * @param string $key - * @param int $ttl - * - * NOTE: 604,800 sec = 1 week + * @param int $ttl Cache TTL in seconds (default: 1 week) * - * @return array + * @return SegmentMetadataStruct|null * @throws ReflectionException */ - public static function get(int $id_segment, string $key, int $ttl = 604800): array + public static function get(int $id_segment, string $key, int $ttl = 604800): ?SegmentMetadataStruct { $thisDao = new self(); $conn = $thisDao->getDatabaseHandler(); - $stmt = $conn->getConnection()->prepare(self::$sql_find_by_id_segment_and_key); + $stmt = $conn->getConnection()->prepare(self::_query_get); - return $thisDao->setCacheTTL($ttl)->_fetchObjectMap( + $results = $thisDao->setCacheTTL($ttl)->_fetchObjectMap( $stmt, SegmentMetadataStruct::class, [$id_segment, $key] ); - } - /** - * Destroy cache of segment metadata based on segment ID and key. - * - * @param int $id_segment The identifier of the segment to target. - * @param string $key The key associated with the cache entry to be destroyed. - * - * @return bool True if the cache was successfully destroyed, false otherwise. - * @throws PDOException - * @throws ReflectionException - */ - public static function destroyCache(int $id_segment, string $key): bool - { - $thisDao = new self(); - $conn = Database::obtain()->getConnection(); - $stmt = $conn->prepare(self::$sql_find_by_id_segment_and_key); - - return $thisDao->_destroyObjectCache($stmt, SegmentMetadataStruct::class, [$id_segment, $key]); + return $results[0] ?? null; } /** @@ -130,6 +96,7 @@ public static function delete(int $id_segment, string $key): void /** * @param SegmentMetadataStruct $metadataStruct + * @throws ReflectionException */ public static function save(SegmentMetadataStruct $metadataStruct): void { @@ -145,6 +112,58 @@ public static function save(SegmentMetadataStruct $metadataStruct): void 'key' => $metadataStruct->meta_key, 'value' => $metadataStruct->meta_value, ]); + + self::destroyGetAllCache($metadataStruct->id_segment); + self::destroyGetCache($metadataStruct->id_segment, $metadataStruct->meta_key); + self::destroyGetBySegmentIdsCache($metadataStruct->meta_key); + } + + /** + * @throws ReflectionException + */ + public static function upsert(int $id_segment, string $key, string $value): void + { + $conn = Database::obtain()->getConnection(); + $stmt = $conn->prepare( + "INSERT INTO segment_metadata " . + " ( id_segment, meta_key, meta_value ) VALUES " . + " ( :id_segment, :key, :value ) " . + " ON DUPLICATE KEY UPDATE meta_value = :value " + ); + + $stmt->execute([ + 'id_segment' => $id_segment, + 'key' => $key, + 'value' => $value, + ]); + + self::destroyGetAllCache($id_segment); + self::destroyGetCache($id_segment, $key); + self::destroyGetBySegmentIdsCache($key); + } + + /** + * @throws ReflectionException + */ + public static function destroyGetAllCache(int $id_segment): bool + { + $thisDao = new self(); + $conn = $thisDao->getDatabaseHandler(); + $stmt = $conn->getConnection()->prepare(self::_query_get_all); + + return $thisDao->_destroyObjectCache($stmt, SegmentMetadataStruct::class, [$id_segment]); + } + + /** + * @throws ReflectionException + */ + public static function destroyGetCache(int $id_segment, string $key): bool + { + $thisDao = new self(); + $conn = $thisDao->getDatabaseHandler(); + $stmt = $conn->getConnection()->prepare(self::_query_get); + + return $thisDao->_destroyObjectCache($stmt, SegmentMetadataStruct::class, [$id_segment, $key]); } /** @@ -153,6 +172,7 @@ public static function save(SegmentMetadataStruct $metadataStruct): void * @param int $id_segment The ID of the segment for which translation will be disabled. * * @return void + * @throws ReflectionException */ public static function setTranslationDisabled(int $id_segment): void { @@ -163,4 +183,20 @@ public static function setTranslationDisabled(int $id_segment): void SegmentMetadataDao::save($metadata); } -} \ No newline at end of file + + /** + * Destroy cache for getBySegmentIds queries matching the given meta_key. + * + * Because getBySegmentIds bakes segment IDs into the SQL string (not bind params), + * we cannot reconstruct the exact cache key via _destroyObjectCache. + * Instead, we delete the keyMap directly using _deleteCacheByKey. + * @throws ReflectionException + */ + public static function destroyGetBySegmentIdsCache(string $key): bool + { + $thisDao = new self(); + $keyMap = self::_keymap_get_by_segment_ids . $key; + + return $thisDao->_deleteCacheByKey($keyMap, false); + } +} diff --git a/lib/Model/Segments/SegmentMetadataMapper.php b/lib/Model/Segments/SegmentMetadataMapper.php new file mode 100644 index 0000000000..93ebdb5fe0 --- /dev/null +++ b/lib/Model/Segments/SegmentMetadataMapper.php @@ -0,0 +1,34 @@ + $transUnitAttributes */ + public function fromTransUnitAttributes(array $transUnitAttributes): SegmentMetadataCollection + { + $structs = []; + + foreach ($transUnitAttributes as $key => $value) { + $case = SegmentMetadataMarshaller::tryFrom($key); + + if ($case === null) { + continue; + } + + $castValue = $case->marshall($value); + + if ($castValue === null) { + continue; + } + + $struct = new SegmentMetadataStruct(); + $struct->meta_key = $case->value; + $struct->meta_value = $castValue; + + $structs[] = $struct; + } + + return new SegmentMetadataCollection($structs); + } +} diff --git a/lib/Model/Segments/SegmentMetadataMarshaller.php b/lib/Model/Segments/SegmentMetadataMarshaller.php new file mode 100644 index 0000000000..86fd9afd3b --- /dev/null +++ b/lib/Model/Segments/SegmentMetadataMarshaller.php @@ -0,0 +1,39 @@ + ((int)$value > 0) ? (string)(int)$value : null, + self::RESTYPE => ContextResType::tryFrom($value) !== null ? (string)$value : null, + default => (string)$value, + }; + } + + public static function unMarshall(SegmentMetadataStruct $struct): mixed + { + return match ($struct->meta_key) { + self::SIZE_RESTRICTION->value => (int)$struct->meta_value, + default => $struct->meta_value, + }; + } +} diff --git a/lib/Model/Segments/SegmentUIStruct.php b/lib/Model/Segments/SegmentUIStruct.php index 17d83b6d8c..be0eca669c 100644 --- a/lib/Model/Segments/SegmentUIStruct.php +++ b/lib/Model/Segments/SegmentUIStruct.php @@ -57,6 +57,7 @@ class SegmentUIStruct extends AbstractDaoSilentStruct implements IDaoStruct, Arr */ public ?ContextStruct $context_groups = null; public ?array $metadata = null; + public ?string $context_url = null; public string $internal_id; public bool $icu = false; diff --git a/lib/Model/Translators/TranslatorsModel.php b/lib/Model/Translators/TranslatorsModel.php index 406405b9eb..5771cd294e 100644 --- a/lib/Model/Translators/TranslatorsModel.php +++ b/lib/Model/Translators/TranslatorsModel.php @@ -15,6 +15,7 @@ use InvalidArgumentException; use Model\DataAccess\TransactionalTrait; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Run\JobPasswordChangedEvent; use Model\Jobs\JobDao; use Model\Jobs\JobStruct; use Model\Outsource\ConfirmationDao; @@ -283,7 +284,7 @@ public function changeJobPassword(?string $newPassword = null): void $jobDao = new JobDao(); $jobDao->changePassword($this->jStruct, $newPassword); $jobDao->destroyCache($this->jStruct); - $this->featureSet->run('job_password_changed', $this->jStruct, $oldPassword); + $this->featureSet->dispatchRun(new JobPasswordChangedEvent($this->jStruct, $oldPassword)); $this->commitTransaction(); } @@ -320,4 +321,4 @@ protected function sendEmail(): void } } -} \ No newline at end of file +} diff --git a/lib/Model/Users/UserDao.php b/lib/Model/Users/UserDao.php index 0e45165e1a..9020272eb8 100644 --- a/lib/Model/Users/UserDao.php +++ b/lib/Model/Users/UserDao.php @@ -87,7 +87,15 @@ public function getByUids(array $uids_array): array ); $resultSet = []; + if (!is_iterable($__resultSet)) { + return $resultSet; + } + foreach ($__resultSet as $user) { + if (!$user instanceof UserStruct) { + continue; + } + $resultSet[$user->uid] = $user; } @@ -216,6 +224,10 @@ public function getByUid($id): ?UserStruct ] )[0] ?? null; + if (!$res instanceof UserStruct) { + return null; + } + return $res; } @@ -254,6 +266,10 @@ public function getByEmail(string $email): ?UserStruct ['email' => $email] )[0] ?? null; + if (!$res instanceof UserStruct) { + return null; + } + return $res; } @@ -352,6 +368,10 @@ public function getProjectOwner(int $job_id): ?UserStruct ['job_id' => $job_id] )[0] ?? null; + if (!$res instanceof UserStruct) { + return null; + } + return $res; } @@ -369,6 +389,10 @@ public function getProjectAssignee(int $project_id): ?UserStruct ['id_project' => $project_id] )[0] ?? null; + if (!$res instanceof UserStruct) { + return null; + } + return $res; } @@ -400,14 +424,9 @@ public function getByEmails(array $email_list): array */ public function sanitize(IDaoStruct $input): UserStruct { - $con = Database::obtain(); parent::_sanitizeInput($input, self::STRUCT_TYPE); $input->uid = ($input->uid !== null) ? (int)$input->uid : null; - $input->email = ($input->email !== null) ? $con->escape($input->email) : null; - $input->create_date = ($input->create_date !== null) ? $con->escape($input->create_date) : null; - $input->first_name = ($input->first_name !== null) ? $con->escape($input->first_name) : null; - $input->last_name = ($input->last_name !== null) ? $con->escape($input->last_name) : null; return $input; } diff --git a/lib/Model/matecat.sql b/lib/Model/matecat.sql index 2e1f92072d..468c8cbab1 100644 --- a/lib/Model/matecat.sql +++ b/lib/Model/matecat.sql @@ -1126,7 +1126,7 @@ CREATE TABLE `segment_metadata` ( `id_segment` bigint(20) NOT NULL, `meta_key` varchar(45) NOT NULL, `meta_value` varchar(255) NOT NULL, - KEY `idx_id_segment_meta_key` (`id_segment`,`meta_key`) + UNIQUE KEY `idx_id_segment_meta_key` (`id_segment`,`meta_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/lib/Plugins/Features/AbstractRevisionFeature.php b/lib/Plugins/Features/AbstractRevisionFeature.php index 0551a0cf20..8d18392d4d 100644 --- a/lib/Plugins/Features/AbstractRevisionFeature.php +++ b/lib/Plugins/Features/AbstractRevisionFeature.php @@ -11,9 +11,18 @@ use Model\Exceptions\NotFoundException; use Model\FeaturesBase\BasicFeatureStruct; use Model\FeaturesBase\FeatureCodes; +use Model\FeaturesBase\Hook\Event\Filter\FilterCreateProjectFeaturesEvent; +use Model\FeaturesBase\Hook\Event\Filter\FilterGetSegmentsResultEvent; +use Model\FeaturesBase\Hook\Event\Filter\FilterJobPasswordToReviewPasswordEvent; +use Model\FeaturesBase\Hook\Event\Run\AlterChunkReviewStructEvent; +use Model\FeaturesBase\Hook\Event\Run\JobPasswordChangedEvent; +use Model\FeaturesBase\Hook\Event\Run\PostJobMergedEvent; +use Model\FeaturesBase\Hook\Event\Run\PostJobSplittedEvent; +use Model\FeaturesBase\Hook\Event\Run\PostProjectCreateEvent; +use Model\FeaturesBase\Hook\Event\Run\ProjectCompletionEventSavedEvent; +use Model\FeaturesBase\Hook\Event\Run\ReviewPasswordChangedEvent; use Model\Jobs\JobDao; use Model\Jobs\JobStruct; -use Model\JobSplitMerge\SplitMergeProjectData; use Model\LQA\ChunkReviewDao; use Model\LQA\ChunkReviewStruct; use Model\LQA\ModelDao; @@ -44,16 +53,13 @@ public function __construct(BasicFeatureStruct $feature) } /** - * @param array $projectFeatures - * - * @return array * @throws Exception */ - public function filterCreateProjectFeatures(array $projectFeatures): array + public function filterCreateProjectFeatures(FilterCreateProjectFeaturesEvent $event): void { + $projectFeatures = $event->getProjectFeatures(); $projectFeatures[static::FEATURE_CODE] = new BasicFeatureStruct(['feature_code' => static::FEATURE_CODE]); - - return $projectFeatures; + $event->setProjectFeatures($projectFeatures); } public static function loadRoutes(Klein $klein): void @@ -61,17 +67,14 @@ public static function loadRoutes(Klein $klein): void route('/project/[:id_project]/[:password]/reviews', 'POST', ['Controller\API\V2\ReviewsController', 'createReview']); } - /** - * @param array $data - * @param JobStruct $chunk - * - * @return array - */ - public function filterGetSegmentsResult(array $data, JobStruct $chunk): array + public function filterGetSegmentsResult(FilterGetSegmentsResultEvent $event): void { + $data = $event->getData(); + $chunk = $event->getChunk(); + if (empty($data['files'])) { // this means that there are no more segments after - return $data; + return; } reset($data['files']); @@ -106,19 +109,18 @@ public function filterGetSegmentsResult(array $data, JobStruct $chunk): array } } - return $data; + $event->setData($data); } /** - * @param string $password - * @param int $id_job - * - * @return string * @throws NotFoundException * @throws ReflectionException */ - public function filter_job_password_to_review_password(string $password, int $id_job): string + public function filterJobPasswordToReviewPassword(FilterJobPasswordToReviewPasswordEvent $event): void { + $password = $event->getPassword(); + $id_job = $event->getIdJob(); + $chunk_review = (new ChunkReviewDao())->findChunkReviews(new JobStruct(['id' => $id_job, 'password' => $password]))[0]; if (!$chunk_review) { @@ -129,7 +131,7 @@ public function filter_job_password_to_review_password(string $password, int $id throw new NotFoundException('Review record was not found'); } - return $chunk_review->review_password; + $event->setPassword($chunk_review->review_password); } /** @@ -138,12 +140,12 @@ public function filter_job_password_to_review_password(string $password, int $id * If so, then try to assign the defined qa_model. * If not, then try to find the qa_model from the project structure. * - * @param ProjectStructure $projectStructure - * * @throws ReflectionException */ - public function postProjectCreate(ProjectStructure $projectStructure): void + public function postProjectCreate(PostProjectCreateEvent $event): void { + $projectStructure = $event->projectStructure; + if ($this instanceof ReviewExtended) { return; } @@ -154,10 +156,7 @@ public function postProjectCreate(ProjectStructure $projectStructure): void /** * @param JobStruct[]|ChunkReviewStruct[] $chunksArray - * @param ProjectStruct $project - * @param array $options * - * @return array * @throws Exception */ public function createQaChunkReviewRecords(array $chunksArray, ProjectStruct $project, array $options = []): array @@ -189,8 +188,6 @@ public function createQaChunkReviewRecords(array $chunksArray, ProjectStruct $pr } /** - * @param ProjectStructure $projectStructure - * * @throws ReflectionException * @throws Exception */ @@ -213,17 +210,14 @@ protected function createChunkReviewRecords(ProjectStructure $projectStructure): } /** - * postJobSplitted - * * Deletes the previously created record and creates the new records matching the new chunks. * - * @param SplitMergeProjectData $projectStructure - * * @throws Exception - * */ - public function postJobSplitted(SplitMergeProjectData $projectStructure): void + public function postJobSplitted(PostJobSplittedEvent $event): void { + $projectStructure = $event->data; + /** * By definition, when running postJobSplitted callback, the job is not split. * So we expect to find just one record in chunk_reviews for the job. @@ -266,17 +260,15 @@ public function postJobSplitted(SplitMergeProjectData $projectStructure): void } /** - * postJobMerged - * * Deletes the previously created record and creates the new records matching the new chunks. * - * @param SplitMergeProjectData $projectStructure - * * @throws ReflectionException * @throws Exception */ - public function postJobMerged(SplitMergeProjectData $projectStructure): void + public function postJobMerged(PostJobMergedEvent $event): void { + $projectStructure = $event->data; + $id_job = $projectStructure->jobToMerge; $old_reviews = ChunkReviewDao::findByIdJob($id_job); $project = ProjectDao::findById($projectStructure->idProject, 86400); @@ -317,32 +309,23 @@ public function postJobMerged(SplitMergeProjectData $projectStructure): void } /** - * - * project_completion_event_saved - * - * @param JobStruct $chunk - * @param CompletionEventStruct $event - * @param $completion_event_id - * * @throws Exception */ - public function project_completion_event_saved(JobStruct $chunk, CompletionEventStruct $event, $completion_event_id): void + public function projectCompletionEventSaved(ProjectCompletionEventSavedEvent $event): void { - $model = new QualityReportModel($chunk); - $model->resetScore($completion_event_id); + $model = new QualityReportModel($event->chunk); + $model->resetScore($event->completionEventId); } /** - * - * @param ChunkCompletionEventStruct $event - * * @throws ReflectionException * @throws ValidationError * @throws Exception */ - public function alter_chunk_review_struct(ChunkCompletionEventStruct $event): void + public function alterChunkReviewStruct(AlterChunkReviewStructEvent $event): void { - $review = (new ChunkReviewDao())->findChunkReviews(new JobStruct(['id' => $event->id_job, 'password' => $event->password]))[0]; + $struct = $event->event; + $review = (new ChunkReviewDao())->findChunkReviews(new JobStruct(['id' => $struct->id_job, 'password' => $struct->password]))[0]; $undo_data = $review->getUndoData(); @@ -350,7 +333,7 @@ public function alter_chunk_review_struct(ChunkCompletionEventStruct $event): vo throw new ValidationError('undo data is not available'); } - $this->_validateUndoData($event, $undo_data); + $this->_validateUndoData($struct, $undo_data); $review->is_pass = $undo_data['is_pass']; $review->penalty_points = $undo_data['penalty_points']; @@ -366,13 +349,10 @@ public function alter_chunk_review_struct(ChunkCompletionEventStruct $event): vo ] ]); - LoggerFactory::doJsonLog("CompletionEventController deleting event: " . var_export($event->getArrayCopy(), true)); + LoggerFactory::doJsonLog("CompletionEventController deleting event: " . var_export($struct->getArrayCopy(), true)); } /** - * @param ChunkCompletionEventStruct $event - * @param $undo_data - * * @throws ValidationError */ protected function _validateUndoData(ChunkCompletionEventStruct $event, $undo_data): void @@ -393,35 +373,22 @@ protected function _validateUndoData(ChunkCompletionEventStruct $event, $undo_da } } - /** - * @param int $job_id - * @param string $old_password - * @param string $new_password - * @param int $revision_number - */ - public function review_password_changed(int $job_id, string $old_password, string $new_password, int $revision_number): void + public function reviewPasswordChanged(ReviewPasswordChangedEvent $event): void { $feedbackDao = new FeedbackDAO(); - $feedbackDao->updateFeedbackPassword($job_id, $old_password, $new_password, $revision_number); + $feedbackDao->updateFeedbackPassword($event->jobId, $event->oldPassword, $event->newPassword, $event->revisionNumber); } - /** - * @param JobStruct $job - * @param string $old_password - */ - public function job_password_changed(JobStruct $job, string $old_password): void + public function jobPasswordChanged(JobPasswordChangedEvent $event): void { $dao = new ChunkReviewDao(); - $dao->updatePassword($job->id, $old_password, $job->password); + $dao->updatePassword($event->job->id, $event->oldPassword, $event->job->password); } /** * Sets the QA model fom the uploaded file which was previously validated * and added to the project structure. * - * @param ProjectStructure $projectStructure - * - * @return void * @throws ReflectionException */ private function setQaModelFromJsonFile(ProjectStructure $projectStructure): void @@ -446,9 +413,6 @@ private function setQaModelFromJsonFile(ProjectStructure $projectStructure): voi * * If validation fails, add errors to the projectStructure. * - * @param ProjectStructure $projectStructure - * @param string|null $jsonPath - * */ public static function loadAndValidateQualityFramework(ProjectStructure &$projectStructure, ?string $jsonPath = null): void { @@ -484,10 +448,7 @@ public static function loadAndValidateQualityFramework(ProjectStructure &$projec } /** - * Get a model from path or default - * - * @param ProjectStructure $projectStructure - * @param string|null $jsonPath + * Get a model from path or default. * * @return array */ @@ -504,11 +465,6 @@ private static function loadModelFromPathOrDefault(ProjectStructure $projectStru return $decoded_model; } - /** - * @param ChunkReviewStruct $chunkReviewStruct - * - * @return ChunkReviewModel - */ public function getChunkReviewModel(ChunkReviewStruct $chunkReviewStruct): ChunkReviewModel { return new ChunkReviewModel($chunkReviewStruct); diff --git a/lib/Plugins/Features/ProjectCompletion.php b/lib/Plugins/Features/ProjectCompletion.php index d9f378dfd0..663962f9fd 100644 --- a/lib/Plugins/Features/ProjectCompletion.php +++ b/lib/Plugins/Features/ProjectCompletion.php @@ -6,6 +6,8 @@ use Model\ChunksCompletion\ChunkCompletionEventDao; use Model\ChunksCompletion\ChunkCompletionUpdateDao; use Model\ChunksCompletion\ChunkCompletionUpdateStruct; +use Model\FeaturesBase\Hook\Event\Run\JobPasswordChangedEvent; +use Model\FeaturesBase\Hook\Event\Run\PostAddSegmentTranslationEvent; use Model\Jobs\JobStruct; use Utils\Tools\Utils; @@ -17,8 +19,9 @@ class ProjectCompletion extends BaseFeature /** * @throws Exception */ - public function postAddSegmentTranslation(array $params): void + public function postAddSegmentTranslation(PostAddSegmentTranslationEvent $event): void { + $params = $event->context; $params = Utils::ensure_keys($params, ['is_review', 'chunk']); // Here we need to find or update the corresponding record, @@ -52,13 +55,13 @@ public function postAddSegmentTranslation(array $params): void } } - public function job_password_changed(JobStruct $job, $old_password): void + public function jobPasswordChanged(JobPasswordChangedEvent $event): void { $dao = new ChunkCompletionUpdateDao(); - $dao->updatePassword($job->id, $job->password, $old_password); + $dao->updatePassword($event->job->id, $event->job->password, $event->oldPassword); $dao = new ChunkCompletionEventDao(); - $dao->updatePassword($job->id, $job->password, $old_password); + $dao->updatePassword($event->job->id, $event->job->password, $event->oldPassword); } } diff --git a/lib/Plugins/Features/ProjectCompletion/Model/EventModel.php b/lib/Plugins/Features/ProjectCompletion/Model/EventModel.php index f33b43ee2c..b3f0d08ee9 100644 --- a/lib/Plugins/Features/ProjectCompletion/Model/EventModel.php +++ b/lib/Plugins/Features/ProjectCompletion/Model/EventModel.php @@ -12,6 +12,7 @@ use Exception; use Model\ChunksCompletion\ChunkCompletionEventDao; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Run\ProjectCompletionEventSavedEvent; use Model\Jobs\JobStruct; use Model\Projects\ProjectDao; use ReflectionException; @@ -52,7 +53,7 @@ public function save(): void $featureSet = new FeatureSet(); $featureSet->loadForProject(ProjectDao::findById($this->chunk->id_project)); - $featureSet->run('project_completion_event_saved', $this->chunk, $this->eventStruct, $this->chunkCompletionEventId); + $featureSet->dispatchRun(new ProjectCompletionEventSavedEvent($this->chunk, $this->eventStruct, (int)$this->chunkCompletionEventId)); } public function getChunkCompletionEventId(): ?int @@ -75,4 +76,4 @@ private function _checkStatusIsValid(): void throw new Exception('Cannot save event, current status mismatch.'); } } -} \ No newline at end of file +} diff --git a/lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php b/lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php index 2b28776ca5..fd05938e03 100644 --- a/lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php +++ b/lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php @@ -15,6 +15,7 @@ use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\FilterJobPasswordToReviewPasswordEvent; use Model\Jobs\JobStruct; use Model\Projects\ProjectStruct; use Utils\TaskRunner\Exceptions\EndQueueException; @@ -76,12 +77,12 @@ private function populateStatus(): array $featureSet = new FeatureSet(); $featureSet->loadForProject($this->project); - - $revise['password'] = $featureSet->filter( - 'filter_job_password_to_review_password', + $filterJobPasswordToReviewPasswordEvent = new FilterJobPasswordToReviewPasswordEvent( $chunk->password, $chunk->id ); + $featureSet->dispatchFilter($filterJobPasswordToReviewPasswordEvent); + $revise['password'] = $filterJobPasswordToReviewPasswordEvent->getPassword(); $response['translate'][] = $translate; $response['revise'][] = $revise; @@ -125,4 +126,4 @@ private function dataForChunkStatus(JobStruct $chunk, bool $is_review): array } -} \ No newline at end of file +} diff --git a/lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php b/lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php index 70d5942052..14a683be7a 100644 --- a/lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php +++ b/lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php @@ -10,6 +10,7 @@ namespace Plugins\Features\ReviewExtended; use Exception; +use Model\FeaturesBase\Hook\Event\Run\ChunkReviewUpdatedEvent; use Model\Jobs\JobStruct; use Model\LQA\ChunkReviewDao; use Model\LQA\ChunkReviewStruct; @@ -133,13 +134,12 @@ protected function _updatePassFailResult(ProjectStruct $project, array $data): v $chunkReviewDao = new ChunkReviewDao(); $chunkReviewDao->passFailCountsAtomicUpdate($this->chunk_review->id, $data); - $project->getFeaturesSet()->run( - 'chunkReviewUpdated', + $project->getFeaturesSet()->dispatchRun(new ChunkReviewUpdatedEvent( $this->chunk_review, 1, $this, $project - ); + )); } /** @@ -192,14 +192,13 @@ public function recountAndUpdatePassFailResult(ProjectStruct $project): void ); // External call by Plugins - $project->getFeaturesSet()->run( - 'chunkReviewUpdated', + $project->getFeaturesSet()->dispatchRun(new ChunkReviewUpdatedEvent( $this->chunk_review, $update_result, $this, $project - ); + )); } -} \ No newline at end of file +} diff --git a/lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php b/lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php index 19df722e39..5362e25941 100644 --- a/lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php +++ b/lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php @@ -18,6 +18,7 @@ use Model\Projects\ProjectStruct; use Model\Users\UserDao; use Model\WordCount\CounterModel; +use Model\FeaturesBase\Hook\Event\Filter\FilterRevisionChangeNotificationListEvent; use Plugins\Features\ReviewExtended\Email\RevisionChangedNotificationEmail; use Plugins\Features\TranslationEvents\Model\TranslationEvent; use Plugins\Features\TranslationEvents\Model\TranslationEventDao; @@ -341,7 +342,9 @@ private function _sendNotificationEmail(array $finalRevisions, array $chunkRevie ]; } - $emails = $this->_chunk->getProject()->getFeaturesSet()->filter('filterRevisionChangeNotificationList', $emails); + $filterRevisionChangeNotificationListEvent = new FilterRevisionChangeNotificationListEvent($emails); + $this->_chunk->getProject()->getFeaturesSet()->dispatchFilter($filterRevisionChangeNotificationListEvent); + $emails = $filterRevisionChangeNotificationListEvent->getEmails(); if (!empty($revision)) { $url = CanonicalRoutes::revise( @@ -399,4 +402,4 @@ private function getPenaltyPointsForSourcePage(int $source_page): int }, 0); } -} \ No newline at end of file +} diff --git a/lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php b/lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php index ca0807e744..e195f5f23e 100644 --- a/lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php +++ b/lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php @@ -52,11 +52,15 @@ public function saveVersionAndIncrement(SegmentTranslationStruct $new_translatio */ public function storeTranslationEvent(array $params): void; - /** - * @param SegmentTranslationStruct $translationStruct - * - * @return array - */ - public function propagateTranslation(SegmentTranslationStruct $translationStruct): array; + /** + * @param SegmentTranslationStruct $translationStruct + * + * @return array{ + * totals?: array, + * propagated_ids?: int[], + * segments_for_propagation?: array + * } + */ + public function propagateTranslation(SegmentTranslationStruct $translationStruct): array; } \ No newline at end of file diff --git a/lib/Routes/api_v3_routes.php b/lib/Routes/api_v3_routes.php index 01f5cc6719..c6eef97350 100644 --- a/lib/Routes/api_v3_routes.php +++ b/lib/Routes/api_v3_routes.php @@ -134,6 +134,13 @@ route('/[i:id]', 'GET', ['\Controller\API\V3\FiltersConfigTemplateController', 'get']); }); +// CONTEXT URL +$klein->with('/api/v3/context-url', function () { + route('/project', 'POST', ['Controller\API\App\ContextUrlController', 'setForProject']); + route('/file', 'POST', ['Controller\API\App\ContextUrlController', 'setForFile']); + route('/segment', 'POST', ['Controller\API\App\ContextUrlController', 'setForSegment']); +}); + /** *************************************************************************** * ALIAS FOR V2 ROUTES diff --git a/lib/Routes/view_routes.php b/lib/Routes/view_routes.php index 7d03e63668..f23763f3c6 100644 --- a/lib/Routes/view_routes.php +++ b/lib/Routes/view_routes.php @@ -17,6 +17,7 @@ route('/jobanalysis/[i:pid]-[i:jid]-[:password]', 'GET', ['Controller\Views\AnalyzeController', 'renderView']); route('/revise-summary/[i:jid]-[:password]', 'GET', ['Controller\Views\QualityReportController', 'renderView']); route('/activityLog/[i:id_project]/[:password]', 'GET', ['Controller\Views\ActivityLogController', 'renderView']); +route('/context-preview/[i:id_project]/[:password]', 'GET', ['Controller\Views\ContextReviewController', 'renderView']); route('/utils/xliff-to-target', 'GET', ['Controller\Views\XliffToTargetController', 'renderView']); route('/translate/[:project_name]/[:lang_pair]/[i:jid]-?[i:split]?-[:password]', 'GET', ['Controller\Views\CattoolController', 'renderView']); diff --git a/lib/Utils/AIAssistant/GeminiClient.php b/lib/Utils/AIAssistant/GeminiClient.php index 17657a43c3..a9f35509de 100644 --- a/lib/Utils/AIAssistant/GeminiClient.php +++ b/lib/Utils/AIAssistant/GeminiClient.php @@ -7,7 +7,6 @@ use Gemini\Data\Schema; use Gemini\Enums\DataType; use Gemini\Enums\ResponseMimeType; -use Utils\Registry\AppConfig; class GeminiClient implements AIClientInterface { diff --git a/lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php b/lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php index 1f946e38d6..eba87de6cb 100644 --- a/lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php +++ b/lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php @@ -285,12 +285,11 @@ function ($curl_info, $data) use (&$txt, &$buffer, $payload, $lockValue) { } } - // ✅ Continua lo stream + // Continue the stream return strlen($data); } ); - } catch (Exception) { } } diff --git a/lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php b/lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php index 0d2b614db8..e0326df255 100644 --- a/lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php +++ b/lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php @@ -7,6 +7,7 @@ use Model\Analysis\PayableRates as PayableRates; use Model\DataAccess\Database; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Run\TmAnalysisDisabledEvent; use Model\FilesStorage\AbstractFilesStorage; use Model\FilesStorage\FilesStorageFactory; use Model\Jobs\JobDao; @@ -188,7 +189,7 @@ public function main(array $args = null): void $perform_Tms_Analysis = false; $status = ProjectStatus::STATUS_DONE; - $featureSet->run('tmAnalysisDisabled', $pid); + $featureSet->dispatchRun(new TmAnalysisDisabledEvent((int)$pid)); $this->logger->debug('Perform Analysis FALSE'); } @@ -297,8 +298,6 @@ public function main(array $args = null): void continue; } - $featureSet->run('fastAnalysisComplete', $this->segments, $this->actual_project_row); - $this->logger->debug("done"); // INSERT DATA diff --git a/lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php b/lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php index 29a31405d2..b447d6ec5d 100644 --- a/lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php +++ b/lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php @@ -20,6 +20,7 @@ use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\AnalysisBeforeMTGetContributionEvent; use Model\Jobs\JobDao; use Model\Jobs\JobsMetadataMarshaller; use Model\MTQE\Templates\DTO\MTQEWorkflowParams; @@ -786,12 +787,13 @@ protected function _getMT(AbstractEngine $mtEngine, array $_config, QueueElement } // if a callback is not set, only the first argument is returned, get the config params from the callback - $config = $this->featureSet->filter( - 'analysisBeforeMTGetContribution', + $analysisBeforeMTGetContributionEvent = new AnalysisBeforeMTGetContributionEvent( $config, $mtEngine, $queueElement - ); //YYY verify airbnb plugin and MMT engine, such plugin force to use MMT, but MMT now is enabled by default + ); + $this->featureSet->dispatchFilter($analysisBeforeMTGetContributionEvent); + $config = $analysisBeforeMTGetContributionEvent->getConfig(); $mt_result = $mtEngine->get($config); @@ -1063,13 +1065,6 @@ protected function _tryToCloseProject($_params): void $database->commit(); - try { - $this->featureSet->run('afterTMAnalysisCloseProject', $_project_id, $_analyzed_report); - } catch (Exception $e) { - //ignore Exception the analysis is finished anyway - $this->_doLog("Ending project_id $_project_id with error {$e->getMessage()} . COMPLETED."); - } - (new JobDao())->destroyCacheByProjectId($_project_id); ProjectDao::destroyCacheById($_project_id); ProjectDao::destroyCacheByIdAndPassword($_project_id, $_params->ppassword); diff --git a/lib/Utils/Engines/MyMemory.php b/lib/Utils/Engines/MyMemory.php index 37de90cbb3..b13f7150af 100644 --- a/lib/Utils/Engines/MyMemory.php +++ b/lib/Utils/Engines/MyMemory.php @@ -7,6 +7,7 @@ use Model\Analysis\Constants\InternalMatchesConstants; use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; +use Model\FeaturesBase\Hook\Event\Filter\FilterMyMemoryGetParametersEvent; use Model\Jobs\JobsMetadataMarshaller; use Model\Users\UserStruct; use Utils\Constants\EngineConstants; @@ -262,7 +263,9 @@ public function get(array $_config): GetMemoryResponse $_config[JobsMetadataMarshaller::SUBFILTERING_HANDLERS->value] ?? null ); // null coalescing operator to avoid warnings, we want to propagate null when it is not set. - $parameters = $this->featureSet->filter('filterMyMemoryGetParameters', $parameters, $_config); + $filterMyMemoryGetParametersEvent = new FilterMyMemoryGetParametersEvent($parameters, $_config); + $this->featureSet->dispatchFilter($filterMyMemoryGetParametersEvent); + $parameters = $filterMyMemoryGetParametersEvent->getParameters(); $this->call("translate_relative_url", $parameters, true); diff --git a/lib/Utils/LQA/QA.php b/lib/Utils/LQA/QA.php index 837c427c6a..84c3f837f2 100644 --- a/lib/Utils/LQA/QA.php +++ b/lib/Utils/LQA/QA.php @@ -98,8 +98,6 @@ class QA public const string WARNING = ErrorManager::WARNING; public const string INFO = ErrorManager::INFO; - public const string SIZE_RESTRICTION = SizeRestrictionChecker::SIZE_RESTRICTION; - // ========== Component Instances ========== /** @var ErrorManager Manages error codes, messages, and exception lists */ diff --git a/lib/Utils/LQA/QA/DomHandler.php b/lib/Utils/LQA/QA/DomHandler.php index 9a3918e624..6768933e03 100644 --- a/lib/Utils/LQA/QA/DomHandler.php +++ b/lib/Utils/LQA/QA/DomHandler.php @@ -10,6 +10,7 @@ use DOMXPath; use Exception; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\InjectExcludedTagsInQaEvent; /** * Handles DOM operations for XML/XLIFF segment analysis. @@ -322,7 +323,9 @@ protected function addThisElementToDomMap(DOMElement $element): bool $tagsToBeExcludedFromChecks = []; if (null !== $this->featureSet) { - $tagsToBeExcludedFromChecks = $this->featureSet->filter('injectExcludedTagsInQa', []); + $injectExcludedTagsInQaEvent = new InjectExcludedTagsInQaEvent([]); + $this->featureSet->dispatchFilter($injectExcludedTagsInQaEvent); + $tagsToBeExcludedFromChecks = $injectExcludedTagsInQaEvent->getExcludedTags(); } if (empty($tagsToBeExcludedFromChecks)) { @@ -425,4 +428,3 @@ public function queryDOMElement(DOMDocument $domDoc, array $TagReference): DOMNo return (($Node->length == 0 || !$Node) ? new DOMNode() : $Node->item(0)); } } - diff --git a/lib/Utils/LQA/QA/SizeRestrictionChecker.php b/lib/Utils/LQA/QA/SizeRestrictionChecker.php index 518f85b8aa..595591cb3e 100644 --- a/lib/Utils/LQA/QA/SizeRestrictionChecker.php +++ b/lib/Utils/LQA/QA/SizeRestrictionChecker.php @@ -2,6 +2,7 @@ namespace Utils\LQA\QA; +use Model\Segments\SegmentMetadataMarshaller; use Model\Segments\SegmentMetadataStruct; /** @@ -18,9 +19,6 @@ */ class SizeRestrictionChecker { - /** @var string Metadata key for size restriction */ - public const string SIZE_RESTRICTION = "sizeRestriction"; - /** @var ErrorManager Error manager for reporting size errors */ private ErrorManager $errorManager; @@ -48,7 +46,7 @@ public function __construct(ErrorManager $errorManager) public function setCharactersCount(int $charactersCount, ?SegmentMetadataStruct $limit = null): void { $this->charactersCount = $charactersCount; - $this->limit = $limit ?? new SegmentMetadataStruct(['meta_value' => 0, 'meta_key' => 'sizeRestriction']); + $this->limit = $limit ?? new SegmentMetadataStruct(['meta_value' => 0, 'meta_key' => SegmentMetadataMarshaller::SIZE_RESTRICTION->value]); } /** @@ -76,7 +74,7 @@ private function filterCheckSizeRestriction(): bool return true; } - if (($this->limit ?? null) && ($this->limit->meta_key ?? null) == self::SIZE_RESTRICTION) { + if (($this->limit ?? null) && ($this->limit->meta_key ?? null) == SegmentMetadataMarshaller::SIZE_RESTRICTION->value) { // Ignore sizeRestriction = 0 if ($this->limit->meta_value == 0) { return true; diff --git a/lib/Utils/LQA/QA/TagChecker.php b/lib/Utils/LQA/QA/TagChecker.php index d759f1544d..75955f1299 100644 --- a/lib/Utils/LQA/QA/TagChecker.php +++ b/lib/Utils/LQA/QA/TagChecker.php @@ -4,6 +4,8 @@ use Exception; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\CheckTagMismatchEvent; +use Model\FeaturesBase\Hook\Event\Filter\CheckTagPositionsEvent; use Utils\LQA\QA; use Utils\Tools\CatUtils; @@ -175,13 +177,19 @@ public function checkTagMismatch(): void protected function checkTagCountMismatch(int $srcNodeCount, int $trgNodeCount): int { if ($this->featureSet && $this->qaInstance) { - $this->errorManager->addError($this->featureSet->filter('checkTagMismatch', ErrorManager::ERR_NONE, $this->qaInstance)); + $checkTagMismatchEvent = new CheckTagMismatchEvent(ErrorManager::ERR_NONE, $this->qaInstance); + $this->featureSet->dispatchFilter($checkTagMismatchEvent); + $this->errorManager->addError($checkTagMismatchEvent->getErrorCode()); } if ($srcNodeCount != $trgNodeCount) { - $errorCode = ($this->featureSet && $this->qaInstance) - ? $this->featureSet->filter('checkTagMismatch', ErrorManager::ERR_COUNT, $this->qaInstance) - : ErrorManager::ERR_COUNT; + if ($this->featureSet && $this->qaInstance) { + $checkTagMismatchEvent = new CheckTagMismatchEvent(ErrorManager::ERR_COUNT, $this->qaInstance); + $this->featureSet->dispatchFilter($checkTagMismatchEvent); + $errorCode = $checkTagMismatchEvent->getErrorCode(); + } else { + $errorCode = ErrorManager::ERR_COUNT; + } $this->errorManager->addError($errorCode); } @@ -195,9 +203,13 @@ protected function checkTagCountMismatch(int $srcNodeCount, int $trgNodeCount): */ public function checkTagPositions(): void { - $customCheckTagPositions = ($this->featureSet && $this->qaInstance) - ? $this->featureSet->filter('checkTagPositions', ErrorManager::ERR_NONE, $this->qaInstance) - : ErrorManager::ERR_NONE; + if ($this->featureSet && $this->qaInstance) { + $checkTagPositionsEvent = new CheckTagPositionsEvent(ErrorManager::ERR_NONE, $this->qaInstance); + $this->featureSet->dispatchFilter($checkTagPositionsEvent); + $customCheckTagPositions = $checkTagPositionsEvent->getErrorCode(); + } else { + $customCheckTagPositions = ErrorManager::ERR_NONE; + } if ($customCheckTagPositions !== true) { $this->performTagPositionCheck($this->sourceSeg, $this->targetSeg); @@ -417,4 +429,3 @@ private function checkDiff(array $diff = []): void } } } - diff --git a/lib/Utils/LQA/SizeRestriction/SizeRestriction.php b/lib/Utils/LQA/SizeRestriction/SizeRestriction.php index 552fa5b4bc..b154c5476e 100644 --- a/lib/Utils/LQA/SizeRestriction/SizeRestriction.php +++ b/lib/Utils/LQA/SizeRestriction/SizeRestriction.php @@ -4,6 +4,7 @@ use Exception; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\CharacterLengthCountEvent; class SizeRestriction { @@ -103,7 +104,9 @@ public function getCharactersRemaining($limit): int public function getCleanedStringLength(): int { try { - $featureCounts = $this->featureSet->filter('characterLengthCount', $this->cleanedString); + $characterLengthCountEvent = new CharacterLengthCountEvent($this->cleanedString); + $this->featureSet->dispatchFilter($characterLengthCountEvent); + $featureCounts = $characterLengthCountEvent->getFilterable(); if (is_array($featureCounts)) { return array_sum($featureCounts); diff --git a/lib/Utils/TMS/TMSService.php b/lib/Utils/TMS/TMSService.php index f92369feb9..b678830301 100644 --- a/lib/Utils/TMS/TMSService.php +++ b/lib/Utils/TMS/TMSService.php @@ -131,16 +131,17 @@ public function createMyMemoryKey(): CreateUserResponse /** * Saves the uploaded file and returns the file info. * + * @param array $files Raw files array (e.g. from $request->files()->all()). * @param bool $disable_upload_limit * * @return UploadElement * @throws Exception */ - public function uploadFile(?bool $disable_upload_limit = false): UploadElement + public function uploadFile(array $files, ?bool $disable_upload_limit = false): UploadElement { $uploadManager = new Upload(); - return $uploadManager->uploadFiles($_FILES, $disable_upload_limit); + return $uploadManager->uploadFiles($files, $disable_upload_limit); } /** diff --git a/lib/View/API/App/Json/Analysis/AnalysisFile.php b/lib/View/API/App/Json/Analysis/AnalysisFile.php index 2cf96ac6a1..79eea21506 100644 --- a/lib/View/API/App/Json/Analysis/AnalysisFile.php +++ b/lib/View/API/App/Json/Analysis/AnalysisFile.php @@ -62,7 +62,14 @@ public function __construct($id, $id_file_part, $name, $original_name, Constants foreach ($metadata as $metadatum) { if (isset($metadatum->key) and isset($metadatum->value)) { - $this->metadata[] = new AnalysisFileMetadata($metadatum->key, $metadatum->value); + $key = is_string($metadatum->key) ? $metadatum->key : (string)$metadatum->key; + $value = is_string($metadatum->value) + ? $metadatum->value + : (is_scalar($metadatum->value) + ? (string)$metadatum->value + : (json_encode($metadatum->value) ?: '')); + + $this->metadata[] = new AnalysisFileMetadata($key, $value); } } } diff --git a/lib/View/API/V2/Json/Activity.php b/lib/View/API/V2/Json/Activity.php index 2d7f6b6214..e54d9bca06 100644 --- a/lib/View/API/V2/Json/Activity.php +++ b/lib/View/API/V2/Json/Activity.php @@ -13,6 +13,7 @@ use Exception; use Model\ActivityLog\ActivityLogStruct; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\FilterActivityLogEntryEvent; use Utils\Tools\Utils; class Activity @@ -37,28 +38,31 @@ public function render(): array $featureSet = new FeatureSet(); foreach ($this->data as $record) { + if (!$record instanceof ActivityLogStruct) { + continue; + } + if (empty($record->email)) { $record->first_name = "Anonymous"; $record->last_name = "User"; $record->email = "Unknown"; } - /** - * @var $record ActivityLogStruct - */ - $record = $featureSet->filter('filterActivityLogEntry', $record); + $filterActivityLogEntryEvent = new FilterActivityLogEntryEvent($record); + $featureSet->dispatchFilter($filterActivityLogEntryEvent); + $filteredRecord = $filterActivityLogEntryEvent->getRecord(); $formatted = [ - 'id' => (int)$record->ID, - 'action' => $record->getAction($record->action), - 'email' => $record->email, - 'event_date' => Utils::api_timestamp($record->event_date), - 'first_name' => $record->first_name, - 'id_job' => (int)$record->id_job, - 'id_project' => (int)$record->id_project, - 'ip' => $record->ip, - 'last_name' => $record->last_name, - 'uid' => (int)$record->uid + 'id' => (int)$filteredRecord->ID, + 'action' => $filteredRecord->getAction($filteredRecord->action), + 'email' => $filteredRecord->email, + 'event_date' => Utils::api_timestamp($filteredRecord->event_date), + 'first_name' => $filteredRecord->first_name, + 'id_job' => (int)$filteredRecord->id_job, + 'id_project' => (int)$filteredRecord->id_project, + 'ip' => $filteredRecord->ip, + 'last_name' => $filteredRecord->last_name, + 'uid' => (int)$filteredRecord->uid ]; $out[] = $formatted; @@ -67,4 +71,4 @@ public function render(): array return $out; } -} \ No newline at end of file +} diff --git a/lib/View/API/V2/Json/Job.php b/lib/View/API/V2/Json/Job.php index 10662af5c2..d9fe87953f 100644 --- a/lib/View/API/V2/Json/Job.php +++ b/lib/View/API/V2/Json/Job.php @@ -17,6 +17,8 @@ use Model\Exceptions\NotFoundException; use Model\Exceptions\ValidationError; use Model\FeaturesBase\FeatureSet; +use Model\FeaturesBase\Hook\Event\Filter\OutsourceAvailableInfoEvent; +use Model\FeaturesBase\Hook\Event\Filter\ProjectUrlsEvent; use Model\Jobs\JobStruct; use Model\LQA\ChunkReviewDao; use Model\Projects\ManageModel; @@ -139,7 +141,9 @@ public function renderItem(JobStruct $chunk, ProjectStruct $project, FeatureSet $chunkReviews = (new ChunkReviewDao())->findChunkReviews($chunk, 60 * 5); // is outsource available? - $outsourceAvailableInfo = $featureSet->filter('outsourceAvailableInfo', $chunk->target, $chunk->getProject()->id_customer, $chunk->id); + $outsourceAvailableInfoEvent = new OutsourceAvailableInfoEvent($chunk->target, (string)$chunk->getProject()->id_customer, (int)$chunk->id); + $featureSet->dispatchFilter($outsourceAvailableInfoEvent); + $outsourceAvailableInfo = $outsourceAvailableInfoEvent->getFilterable(); // if any plugin doesn't trigger the hook if (!is_array($outsourceAvailableInfo) or empty($outsourceAvailableInfo)) { @@ -224,8 +228,12 @@ protected function fillUrls(array $result, JobStruct $chunk, ProjectStruct $proj $formatted = new ProjectUrls($projectData); - /** @var $formatted ProjectUrls */ - $formatted = $featureSet->filter('projectUrls', $formatted); + $projectUrlsEvent = new ProjectUrlsEvent($formatted); + $featureSet->dispatchFilter($projectUrlsEvent); + $formatted = $projectUrlsEvent->getFormatted(); + if (!$formatted instanceof ProjectUrls) { + throw new Exception('Invalid projectUrls hook payload'); + } $urlsObject = $formatted->render(true); $result['urls'] = $urlsObject['jobs'][$chunk->id]['chunks'][$chunk->password] ?? []; @@ -237,4 +245,4 @@ protected function fillUrls(array $result, JobStruct $chunk, ProjectStruct $proj return $result; } -} \ No newline at end of file +} diff --git a/lib/View/fileupload/UploadHandler.php b/lib/View/fileupload/UploadHandler.php index e7c92ad393..2be5748882 100644 --- a/lib/View/fileupload/UploadHandler.php +++ b/lib/View/fileupload/UploadHandler.php @@ -21,11 +21,14 @@ class UploadHandler */ protected array $options; + private array $files; + protected MatecatLogger $logger; - function __construct() + function __construct(array $files = []) { $this->logger = LoggerFactory::getLogger("upload_handler"); + $this->files = $files; $this->options = [ 'script_url' => $this->getFullUrl() . '/', @@ -433,12 +436,12 @@ public function post(): void $this->flush($info); } - $upload = $_FILES[$this->options['param_name']] ?? null; + $upload = $this->files[$this->options['param_name']] ?? null; $info = []; if ($upload && is_array($upload['tmp_name'])) { // param_name is an array identifier like "files[]", - // $_FILES is a multi-dimensional array: + // $this->files is a multi-dimensional array: foreach ($upload['tmp_name'] as $index => $value) { $info[] = $this->handle_file_upload( $upload['tmp_name'][$index], @@ -449,7 +452,7 @@ public function post(): void } } elseif ($upload || isset($_SERVER['HTTP_X_FILE_NAME'])) { // param_name is a single object identifier like "file", - // $_FILES is a one-dimensional array: + // $this->files is a one-dimensional array: $info[] = $this->handle_file_upload( $upload['tmp_name'] ?? null, $upload['name'] ?? null, diff --git a/lib/View/fileupload/index.php b/lib/View/fileupload/index.php index 55c83b0803..e1cd4f5f0f 100644 --- a/lib/View/fileupload/index.php +++ b/lib/View/fileupload/index.php @@ -13,7 +13,7 @@ require_once('UploadHandler.php'); -$upload_handler = new UploadHandler(); +$upload_handler = new UploadHandler($_FILES); header('Pragma: no-cache'); header('Cache-Control: no-store, no-cache, must-revalidate'); diff --git a/lib/View/templates/_context_preview.html b/lib/View/templates/_context_preview.html new file mode 100644 index 0000000000..8552934095 --- /dev/null +++ b/lib/View/templates/_context_preview.html @@ -0,0 +1,34 @@ + + + + + Context Preview - Matecat + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + diff --git a/migrations/20260326190000_alter_table_segment_metadata_add_unique_index.php b/migrations/20260326190000_alter_table_segment_metadata_add_unique_index.php new file mode 100644 index 0000000000..a9ec6e2012 --- /dev/null +++ b/migrations/20260326190000_alter_table_segment_metadata_add_unique_index.php @@ -0,0 +1,27 @@ +path = '/api/new' ; - $this->method = 'POST'; - - $this->test_data = new StdClass(); - - parent::setup(); - } - - private function prepareUserAndKey() { - $this->test_data->user = Factory_User::create() ; - $this->test_data->api_key = Factory_ApiKey::create(array( - 'uid' => $this->test_data->user->uid, - )); - } - - function test_api_key_is_recognized() { - $this->prepareUserAndKey(); - - $this->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - - $this->params = array( - 'project_name' => 'foo', - 'target_lang' => 'it-IT', - 'source_lang' => 'en-US', - ); - - $this->files[] = test_file_path('xliff/amex-test.docx.xlf'); - - $response = $this->getResponse() ; - $body = json_decode( $response['body'] ); - - // check - // - $project = Projects_ProjectDao::findById( $body->id_project ); - - $this->assertEquals( $project->id_customer, $this->test_data->user->email ); - $this->assertEquals( $response['code'], 200 ); - } - - function test_wrong_key_returns_401() { - $this->prepareUserAndKey(); - - $this->headers = array( - "X-MATECAT-KEY: not-a-valid-key", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - - $this->params = array( - 'project_name' => 'foo', - 'target_lang' => 'it-IT', - 'source_lang' => 'en-US', - ); - - $this->files[] = test_file_path('xliff/amex-test.docx.xlf'); - - $response = $this->getResponse() ; - $body = json_decode( $response['body'] ); - - $this->assertEquals( $response['code'], 401); - $this->assertEquals( $body->message, 'Authentication failed' ); - } - - function test_missing_auth_sets_project_to_translated_user() { - $this->params = array( - 'project_name' => 'foo', - 'target_lang' => 'it-IT', - 'source_lang' => 'en-US', - ); - - $this->files[] = test_file_path('xliff/amex-test.docx.xlf'); - - $response = $this->getResponse() ; - $body = json_decode( $response['body'] ); - - $project = Projects_ProjectDao::findById( $body->id_project ); - $this->assertEquals( $project->id_customer, ProjectManager::TRANSLATED_USER ); - - } - - - -} diff --git a/old_tests/integration/API/V1/NewWithPrivateTMKeyTest.php b/old_tests/integration/API/V1/NewWithPrivateTMKeyTest.php deleted file mode 100644 index 446581bafd..0000000000 --- a/old_tests/integration/API/V1/NewWithPrivateTMKeyTest.php +++ /dev/null @@ -1,45 +0,0 @@ -path = '/api/new' ; - $this->method = 'POST'; - - $this->test_data = new StdClass(); - - parent::setup(); - } - - - function test_api_key_is_recognized() { - $this->params = array( - 'project_name' => 'foo', - 'target_lang' => 'it-IT', - 'source_lang' => 'en-US', - 'private_tm_key' => '23154e7f6f93a838f7bc', - ); - - $this->files[] = test_file_path('xliff/amex-test.docx.xlf'); - - $response = $this->getResponse() ; - $body = json_decode( $response['body'] ); - - $project = Projects_ProjectDao::findById( $body->id_project ); - $chunks = $project->getChunks(); - $this->assertEquals(1, count( $chunks )); - $keys = TmKeyManagement_TmKeyManagement::getJobTmKeys( $chunks[0]->tm_keys); - - $this->assertEquals(1, count( $keys )); - - $this->assertEquals('23154e7f6f93a838f7bc', $keys[0]->key ); - - } - -} \ No newline at end of file diff --git a/old_tests/integration/API/V1/NewWithRevisionTypeTest.php b/old_tests/integration/API/V1/NewWithRevisionTypeTest.php deleted file mode 100644 index 4f7f9019ae..0000000000 --- a/old_tests/integration/API/V1/NewWithRevisionTypeTest.php +++ /dev/null @@ -1,51 +0,0 @@ -path = '/api/new' ; - $this->method = 'POST'; - - $this->test_data = new StdClass(); - - parent::setup(); - } - - private function prepareUserAndKey() { - $this->test_data->user = Factory_User::create() ; - $this->test_data->api_key = Factory_ApiKey::create(array( - 'uid' => $this->test_data->user->uid, - )); - } - - function tests_project_type_is_saved_in_project() { - $this->prepareUserAndKey(); - - $this->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - - $this->params = array( - 'project_name' => 'foo', - 'target_lang' => 'it-IT', - 'source_lang' => 'en-US', - 'metadata' => '{ "project_type" : "HT"}' - ); - - $this->files[] = test_file_path('xliff/amex-test.docx.xlf'); - - $response = $this->getResponse() ; - $body = json_decode( $response['body'] ); - - // check - $project = Projects_ProjectDao::findById( $body->id_project ); - $dao = new Projects_MetadataDao(Database::obtain()); - - $this->assertEquals('HT', $dao->get($project->id, 'project_type')->value ); - } - - -} diff --git a/old_tests/integration/API/V1/NewWithTeamTest.php b/old_tests/integration/API/V1/NewWithTeamTest.php deleted file mode 100644 index b36a05df64..0000000000 --- a/old_tests/integration/API/V1/NewWithTeamTest.php +++ /dev/null @@ -1,54 +0,0 @@ -path = '/api/new'; - $this->method = 'POST'; - - $this->test_data = new stdClass(); - - parent::setUp(); - } - - private function prepareUserAndKey() { - $this->test_data->user = Factory_User::create(); - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - } - - function test_api_key_without_team_assigns_to_personal_team() { - $this->prepareUserAndKey(); - - $this->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - - $this->params = array( - 'project_name' => 'foo', - 'target_lang' => 'it-IT', - 'source_lang' => 'en-US', - ); - - $this->files[] = test_file_path( 'xliff/amex-test.docx.xlf' ); - - $response = $this->getResponse(); - $body = json_decode( $response[ 'body' ] ); - - // check - // - $project = Projects_ProjectDao::findById( $body->id_project ); - - $this->assertEquals( $project->id_customer, $this->test_data->user->email ); - $this->assertEquals( $response[ 'code' ], 200 ); - - $user = ( new Users_UserDao() )->getByEmail( $this->test_data->user->email ); - $this->assertEquals( $project->id_team, $user->getPersonalTeam()->id ); - } - - -} \ No newline at end of file diff --git a/old_tests/integration/API/V1/StatusTest.php b/old_tests/integration/API/V1/StatusTest.php deleted file mode 100644 index 60b65aa694..0000000000 --- a/old_tests/integration/API/V1/StatusTest.php +++ /dev/null @@ -1,73 +0,0 @@ -path = '/api/status' ; - $this->method = 'GET'; - - parent::setup(); - } - - function testsRequiredProjectIdAndPassword() { - $expected = array( - 'status' => 'FAIL', - "message" => array(-1,"No id project provided") - ); - - $response = $this->makeRequest(); - $this->assertJSONResponse( $expected, $response['body'] ); - } - - function testsStatusOnNewProject() { - $project = integrationCreateTestProject( ); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $response = $this->makeRequest() ; - $body = json_decode( $response['body'] ); - $this->assertEquals( $body->status, 'ANALYZING' ); - } - - function testStatusOnTranslated() { - $project = integrationCreateTestProject( ); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - - $this->assertTrue( count($chunks) == 1); - - foreach( $chunks as $chunk ) { - $segments = $chunk->getSegments(); - foreach( $segments as $segment) { - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated' - ) ) ; - } - } - - foreach( $chunks as $chunk ) { - $translations = $chunk->getTranslations(); - $this->assertEquals( 3, count($translations)); - - foreach( $translations as $translation) { - $this->assertEquals('TRANSLATED', $translation->status); - } - } - - $request = $this->makeRequest() ; - $response = json_decode ( $request['body'] ) ; - - } -} diff --git a/old_tests/integration/API/V1/ValidateSourceAndTargetLanguagesTest.php b/old_tests/integration/API/V1/ValidateSourceAndTargetLanguagesTest.php deleted file mode 100644 index 02583a0d3b..0000000000 --- a/old_tests/integration/API/V1/ValidateSourceAndTargetLanguagesTest.php +++ /dev/null @@ -1,63 +0,0 @@ -path = '/api/new' ; - $this->method = 'POST'; - - $this->test_data = new StdClass(); - - parent::setup(); - } - - function test_RFC_format_is_accepted() { - $this->params = array( - 'project_name' => 'foo', - 'target_lang' => 'it-IT,es-ES', - 'source_lang' => 'en-US', - ); - - $this->files[] = test_file_path('xliff/amex-test.docx.xlf'); - - $response = $this->getResponse() ; - $body = json_decode( $response['body'] ); - - $project = Projects_ProjectDao::findById( $body->id_project ); - - $jobs = $project->getChunks(); - - $this->assertEquals('en-US', $jobs[0]->source ); - $this->assertEquals('it-IT', $jobs[0]->target ); - - $this->assertEquals('en-US', $jobs[1]->source ) ; - $this->assertEquals('es-ES', $jobs[1]->target ) ; - - } - - function test_not_RFC_format_is_rejected() { - $this->params = array( - 'project_name' => 'foo', - 'target_lang' => 'it,es-ES', - 'source_lang' => 'en-US', - ); - - $this->files[] = test_file_path('xliff/amex-test.docx.xlf'); - - $response = $this->getResponse() ; - $body = json_decode( $response['body'] ); - - $this->assertEquals( 'FAIL', $body->status ); - $this->assertStringMatchesFormat("Invalid language code: it", $body->message ) ; - - } - -} \ No newline at end of file diff --git a/old_tests/integration/API/V2/ChunkOptionsControllerTest.php b/old_tests/integration/API/V2/ChunkOptionsControllerTest.php deleted file mode 100644 index ec3de6e20f..0000000000 --- a/old_tests/integration/API/V2/ChunkOptionsControllerTest.php +++ /dev/null @@ -1,134 +0,0 @@ -test_data = new StdClass(); - } - - function test_setting_on_uncommon_language() { - $project = $this->prepareUncommonLanguagesProject(); - $chunks = $project->getChunks(); - - $test = new CurlTest() ; - $test->path = sprintf("/api/v2/jobs/%s/%s/options", $chunks[0]->id, $chunks[0]->password); - $test->method = 'POST'; - $test->params = array('speech2text' => false, 'tag_projection' => true, 'lexiqa' => true); - - $response = $test->getResponse(); - - $json = json_decode( $response['body'] ); - $this->assertEquals( false, $json->options->speech2text ); - $this->assertEquals( false, $json->options->tag_projection ); - $this->assertEquals( false, $json->options->lexiqa ); - - $model = new ChunkOptionsModel( $chunks[0] ) ; - - $options_from_database = $model->toArray() ; - - $this->assertEquals($options_from_database, (array) $json->options ) ; - - } - - function test_setting_on_common_languages() { - $project = $this->prepareCommonLanguagesProject(); - $chunks = $project->getChunks(); - - $test = new CurlTest() ; - $test->path = sprintf("/api/v2/jobs/%s/%s/options", $chunks[0]->id, $chunks[0]->password); - $test->method = 'POST'; - $test->params = array('speech2text' => 'false', 'tag_projection' => true, 'lexiqa' => true); - - $response = $test->getResponse(); - - $json = json_decode( $response['body'] ); - $this->assertEquals( false, $json->options->speech2text ); - $this->assertEquals( true, $json->options->tag_projection ); - $this->assertEquals( true, $json->options->lexiqa ); - - $model = new ChunkOptionsModel( $chunks[0] ) ; - - $options_from_database = $model->toArray() ; - - $this->assertEquals($options_from_database, (array) $json->options ) ; - } - - function test_just_one_value_passed_is_fine() { - $project = $this->prepareCommonLanguagesProject(); - $chunks = $project->getChunks(); - - $test = new CurlTest() ; - $test->path = sprintf("/api/v2/jobs/%s/%s/options", $chunks[0]->id, $chunks[0]->password); - $test->method = 'POST'; - $test->params = array('lexiqa' => 'false'); - - $response = $test->getResponse(); - - $json = json_decode( $response['body'] ); - $this->assertEquals( false, $json->options->lexiqa ); - - $model = new ChunkOptionsModel( $chunks[0] ) ; - - $options_from_database = $model->toArray() ; - - $this->assertEquals($options_from_database, (array) $json->options ) ; - } - - - private function prepareCommonLanguagesProject() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'it-IT', - 'target_lang' => 'en-US', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'it-IT', - 'target_language' => 'en-US', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ) - )); - - $json_response = json_decode( $response['body'], TRUE ); - $project = Projects_ProjectDao::findById( $json_response['id_project'] ); - return $project ; - } - - private function prepareUncommonLanguagesProject() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'my-MM', - 'target_lang' => 'ja-JP', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'my-MM', - 'target_language' => 'ja-JP', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ) - )); - - $json_response = json_decode( $response['body'], TRUE ); - $project = Projects_ProjectDao::findById( $json_response['id_project'] ); - return $project ; - } - -} \ No newline at end of file diff --git a/old_tests/integration/API/V2/CreateTeamTest.php b/old_tests/integration/API/V2/CreateTeamTest.php deleted file mode 100644 index 7368a81921..0000000000 --- a/old_tests/integration/API/V2/CreateTeamTest.php +++ /dev/null @@ -1,44 +0,0 @@ -test_data = new stdClass(); - $this->prepareUserAndApiKey(); - } - - public function test_create_team_with_members() { - $new_member = Factory_User::create(); - // create an team for the user - - $teamRequest = new CurlTest(); - $teamRequest->headers = $this->test_data->headers; - $teamRequest->path = '/api/v2/teams'; - $teamRequest->method = 'POST'; - $teamRequest->params = [ - 'type' => Constants_Teams::GENERAL, - 'name' => 'New team', - 'members' => [ $new_member->email, 'bar@example.org' ] - ]; - - $response = json_decode( $teamRequest->getResponse()[ 'body' ], true ); - $members = ( new MembershipDao() )->getMemberListByTeamId( $response[ 'team' ][ 'id' ] ); - - /** - * Ensure new_member is among team's members - */ - $found = array_values( array_filter( $members, function ( MembershipStruct $member ) use ( $new_member ) { - return $new_member->uid == $member->getUser()->uid; - } ) ); - - $this->assertEquals( $new_member->email, $found[ 0 ]->getUser()->email ); - } -} diff --git a/old_tests/integration/API/V2/JobMergeTest.php b/old_tests/integration/API/V2/JobMergeTest.php deleted file mode 100644 index e300f63f96..0000000000 --- a/old_tests/integration/API/V2/JobMergeTest.php +++ /dev/null @@ -1,117 +0,0 @@ -test_data = new StdClass(); - - $this->prepareUserAndApiKey(); - } - - function test_merge_api() { - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers, - 'files' => array( - test_file_path('zip-with-model-json.zip') - ) - )); - - $project = Projects_ProjectDao::findById( $project->id_project ); - - $chunks = $project->getChunks(); - splitJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - - 'project_pass' => $project->password, - 'job_pass' => $chunks[0]->password, - 'num_split' => 2, - 'split_values' => array(10, 11) - )); - - $chunks = $project->getChunks(); - $this->assertEquals(2, count( $chunks )); - - // make request to the APIs - $test = new CurlTest(); - $test->path = sprintf('/api/v2/projects/%s/%s/jobs/%s/merge', - $project->id, - $project->password, - $chunks[0]->id - ); - - $test->method = 'POST'; - $test->headers = $this->test_data->headers; - $response = $test->getResponse(); - - $chunks = $project->getChunks(); - $this->assertEquals(1, count($chunks)); - - } - - function test_chunk_options_cleanup_after_merge() { - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers, - 'files' => array( - test_file_path('zip-with-model-json.zip') - ) - )); - - $project = Projects_ProjectDao::findById( $project->id_project ); - - $chunks = $project->getChunks(); - - splitJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - 'job_pass' => $chunks[0]->password, - 'num_split' => 2, - 'split_values' => array(10, 11) - )); - - $chunks = $project->getChunks(); - - $speech2text_key = 'speech2text'; - - foreach ($chunks as $chunk) { - $metadata_dao = new \Projects_MetadataDao(); - - toggleChunkOptions(array( - 'id_job' => $chunk->id, - 'job_pass' => $chunk->password, - 'features' => array( $speech2text_key => true ) - )); - - $chunk_option = $metadata_dao->get( - $project->id, - \Projects_MetadataDao::buildChunkKey( $speech2text_key, $chunk ) - ); - - $this->assertNotNull( $chunk_option, 'chunk option created' ); - } - - mergeJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - )); - - $chunks = $project->getChunks(); - - foreach ($chunks as $chunk) { - $metadata_dao = new \Projects_MetadataDao(); - - $chunk_option = $metadata_dao->get( - $project->id, - \Projects_MetadataDao::buildChunkKey( $speech2text_key, $chunk ) - ); - - $this->assertNull( $chunk_option, 'chunk option removed' ); - } - } -} \ No newline at end of file diff --git a/old_tests/integration/API/V2/ProjectCompletionStatusTest.php b/old_tests/integration/API/V2/ProjectCompletionStatusTest.php deleted file mode 100644 index 0b89bfa1c0..0000000000 --- a/old_tests/integration/API/V2/ProjectCompletionStatusTest.php +++ /dev/null @@ -1,300 +0,0 @@ -test_data = new stdClass(); - // parent::setup(); - } - - private function submitProjectWithApiKeys() { - $this->test_data->project = integrationCreateTestProject( - array( 'headers' => $this->test_data->headers ) - ); - } - - private function setValidProjectWithAllTranslatedSegments() { - $this->createProject(); - $this->setAllSegmentsTranslated(); - } - - private function setAllSegmentsTranslated() { - $this->test_data->chunks = integrationSetSegmentsTranslated( - $this->test_data->project->id_project - ); - } - - private function createProject() { - $this->prepareUserAndApiKey(); - - Factory_OwnerFeature::create( array( - 'uid' => $this->test_data->user->uid, - 'feature_code' => 'project_completion' - ) ); - - $this->submitProjectWithApiKeys(); - } - - function test_is_not_complete_when_segments_are_translated() { - $this->setValidProjectWithAllTranslatedSegments(); - - $project = Projects_ProjectDao::findById( $this->test_data->project->id_project ); - - $expected_jobs = array(); - $jobs = $project->getJobs(); - - $expected = array( - 'project_status' => array( - 'revise' => array( - array( - 'id' => $jobs[0]->id, - 'password' => $jobs[0]->password, - 'completed' => false, - 'completed_at' => null - ) - ), - 'translate' => array( - array( - 'id' => $jobs[0]->id, - 'password' => $jobs[0]->password, - 'completed' => false, - 'completed_at' => null - ) - ), - 'id' => $this->test_data->project->id_project, - 'completed' => false, - ) - ); - - $test = new CurlTest(); - $test->path = '/api/v2/project-completion-status/' . - $this->test_data->project->id_project; - $test->method = 'GET'; - $test->headers = $this->test_data->headers; - $response = $test->getResponse(); - - $this->assertEquals( json_encode( $expected ), $response[ 'body' ] ); - - } - - function test_is_not_complete_by_default() { - $this->createProject(); - $project = Projects_ProjectDao::findById( $this->test_data->project->id_project ); - - $expected_jobs = array(); - $jobs = $project->getJobs(); - - $expected = array( - 'project_status' => array( - 'revise' => array( - array( - 'id' => $jobs[0]->id, - 'password' => $jobs[0]->password, - 'completed' => false, - 'completed_at' => null - ) - ), - 'translate' => array( - array( - 'id' => $jobs[0]->id, - 'password' => $jobs[0]->password, - 'completed' => false, - 'completed_at' => null - ) - ), - 'id' => $this->test_data->project->id_project, - 'completed' => false, - ) - ); - - $test = new CurlTest(); - $test->path = '/api/v2/project-completion-status/' . - $this->test_data->project->id_project; - $test->method = 'GET'; - $test->headers = $this->test_data->headers; - $response = $test->getResponse(); - - $this->assertEquals( json_encode( $expected ), $response[ 'body' ] ); - - } - - function test_is_complete_when_review_and_translate_are_complete() { - $this->setValidProjectWithAllTranslatedSegments(); - - $project = Projects_ProjectDao::findById( $this->test_data->project->id_project ); - - sleep(1); - foreach ( $this->test_data->chunks as $chunk ) { - integrationSetChunkAsComplete( array( - 'referer' => 'http://example.org/translate/foo/bar', - 'params' => array( - 'id_job' => $chunk->id, - 'password' => $chunk->password - ) - ) ); - integrationSetChunkAsComplete( array( - 'referer' => 'http://example.org/revise/foo/bar', - 'params' => array( - 'id_job' => $chunk->id, - 'password' => $chunk->password - ) - ) ); - } - - $project = Projects_ProjectDao::findById( $this->test_data->project->id_project ); - $expected_jobs = array('translate' => array(), 'revise' => array() ); - - - foreach ( $project->getChunks() as $job ) { - $translate = Chunks_ChunkCompletionEventDao::lastCompletionRecord( - $job, array('is_review' => false)); - $revise = Chunks_ChunkCompletionEventDao::lastCompletionRecord( - $job, array('is_review' => true)); - - $expected_jobs['translate'][] = array( - 'id' => $job->id, - 'password' => $job->password, - 'completed' => true, - 'completed_at' => Utils::api_timestamp( $translate['create_date'] ) - ); - - $expected_jobs['revise'][] = array( - 'id' => $job->id, - 'password' => $job->password, - 'completed' => true, - 'completed_at' => Utils::api_timestamp( $revise['create_date'] ) - ); - } - - $expected = array( - 'project_status' => array( - 'revise' => $expected_jobs['revise'], - 'translate' => $expected_jobs['translate'], - 'id' => $this->test_data->project->id_project, - 'completed' => true, - ) - ); - - $test = new CurlTest(); - $test->path = '/api/v2/project-completion-status/' . - $this->test_data->project->id_project; - $test->method = 'GET'; - $test->headers = $this->test_data->headers; - $response = $test->getResponse(); - - $this->assertEquals( json_encode( $expected ), $response[ 'body' ] ); - - } - - function test_returns_uncomplete_splitted_job_correctly() { - $this->setValidProjectWithAllTranslatedSegments(); - - // get project chunks - $chunksDao = new Chunks_ChunkDao( Database::obtain() ); - $chunks = $chunksDao->getByProjectID( - $this->test_data->project->id_project - ); - $this->assertEquals( 1, count( $chunks ) ); - - $chunk = $chunks[ 0 ]; - - // split job in two - $splitTest = new CurlTest(); - $params = array( - 'action' => 'splitJob', - 'exec' => 'apply', - 'project_id' => $this->test_data->project->id_project, - 'project_pass' => $this->test_data->project->project_pass, - 'job_id' => $chunk->id, - 'job_pass' => $chunk->password, - 'num_split' => 2, - 'split_values' => array( '5', '1' ) - ); - $splitTest->params = $params; - $splitTest->method = 'POST'; - $response = $splitTest->getResponse(); - - $chunks = $chunksDao->getByProjectID( - $this->test_data->project->id_project - ); - $this->assertEquals( 2, count( $chunks ) ); - - $first_chunk = $chunks[ 0 ]; - $second_chunk = $chunks[ 1 ]; - - sleep(1); - - // set chunk completed for translate page - integrationSetChunkAsComplete( array( - 'referer' => 'http://example.org/translate/rest-of-path', - 'params' => array( - 'id_job' => $first_chunk->id, - 'password' => $first_chunk->password - ) - ) ); - - // set chunk completed for revise page - integrationSetChunkAsComplete( array( - 'referer' => 'http://example.org/revise/rest-of-path', - 'params' => array( - 'id_job' => $first_chunk->id, - 'password' => $first_chunk->password - ) - ) ); - - $test = new CurlTest(); - $test->path = '/api/v2/project-completion-status/' . - $this->test_data->project->id_project; - $test->method = 'GET'; - $test->headers = $this->test_data->headers; - - $response = $test->getResponse(); - - $first_translate = Chunks_ChunkCompletionEventDao::lastCompletionRecord( - $first_chunk, array('is_review' => false)); - $first_revise = Chunks_ChunkCompletionEventDao::lastCompletionRecord( - $first_chunk, array('is_review' => true)); - - $expected = array( - 'project_status' => array( - 'revise' => array( - array( - 'id' => $first_chunk->id, - 'password' => $first_chunk->password, - 'completed' => true, - 'completed_at' => Utils::api_timestamp( $first_revise['create_date']) - ), - array( - 'id' => $second_chunk->id, - 'password' => $second_chunk->password, - 'completed' => false, - 'completed_at' => null - ) - ), - 'translate' => array( - array( - 'id' => $first_chunk->id, - 'password' => $first_chunk->password, - 'completed' => true, - 'completed_at' => Utils::api_timestamp( $first_translate['create_date']) - ), - array( - 'id' => $second_chunk->id, - 'password' => $second_chunk->password, - 'completed' => false, - 'completed_at' => null - ) - ), - 'id' => $this->test_data->project->id_project, - 'completed' => false, - ) - ); - - $this->assertEquals( json_encode( $expected ), $response[ 'body' ] ); - - } - - -} diff --git a/old_tests/integration/API/V2/ProjectUpdateTest.php b/old_tests/integration/API/V2/ProjectUpdateTest.php deleted file mode 100644 index 6ecda63864..0000000000 --- a/old_tests/integration/API/V2/ProjectUpdateTest.php +++ /dev/null @@ -1,112 +0,0 @@ -test_data = new stdClass(); - } - - /** - * Assignee - */ - - public function test_anonymous_project_has_no_assignee() { - $project_body = integrationCreateTestProject(); - $project = Projects_ProjectDao::findById( $project_body->id_project ); - - $this->assertEquals( null, $project->id_assignee ); - - } - - public function test_assignee_can_be_set_and_unset() { - $this->prepareUserAndApiKey(); - - $project_body = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers - ) ); - - $project = Projects_ProjectDao::findById( $project_body->id_project ); - - $other_user = Factory_User::create(); - ( new MembershipDao() )->createList( array( - 'team' => $this->test_data->user->getPersonalTeam(), - 'members' => array( $other_user->email ) - ) ); - - /** - * @var $user Users_UserStruct - */ - $user = $this->test_data->user; - - $this->assertEquals( $project->id_customer, $user->email ); - - $this->assertEquals( $user->getPersonalTeam()->id, $project->id_team ); - - $test = new CurlTest( array( - 'headers' => $this->test_data->headers, - 'path' => "/api/v2/teams/{$project->id_team}/projects/{$project->id}", - 'method' => 'PUT', - 'params' => array( 'id_assignee' => $other_user->uid ) - ) ); - - $response = $test->getResponse(); - - $project = Projects_ProjectDao::findById( $project->id ); - $this->assertEquals( $project->id_assignee, $other_user->uid ); - - - $test = new CurlTest( array( - 'headers' => $this->test_data->headers, - 'path' => "/api/v2/teams/{$project->id_team}/projects/{$project->id}", - 'method' => 'PUT', - 'params' => array( 'id_assignee' => null ) - ) ); - - $response = $test->getResponse(); - - $project = Projects_ProjectDao::findById( $project->id ); - $this->assertNull( $project->id_assignee ); - - } - - public function test_project_name_can_be_changed() { - $this->prepareUserAndApiKey(); - - $project_body = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers - ) ); - - $project = Projects_ProjectDao::findById( $project_body->id_project ); - - $test = new CurlTest( array( - 'headers' => $this->test_data->headers, - 'path' => "/api/v2/teams/{$project->id_team}/projects/{$project->id}", - 'method' => 'PUT', - 'params' => array( 'name' => 'My new project name' ) - ) ); - - $response = $test->getResponse(); - - $json = json_decode( $response[ 'body' ] ); - - $this->assertContains( - Utils::friendly_slug( 'My new project name' ), - $json->project->analyze_url - ); - $this->assertEquals( 'My new project name', $json->project->name ); - - $project = Projects_ProjectDao::findById( $project->id ); - $this->assertEquals( 'My new project name', $project->name ); - - } - -} \ No newline at end of file diff --git a/old_tests/integration/API/V2/ProjectUrlsTest.php b/old_tests/integration/API/V2/ProjectUrlsTest.php deleted file mode 100644 index f1867d570e..0000000000 --- a/old_tests/integration/API/V2/ProjectUrlsTest.php +++ /dev/null @@ -1,31 +0,0 @@ -params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $test = new CurlTest(); - $test->path = sprintf("/api/v2/projects/%s/%s/urls", - $project->id_project, $project->project_pass - ); - - $response = $test->getResponse(); - $this->assertEquals( 200, $response['code'] ); - - // TODO: check it contains all required urls - } -} \ No newline at end of file diff --git a/old_tests/integration/API/V2/SegmentTranslationIssueTest.php b/old_tests/integration/API/V2/SegmentTranslationIssueTest.php deleted file mode 100644 index 70f468a66f..0000000000 --- a/old_tests/integration/API/V2/SegmentTranslationIssueTest.php +++ /dev/null @@ -1,18 +0,0 @@ -assertTrue( true ); - - - } - -} diff --git a/old_tests/integration/API/V2/SegmentVersionTest.php b/old_tests/integration/API/V2/SegmentVersionTest.php deleted file mode 100644 index 86c8ea6684..0000000000 --- a/old_tests/integration/API/V2/SegmentVersionTest.php +++ /dev/null @@ -1,102 +0,0 @@ -test_data = new stdClass(); - $this->test_data->user = Factory_User::create(); - - $feature = Factory_OwnerFeature::create( array( - 'uid' => $this->test_data->user->uid, - 'feature_code' => Features::TRANSLATION_VERSIONS - ) ); - - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - - $this->test_data->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - } - - function tests_should_get_info_on_versions() { - - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is the original translation' - ) ) ; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'New Translation!' # <-- this changed - ) ) ; - - $translations = $chunk->getTranslations(); - $translation = $translations[0]; - - $test = new CurlTest(); - $test->path = sprintf("/api/v2/jobs/%s/%s/segments/%s/translation-versions", - $chunk->id, $chunk->password, $segment->id - ); - $test->method = 'GET'; - $test->headers = $this->test_data->headers; - - $response = $test->getResponse(); - - $versions = TranslationVersionDao::getVersionsForTranslation( $chunk->id, $segment->id ); - $version = $versions[0]; - - $expected = array( - 'versions' => array( - array( - 'id' => $version->id, - 'id_segment' => $version->id_segment, - 'id_job' => $version->id_job, - 'translation' => $version->translation, - 'version_number' => $version->version_number, - 'propagated_from' => $version->propagated_from, - 'created_at' => $version->creation_date, - ) - ) - ); - - $this->assertEquals( json_encode( $expected ), $response[ 'body' ] ); - } - -} diff --git a/old_tests/integration/Converters/ConversionsTest.php b/old_tests/integration/Converters/ConversionsTest.php deleted file mode 100644 index 0dfbe17feb..0000000000 --- a/old_tests/integration/Converters/ConversionsTest.php +++ /dev/null @@ -1,46 +0,0 @@ - array( - test_file_path( 'docx/WhiteHouse.docx' ) - ) - ); - - $body = integrationCreateTestProject( $options ); - - $this->assertNotNull( $body->id_project ); - $this->assertNotNull( $body->project_pass ); - - // ensure one job is created - $project = Projects_ProjectDao::findById( $body->id_project ); - - $this->assertEquals( 1, count( $project->getJobs() ) ); - - $jobs = $project->getJobs(); - $chunks = $jobs[ 0 ]->getChunks(); - $segments = $chunks[ 0 ]->getSegments(); - $notes_segment_one = $segments[ 0 ]->getNotes(); - - $this->assertNotEmpty( $jobs ); - $this->assertNotEmpty( $chunks ); - $this->assertEquals( 11, count( $segments ) ); - $this->assertEmpty( $notes_segment_one ); - - } - -} \ No newline at end of file diff --git a/old_tests/integration/CreateProjectController/defaultProjectOptionTest.php b/old_tests/integration/CreateProjectController/defaultProjectOptionTest.php deleted file mode 100644 index 6cc24d0bd9..0000000000 --- a/old_tests/integration/CreateProjectController/defaultProjectOptionTest.php +++ /dev/null @@ -1,365 +0,0 @@ -test_data=new stdClass(); - } - - function test_speech2text_is_enabled_by_default() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'en-US', - 'target_language' => 'it-IT', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ) - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertEquals( false, array_key_exists('speech2text', $metadata ) ); - } - - function test_speech2text_can_be_disabled() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'speech2text' => 0, - 'source_language' => 'en-US', - 'target_language' => 'it-IT', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ) - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertFalse( !!$metadata['speech2text'] ); - } - - function test_lexiqa_is_enabled_if_language_combination_is_ok() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'en-US', - 'target_language' => 'it-IT', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'lexiqa' => 'true' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertEquals( '1', $metadata['lexiqa'] ); - } - - function test_lexiqa_is_disabled_if_language_combination_is_not_ok() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'my-MM', - 'target_lang' => 'ja-JP,be-BY', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'my-MM', - 'target_language' => 'ja-JP,be-BY', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'lexiqa' => 'true' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertFalse( !!$metadata['lexiqa'] ); - } - - function test_lexiqa_is_enabled_if_one_language_is_in_list() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT,be-BY', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'en-US', - 'target_language' => 'it-IT,be-BY', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'lexiqa' => 'true' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertEquals( '1', $metadata['lexiqa'] ); - - } - - function test_lexiqa_can_be_disabled() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'my-MM', - 'target_lang' => 'it-IT,be-BY', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'lexiqa' => 0, - 'source_language' => 'my-MM', - 'target_language' => 'it-IT,be-BY', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ) - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertFalse( !!$metadata['lexiqa'] ); - } - - function test_tag_projection_is_enabled_if_language_combination_is_ok() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'en-US', - 'target_language' => 'it-IT', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'tag_projection' => 'true' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertEquals( '1', $metadata['tag_projection'] ); - } - - function test_tag_projection_is_disabled_if_language_combination_is_not_ok() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'my-MM', - 'target_lang' => 'ja-JP,be-BY', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'my-MM', - 'target_language' => 'ja-JP,be-BY', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'tag_projection' => 'true' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertFalse( !!$metadata['tag_projection'] ); - } - - function test_tag_projection_is_enabled_if_one_language_is_in_list() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT,be-BY', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'en-US', - 'target_language' => 'it-IT,be-BY', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'tag_projection' => 'true' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertEquals( '1', $metadata['tag_projection'] ); - - } - - function test_tag_projection_can_be_disabled() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'my-MM', - 'target_lang' => 'it-IT,be-BY', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'tag_projection' => 0, - 'source_language' => 'my-MM', - 'target_language' => 'it-IT,be-BY', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'tag_projection' => 'false' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - $metadata = $project->getMetadataAsKeyValue(); - - $this->assertEquals( FALSE, !!$metadata['tag_projection'] ); - } - -} - - - - diff --git a/old_tests/integration/CreateProjectController/setPrivateTMKeyTest.php b/old_tests/integration/CreateProjectController/setPrivateTMKeyTest.php deleted file mode 100644 index bea3a08473..0000000000 --- a/old_tests/integration/CreateProjectController/setPrivateTMKeyTest.php +++ /dev/null @@ -1,94 +0,0 @@ -test_data = new stdClass(); - } - - function test_set_private_tm_key_works() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'en-US', - 'target_language' => 'it-IT', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'private_tm_key' => '23154e7f6f93a838f7bc' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - - $chunks = $project->getChunks(); - $this->assertEquals(1, count( $chunks )); - $keys = TmKeyManagement_TmKeyManagement::getJobTmKeys( $chunks[0]->tm_keys); - - $this->assertEquals(1, count( $keys )); - $this->assertEquals( '23154e7f6f93a838f7bc', $keys[0]->key ); - } - - function test_set_private_tm_key_from_list_works() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'en-US', - 'target_language' => 'it-IT', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ), - 'private_keys_list' => '{"ownergroup":[],"mine":[{"tm":"1","glos":"1","key":"23154e7f6f93a838f7bc","name":"en-es-test.g","r":1,"w":1}],"anonymous":[]}' - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $id_project = $json_response['id_project']; - - $project = Projects_ProjectDao::findById( $id_project ); - $this->assertNotNull( $project->id ); - - $chunks = $project->getChunks(); - $this->assertEquals(1, count( $chunks )); - $keys = TmKeyManagement_TmKeyManagement::getJobTmKeys( $chunks[0]->tm_keys); - - $this->assertEquals(1, count( $keys )); - $this->assertEquals( '23154e7f6f93a838f7bc', $keys[0]->key ); - } - - -} \ No newline at end of file diff --git a/old_tests/integration/CreateProjectController/sourceAndTargetLangValidationTest.php b/old_tests/integration/CreateProjectController/sourceAndTargetLangValidationTest.php deleted file mode 100644 index 1cb1ebccb6..0000000000 --- a/old_tests/integration/CreateProjectController/sourceAndTargetLangValidationTest.php +++ /dev/null @@ -1,47 +0,0 @@ -test_data=new stdClass(); - } - - function test_source_lang_must_be_RFC() { - $upload_session = uniqid(); - - $file = test_file_path('xliff/amex-test.docx.xlf') ; - prepare_file_in_upload_folder( $file, $upload_session ); - - do_file_conversion(array( - 'source_lang' => 'en-US', - 'target_lang' => 'it-IT', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session - )); - - $response = createProjectWithUIParams( array( - 'source_language' => 'en', - 'target_language' => 'it', - 'pretranslate_100' => 1, - 'job_subject' => 'general', - 'file_name' => 'amex-test.docx.xlf', - 'upload_session' => $upload_session, - 'files' => array( $file ) - )); - - $json_response = json_decode( $response['body'], TRUE ); - - $this->assertStringMatchesFormat('Invalid language code: en', $json_response['errors'][0]['message']); - $this->assertStringMatchesFormat('Invalid language code: it', $json_response['errors'][1]['message']); - } - - -} \ No newline at end of file diff --git a/old_tests/integration/Features/ProjectCompletion/JobStatusTest.php b/old_tests/integration/Features/ProjectCompletion/JobStatusTest.php deleted file mode 100644 index e133f7121f..0000000000 --- a/old_tests/integration/Features/ProjectCompletion/JobStatusTest.php +++ /dev/null @@ -1,32 +0,0 @@ -params = array( - 'id_job' => 1 - ); - - $this->markTestSkipped(); - } - - function testsJSONForUncompletedJob() { - $this->markTestSkipped(); - } - - function testsJSONForCompletedJob() { - $this->markTestSkipped(); - } - - function testsSubmitCompletedStatus() { - $this->markTestSkipped(); - } - - function testSubmitOnNonTranslatedProject() { - $this->markTestSkipped(); - } -} diff --git a/old_tests/integration/Features/ReviewImproved/AssignQualityModelToProjectTest.php b/old_tests/integration/Features/ReviewImproved/AssignQualityModelToProjectTest.php deleted file mode 100644 index cf61351ec3..0000000000 --- a/old_tests/integration/Features/ReviewImproved/AssignQualityModelToProjectTest.php +++ /dev/null @@ -1,44 +0,0 @@ -test_data=new stdClass(); - $this->test_data->user = Factory_User::create(); - - $feature = Factory_OwnerFeature::create( array( - 'uid' => $this->test_data->user->uid, - 'feature_code' => Features::REVIEW_IMPROVED, - 'options' => json_encode( array( 'id_qa_model' => 1 ) ) - ) ); - - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - - $this->test_data->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - } - - function tests_qa_model_is_assigned_to_project() { - - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $project = Projects_ProjectDao::findById( $project->id_project ); - - $this->assertNotNull( $project->id ); - $this->assertEquals( '1', $project->id_qa_model ); - } - -} diff --git a/old_tests/integration/Features/ReviewImproved/CreateRecordInQaJobReviewsTest.php b/old_tests/integration/Features/ReviewImproved/CreateRecordInQaJobReviewsTest.php deleted file mode 100644 index c15d71378c..0000000000 --- a/old_tests/integration/Features/ReviewImproved/CreateRecordInQaJobReviewsTest.php +++ /dev/null @@ -1,130 +0,0 @@ -test_data=new stdClass(); - $this->test_data->user = Factory_User::create(); - - $feature = Factory_OwnerFeature::create( array( - 'uid' => $this->test_data->user->uid, - 'feature_code' => Features::REVIEW_IMPROVED - ) ); - - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - - $this->test_data->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - - } - - function tests_qa_job_reivew_record_is_present() { - $project = $this->createProject(); - $project = Projects_ProjectDao::findById( $project->id_project ); - - $this->assertNotNull( $project->id ); - $reviews = ChunkReviewDao::findByProjectId( $project->id ) ; - $this->assertNotEmpty( $reviews ); - } - - - function tests_qa_job_review_record_for_multiple_targets() { - // Create a project with multilanguage target - - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers, - 'files' => array( - test_file_path('zip-with-model-json.zip') - ), - 'params' => array( - 'target_lang' => 'it-IT,pt-BR' - ) - )); - - // $project = $this->createProject(); - $project = Projects_ProjectDao::findById( $project->id_project ); - - $this->assertNotNull( $project->id ); - $reviews = ChunkReviewDao::findByProjectId( $project->id ) ; - $this->assertCount(2, $reviews) ; - $jobs = $project->getJobs(); - $this->assertNotNull( ChunkReviewDao::findByIdJob( $jobs[0]->id ) ); - $this->assertNotNull( ChunkReviewDao::findByIdJob( $jobs[1]->id ) ); - } - - function tests_update_chunk_review_records_on_split() { - $project = $this->createProject(); - $project = Projects_ProjectDao::findById( $project->id_project ); - - $chunks = $project->getChunks(); - - splitJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - 'job_pass' => $chunks[0]->password, - 'num_split' => 2, - 'split_values' => array(10, 11) - )); - - $chunks = $project->getChunks(); - $this->assertEquals(2, count( $chunks ) ); - - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $this->assertEquals(2, count( $review_chunks ) ); - } - - function tests_update_chunk_review_records_on_merge() { - $project = $this->createProject(); - $project = Projects_ProjectDao::findById( $project->id_project ); - - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $this->assertEquals(1, count( $review_chunks ) ); - - $chunks = $project->getChunks(); - - splitJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - 'job_pass' => $chunks[0]->password, - 'num_split' => 2, - 'split_values' => array(10, 11) - )); - - $chunks = $project->getChunks(); - $this->assertEquals(2, count( $chunks ) ); - - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $this->assertEquals(2, count( $review_chunks ) ); - - // Now merge the job again - mergeJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - )); - - $chunks = $project->getChunks(); - $this->assertEquals(1, count( $chunks ) ); - - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $this->assertEquals(1, count( $review_chunks ) ); - } - - private function createProject() { - return integrationCreateTestProject( array( - 'headers' => $this->test_data->headers, - 'files' => array( - test_file_path('zip-with-model-json.zip') - ) - )); - } -} diff --git a/old_tests/integration/Features/ReviewImproved/SplitAndMergeTest.php b/old_tests/integration/Features/ReviewImproved/SplitAndMergeTest.php deleted file mode 100644 index 5116ac1169..0000000000 --- a/old_tests/integration/Features/ReviewImproved/SplitAndMergeTest.php +++ /dev/null @@ -1,250 +0,0 @@ -test_data = new StdClass(); - $this->test_data->user = Factory_User::create(); - - $feature = Factory_OwnerFeature::create( array( - 'uid' => $this->test_data->user->uid, - 'feature_code' => Features::REVIEW_IMPROVED - ) ); - - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - - $this->test_data->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - } - - function test_split_and_merge_keep_first_chunk_review_password() { - $project = $this->createProject(); - $project = Projects_ProjectDao::findById( $project->id_project ); - - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $original_password = $review_chunks[0]->review_password ; - - $chunks = $project->getChunks(); - splitJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - 'job_pass' => $chunks[0]->password, - 'num_split' => 2, - 'split_values' => array(10, 11) - )); - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $new_password = $review_chunks[0]->review_password ; - - $this->assertEquals($original_password, $new_password, 'password changed after split'); - - mergeJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - )); - - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $new_password = $review_chunks[0]->review_password ; - - $this->assertEquals($original_password, $new_password, 'password changed after merge'); - - } - - /** - * In this test we want to check the when a job is splitted - * the record that holds the review data is update with current - * review data for the newly created chunks. - * - * - * @throws Exception - */ - - function test_split_preserves_review_data() { - $project = $this->createProject(); - $project = Projects_ProjectDao::findById( $project->id_project ); - - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $this->assertEquals(1, count( $review_chunks ) ); - - $chunks = $project->getChunks(); - $segments = $chunks[0]->getSegments(); - $this->assertEquals(3, count( $segments )); - - foreach( $segments as $key => $segment ) { - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunks[0]->id, - 'password' => $chunks[0]->password, - 'status' => 'translated', - 'translation' => 'This is translated!', - 'propagate' => false - ) ) ; - - $issue_result = $this->makeIssueOnChunk($chunks[0], array( - 'segment_index' => $key - )); - } - - /** - * At this point we have one issue on each segment. We want to test - * that when a split is done, each new chunk preserves the review - * information ( score, reviewed_words_count, is_pass ). - */ - - $review_data = ( new ChunkReviewDao() )->findChunkReviews( $chunks[0] )[ 0 ]; - - $this->assertEquals(3, $review_data->penalty_points ); - - splitJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - 'job_pass' => $chunks[0]->password, - 'num_split' => 2, - 'split_values' => array(10, 11) - )); - - $chunks = $project->getChunks(); - $this->assertEquals(2, count($chunks)); - - $first_chunk_review = ( new ChunkReviewDao() )->findChunkReviews( $chunks[ 0 ] )[ 0 ]; - $last_chunk_review = ( new ChunkReviewDao() )->findChunkReviews( $chunks[ 1 ] )[ 0 ]; - - $this->assertEquals(2, $first_chunk_review->penalty_points); - $this->assertEquals(1, $last_chunk_review->penalty_points); - } - - - function test_merge_preserves_review_data() { - $project = $this->createProject(); - $project = Projects_ProjectDao::findById( $project->id_project ); - - $review_chunks = ChunkReviewDao::findByProjectId( $project->id ); - $this->assertEquals(1, count( $review_chunks ) ); - - $chunks = $project->getChunks(); - splitJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - 'job_pass' => $chunks[0]->password, - 'num_split' => 2, - 'split_values' => array(10, 11) - )); - - $chunks = $project->getChunks(); - $this->assertEquals(2, count($chunks)); - - integrationSetTranslation( array( - 'id_segment' => firstSegmentOfChunk($chunks[0])->id , - 'id_job' => $chunks[0]->id, - 'password' => $chunks[0]->password, - 'status' => 'translated', - 'translation' => 'This is translated!', - 'propagate' => false - ) ) ; - - integrationSetTranslation( array( - 'id_segment' => firstSegmentOfChunk($chunks[1])->id , - 'id_job' => $chunks[1]->id, - 'password' => $chunks[1]->password, - 'status' => 'translated', - 'translation' => 'This is translated!', - 'propagate' => false - ) ) ; - - // TODO: this api call to create issue is not really required here. - // it could be done with an insert in the database. - - $result = $this->makeIssueOnChunk($chunks[0]); - $result = $this->makeIssueOnChunk($chunks[1]); - - $first_chunk_review = ( new ChunkReviewDao() )->findChunkReviews( $chunks[ 0 ] )[ 0 ]; - $last_chunk_review = ( new ChunkReviewDao() )->findChunkReviews( $chunks[ 1 ] )[ 0 ]; - - $this->assertEquals(1, $first_chunk_review->penalty_points); - $this->assertEquals(1, $last_chunk_review->penalty_points); - - // Merge and check the count is merged - mergeJob(array( - 'id_job' => $chunks[0]->id, - 'id_project' => $project->id, - 'project_pass' => $project->password, - )); - - $chunks = $project->getChunks(); - - $this->assertEquals(1, count( $chunks )); - - $merged_review_record = ( new ChunkReviewDao() )->findChunkReviews( $chunks[ 0 ] )[ 0 ]; - - $this->assertEquals(2, $merged_review_record->penalty_points); - } - - private function makeIssueOnChunk( Chunks_ChunkStruct $chunk, $options=array()) { - $project = $chunk->getProject(); - $categories = $project->getLqaModel()->getCategories(); - $severities = $categories[0]->getJsonSeverities(); - - $options = array_merge( array( - 'severity' => 'Minor', - 'segment_index' => 0 - ), $options ); - - // register some issue generate review data in each chunk - $issue_data = array( - "id_category" => $categories[0]->id, - 'severity' => $options['severity'], - 'target_text' => 'whatever', - 'start_node' => 0, - 'start_offset' => 3, - 'end_node' => 0, - 'end_offset' => 8, - 'comment' => '' - ); - - // Issue on first chunk - $id_job = $chunk->id; - $password = $chunk->password; - $segments = $chunk->getSegments(); - $id_segment = $segments[ $options['segment_index'] ]->id; - - $issue_request = new CurlTest(array( - 'path' => "/api/v2/jobs/$id_job/$password/segments/$id_segment/translation-issues", - 'params' => $issue_data, - 'referer' => '/translate/foo/bar', - 'method' => 'POST' - )); - - $issue_request->run(); - - return $issue_request ; - } - - private function createProject() { - return integrationCreateTestProject( array( - 'headers' => $this->test_data->headers, - 'files' => array( - test_file_path('zip-with-model-json.zip') - ) - )); - } - - - -} \ No newline at end of file diff --git a/old_tests/integration/Features/SegmentNotes/SegmentNotesCreationTest.php b/old_tests/integration/Features/SegmentNotes/SegmentNotesCreationTest.php deleted file mode 100644 index 476f3dd5c1..0000000000 --- a/old_tests/integration/Features/SegmentNotes/SegmentNotesCreationTest.php +++ /dev/null @@ -1,114 +0,0 @@ -markTestSkipped("This test Fails because of Filters. Created XLF has --- between merged notes. Seems that only one note per trans-unit is allowed." ); - - $options = array('files' => array( - test_file_path('small-with-notes.sdlxliff') - )); - - $body = integrationCreateTestProject($options); - - $this->assertNotNull($body->id_project); - $this->assertNotNull($body->project_pass); - - // ensure one job is created - $project = Projects_ProjectDao::findById($body->id_project); - - $this->assertEquals(1, count($project->getJobs())); - - $jobs = $project->getJobs() ; - $chunks = $jobs[0]->getChunks() ; - $segments = $chunks[0]->getSegments(); - $notes_segment_one = $segments[0]->getNotes() ; - $notes_segment_two = $segments[1]->getNotes() ; - - $this->assertEquals( 4, count($segments) ); - $this->assertEquals( 'This is a comment', $notes_segment_one[0]->note, "This assertion Fails because of Filters. Created XLF has --- between merged notes. Seems that only one note per trans-unit is allowed." ); - $this->assertEquals( 'This is another comment for the same segment', $notes_segment_one[1]->note); - $this->assertEquals( 'This is another comment', $notes_segment_two[0]->note); - $this->assertEquals( 0, count( $segments[2]->getNotes())); - $this->assertEquals( 0, count( $segments[3]->getNotes())); - - } - - function testXliffWithSegSource() { - $options = array('files' => array( - test_file_path('xliff/file-with-notes-converted.xliff') - )); - - $body = integrationCreateTestProject($options); - - $this->assertNotNull($body->id_project); - $this->assertNotNull($body->project_pass); - - // ensure one job is created - $project = Projects_ProjectDao::findById($body->id_project); - - $jobs = $project->getJobs(); - $this->assertEquals(1, count($project->getJobs())); - - $chunks = $jobs[0]->getChunks() ; - $segments = $chunks[0]->getSegments(); - $notes = $segments[0]->getNotes() ; - - $this->assertEquals( 3, count($segments)); - - $this->assertEquals( - "This is a comment\n" . - "---\n" . - "This is a comment number two\n" . - "---\n" . - "This is a comment number three", - - $notes[0]->note - ); - } - - function testNoteIsAssignedToAllMrkInTransUnit() { - $options = array('files' => array( - test_file_path('xliff/sdlxliff-with-mrk-and-note.xlf.sdlxliff') - )); - - $body = integrationCreateTestProject($options); - - $this->assertNotNull($body->id_project); - $this->assertNotNull($body->project_pass); - - // ensure one job is created - $project = Projects_ProjectDao::findById($body->id_project); - - $jobs = $project->getJobs(); - - // expect one job is created - $this->assertEquals(1, count($project->getJobs())); - - $chunks = $jobs[0]->getChunks() ; - $segments = $chunks[0]->getSegments(); - - // expect one segment per mrk - $this->assertEquals( 2, count($segments)); - - // expect the correct notes count - $this->assertEquals( 1, count( $segments[0]->getNotes() ) ); - $this->assertEquals( 1, count( $segments[1]->getNotes() ) ); - - // expect the same note text - $notes_segment_one = $segments[0]->getNotes(); - $notes_segment_two = $segments[1]->getNotes(); - - $this->assertEquals('Test note', $notes_segment_one[0]->note ); - $this->assertEquals('Test note', $notes_segment_two[0]->note ); - - // expect the internal_id is saved appropriately - $this->assertEquals( - $notes_segment_one[0]->internal_id, - $notes_segment_two[0]->internal_id - ); - - } - -} diff --git a/old_tests/integration/Features/TranslationVersions/increaseVersionNumberTest.php b/old_tests/integration/Features/TranslationVersions/increaseVersionNumberTest.php deleted file mode 100644 index d49d4cb590..0000000000 --- a/old_tests/integration/Features/TranslationVersions/increaseVersionNumberTest.php +++ /dev/null @@ -1,114 +0,0 @@ -test_data=new stdClass(); - $this->test_data->user = Factory_User::create(); - - $feature = Factory_OwnerFeature::create( array( - 'uid' => $this->test_data->user->uid, - 'feature_code' => Features::TRANSLATION_VERSIONS - ) ); - - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - - $this->test_data->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - } - - function tests_increases_version_number_in_segment_translations() { - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is the original translation' - ) ) ; - - integrationSetTranslation( array( - 'id_segment' => $segment->id, - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'New Translation!' # <-- this changed - ) ); - - $translations = $chunk->getTranslations(); - - $this->assertEquals(1, $translations[0]->version_number ); - - integrationSetTranslation( array( - 'id_segment' => $segment->id, - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'translation changed again!' # <-- this changed - ) ); - - $translations = $chunk->getTranslations(); - - $this->assertEquals(2, $translations[0]->version_number ); - - } - - function tests_increases_version_number_in_translation_propagation() { - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers, - 'files' => array( test_file_path('test-propagation.xlf')) - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is translated!', - 'propagate' => true - ) ) ; - - $translations = $chunk->getTranslations(); - - foreach( $translations as $key => $translation) { - $this->assertEquals(1, $translation->version_number, "On record number $key " ); - } - - } -} diff --git a/old_tests/integration/Features/TranslationVersions/setTranslationWithVersioningDisabledTest.php b/old_tests/integration/Features/TranslationVersions/setTranslationWithVersioningDisabledTest.php deleted file mode 100644 index 8f2419382d..0000000000 --- a/old_tests/integration/Features/TranslationVersions/setTranslationWithVersioningDisabledTest.php +++ /dev/null @@ -1,115 +0,0 @@ -test_data=new stdClass(); - $this->test_data->user = Factory_User::create(); - - // Feature TRANSLATION_VERSIONS is not set for this test - // - // $feature = Factory_OwnerFeature::create( array( - // 'uid' => $this->test_data->user->uid, - // 'feature_code' => Features::TRANSLATION_VERSIONS - // ) ); - - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - - $this->test_data->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - } - - function tests_no_versioning_on_translation() { - - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is the original translation' - ) ) ; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'New Translation!' # <-- this changed - ) ) ; - - $translations = $chunk->getTranslations(); - - $versions = TranslationVersionDao::getVersionsForTranslation( - $translations[0]->id_job, $translations[0]->id_segment - ); - - $this->assertEquals( 0, count( $versions ) ); - - } - - function tests_no_versioning_on_propagation() { - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers, - 'files' => array( test_file_path('test-propagation.xlf')) - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is translated!', - 'propagate' => true - ) ) ; - - $translations = $chunk->getTranslations(); - - $versions = TranslationVersionDao::getVersionsForJob( - $translations[0]->id_job - ); - - $this->assertEquals( 0, count( $versions ) ); - - } - - -} diff --git a/old_tests/integration/Features/TranslationVersions/setTranslationWithVersioningEnabledTest.php b/old_tests/integration/Features/TranslationVersions/setTranslationWithVersioningEnabledTest.php deleted file mode 100644 index cba8283084..0000000000 --- a/old_tests/integration/Features/TranslationVersions/setTranslationWithVersioningEnabledTest.php +++ /dev/null @@ -1,230 +0,0 @@ -test_data=new stdClass(); - $this->test_data->user = Factory_User::create(); - - $feature = Factory_OwnerFeature::create( array( - 'uid' => $this->test_data->user->uid, - 'feature_code' => Features::TRANSLATION_VERSIONS - ) ); - - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - - $this->test_data->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - } - - function tests_translations_are_versioned() { - - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is the original translation' - ) ) ; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'New Translation!' # <-- this changed - ) ) ; - - $translations = $chunk->getTranslations(); - - $versions = TranslationVersionDao::getVersionsForTranslation( - $translations[0]->id_job, $translations[0]->id_segment - ); - - $this->assertEquals( 1, count( $versions ) ); - $version = $versions[0]; - $this->assertEquals('This is the original translation', $version->translation); - - } - - function tests_no_changes_to_the_text_causes_no_new_version() { - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is the original translation' - ) ) ; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'New Translation!' # <-- this changed - ) ) ; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'New Translation!' # <-- this is the same as before - ) ) ; - - $translations = $chunk->getTranslations(); - - $versions = TranslationVersionDao::getVersionsForTranslation( - $translations[0]->id_job, $translations[0]->id_segment - ); - - $this->assertEquals( 1, count( $versions ) ); - } - - function tests_propagated_segments_are_versioned() { - $project = integrationCreateTestProject( array( - 'headers' => $this->test_data->headers, - 'files' => array( test_file_path('test-propagation.xlf')) - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is translated!', - 'propagate' => true - ) ) ; - - - $translations = $chunk->getTranslations(); - - $versions = TranslationVersionDao::getVersionsForJob( - $translations[0]->id_job - ); - - $this->assertEquals( 7, count( $versions ) ); - - $i=0; while($i < 7) { - $version = $versions[0]; - $this->assertEquals('Palavra En Inglês', $version->translation); - $i++; - } - - } - - function tests_same_translation_submitted_does_not_increase_versions() { - $project = integrationCreateTestProject(array( - 'headers' => $this->test_data->headers, - 'files' => array( test_file_path('test-propagation.xlf')) - )); - - $this->params = array( - 'id_project' => $project->id_project, - 'project_pass' => $project->project_pass - ); - - $chunksDao = new Chunks_ChunkDao( Database::obtain() ) ; - $chunks = $chunksDao->getByProjectID( $project->id_project ); - $chunk = $chunks[0]; - - $this->assertTrue( count($chunks) == 1); - - $segments = $chunk->getSegments(); - $segment = $segments[0]; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is translated!', - 'propagate' => true - ) ) ; - - integrationSetTranslation( array( - 'id_segment' => $segment->id , - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated', - 'translation' => 'This is translated!', - # 'propagate' => true - # ^^^^^^^^^^^^^^^^^^^^^ - # Previously propagated segments propagate even - # if `propagate` is not submitted. - ) ) ; - - $translations = $chunk->getTranslations(); - - $versions = TranslationVersionDao::getVersionsForJob( - $translations[0]->id_job - ); - - $this->assertEquals( 7, count( $versions ) ); - - $i=0; while($i < 7) { - $version = $versions[0]; - $this->assertEquals('Palavra En Inglês', $version->translation); - $i++; - } - - } - -} diff --git a/old_tests/support/files/csv/glossary/NV - Campi concetto + una sola lingua solo termini.csv b/old_tests/support/files/csv/glossary/NV - Campi concetto + una sola lingua solo termini.csv deleted file mode 100644 index 1c24acaaf9..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Campi concetto + una sola lingua solo termini.csv +++ /dev/null @@ -1,9 +0,0 @@ -Domain,Subdomain,Definition,en-GB -Uber,Partner,Contact is the label of a button in the Uber Driver app UI which enables the user to call or text the rider.,Contact -Uber,Support,"In our customer support platform, Bliss, each support ticket is called a contact.",Contact -Uber,Rider,"This refers to a person whose information, such as ID or email address, has been added by the user to their contact list or to an address book.",Contact -Uber,Partner,People who sign up to drive on the Uber platform.,Driver -Uber,Rider,People who sign up to drive on the Uber platform.,Driver -Marketing,Guests,Used Airbnb Plus value prop; each home in Airbnb Plus is verified for quality and design.,Verified for quality and design -Support,,Guidelines on Uber's use for all of our community,Community guidelines -Support,,Guidelines on Uber's use for all of our community,CG diff --git a/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua solo esempi.csv b/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua solo esempi.csv deleted file mode 100644 index ac06c01298..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua solo esempi.csv +++ /dev/null @@ -1,9 +0,0 @@ -Domain,Subdomain,Definition,en-GB,Example of use -Uber,Partner,Contact is the label of a button in the Uber Driver app UI which enables the user to call or text the rider.,Contact, -Uber,Support,"In our customer support platform, Bliss, each support ticket is called a contact.",Contact, -Uber,Rider,"This refers to a person whose information, such as ID or email address, has been added by the user to their contact list or to an address book.",Contact, -Uber,Partner,People who sign up to drive on the Uber platform.,Driver, -Uber,Rider,People who sign up to drive on the Uber platform.,Driver, -Marketing,Guests,Used Airbnb Plus value prop; each home in Airbnb Plus is verified for quality and design.,Verified for quality and design,These houses are verified for quality and design -Support,,Guidelines on Uber's use for all of our community,Community guidelines, -Support,,Guidelines on Uber's use for all of our community,CG, diff --git a/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua solo note.csv b/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua solo note.csv deleted file mode 100644 index 17a082b7cf..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua solo note.csv +++ /dev/null @@ -1,9 +0,0 @@ -Domain,Subdomain,Definition,en-GB,Notes -Uber,Partner,Contact is the label of a button in the Uber Driver app UI which enables the user to call or text the rider.,Contact, -Uber,Support,"In our customer support platform, Bliss, each support ticket is called a contact.",Contact, -Uber,Rider,"This refers to a person whose information, such as ID or email address, has been added by the user to their contact list or to an address book.",Contact, -Uber,Partner,People who sign up to drive on the Uber platform.,Driver,"Generally, we refer to drivers using the Uber platform as ""driver-partners""." -Uber,Rider,People who sign up to drive on the Uber platform.,Driver, -Marketing,Guests,Used Airbnb Plus value prop; each home in Airbnb Plus is verified for quality and design.,Verified for quality and design,Quality should always come before the word design in these value props. -Support,,Guidelines on Uber's use for all of our community,Community guidelines, -Support,,Guidelines on Uber's use for all of our community,CG,Acronym for Community Guidelines diff --git a/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua.csv b/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua.csv deleted file mode 100644 index d97a99212a..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Formato campi concetto + una sola lingua.csv +++ /dev/null @@ -1,9 +0,0 @@ -Domain,Subdomain,Definition,en-GB,Notes,Example of use -Uber,Partner,Contact is the label of a button in the Uber Driver app UI which enables the user to call or text the rider.,Contact,, -Uber,Support,"In our customer support platform, Bliss, each support ticket is called a contact.",Contact,, -Uber,Rider,"This refers to a person whose information, such as ID or email address, has been added by the user to their contact list or to an address book.",Contact,, -Uber,Partner,People who sign up to drive on the Uber platform.,Driver,"Generally, we refer to drivers using the Uber platform as ""driver-partners"".", -Uber,Rider,People who sign up to drive on the Uber platform.,Driver,, -Marketing,Guests,Used Airbnb Plus value prop; each home in Airbnb Plus is verified for quality and design.,Verified for quality and design,Quality should always come before the word design in these value props.,These houses are verified for quality and design -Support,,Guidelines on Uber's use for all of our community,Community guidelines,, -Support,,Guidelines on Uber's use for all of our community,CG,Acronym for Community Guidelines, diff --git a/old_tests/support/files/csv/glossary/NV - Formato completo con colonne lingua spostate.csv b/old_tests/support/files/csv/glossary/NV - Formato completo con colonne lingua spostate.csv deleted file mode 100644 index 6910c4fb3b..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Formato completo con colonne lingua spostate.csv +++ /dev/null @@ -1,12 +0,0 @@ -Forbidden,Domain,Subdomain,Definition,en-GB,Example of use,Notes,es-ES,Example of use,Notes,it-IT,Example of use,Notes -,Uber,Partner,Contact is the label of a button in the Uber Driver app UI which enables the user to call or text the rider.,Contact,,,Contactar,,,Contatta,, -,Uber,Support,"In our customer support platform, Bliss, each support ticket is called a contact.",Contact,,,Contacto,,,Contatto,, -,Uber,Rider,"This refers to a person whose information, such as ID or email address, has been added by the user to their contact list or to an address book.",Contact,,,Contacto,,,Contatto,, -,Uber,Partner,People who sign up to drive on the Uber platform.,Driver,,"Generally, we refer to drivers using the Uber platform as ""driver-partners"".",Conductor partner,,,Autista partner,, -,Uber,Rider,People who sign up to drive on the Uber platform.,Driver,,,Chofer,,,Autista partner,, -,Marketing,Guests,Used Airbnb Plus value prop; each home in Airbnb Plus is verified for quality and design.,Verified for quality and design,These houses are verified for quality and design,Quality should always come before the word design in these value props.,verificado por su calidad y diseo,Estas casas se han verificado por su calidad y diseo,"""calidad"" siempre debe estar antes de ""diseo""",verificato per qualit e design,Queste case sono state verificate per qualit e design,"""qualit"" va sempre messo prima di ""design"" quando si utilizza quest'epressione" -,Support,,Guidelines on Uber's use for all of our community,Community guidelines,,,directrices de la comunidad,,,Linee guida della community,, -,Support,,Guidelines on Uber's use for all of our community,CG,,Acronym for Community Guidelines,Directrices de la comunidad,,"In Spanish, never use an acronym to translate ""Community Guidelines""",CG,,"Acronimo per ""Linee guida della community"". Alla prima occorrenza nel testo target, aggiungere ""(Linee guida della community)"" dopo l'acronimo." -1,,,,,,,,,,Cavallo,, -1,,,,House,,,Gato,,,Orso,, -,,,,,,,,,,Cane,, diff --git a/old_tests/support/files/csv/glossary/NV - Formato una sola lingua completa.csv b/old_tests/support/files/csv/glossary/NV - Formato una sola lingua completa.csv deleted file mode 100644 index 896b539d1a..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Formato una sola lingua completa.csv +++ /dev/null @@ -1,9 +0,0 @@ -en-GB,Notes,Example of use -Contact,, -Contact,, -Contact,, -Driver,"Generally, we refer to drivers using the Uber platform as ""driver-partners"".", -Driver,, -Verified for quality and design,Quality should always come before the word design in these value props.,These houses are verified for quality and design -Community guidelines,, -CG,Acronym for Community Guidelines, diff --git a/old_tests/support/files/csv/glossary/NV - Formato una sola lingua solo esempi.csv b/old_tests/support/files/csv/glossary/NV - Formato una sola lingua solo esempi.csv deleted file mode 100644 index 3f8ea09ca1..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Formato una sola lingua solo esempi.csv +++ /dev/null @@ -1,9 +0,0 @@ -en-GB,Example of use -Contact, -Contact, -Contact, -Driver, -Driver, -Verified for quality and design,These houses are verified for quality and design -Community guidelines, -CG, diff --git a/old_tests/support/files/csv/glossary/NV - Formato una sola lingua solo note.csv b/old_tests/support/files/csv/glossary/NV - Formato una sola lingua solo note.csv deleted file mode 100644 index 6e4a4c8226..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Formato una sola lingua solo note.csv +++ /dev/null @@ -1,9 +0,0 @@ -en-GB,Notes -Contact, -Contact, -Contact, -Driver,"Generally, we refer to drivers using the Uber platform as ""driver-partners""." -Driver, -Verified for quality and design,Quality should always come before the word design in these value props. -Community guidelines, -CG,Acronym for Community Guidelines diff --git a/old_tests/support/files/csv/glossary/NV - Header vuoto.csv b/old_tests/support/files/csv/glossary/NV - Header vuoto.csv deleted file mode 100644 index 77a307a813..0000000000 --- a/old_tests/support/files/csv/glossary/NV - Header vuoto.csv +++ /dev/null @@ -1,4 +0,0 @@ -en-GB,es-ES,,it-IT -Contact,Contactar,,Contatta -Contact,Contacto,,Contatto -Contact,Contacto,,Contatto \ No newline at end of file diff --git a/old_tests/support/files/csv/glossary/NV -Formato solo blacklist generale.csv b/old_tests/support/files/csv/glossary/NV -Formato solo blacklist generale.csv deleted file mode 100644 index 4db62349f1..0000000000 --- a/old_tests/support/files/csv/glossary/NV -Formato solo blacklist generale.csv +++ /dev/null @@ -1,2 +0,0 @@ -Forbidden,it-IT -TRUE,Cavallo diff --git a/old_tests/support/files/csv/glossary/V - Formato completo.csv b/old_tests/support/files/csv/glossary/V - Formato completo.csv deleted file mode 100644 index 3f3099ca28..0000000000 --- a/old_tests/support/files/csv/glossary/V - Formato completo.csv +++ /dev/null @@ -1,13 +0,0 @@ -Forbidden,Domain,Subdomain,Definition,en-GB,Notes,Example of use,es-ES,Notes,Example of use,it-IT,Notes,Example of use -,Uber,Partner,Contact is the label of a button in the Uber Driver app UI which enables the user to call or text the rider.,Contact,,,Contactar,,,Contatta,, -,Uber,Support,"In our customer support platform, Bliss, each support ticket is called a contact.",Contact,,,Contacto,,,Contatto,, -,Uber,Rider,"This refers to a person whose information, such as ID or email address, has been added by the user to their contact list or to an address book.",Contact,,,Contacto,,,Contatto,, -,Uber,Partner,People who sign up to drive on the Uber platform.,Driver,"Generally, we refer to drivers using the Uber platform as ""driver-partners"".",,Conductor partner,,,Autista partner,, -,Uber,Rider,People who sign up to drive on the Uber platform.,Driver,,,Chofer,,,Autista partner,, -,Marketing,Guests,Used Airbnb Plus value prop; each home in Airbnb Plus is verified for quality and design.,Verified for quality and design,Quality should always come before the word design in these value props.,These houses are verified for quality and design,verificado por su calidad y diseño,"""calidad"" siempre debe estar antes de ""diseño""",Estas casas se han verificado por su calidad y diseño,verificato per qualità e design,"""qualità"" va sempre messo prima di ""design"" quando si utilizza quest'epressione",Queste case sono state verificate per qualità e design -,Support,,Guidelines on Uber's use for all of our community,Community guidelines,,,directrices de la comunidad,,,Linee guida della community,, -,Support,,Guidelines on Uber's use for all of our community,CG,Acronym for Community Guidelines,,Directrices de la comunidad,"In Spanish, never use an acronym to translate ""Community Guidelines""",,CG,"Acronimo per ""Linee guida della community"". Alla prima occorrenza nel testo target, aggiungere ""(Linee guida della community)"" dopo l'acronimo.", -TRUE,,,,,,,,,,Cavallo,, -TRUE,,,,House,,,Gato,,,Orso,, -,,,,Ask,,,,,,Chiedere,, -,,,,Alert,,,,,,Notificare,, diff --git a/old_tests/support/files/csv/glossary/V - Formato lingue + campi termine (non per tutte le lingue).csv b/old_tests/support/files/csv/glossary/V - Formato lingue + campi termine (non per tutte le lingue).csv deleted file mode 100644 index 15e8737253..0000000000 --- a/old_tests/support/files/csv/glossary/V - Formato lingue + campi termine (non per tutte le lingue).csv +++ /dev/null @@ -1,11 +0,0 @@ -en-GB,es-ES,Example of use,it-IT,Notes -Contact,Contactar,,Contatta, -Contact,Contacto,,Contatto, -Contact,Contacto,,Contatto, -Driver,Conductor partner,,Autista partner, -Driver,Chofer,,Autista partner, -Verified for quality and design,verificado por su calidad y diseño,Estas casas se han verificado por su calidad y diseño,verificato per qualità e design,"""qualità"" va sempre messo prima di ""design"" quando si utilizza quest'epressione" -Community guidelines,directrices de la comunidad,,Linee guida della community, -CG,Directrices de la comunidad,,CG,"Acronimo per ""Linee guida della community"". Alla prima occorrenza nel testo target, aggiungere ""(Linee guida della community)"" dopo l'acronimo." -,Perro,,, -House,Gato,,Orso, diff --git a/old_tests/support/files/csv/glossary/V - Formato lingue + campi termine.csv b/old_tests/support/files/csv/glossary/V - Formato lingue + campi termine.csv deleted file mode 100644 index 1e75143e27..0000000000 --- a/old_tests/support/files/csv/glossary/V - Formato lingue + campi termine.csv +++ /dev/null @@ -1,11 +0,0 @@ -en-GB,Notes,Example of use,es-ES,Notes,Example of use,it-IT,Notes,Example of use -Contact,,,Contactar,,,Contatta,, -Contact,,,Contacto,,,Contatto,, -Contact,,,Contacto,,,Contatto,, -Driver,"Generally, we refer to drivers using the Uber platform as ""driver-partners"".",,Conductor partner,,,Autista partner,, -Driver,,,Chofer,,,Autista partner,, -Verified for quality and design,Quality should always come before the word design in these value props.,These houses are verified for quality and design,verificado por su calidad y diseño,"""calidad"" siempre debe estar antes de ""diseño""",Estas casas se han verificado por su calidad y diseño,verificato per qualità e design,"""qualità"" va sempre messo prima di ""design"" quando si utilizza quest'epressione",Queste case sono state verificate per qualità e design -Community guidelines,,,directrices de la comunidad,,,Linee guida della community,, -CG,Acronym for Community Guidelines,,Directrices de la comunidad,"In Spanish, never use an acronym to translate ""Community Guidelines""",,CG,"Acronimo per ""Linee guida della community"". Alla prima occorrenza nel testo target, aggiungere ""(Linee guida della community)"" dopo l'acronimo.", -,,,,,,Cavallo,, -House,,,Gato,,,Orso,, diff --git a/old_tests/support/files/csv/glossary/V - Formato semplice solo lingue.csv b/old_tests/support/files/csv/glossary/V - Formato semplice solo lingue.csv deleted file mode 100644 index bf5405648a..0000000000 --- a/old_tests/support/files/csv/glossary/V - Formato semplice solo lingue.csv +++ /dev/null @@ -1,12 +0,0 @@ -en-GB,es-ES,it-IT -Contact,Contactar,Contatta -Contact,Contacto,Contatto -Contact,Contacto,Contatto -Driver,Conductor partner,Autista partner -Driver,Chofer,Autista partner -Verified for quality and design,verificado por su calidad y diseño,verificato per qualità e design -Community guidelines,directrices de la comunidad,Linee guida della community -CG,Directrices de la comunidad,CG -,,Cavallo -House,Gato,Orso -,,Cane diff --git a/old_tests/support/files/csv/glossary/V - Formato solo blacklist combinata.csv b/old_tests/support/files/csv/glossary/V - Formato solo blacklist combinata.csv deleted file mode 100644 index 60855545d9..0000000000 --- a/old_tests/support/files/csv/glossary/V - Formato solo blacklist combinata.csv +++ /dev/null @@ -1,3 +0,0 @@ -Forbidden,en-GB,es-ES,it-IT -TRUE,,,Cavallo -TRUE,House,Gato,Orso diff --git a/old_tests/support/files/csv/glossary/V - Formato solo blacklist language-specific.csv b/old_tests/support/files/csv/glossary/V - Formato solo blacklist language-specific.csv deleted file mode 100644 index 071cc55789..0000000000 --- a/old_tests/support/files/csv/glossary/V - Formato solo blacklist language-specific.csv +++ /dev/null @@ -1,2 +0,0 @@ -Forbidden,en-GB,es-ES,it-IT -TRUE,House,Gato,Orso diff --git a/old_tests/support/files/csv/glossary/V - Header-vuoti.csv b/old_tests/support/files/csv/glossary/V - Header-vuoti.csv deleted file mode 100644 index 9f43267e9d..0000000000 --- a/old_tests/support/files/csv/glossary/V - Header-vuoti.csv +++ /dev/null @@ -1,4 +0,0 @@ -en-GB,es-ES,it-IT,,,,, -Contact,Contactar,Contatta,,,,, -Contact,Contacto,Contatto,,,,, -Contact,Contacto,Contatto,,,,, diff --git a/old_tests/support/files/csv/glossary/full-structure-valid.csv b/old_tests/support/files/csv/glossary/full-structure-valid.csv deleted file mode 100644 index 84781c799a..0000000000 --- a/old_tests/support/files/csv/glossary/full-structure-valid.csv +++ /dev/null @@ -1,3 +0,0 @@ -forbidden,domain,subdomain,definition,en-US,Notes,Example of use,it-IT,Notes,Example of use,es-ES,Notes,Example of use -,Uber,Partner,bla bla bla,Contact,,,Contattare,,,Contactar,, -,Uber,Eats,bla bla bla,Eat,,,Mangiare,,,Comer,, \ No newline at end of file diff --git a/old_tests/support/files/csv/glossary/invalid-language.csv b/old_tests/support/files/csv/glossary/invalid-language.csv deleted file mode 100644 index f57f229a93..0000000000 --- a/old_tests/support/files/csv/glossary/invalid-language.csv +++ /dev/null @@ -1,3 +0,0 @@ -not,valid,foo,bar -1,2,3,4 -5,6,7,8 \ No newline at end of file diff --git a/old_tests/support/files/csv/glossary/invalid-structure.csv b/old_tests/support/files/csv/glossary/invalid-structure.csv deleted file mode 100644 index a1bde4bac4..0000000000 --- a/old_tests/support/files/csv/glossary/invalid-structure.csv +++ /dev/null @@ -1,4 +0,0 @@ -en-ZZ,it-IT,Notes -house,casa,This is a note -hello,ciao,This is a note -No,No,This is a note \ No newline at end of file diff --git a/old_tests/support/files/csv/glossary/minimal-invalid.csv b/old_tests/support/files/csv/glossary/minimal-invalid.csv deleted file mode 100644 index 2ae446089d..0000000000 --- a/old_tests/support/files/csv/glossary/minimal-invalid.csv +++ /dev/null @@ -1,4 +0,0 @@ -en-US,it-IT,es-419 -house,casa,casa -hello,ciao,Hola -No,No,No \ No newline at end of file diff --git a/old_tests/support/files/csv/glossary/minimal-valid.csv b/old_tests/support/files/csv/glossary/minimal-valid.csv deleted file mode 100644 index 9d3c5e3c63..0000000000 --- a/old_tests/support/files/csv/glossary/minimal-valid.csv +++ /dev/null @@ -1,4 +0,0 @@ -en-US,it-IT,Notes -house,casa,This is a note -hello,ciao,This is a note -No,No,This is a note \ No newline at end of file diff --git a/old_tests/support/files/csv/glossary/mixed-valid.csv b/old_tests/support/files/csv/glossary/mixed-valid.csv deleted file mode 100644 index 144475d452..0000000000 --- a/old_tests/support/files/csv/glossary/mixed-valid.csv +++ /dev/null @@ -1,3 +0,0 @@ -domain,subdomain,definition,en-US,Notes,it-IT,Notes,es-ES,Notes -Uber,Partner,bla bla bla,Contact,Nota,Contattare,Nota,Contactar,Nota -Uber,Eats,bla bla bla,Eat,Nota,Mangiare,Nota,Comer,Nota \ No newline at end of file diff --git a/old_tests/support/files/docx/WhiteHouse.docx b/old_tests/support/files/docx/WhiteHouse.docx deleted file mode 100644 index 3979541025..0000000000 Binary files a/old_tests/support/files/docx/WhiteHouse.docx and /dev/null differ diff --git a/old_tests/support/files/glossary/Final-Matecat-new_glossary_format-Glossary.csv b/old_tests/support/files/glossary/Final-Matecat-new_glossary_format-Glossary.csv deleted file mode 100644 index 01f4e26481..0000000000 --- a/old_tests/support/files/glossary/Final-Matecat-new_glossary_format-Glossary.csv +++ /dev/null @@ -1,12 +0,0 @@ -Forbidden,Domain,Subdomain,Definition,en-GB,Notes,Example of use,es-ES,Notes,Example of use,it-IT,Notes,Example of use -,Uber,Partner,Contact is the label of a button in the Uber Driver app UI which enables the user to call or text the rider.,Contact,,,Contactar,,,Contatta,, -,Uber,Support,"In our customer support platform, Bliss, each support ticket is called a contact.",Contact,,,Contacto,,,Contatto,, -,Uber,Rider,"This refers to a person whose information, such as ID or email address, has been added by the user to their contact list or to an address book.",Contact,,,Contacto,,,Contatto,, -,Uber,Partner,People who sign up to drive on the Uber platform.,Driver,"Generally, we refer to drivers using the Uber platform as ""driver-partners"".",,Conductor partner,,,Autista partner,, -,Uber,Rider,People who sign up to drive on the Uber platform.,Driver, ,,Chofer,,,Autista partner,, -,Marketing,Guests,Used Airbnb Plus value prop; each home in Airbnb Plus is verified for quality and design.,Verified for quality and design,Quality should always come before the word design in these value props.,These houses are verified for quality and design,verificado por su calidad y diseño,"""calidad"" siempre debe estar antes de ""diseño""",Estas casas se han verificado por su calidad y diseño,verificato per qualità e design,"""qualità"" va sempre messo prima di ""design"" quando si utilizza quest'epressione",Queste case sono state verificate per qualità e design -,Support,,Guidelines on Uber's use for all of our community,Community guidelines,,,directrices de la comunidad,,,Linee guida della community,, -,Support,,Guidelines on Uber's use for all of our community,CG,Acronym for Community Guidelines,,Directrices de la comunidad,"In Spanish, never use an acronym to translate ""Community Guidelines""",,CG,"Acronimo per ""Linee guida della community"". Alla prima occorrenza nel testo target, aggiungere ""(Linee guida della community)"" dopo l'acronimo.", -TRUE,,,,,,,Perro,,,,, -TRUE,,,,House,,,Gato,,,Orso,, -TRUE,,,,Pippo,,,,,,Pluto,, \ No newline at end of file diff --git a/old_tests/support/files/glossary/Final-Matecat-new_glossary_format-InvalidTargetLang.csv b/old_tests/support/files/glossary/Final-Matecat-new_glossary_format-InvalidTargetLang.csv deleted file mode 100644 index db0fd071f0..0000000000 --- a/old_tests/support/files/glossary/Final-Matecat-new_glossary_format-InvalidTargetLang.csv +++ /dev/null @@ -1,12 +0,0 @@ -Forbidden,Domain,Subdomain,Definition,en-GB,Notes,Example of use,INVALID_TARGET_LANG,Notes,Example of use,it-IT,Notes,Example of use -,Uber,Partner,Contact is the label of a button in the Uber Driver app UI which enables the user to call or text the rider.,Contact,,,Contactar,,,Contatta,, -,Uber,Support,"In our customer support platform, Bliss, each support ticket is called a contact.",Contact,,,Contacto,,,Contatto,, -,Uber,Rider,"This refers to a person whose information, such as ID or email address, has been added by the user to their contact list or to an address book.",Contact,,,Contacto,,,Contatto,, -,Uber,Partner,People who sign up to drive on the Uber platform.,Driver,"Generally, we refer to drivers using the Uber platform as ""driver-partners"".",,Conductor partner,,,Autista partner,, -,Uber,Rider,People who sign up to drive on the Uber platform.,Driver, ,,Chofer,,,Autista partner,, -,Marketing,Guests,Used Airbnb Plus value prop; each home in Airbnb Plus is verified for quality and design.,Verified for quality and design,Quality should always come before the word design in these value props.,These houses are verified for quality and design,verificado por su calidad y diseño,"""calidad"" siempre debe estar antes de ""diseño""",Estas casas se han verificado por su calidad y diseño,verificato per qualità e design,"""qualità"" va sempre messo prima di ""design"" quando si utilizza quest'epressione",Queste case sono state verificate per qualità e design -,Support,,Guidelines on Uber's use for all of our community,Community guidelines,,,directrices de la comunidad,,,Linee guida della community,, -,Support,,Guidelines on Uber's use for all of our community,CG,Acronym for Community Guidelines,,Directrices de la comunidad,"In Spanish, never use an acronym to translate ""Community Guidelines""",,CG,"Acronimo per ""Linee guida della community"". Alla prima occorrenza nel testo target, aggiungere ""(Linee guida della community)"" dopo l'acronimo.", -TRUE,,,,,,,Perro,,,,, -TRUE,,,,House,,,Gato,,,Orso,, -TRUE,,,,Pippo,,,,,,Pluto,, \ No newline at end of file diff --git a/old_tests/support/files/glossary/GlossaryInvalidHeader.csv b/old_tests/support/files/glossary/GlossaryInvalidHeader.csv deleted file mode 100644 index e090d31e63..0000000000 --- a/old_tests/support/files/glossary/GlossaryInvalidHeader.csv +++ /dev/null @@ -1,5 +0,0 @@ -, -absorber,assorbire -Poppy,Poppy -"ISSEY MIYAKE","ISSEY MIYAKE" -enfants,bambini diff --git a/old_tests/support/files/json/files/invalid.json b/old_tests/support/files/json/files/invalid.json deleted file mode 100644 index 2cf3821c43..0000000000 --- a/old_tests/support/files/json/files/invalid.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": 1, - "name": "John Doe", - "orders": [ - { - "id": 1 - }, - { - "price": 1.0 - } - ] -} diff --git a/old_tests/support/files/json/files/invalid_maxItems.json b/old_tests/support/files/json/files/invalid_maxItems.json deleted file mode 100644 index 2d28d959d0..0000000000 --- a/old_tests/support/files/json/files/invalid_maxItems.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "id": 1, - "name": "John Doe", - "orders": [ - { - "id": 1, - "price": 2.0, - "updated": "2017-07-21T17:32:28Z" - }, - { - "id": 2, - "price": 1.0, - "updated": "2017-07-21T17:32:28Z" - }, - { - "id": 3, - "price": 3.0, - "updated": "2017-07-21T17:32:28Z" - }, - { - "id": 4, - "price": 4.0, - "updated": "2017-07-21T17:32:28Z" - } - ] -} diff --git a/old_tests/support/files/json/files/uber_qa_model.json b/old_tests/support/files/json/files/uber_qa_model.json deleted file mode 100644 index def282fc68..0000000000 --- a/old_tests/support/files/json/files/uber_qa_model.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "model": { - "version": 1, - "label": "Uber - Marketing", - "categories": [ - { - "label": "Readability", - "code": "RDB", - "severities": [ - { - "label": "Minor error", - "code": "Min", - "dqf_id": 1, - "penalty": 1 - }, - { - "label": "Major error", - "code": "Maj", - "dqf_id": 2, - "penalty": 2 - }, - { - "label": "Critical Error", - "code": "Cri", - "dqf_id": 3, - "penalty": 4 - } - ] - }, - { - "label": "Compliance", - "code": "COM", - "severities": [ - { - "label": "Minor error", - "code": "Min", - "dqf_id": 1, - "penalty": 0.5 - }, - { - "label": "Major error", - "code": "Maj", - "dqf_id": 2, - "penalty": 1 - }, - { - "label": "Critical Error", - "code": "Cri", - "dqf_id": 3, - "penalty": 3 - } - ] - }, - { - "label": "Grammar", - "code": "GRA", - "severities": [ - { - "label": "Minor error", - "code": "Min", - "dqf_id": 1, - "penalty": 0.5 - }, - { - "label": "Major error", - "code": "Maj", - "dqf_id": 2, - "penalty": 1 - }, - { - "label": "Critical Error", - "code": "Cri", - "dqf_id": 3, - "penalty": 3 - } - ] - }, - { - "label": "Punctuation/Spelling/Typo", - "code": "PST", - "severities": [ - { - "label": "Minor error", - "code": "Min", - "dqf_id": 1, - "penalty": 0.5 - }, - { - "label": "Major error", - "code": "Maj", - "dqf_id": 2, - "penalty": 1 - }, - { - "label": "Critical Error", - "code": "Cri", - "dqf_id": 3, - "penalty": 3 - } - ] - }, - { - "label": "Meaning", - "code": "MNG", - "severities": [ - { - "label": "Minor error", - "code": "Min", - "dqf_id": 1, - "penalty": 1 - }, - { - "label": "Major error", - "code": "Maj", - "dqf_id": 2, - "penalty": 2 - }, - { - "label": "Critical Error", - "code": "Cri", - "dqf_id": 3, - "penalty": 4 - } - ] - }, - { - "label": "Style", - "code": "STY", - "severities": [ - { - "label": "Minor error", - "code": "Min", - "dqf_id": 1, - "penalty": 1 - }, - { - "label": "Major error", - "code": "Maj", - "dqf_id": 2, - "penalty": 2 - }, - { - "label": "Critical Error", - "code": "Cri", - "dqf_id": 3, - "penalty": 4 - } - ] - }, - { - "label": "Terminology", - "code": "TER", - "severities": [ - { - "label": "Minor error", - "code": "Min", - "dqf_id": 1, - "penalty": 0.5 - }, - { - "label": "Major error", - "code": "Maj", - "dqf_id": 2, - "penalty": 1 - }, - { - "label": "Critical Error", - "code": "Cri", - "dqf_id": 3, - "penalty": 3 - } - ] - } - ], - "passfail": { - "type": "points_per_thousand", - "thresholds": [ - { - "label": "R1", - "value": 3 - }, - { - "label": "R2", - "value": 33 - } - ] - } - } -} diff --git a/old_tests/support/files/json/files/valid.json b/old_tests/support/files/json/files/valid.json deleted file mode 100644 index 78b357251a..0000000000 --- a/old_tests/support/files/json/files/valid.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": 1, - "name": "John Doe", - "orders": [ - { - "id": 1, - "price": 2.0, - "updated": "2017-07-21T17:32:28Z" - }, - { - "id": 2, - "price": 1.0, - "updated": "2017-07-21T17:32:28Z" - } - ] -} diff --git a/old_tests/support/files/json/schema/invalid.json b/old_tests/support/files/json/schema/invalid.json deleted file mode 100644 index 81750b96f9..0000000000 --- a/old_tests/support/files/json/schema/invalid.json +++ /dev/null @@ -1 +0,0 @@ -{ \ No newline at end of file diff --git a/old_tests/support/files/json/schema/schema_1.json b/old_tests/support/files/json/schema/schema_1.json deleted file mode 100644 index c5b999a424..0000000000 --- a/old_tests/support/files/json/schema/schema_1.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "orders": { - "type": "array", - "maxItems": 2, - "items": { - "$ref": "#/definitions/order" - } - } - }, - "required": ["id"], - "definitions": { - "order": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "price": { - "type": "number" - }, - "updated": { - "type": "string", - "format": "date-time" - } - }, - "required": ["id"] - } - } -} diff --git a/old_tests/support/files/small-with-notes.sdlxliff b/old_tests/support/files/small-with-notes.sdlxliff deleted file mode 100644 index 925696f266..0000000000 --- a/old_tests/support/files/small-with-notes.sdlxliff +++ /dev/null @@ -1,28 +0,0 @@ - - - -
- - - An English string - This is Brazilian text 1 - This is a comment - This is another comment for the same segment - - - This unit has a comment too - Another translated text - This is another comment - - - This has not comments - BR this has no comments - - - This unit has a comment too - Another translated text - This is a note with attributes - - -
-
diff --git a/old_tests/support/files/test-propagation.xlf b/old_tests/support/files/test-propagation.xlf deleted file mode 100644 index 9cd3a993e3..0000000000 --- a/old_tests/support/files/test-propagation.xlf +++ /dev/null @@ -1,36 +0,0 @@ - - - -
- - - An English word - Palavra En Inglês - - - An English word - Palavra En Inglês - - - An English word - Palavra En Inglês - - - An English word - Palavra En Inglês - - - An English word - Palavra En Inglês - - - An English word - Palavra En Inglês - - - An English word - Palavra En Inglês - - -
-
diff --git a/old_tests/support/files/tmx/exampleForTestOriginal.tmx b/old_tests/support/files/tmx/exampleForTestOriginal.tmx deleted file mode 100644 index da11916554..0000000000 --- a/old_tests/support/files/tmx/exampleForTestOriginal.tmx +++ /dev/null @@ -1,44 +0,0 @@ - - -
- - - 351754 - 196899968 - va-_per_trad_eng_02.docx - TRANSLATED - - - 3.2 comprendere la qualità della vita affettiva - - - 3.2 Understanding the quality of affective life - - - - - 351754 - 196899969 - va-_per_trad_eng_02.docx - TRANSLATED - - - 3.2.1 il lato emozionale della vita della mente - - - 3.2.1 The emotional side of life of the mind - - - - - - - \ No newline at end of file diff --git a/old_tests/support/files/txt/hello.txt b/old_tests/support/files/txt/hello.txt deleted file mode 100644 index 8211ee4b2c..0000000000 --- a/old_tests/support/files/txt/hello.txt +++ /dev/null @@ -1,3 +0,0 @@ -Hello world, what time is it ? Where are you from ? -I think the mistery of universe can be solved by humanity near in the future -With regard to the recent discovery of gravitational waves there are more implications than those that you can see \ No newline at end of file diff --git a/old_tests/support/files/xliff/324.VIII.xlf b/old_tests/support/files/xliff/324.VIII.xlf deleted file mode 100644 index 6ae8f35997..0000000000 --- a/old_tests/support/files/xliff/324.VIII.xlf +++ /dev/null @@ -1,12 +0,0 @@ -
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j3+MECatQ+/evfv06TNhwgRxgmwRevXqdfDBBysnI1ew5sTJXmPGjIlSVdI1X4H/VypwjA6pXKl/Clge+ovOoahJhUz/bcXdmZUi6YYbbgDfKaecgjZUPfPMMxKDBx54oHXr1pgbPnw4eiZPnsxKu3btKovVrbi4+LLLLpszZw63fuihh4466qh169add955doLKFStWHHnkkVBziXW45JJLli1btnHjRmFN17NnT32eeuqpESNGiGy3jBw50oaxDa655hpxGPDKlSuffvppIHXu3FmKHDvBsq0nP5H4T+am/jli61Qq5yuf1Eqw7lyT6f9fCEh5Jwvkl1EmHGAClxdddBEPhpF0An/Kd9xxB3zbtGkzffr0qVOnHnTQQXfffTfKOe727dtxLCxjXrVq1T333MM1ZQ42wKRJk7p16/b4449feeWVejJvswBOgZvaHjbGxIkTBWT2hlgMxCP9MLueIHbku7bE+PHj3QGef/75eMJj+Y56Ip4Nl/8AOWVPV7VcTAGmcad2jJSXKSoDEdyDBw+eMmXK0KFDcaaz+lmzZkkD4r+uHzZs2Ny5c93fEcYLDWS9YHLKSrHVsWNHlax63rx5b731FnPlshA0KdM1hX0S3w+bOXOmaOeccw6X5W5yZdNx5XBWK9m0aVNJSYkFgNikL7/88jvvvHP66aejHO5xV9fkGOlEKCO4lgsZQMllc+X/T7caN2i0ff/737/uuuswh7BwvmgFFkabNm2q0sCXXnoJ+njFGax1Y5m5wOV7QzqB8saNGwtiuD6OBQUFWDRvTKqnCFAWsEuXLscee2w850UmgFdHS1LZqlUr86qZMWPG6NGjH374YUBLggUR2XQgdtQ/XxnBtVxhXRTEUNyvwVRYWIgM5cj36tatqyx/lQOA5oc//KHnKsmAFEJiqkliynTjZZkhSJVFQJPi4w8PeUuWLIEvy2TMTlk+4nVWaNeu3Y9+9CMefOONN1qMbmYxynp0iNuCzWMiybEU2bNd3759X3nlFZuBDZvUzxI/hSGOoYzgWi6m6MKDw1WHghrG6RnrqquuGjVqVPfu3dGDJJxBSln/1atXX3311b/73e94IcuMXz6Q3V566aXSXEBfcMEF11577cCBAw888MCxY8fee++9UD7++OPPP//8F198UQr7m9/85rvf/S7EYw0ksqzg+uuvv+WWWy688MLX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AGRvY1Byb3BzL2NvcmUueG1sUEsBAi0AFAAGAAgAAAAhAGsEoMYGAgAAtQUAABIAAAAAAAAAAAAAAAAAxNAFAHdvcmQvZm9udFRhYmxlLnhtbFBLAQItABQABgAIAAAAIQBXTMPYgAEAANICAAAQAAAAAAAAAAAAAAAAAPrSBQBkb2NQcm9wcy9hcHAueG1sUEsFBgAAAAAfAB8ADAgAALDVBQAAAA==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CjwhLS1QTEVBU0UsIERPIE5PVCBSRU5BTUUsIE1PVkUsIE1PRElGWSBPUiBBTFRFUiBJTiBBTlkgV0FZIFRISVMgRklMRS0tPgo8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KPG1hbmlmZXN0IHZlcnNpb249IjIiIGxpYlZlcnNpb249IjEuMi40IiBwcm9qZWN0SWQ9Ik5CREQ4MjJEOSIgcGFja2FnZUlkPSJmNzkxZDI1NS01Y2JlLTQ4NzMtYmNlMy1iZmJiODQ1ZGRiMmMiIHNvdXJjZT0icnUtUlUiIHRhcmdldD0ic2stU0siIG9yaWdpbmFsU3ViRGlyPSJvcmlnaW5hbCIgc2tlbGV0b25TdWJEaXI9InNrZWxldG9uIiBzb3VyY2VTdWJEaXI9IndvcmsiIHRhcmdldFN1YkRpcj0id29yayIgbWVyZ2VTdWJEaXI9ImRvbmUiIHRtU3ViRGlyPSIiIGRhdGU9IjIwMjAtMDItMTEgMDk6MjY6MzcrMDAwMCIgdXNlQXBwcm92ZWRPbmx5PSIwIiB1cGRhdGVBcHByb3ZlZEZsYWc9IjAiPgo8Y3JlYXRvclBhcmFtZXRlcnM+PC9jcmVhdG9yUGFyYW1ldGVycz4KPGRvYyB4bWw6c3BhY2U9InByZXNlcnZlIiBkb2NJZD0iMSIgZXh0cmFjdGlvblR5cGU9InhsaWZmIiByZWxhdGl2ZUlucHV0UGF0aD0iMzI0LlZJSUlfKDIpLmRvY3giIGZpbHRlcklkPSJva2Zfb3BlbnhtbCIgaW5wdXRFbmNvZGluZz0iVVRGLTgiIHJlbGF0aXZlVGFyZ2V0UGF0aD0iMzI0LlZJSUlfKDIpLm91dC5kb2N4IiB0YXJnZXRFbmNvZGluZz0iVVRGLTgiIHNlbGVjdGVkPSIxIj5JM1l4Q21KUWNtVm1aWEpsYm1ObFZISmhibk5zWVhSbFJHOWpVSEp2Y0dWeWRHbGxjeTVpUFdaaGJITmxDbUpRY21WbVpYSmxibU5sVkhKaGJuTnNZWFJsUTI5dGJXVnVkSE11WWoxbVlXeHpaUXBpVUhKbFptVnlaVzVqWlZSeVlXNXpiR0YwWlZCdmQyVnljRzlwYm5ST2IzUmxjeTVpUFhSeWRXVUtZbEJ5WldabGNtVnVZMlZVY21GdWMyeGhkR1ZRYjNkbGNuQnZhVzUwVFdGemRHVnljeTVpUFdaaGJITmxDbUpRY21WbVpYSmxibU5sU1dkdWIzSmxVR3hoWTJWb2IyeGtaWEp6U1c1UWIzZGxjbkJ2YVc1MFRXRnpkR1Z5Y3k1aVBXWmhiSE5sQ21KUWNtVm1aWEpsYm1ObFZISmhibk5zWVhSbFYyOXlaRWhsWVdSbGNuTkdiMjkwWlhKekxtSTlkSEoxWlFwaVVISmxabVZ5Wlc1alpWUnlZVzV6YkdGMFpWZHZjbVJJYVdSa1pXNHVZajFtWVd4elpRcGlVSEpsWm1WeVpXNWpaVlJ5WVc1emJHRjBaVmR2Y21SRmVHTnNkV1JsUjNKaGNHaHBZMDFsZEdGRVlYUmhMbUk5ZEhKMVpRcGlVSEpsWm1WeVpXNWpaVlJ5WVc1emJHRjBaVVY0WTJWc1JYaGpiSFZrWlVOdmJHOXljeTVpUFdaaGJITmxDbUpRY21WbVpYSmxibU5sVkhKaGJuTnNZWFJsUlhoalpXeEZlR05zZFdSbFEyOXNkVzF1Y3k1aVBXWmhiSE5sQ21KUWNtVm1aWEpsYm1ObFZISmhibk5zWVhSbFJYaGpaV3hUYUdWbGRFNWhiV1Z6TG1JOVptRnNjMlVLWWxCeVpXWmxjbVZ1WTJWQlpHUk1hVzVsVTJWd1lYSmhkRzl5UVhORGFHRnlZV04wWlhJdVlqMTBjblZsQ25OUWNtVm1aWEpsYm1ObFRHbHVaVk5sY0dGeVlYUnZjbEpsY0d4aFkyVnRaVzUwUFNRd1lTUUtZbEJ5WldabGNtVnVZMlZTWlhCc1lXTmxUbTlDY21WaGEwaDVjR2hsYmxSaFp5NWlQWFJ5ZFdVS1lsQnlaV1psY21WdVkyVkpaMjV2Y21WVGIyWjBTSGx3YUdWdVZHRm5MbUk5ZEhKMVpRcGlVSEpsWm1WeVpXNWpaVUZrWkZSaFlrRnpRMmhoY21GamRHVnlMbUk5ZEhKMVpRcGlVSEpsWm1WeVpXNWpaVUZuWjNKbGMzTnBkbVZEYkdWaGJuVndMbUk5ZEhKMVpRcGlVSEpsWm1WeVpXNWpaVUYxZEc5dFlYUnBZMkZzYkhsQlkyTmxjSFJTWlhacGMybHZibk11WWoxbVlXeHpaUXBpVUhKbFptVnlaVzVqWlZCdmQyVnljRzlwYm5SSmJtTnNkV1JsWkZOc2FXUmxUblZ0WW1WeWMwOXViSGt1WWoxbVlXeHpaUXBpVUhKbFptVnlaVzVqWlZSeVlXNXpiR0YwWlVWNFkyVnNSR2xoWjNKaGJVUmhkR0V1WWoxbVlXeHpaUXBpVUhKbFptVnlaVzVqWlZSeVlXNXpiR0YwWlVWNFkyVnNSSEpoZDJsdVozTXVZajFtWVd4elpRcGlVSEpsWm1WeVpXNWpaVlJ5WVc1emJHRjBaVVY0WTJWc1NHbGtaR1Z1TG1JOVptRnNjMlVLYjNWMGNIVjBVMlZuYldWdWRHRjBhVzl1Vkhsd1pTNXBQVE1LZEhORGIyMXdiR1Y0Um1sbGJHUkVaV1pwYm1sMGFXOXVjMVJ2UlhoMGNtRmpkQzVwUFRFS1kyWmtNRDFJV1ZCRlVreEpUa3NLZEhORmVHTmxiRVY0WTJ4MVpHVmtRMjlzYjNKekxtazlNQXAwYzBWNFkyVnNSWGhqYkhWa1pXUkRiMngxYlc1ekxtazlNQXAwYzBWNFkyeDFaR1ZYYjNKa1UzUjViR1Z6TG1rOU1BcDBjMUJ2ZDJWeWNHOXBiblJKYm1Oc2RXUmxaRk5zYVdSbFRuVnRZbVZ5Y3k1cFBUQT08L2RvYz4KPC9tYW5pZmVzdD4=
- - - -👌🏻 -👌🏻 -👌🏻 ¥♠ ' " -10 - - - -
\ No newline at end of file diff --git a/old_tests/support/files/xliff/amex-test.docx.xlf b/old_tests/support/files/xliff/amex-test.docx.xlf deleted file mode 100644 index 5665978708..0000000000 --- a/old_tests/support/files/xliff/amex-test.docx.xlf +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - -American Express : pour des raisons indépendantes de notre volonté, nous ne pourrons effectuer le débit qu’en Euros. Merci de votre compréhension -American Express : pour des raisons indépendantes de notre volonté, nous ne pourrons effectuer le débit qu’en Euros. Merci de votre compréhension -American Express : -pour des raisons indépendantes de notre volonté, nous ne pourrons effectuer le débit qu’en Euros. Merci de votre compréhension - - - - - - - - - - - - diff --git a/old_tests/support/files/xliff/file-with-hello-world.xliff b/old_tests/support/files/xliff/file-with-hello-world.xliff deleted file mode 100644 index 3c0d6083a0..0000000000 --- a/old_tests/support/files/xliff/file-with-hello-world.xliff +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Hello world, what time is it ? Where are you from ? - Hello world, what time is it ? Where are you from ? - Bonjour le monde, quelle heure il est ? d ou etes vous ? - - - I think the mistery of universe can be solved by humanity near in the future - - - With regard to the recent discovery of gravitational waves there are more implications than those that you can see - - - - \ No newline at end of file diff --git a/old_tests/support/files/xliff/file-with-notes-and-malicious-code.xliff b/old_tests/support/files/xliff/file-with-notes-and-malicious-code.xliff deleted file mode 100644 index 0798fd834b..0000000000 --- a/old_tests/support/files/xliff/file-with-notes-and-malicious-code.xliff +++ /dev/null @@ -1,26 +0,0 @@ -
- PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHhsaWZmIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIiB2ZXJzaW9uPSIxLjIiPgo8ZmlsZSBvcmlnaW5hbD0iIiBzb3VyY2UtbGFuZ3VhZ2U9ImVuLVVTIiB0YXJnZXQtbGFuZ3VhZ2U9InB0LUJSIiBkYXRhdHlwZT0icGxhaW50ZXh0IiBtdD0iZU1UIj4KPGhlYWRlcj48L2hlYWRlcj4KPGJvZHk+Cgk8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjUiPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5BbiBFbmdsaXNoIHN0cmluZzwvc291cmNlPgoJCTx0YXJnZXQgeG1sOmxhbmc9InB0LUJSIj5UaGlzIGlzIEJyYXppbGlhbiB0ZXh0IDE8L3RhcmdldD4KCQk8bm90ZT5UaGlzIGlzIGEgY29tbWVudDwvbm90ZT4KCQk8bm90ZT5UaGlzIGlzIGEgY29tbWVudCBudW1iZXIgdHdvPC9ub3RlPgoJCTxub3RlPlRoaXMgaXMgYSBjb21tZW50IG51bWJlciB0aHJlZTwvbm90ZT4KCTwvdHJhbnMtdW5pdD4KICA8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjYiPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5UaGlzIHVuaXQgaGFzIGEgY29tbWVudCB0b288L3NvdXJjZT4KCQk8dGFyZ2V0IHhtbDpsYW5nPSJwdC1CUiI+QW5vdGhlciB0cmFuc2xhdGVkIHRleHQ8L3RhcmdldD4KCTwvdHJhbnMtdW5pdD4KICA8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjciPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5BbiBFbmdsaXNoIHN0cmluZzwvc291cmNlPgoJCTx0YXJnZXQgeG1sOmxhbmc9InB0LUJSIj5UaGlzIGlzIEJyYXppbGlhbiB0ZXh0IDE8L3RhcmdldD4KCQk8bm90ZT5UaGlzIGlzIGFub3RoZXIgY29tbWVudDwvbm90ZT4KCTwvdHJhbnMtdW5pdD4KPC9ib2R5Pgo8L2ZpbGU+CjwveGxpZmY+Cg== -
-
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPg0KPCEtLVBMRUFTRSwgRE8gTk9UIFJFTkFNRSwgTU9WRSwgTU9ESUZZIE9SIEFMVEVSIElOIEFOWSBXQVkgVEhJUyBGSUxFLS0+DQo8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCjxtYW5pZmVzdCB2ZXJzaW9uPSIyIiBsaWJWZXJzaW9uPSIiIHByb2plY3RJZD0iTkM1QzkzQURFIiBwYWNrYWdlSWQ9IjY4ODc2NjIyLTQzZWItNDdiYy1hY2VmLWFmNjNlNWQwOTE5OSIgc291cmNlPSJoeS1hbSIgdGFyZ2V0PSJmci1mciIgb3JpZ2luYWxTdWJEaXI9Im9yaWdpbmFsIiBza2VsZXRvblN1YkRpcj0ic2tlbGV0b24iIHNvdXJjZVN1YkRpcj0id29yayIgdGFyZ2V0U3ViRGlyPSJ3b3JrIiBtZXJnZVN1YkRpcj0iZG9uZSIgdG1TdWJEaXI9IiIgZGF0ZT0iMjAxNS0xMC0wNiAxNjo1ODowMCswMDAwIiB1c2VBcHByb3ZlZE9ubHk9IjAiIHVwZGF0ZUFwcHJvdmVkRmxhZz0iMCI+DQo8Y3JlYXRvclBhcmFtZXRlcnM+PC9jcmVhdG9yUGFyYW1ldGVycz4NCjxkb2MgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZG9jSWQ9IjEiIGV4dHJhY3Rpb25UeXBlPSJ4bGlmZiIgcmVsYXRpdmVJbnB1dFBhdGg9IkViYXktbGlrZS1zbWFsbC1maWxlLWVkaXRlZC54bGYiIGZpbHRlcklkPSJva2ZfeGxpZmYiIGlucHV0RW5jb2Rpbmc9InV0Zi04IiByZWxhdGl2ZVRhcmdldFBhdGg9IkViYXktbGlrZS1zbWFsbC1maWxlLWVkaXRlZC5vdXQueGxmIiB0YXJnZXRFbmNvZGluZz0iVVRGLTgiIHNlbGVjdGVkPSIxIj5JM1l4Q25WelpVTjFjM1J2YlZCaGNuTmxjaTVpUFhSeWRXVUtabUZqZEc5eWVVTnNZWE56UFdOdmJTNWpkR011ZDNOMGVDNXpkR0Y0TGxkemRIaEpibkIxZEVaaFkzUnZjbmtLWm1Gc2JHSmhZMnRVYjBsRUxtSTlabUZzYzJVS1pYTmpZWEJsUjFRdVlqMW1ZV3h6WlFwaFpHUlVZWEpuWlhSTVlXNW5kV0ZuWlM1aVBYUnlkV1VLYjNabGNuSnBaR1ZVWVhKblpYUk1ZVzVuZFdGblpTNWlQV1poYkhObENtOTFkSEIxZEZObFoyMWxiblJoZEdsdmJsUjVjR1V1YVQwekNtbG5ibTl5WlVsdWNIVjBVMlZuYldWdWRHRjBhVzl1TG1JOVptRnNjMlVLWVdSa1FXeDBWSEpoYm5NdVlqMW1ZV3h6WlFwaFpHUkJiSFJVY21GdWMwZE5iMlJsTG1JOWRISjFaUXBsWkdsMFFXeDBWSEpoYm5NdVlqMW1ZV3h6WlFwcGJtTnNkV1JsUlhoMFpXNXphVzl1Y3k1aVBYUnlkV1VLYVc1amJIVmtaVWwwY3k1aVBYUnlkV1VLWW1Gc1lXNWpaVU52WkdWekxtSTlkSEoxWlFwaGJHeHZkMFZ0Y0hSNVZHRnlaMlYwY3k1aVBXWmhiSE5sQ25SaGNtZGxkRk4wWVhSbFRXOWtaUzVwUFRBS2RHRnlaMlYwVTNSaGRHVldZV3gxWlQxdVpXVmtjeTEwY21GdWMyeGhkR2x2YmdwaGJIZGhlWE5WYzJWVFpXZFRiM1Z5WTJVdVlqMW1ZV3h6WlFweGRXOTBaVTF2WkdWRVpXWnBibVZrTG1JOWRISjFaUXB4ZFc5MFpVMXZaR1V1YVQwd0NuVnpaVk5rYkZoc2FXWm1WM0pwZEdWeUxtSTlabUZzYzJVPTwvZG9jPg0KPC9tYW5pZmVzdD4=
-
- - - An English string - An English string - An English string - - - - This unit has a comment too - This unit has a comment too - This unit has a comment too - - - An English string - An English string - An English string - This is another comment - - - -
diff --git a/old_tests/support/files/xliff/file-with-notes-converted-nobase64.xliff b/old_tests/support/files/xliff/file-with-notes-converted-nobase64.xliff deleted file mode 100644 index 3b58688426..0000000000 --- a/old_tests/support/files/xliff/file-with-notes-converted-nobase64.xliff +++ /dev/null @@ -1,31 +0,0 @@ -
- PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHhsaWZmIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIiB2ZXJzaW9uPSIxLjIiPgo8ZmlsZSBvcmlnaW5hbD0iIiBzb3VyY2UtbGFuZ3VhZ2U9ImVuLVVTIiB0YXJnZXQtbGFuZ3VhZ2U9InB0LUJSIiBkYXRhdHlwZT0icGxhaW50ZXh0IiBtdD0iZU1UIj4KPGhlYWRlcj48L2hlYWRlcj4KPGJvZHk+Cgk8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjUiPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5BbiBFbmdsaXNoIHN0cmluZzwvc291cmNlPgoJCTx0YXJnZXQgeG1sOmxhbmc9InB0LUJSIj5UaGlzIGlzIEJyYXppbGlhbiB0ZXh0IDE8L3RhcmdldD4KCQk8bm90ZT5UaGlzIGlzIGEgY29tbWVudDwvbm90ZT4KCQk8bm90ZT5UaGlzIGlzIGEgY29tbWVudCBudW1iZXIgdHdvPC9ub3RlPgoJCTxub3RlPlRoaXMgaXMgYSBjb21tZW50IG51bWJlciB0aHJlZTwvbm90ZT4KCTwvdHJhbnMtdW5pdD4KICA8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjYiPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5UaGlzIHVuaXQgaGFzIGEgY29tbWVudCB0b288L3NvdXJjZT4KCQk8dGFyZ2V0IHhtbDpsYW5nPSJwdC1CUiI+QW5vdGhlciB0cmFuc2xhdGVkIHRleHQ8L3RhcmdldD4KCTwvdHJhbnMtdW5pdD4KICA8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjciPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5BbiBFbmdsaXNoIHN0cmluZzwvc291cmNlPgoJCTx0YXJnZXQgeG1sOmxhbmc9InB0LUJSIj5UaGlzIGlzIEJyYXppbGlhbiB0ZXh0IDE8L3RhcmdldD4KCQk8bm90ZT5UaGlzIGlzIGFub3RoZXIgY29tbWVudDwvbm90ZT4KCTwvdHJhbnMtdW5pdD4KPC9ib2R5Pgo8L2ZpbGU+CjwveGxpZmY+Cg== -
-
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPg0KPCEtLVBMRUFTRSwgRE8gTk9UIFJFTkFNRSwgTU9WRSwgTU9ESUZZIE9SIEFMVEVSIElOIEFOWSBXQVkgVEhJUyBGSUxFLS0+DQo8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCjxtYW5pZmVzdCB2ZXJzaW9uPSIyIiBsaWJWZXJzaW9uPSIiIHByb2plY3RJZD0iTkM1QzkzQURFIiBwYWNrYWdlSWQ9IjY4ODc2NjIyLTQzZWItNDdiYy1hY2VmLWFmNjNlNWQwOTE5OSIgc291cmNlPSJoeS1hbSIgdGFyZ2V0PSJmci1mciIgb3JpZ2luYWxTdWJEaXI9Im9yaWdpbmFsIiBza2VsZXRvblN1YkRpcj0ic2tlbGV0b24iIHNvdXJjZVN1YkRpcj0id29yayIgdGFyZ2V0U3ViRGlyPSJ3b3JrIiBtZXJnZVN1YkRpcj0iZG9uZSIgdG1TdWJEaXI9IiIgZGF0ZT0iMjAxNS0xMC0wNiAxNjo1ODowMCswMDAwIiB1c2VBcHByb3ZlZE9ubHk9IjAiIHVwZGF0ZUFwcHJvdmVkRmxhZz0iMCI+DQo8Y3JlYXRvclBhcmFtZXRlcnM+PC9jcmVhdG9yUGFyYW1ldGVycz4NCjxkb2MgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZG9jSWQ9IjEiIGV4dHJhY3Rpb25UeXBlPSJ4bGlmZiIgcmVsYXRpdmVJbnB1dFBhdGg9IkViYXktbGlrZS1zbWFsbC1maWxlLWVkaXRlZC54bGYiIGZpbHRlcklkPSJva2ZfeGxpZmYiIGlucHV0RW5jb2Rpbmc9InV0Zi04IiByZWxhdGl2ZVRhcmdldFBhdGg9IkViYXktbGlrZS1zbWFsbC1maWxlLWVkaXRlZC5vdXQueGxmIiB0YXJnZXRFbmNvZGluZz0iVVRGLTgiIHNlbGVjdGVkPSIxIj5JM1l4Q25WelpVTjFjM1J2YlZCaGNuTmxjaTVpUFhSeWRXVUtabUZqZEc5eWVVTnNZWE56UFdOdmJTNWpkR011ZDNOMGVDNXpkR0Y0TGxkemRIaEpibkIxZEVaaFkzUnZjbmtLWm1Gc2JHSmhZMnRVYjBsRUxtSTlabUZzYzJVS1pYTmpZWEJsUjFRdVlqMW1ZV3h6WlFwaFpHUlVZWEpuWlhSTVlXNW5kV0ZuWlM1aVBYUnlkV1VLYjNabGNuSnBaR1ZVWVhKblpYUk1ZVzVuZFdGblpTNWlQV1poYkhObENtOTFkSEIxZEZObFoyMWxiblJoZEdsdmJsUjVjR1V1YVQwekNtbG5ibTl5WlVsdWNIVjBVMlZuYldWdWRHRjBhVzl1TG1JOVptRnNjMlVLWVdSa1FXeDBWSEpoYm5NdVlqMW1ZV3h6WlFwaFpHUkJiSFJVY21GdWMwZE5iMlJsTG1JOWRISjFaUXBsWkdsMFFXeDBWSEpoYm5NdVlqMW1ZV3h6WlFwcGJtTnNkV1JsUlhoMFpXNXphVzl1Y3k1aVBYUnlkV1VLYVc1amJIVmtaVWwwY3k1aVBYUnlkV1VLWW1Gc1lXNWpaVU52WkdWekxtSTlkSEoxWlFwaGJHeHZkMFZ0Y0hSNVZHRnlaMlYwY3k1aVBXWmhiSE5sQ25SaGNtZGxkRk4wWVhSbFRXOWtaUzVwUFRBS2RHRnlaMlYwVTNSaGRHVldZV3gxWlQxdVpXVmtjeTEwY21GdWMyeGhkR2x2YmdwaGJIZGhlWE5WYzJWVFpXZFRiM1Z5WTJVdVlqMW1ZV3h6WlFweGRXOTBaVTF2WkdWRVpXWnBibVZrTG1JOWRISjFaUXB4ZFc5MFpVMXZaR1V1YVQwd0NuVnpaVk5rYkZoc2FXWm1WM0pwZEdWeUxtSTlabUZzYzJVPTwvZG9jPg0KPC9tYW5pZmVzdD4=
-
- - - An English string - An English string - An English string - This is a comment - --- - This is a comment number two - --- - This is a comment number three - - - - This unit has a comment too - This unit has a comment too - This unit has a comment too - - - An English string - An English string - An English string - This is another comment - - - -
diff --git a/old_tests/support/files/xliff/file-with-notes-converted.xliff b/old_tests/support/files/xliff/file-with-notes-converted.xliff deleted file mode 100644 index acec006cfd..0000000000 --- a/old_tests/support/files/xliff/file-with-notes-converted.xliff +++ /dev/null @@ -1,30 +0,0 @@ -
- PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHhsaWZmIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIiB2ZXJzaW9uPSIxLjIiPgo8ZmlsZSBvcmlnaW5hbD0iIiBzb3VyY2UtbGFuZ3VhZ2U9ImVuLVVTIiB0YXJnZXQtbGFuZ3VhZ2U9InB0LUJSIiBkYXRhdHlwZT0icGxhaW50ZXh0IiBtdD0iZU1UIj4KPGhlYWRlcj48L2hlYWRlcj4KPGJvZHk+Cgk8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjUiPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5BbiBFbmdsaXNoIHN0cmluZzwvc291cmNlPgoJCTx0YXJnZXQgeG1sOmxhbmc9InB0LUJSIj5UaGlzIGlzIEJyYXppbGlhbiB0ZXh0IDE8L3RhcmdldD4KCQk8bm90ZT5UaGlzIGlzIGEgY29tbWVudDwvbm90ZT4KCQk8bm90ZT5UaGlzIGlzIGEgY29tbWVudCBudW1iZXIgdHdvPC9ub3RlPgoJCTxub3RlPlRoaXMgaXMgYSBjb21tZW50IG51bWJlciB0aHJlZTwvbm90ZT4KCTwvdHJhbnMtdW5pdD4KICA8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjYiPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5UaGlzIHVuaXQgaGFzIGEgY29tbWVudCB0b288L3NvdXJjZT4KCQk8dGFyZ2V0IHhtbDpsYW5nPSJwdC1CUiI+QW5vdGhlciB0cmFuc2xhdGVkIHRleHQ8L3RhcmdldD4KCTwvdHJhbnMtdW5pdD4KICA8dHJhbnMtdW5pdCBjYXQxPSJBbnRpcXVlcyIgY2F0Mj0iQW50aXF1aXRpZXMiIGlkPSIyNTE5NzE1NTEwNjciPgoJCTxzb3VyY2UgeG1sOmxhbmc9ImVuLVVTIj5BbiBFbmdsaXNoIHN0cmluZzwvc291cmNlPgoJCTx0YXJnZXQgeG1sOmxhbmc9InB0LUJSIj5UaGlzIGlzIEJyYXppbGlhbiB0ZXh0IDE8L3RhcmdldD4KCQk8bm90ZT5UaGlzIGlzIGFub3RoZXIgY29tbWVudDwvbm90ZT4KCTwvdHJhbnMtdW5pdD4KPC9ib2R5Pgo8L2ZpbGU+CjwveGxpZmY+Cg== -
-
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPg0KPCEtLVBMRUFTRSwgRE8gTk9UIFJFTkFNRSwgTU9WRSwgTU9ESUZZIE9SIEFMVEVSIElOIEFOWSBXQVkgVEhJUyBGSUxFLS0+DQo8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCjxtYW5pZmVzdCB2ZXJzaW9uPSIyIiBsaWJWZXJzaW9uPSIiIHByb2plY3RJZD0iTkM1QzkzQURFIiBwYWNrYWdlSWQ9IjY4ODc2NjIyLTQzZWItNDdiYy1hY2VmLWFmNjNlNWQwOTE5OSIgc291cmNlPSJoeS1hbSIgdGFyZ2V0PSJmci1mciIgb3JpZ2luYWxTdWJEaXI9Im9yaWdpbmFsIiBza2VsZXRvblN1YkRpcj0ic2tlbGV0b24iIHNvdXJjZVN1YkRpcj0id29yayIgdGFyZ2V0U3ViRGlyPSJ3b3JrIiBtZXJnZVN1YkRpcj0iZG9uZSIgdG1TdWJEaXI9IiIgZGF0ZT0iMjAxNS0xMC0wNiAxNjo1ODowMCswMDAwIiB1c2VBcHByb3ZlZE9ubHk9IjAiIHVwZGF0ZUFwcHJvdmVkRmxhZz0iMCI+DQo8Y3JlYXRvclBhcmFtZXRlcnM+PC9jcmVhdG9yUGFyYW1ldGVycz4NCjxkb2MgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZG9jSWQ9IjEiIGV4dHJhY3Rpb25UeXBlPSJ4bGlmZiIgcmVsYXRpdmVJbnB1dFBhdGg9IkViYXktbGlrZS1zbWFsbC1maWxlLWVkaXRlZC54bGYiIGZpbHRlcklkPSJva2ZfeGxpZmYiIGlucHV0RW5jb2Rpbmc9InV0Zi04IiByZWxhdGl2ZVRhcmdldFBhdGg9IkViYXktbGlrZS1zbWFsbC1maWxlLWVkaXRlZC5vdXQueGxmIiB0YXJnZXRFbmNvZGluZz0iVVRGLTgiIHNlbGVjdGVkPSIxIj5JM1l4Q25WelpVTjFjM1J2YlZCaGNuTmxjaTVpUFhSeWRXVUtabUZqZEc5eWVVTnNZWE56UFdOdmJTNWpkR011ZDNOMGVDNXpkR0Y0TGxkemRIaEpibkIxZEVaaFkzUnZjbmtLWm1Gc2JHSmhZMnRVYjBsRUxtSTlabUZzYzJVS1pYTmpZWEJsUjFRdVlqMW1ZV3h6WlFwaFpHUlVZWEpuWlhSTVlXNW5kV0ZuWlM1aVBYUnlkV1VLYjNabGNuSnBaR1ZVWVhKblpYUk1ZVzVuZFdGblpTNWlQV1poYkhObENtOTFkSEIxZEZObFoyMWxiblJoZEdsdmJsUjVjR1V1YVQwekNtbG5ibTl5WlVsdWNIVjBVMlZuYldWdWRHRjBhVzl1TG1JOVptRnNjMlVLWVdSa1FXeDBWSEpoYm5NdVlqMW1ZV3h6WlFwaFpHUkJiSFJVY21GdWMwZE5iMlJsTG1JOWRISjFaUXBsWkdsMFFXeDBWSEpoYm5NdVlqMW1ZV3h6WlFwcGJtTnNkV1JsUlhoMFpXNXphVzl1Y3k1aVBYUnlkV1VLYVc1amJIVmtaVWwwY3k1aVBYUnlkV1VLWW1Gc1lXNWpaVU52WkdWekxtSTlkSEoxWlFwaGJHeHZkMFZ0Y0hSNVZHRnlaMlYwY3k1aVBXWmhiSE5sQ25SaGNtZGxkRk4wWVhSbFRXOWtaUzVwUFRBS2RHRnlaMlYwVTNSaGRHVldZV3gxWlQxdVpXVmtjeTEwY21GdWMyeGhkR2x2YmdwaGJIZGhlWE5WYzJWVFpXZFRiM1Z5WTJVdVlqMW1ZV3h6WlFweGRXOTBaVTF2WkdWRVpXWnBibVZrTG1JOWRISjFaUXB4ZFc5MFpVMXZaR1V1YVQwd0NuVnpaVk5rYkZoc2FXWm1WM0pwZEdWeUxtSTlabUZzYzJVPTwvZG9jPg0KPC9tYW5pZmVzdD4=
-
- - - An English string - An English string - An English string - This is a comment ---- -This is a comment number two ---- -This is a comment number three - - - This unit has a comment too - This unit has a comment too - This unit has a comment too - - - An English string - An English string - An English string - This is another comment - - - -
diff --git a/old_tests/support/files/xliff/file-with-notes-nobase64.po.sdlxliff b/old_tests/support/files/xliff/file-with-notes-nobase64.po.sdlxliff deleted file mode 100644 index e02dcf54a1..0000000000 --- a/old_tests/support/files/xliff/file-with-notes-nobase64.po.sdlxliff +++ /dev/null @@ -1,32 +0,0 @@ - - - - -New! Audience segmentation gets smarter -Novità! La segmentazione del tuo pubblico diventa più intelligente - - -News@me now works right after the activation. The News@me widget is now shown across your site at the bottom of any post that has \"Tags\" added or \"Categories\" assigned to it. <br><br> \"Tags\" and \"Categories\" are not good to you for segmenting your audience? Add \"News@me topics\" to your posts. -News@me adesso funziona subito dopo l’attivazione. ll widget di News@me è mostrato sul tuo sito alla fine di ogni articolo a cui sono stati aggiunti dei \"Tag\" o assegnate delle \"Categorie\". <br><br>Utilizzi \"Tag\" e \"Categorie\" in un modo diverso? Puoi aggiungere gli \"argomenti di News@me\" ai tuoi articoli e segmentare in questo modo la tua audience. - - -Introducing a new criteria for segmenting your audience -Introduciamo un nuovo criterio di segmentazione della tua audience - - -Please ask your hosting provider to install -Ti preghiamo di chiedere al tuo hosting provider di installare -This is a comment - - -Activate your account -Attiva il tuo account - - -News@me converts your occasional visitors into regular readers and sends them newsletter digests with the new posts published on your site based on their interests.<br>To use News@me you may need to sign up for an API key. Get started with the button below. -New@me trasforma i tuoi visitatori occasionali in lettori abituali e invia loro newsletter digest con i nuovi articoli pubblicati sul tuo sito in base ai loro interessi.<br>Per utilizzare News@me puoi aver bisogno di iscriverti per una API key. Inizia con il pulsante qui sotto. -This is another comment - - - - diff --git a/old_tests/support/files/xliff/file-with-preserve-white-space.xliff b/old_tests/support/files/xliff/file-with-preserve-white-space.xliff deleted file mode 100644 index 5b137c046b..0000000000 --- a/old_tests/support/files/xliff/file-with-preserve-white-space.xliff +++ /dev/null @@ -1,49 +0,0 @@ -
- - - -rec -rec -rec - - -<model id="12341" categoryId="10"> - <name>EOS 60D Body</name> - - ... - - <rec type="component" isSupplement="true" innerId="167" marketId="7888908">Объектив Canon EF 50 mm f/1.8 STM</rec> - <rec type="accessory" isSupplement="true" marketId="14210745">Сумка для фотокамеры Gadget Bag</rec> - <rec type="consumable" isSupplement="true">Аккумулятор для Canon AcmePower AP-LP-E6</rec> - - ... - -</model> -<model id="12341" categoryId="10"> - <name>EOS 60D Body</name> - - ... - - <rec type="component" isSupplement="true" innerId="167" marketId="7888908">Объектив Canon EF 50 mm f/1.8 STM</rec> - <rec type="accessory" isSupplement="true" marketId="14210745">Сумка для фотокамеры Gadget Bag</rec> - <rec type="consumable" isSupplement="true">Аккумулятор для Canon AcmePower AP-LP-E6</rec> - - ... - -</model> -<model id="12341" categoryId="10"> - <name>EOS 60D Body</name> - - ... - - <rec type="component" isSupplement="true" innerId="167" marketId="7888908">Объектив Canon EF 50 mm f/1.8 STM</rec> - <rec type="accessory" isSupplement="true" marketId="14210745">Сумка для фотокамеры Gadget Bag</rec> - <rec type="consumable" isSupplement="true">Аккумулятор для Canon AcmePower AP-LP-E6</rec> - - ... - -</model> - - - -
diff --git a/old_tests/support/files/xliff/sdlxliff-with-mrk-and-note.xlf.sdlxliff b/old_tests/support/files/xliff/sdlxliff-with-mrk-and-note.xlf.sdlxliff deleted file mode 100644 index 53620b9f86..0000000000 --- a/old_tests/support/files/xliff/sdlxliff-with-mrk-and-note.xlf.sdlxliff +++ /dev/null @@ -1,37 +0,0 @@ -
- -
- -
- -
- - - - - Making a Raced Win replica diecast takes time, patience and expertise. And this is how it is done… - - - - Making a Raced Win replica diecast takes time, patience and expertise. - - - And this is how it is done… - - - - - - Fare una Raced Win replica in metallo richiede tempo, pazienza ed esperienza. - - - E così è come si fa… - - - - Test note - - - - -
diff --git a/old_tests/support/files/zip-with-model-json.zip b/old_tests/support/files/zip-with-model-json.zip deleted file mode 100644 index 148907b25a..0000000000 Binary files a/old_tests/support/files/zip-with-model-json.zip and /dev/null differ diff --git a/old_tests/support/files/zip-with-model-json/__meta/qa_model.json b/old_tests/support/files/zip-with-model-json/__meta/qa_model.json deleted file mode 100644 index 658a522cb5..0000000000 --- a/old_tests/support/files/zip-with-model-json/__meta/qa_model.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "model": { - "version": 1, - "label": "testing", - - "categories": [ - { - "label": "Accuracy", - "subcategories": [ - {"label": "Mistranslation"}, - {"label": "Addition"}, - {"label": "Omission"}, - {"label": "Untranslated"} - ] - }, - { - "label": "Terminology" - }, - { - "label": "Fluency", - "subcategories": [ - {"label": "Spelling"}, - {"label": "Grammar"}, - {"label": "Punctuation"} - ] - }, - { - "label": "Style", - "subcategories": [{"label": "Company Style"}] - } - ], - "severities": [ - { - "label": "Minor", - "penalty": 1 - }, - { - "label": "Major", - "penalty": 3 - }, - { - "label": "Critical", - "penalty": 10 - } - ], - - "passfail": { - "type": "points_per_thousand", - "options": { - "limit": 20 - } - } - } -} diff --git a/old_tests/support/files/zip-with-model-json/amex-test.docx.xlf b/old_tests/support/files/zip-with-model-json/amex-test.docx.xlf deleted file mode 100644 index 7b935bd6cc..0000000000 --- a/old_tests/support/files/zip-with-model-json/amex-test.docx.xlf +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - -American Express : pour des raisons indépendantes de notre volonté, nous ne pourrons effectuer le débit qu’en Euros. Merci de votre compréhension -American Express : pour des raisons indépendantes de notre volonté, nous ne pourrons effectuer le débit qu’en Euros. Merci de votre compréhension -American Express : pour des raisons indépendantes de notre volonté, nous ne pourrons effectuer le débit qu’en Euros. Merci de votre compréhension - - - - - - - - - - - - diff --git a/old_tests/support/files/zip-with-reference-files.zip b/old_tests/support/files/zip-with-reference-files.zip deleted file mode 100644 index 316c938c17..0000000000 Binary files a/old_tests/support/files/zip-with-reference-files.zip and /dev/null differ diff --git a/old_tests/support/fixtures/files.yml b/old_tests/support/fixtures/files.yml deleted file mode 100644 index f0453350da..0000000000 --- a/old_tests/support/fixtures/files.yml +++ /dev/null @@ -1,7 +0,0 @@ -file1: - id: @EVER_INCREMENT - id_project: @REF:projects:simple_project:id - filename: sample.xlf - source_language: en-US - mime_type: xlf - sha1_original_file: 20170609/f7b3c7b3551a1f8e08e079035c7e64e3705f6df1 diff --git a/old_tests/support/fixtures/files_job.yml b/old_tests/support/fixtures/files_job.yml deleted file mode 100644 index 71b51aa606..0000000000 --- a/old_tests/support/fixtures/files_job.yml +++ /dev/null @@ -1,9 +0,0 @@ -fj1: - id_job: @REF:jobs:job1:id - id_file: @REF:files:file1:id - assign_date: NULL - t_delivery_date: NULL - t_a_delivery_date: NULL - id_segment_start: NULL - id_segment_end: NULL - status_analisys: NEW \ No newline at end of file diff --git a/old_tests/support/fixtures/job_metadata.yml b/old_tests/support/fixtures/job_metadata.yml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/old_tests/support/fixtures/jobs.yml b/old_tests/support/fixtures/jobs.yml deleted file mode 100644 index ccabc717e7..0000000000 --- a/old_tests/support/fixtures/jobs.yml +++ /dev/null @@ -1,42 +0,0 @@ -job1: - id: @EVER_INCREMENT - password: a90acf203402 - id_project: @REF:projects:simple_project:id - job_first_segment: 4 - job_last_segment: 1262 - id_translator: - tm_keys: "[]" - job_type: NULL - source: en-GB - target: es-ES - total_time_to_edit: 157967 - only_private_tm: 0 - avg_post_editing_effort: 9700 - id_job_to_revise: NULL - last_opened_segment: 64 - id_tms: 1 - id_mt_engine: 1 - create_date: 2017-03-23 15:05:57 - last_update: 2017-04-04 09:55:19 - disabled: 0 - owner: foo@example.org - status_owner: active - status_translator: NULL - status: active - completed: '' - new_words: 0.00 - draft_words: 0.00 - translated_words: 21751.00 - approved_words: 407.00 - rejected_words: 147.00 - subject: general - payable_rates: '{"NO_MATCH":100,"50%-74%":100,"75%-84%":60,"85%-94%":60,"95%-99%":60,"100%":30,"100%_PUBLIC":30,"REPETITIONS":30,"INTERNAL":60,"MT":80}' - total_raw_wc: 1 - approved2_words: 0 - new_raw_words: 0 - draft_raw_words: 0 - translated_raw_words: 0 - approved_raw_words: 0 - approved2_raw_words: 0 - rejected_raw_words: 0 - diff --git a/old_tests/support/fixtures/project_metadata.yml b/old_tests/support/fixtures/project_metadata.yml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/old_tests/support/fixtures/projects.yml b/old_tests/support/fixtures/projects.yml deleted file mode 100644 index 31ab05bad0..0000000000 --- a/old_tests/support/fixtures/projects.yml +++ /dev/null @@ -1,18 +0,0 @@ -simple_project: - id: @EVER_INCREMENT - password: 441ad0a84b52 - id_customer: foo@example.org - name: testXLif.xlf - create_date: 2017-03-23 15:05:53 - id_engine_tm: NULL - id_engine_mt: NULL - status_analysis: DONE - fast_analysis_wc: 0.00 - tm_analysis_wc: 0.00 - standard_analysis_wc: 22305.00 - remote_ip_address: 172.17.0.1 - instance_id: 0 - pretranslate_100: 0 - id_qa_model: NULL - id_team: 32786 - id_assignee: 18052 \ No newline at end of file diff --git a/old_tests/support/fixtures/qa_categories.yml b/old_tests/support/fixtures/qa_categories.yml deleted file mode 100644 index c6c3d51100..0000000000 --- a/old_tests/support/fixtures/qa_categories.yml +++ /dev/null @@ -1,39 +0,0 @@ -qa_cat1: - id: NULL - id_model: @REF:qa_models:qa_model_1:id - label: Style (readability, consistent style and tone) - id_parent: NULL - severities: '[{"label":"Enhancement","dqf_id":1,"penalty":0},{"label":"Error","dqf_id":2,"penalty":1},{"label":"Error 2","dqf_id":3,"penalty":3},{"label":"Error 3","dqf_id":4,"penalty":10}]' - options: '{"dqf_id":4}' - -qa_cat2: - id: NULL - id_model: @REF:qa_models:qa_model_1:id - label: Language quality (grammar, punctuation, spelling) - id_parent: NULL - severities: '[{"label":"Enhancement","dqf_id":1,"penalty":0},{"label":"Error","dqf_id":2,"penalty":1},{"label":"Error 2","dqf_id":3,"penalty":3},{"label":"Error 3","dqf_id":4,"penalty":10}]' - options: '{"dqf_id":2}' - -qa_cat3: - id: NULL - id_model: @REF:qa_models:qa_model_1:id - label: Terminology and translation consistency - id_parent: NULL - severities: '[{"label":"Enhancement","dqf_id":1,"penalty":0},{"label":"Error","dqf_id":2,"penalty":1},{"label":"Error 2","dqf_id":3,"penalty":3},{"label":"Error 3","dqf_id":4,"penalty":10}]' - options: '{"dqf_id":3}' - -qa_cat4: - id: NULL - id_model: @REF:qa_models:qa_model_1:id - label: Translation errors (mistranslation, additions or omissions) - id_parent: NULL - severities: '[{"label":"Enhancement","dqf_id":1,"penalty":0},{"label":"Error","dqf_id":2,"penalty":1},{"label":"Error 2","dqf_id":3,"penalty":3},{"label":"Error 3","dqf_id":4,"penalty":10}]' - options: '{"dqf_id":1}' - -qa_cat5: - id: NULL - id_model: @REF:qa_models:qa_model_1:id - label: Tag issues (mismatches, whitespaces) - id_parent: NULL - severities: '[{"label":"Enhancement","dqf_id":1,"penalty":0},{"label":"Error","dqf_id":2,"penalty":1},{"label":"Error 2","dqf_id":3,"penalty":3},{"label":"Error 3","dqf_id":4,"penalty":10}]' - options: '{"dqf_id":5}' diff --git a/old_tests/support/fixtures/qa_chunk_reviews.yml b/old_tests/support/fixtures/qa_chunk_reviews.yml deleted file mode 100644 index 5434f62587..0000000000 --- a/old_tests/support/fixtures/qa_chunk_reviews.yml +++ /dev/null @@ -1,16 +0,0 @@ -cr1: - id: NULL - id_project: @REF:projects:simple_project:id - id_job: @REF:jobs:job1:id - password: @REF:jobs:job1:password - review_password: 05023cf84288 - penalty_points: NULL - num_errors: 0 - is_pass: 0 - force_pass_at: NULL - reviewed_words_count: 0 - undo_data: NULL - advancement_wc: 0 - total_tte: 0 - avg_pee: 0 - source_page: 1 diff --git a/old_tests/support/fixtures/qa_models.yml b/old_tests/support/fixtures/qa_models.yml deleted file mode 100644 index eda34eb9df..0000000000 --- a/old_tests/support/fixtures/qa_models.yml +++ /dev/null @@ -1,7 +0,0 @@ -qa_model_1: - id: @EVER_INCREMENT - uid: NULL - create_date: 2017-06-09 16:08:16 - label: MateCat default - pass_type: points_per_thousand - pass_options: '{"limit":20}' diff --git a/old_tests/support/fixtures/segment_translation_versions.yml b/old_tests/support/fixtures/segment_translation_versions.yml deleted file mode 100644 index fb595b2a06..0000000000 --- a/old_tests/support/fixtures/segment_translation_versions.yml +++ /dev/null @@ -1,32 +0,0 @@ -stv1: - id: @EVER_INCREMENT - id_segment: @REF:segments:segment1:id - id_job: @REF:jobs:job1:id - translation: Mondo, ciao - version_number: 0 - creation_date: 2017-07-12 13:00:00 - propagated_from: NULL - time_to_edit: 2345 - is_review: 0 - -stv2: - id: @EVER_INCREMENT - id_segment: @REF:segments:segment1:id - id_job: @REF:jobs:job1:id - translation: Mondo ciao - version_number: 1 - creation_date: 2017-07-12 13:00:10 - propagated_from: NULL - time_to_edit: 2345 - is_review: 0 - -stv3: - id: @EVER_INCREMENT - id_segment: @REF:segments:segment1:id - id_job: @REF:jobs:job1:id - translation: Ciao... mondo - version_number: 2 - creation_date: 2017-07-12 13:00:20 - propagated_from: NULL - time_to_edit: 2345 - is_review: 0 diff --git a/old_tests/support/fixtures/segment_translations.yml b/old_tests/support/fixtures/segment_translations.yml deleted file mode 100644 index 84fbeb48e0..0000000000 --- a/old_tests/support/fixtures/segment_translations.yml +++ /dev/null @@ -1,103 +0,0 @@ -st1: - id_segment: @REF:segments:segment1:id - id_job: @REF:jobs:job1:id - segment_hash: f88037cf8f5d27f475cee79c603cecae - autopropagated_from: NULL - status: TRANSLATED - translation: Ciao Ciao mondo 4WD & ampolla %{variable}% - translation_date: NULL - time_to_edit: 0 - match_type: NO_MATCH - context_hash: NULL - eq_word_count: 3.00 - standard_word_count: 3.00 - suggestions_array: NULL - suggestion: NULL - suggestion_match: NULL - suggestion_source: NULL - suggestion_position: NULL - mt_qe: 0.00000000000000 - tm_analysis_status: UNDONE - locked: 0 - warning: 0 - serialized_errors_list: NULL - version_number: 0 - edit_distance: NULL - -st2: - id_segment: @REF:segments:segment2:id - id_job: @REF:jobs:job1:id - segment_hash: 3e25960a79dbc69b674cd4ec67a72c62 - autopropagated_from: NULL - status: TRANSLATED - translation: Ciao mondo - translation_date: NULL - time_to_edit: 0 - match_type: 95%-99% - context_hash: NULL - eq_word_count: 1.20 - standard_word_count: 1.20 - suggestions_array: NULL - suggestion: NULL - suggestion_match: NULL - suggestion_source: NULL - suggestion_position: NULL - mt_qe: 0.00000000000000 - tm_analysis_status: UNDONE - locked: 0 - warning: 0 - serialized_errors_list: NULL - version_number: 0 - edit_distance: NULL - -st3: - id_segment: @REF:segments:segment3:id - id_job: @REF:jobs:job1:id - segment_hash: 37d2a389ba71f6de1df030220703785d - autopropagated_from: NULL - status: TRANSLATED - translation: Anche questa unità ha un "commento"; - translation_date: NULL - time_to_edit: 0 - match_type: NO_MATCH - context_hash: NULL - eq_word_count: 6.00 - standard_word_count: 6.00 - suggestions_array: NULL - suggestion: NULL - suggestion_match: NULL - suggestion_source: NULL - suggestion_position: NULL - mt_qe: 0.00000000000000 - tm_analysis_status: UNDONE - locked: 0 - warning: 0 - serialized_errors_list: NULL - version_number: 0 - edit_distance: NULL - -st4: - id_segment: @REF:segments:segment4:id - id_job: @REF:jobs:job1:id - segment_hash: 3e25960a79dbc69b674cd4ec67a72c62 - autopropagated_from: NULL - status: TRANSLATED - translation: Ciao mondo - translation_date: NULL - time_to_edit: 0 - match_type: REPETITIONS - context_hash: NULL - eq_word_count: 0.60 - standard_word_count: 0.60 - suggestions_array: NULL - suggestion: NULL - suggestion_match: NULL - suggestion_source: NULL - suggestion_position: NULL - mt_qe: 0.00000000000000 - tm_analysis_status: UNDONE - locked: 0 - warning: 0 - serialized_errors_list: NULL - version_number: 0 - edit_distance: NULL diff --git a/old_tests/support/fixtures/segments.yml b/old_tests/support/fixtures/segments.yml deleted file mode 100644 index b4e425547a..0000000000 --- a/old_tests/support/fixtures/segments.yml +++ /dev/null @@ -1,59 +0,0 @@ -segment1: - id: 1 - id_file: @REF:files:file1:id - id_file_part: NULL - internal_id: 251971551069 - xliff_mrk_id: - xliff_ext_prec_tags: - xliff_mrk_ext_prec_tags: - segment: Hello Hello world 4WD & ampoule %{variable}% - segment_hash: f88037cf8f5d27f475cee79c603cecae - xliff_mrk_ext_succ_tags: - xliff_ext_succ_tags: - raw_word_count: 3.00 - show_in_cattool: 1 - -segment2: - id: 2 - id_file: @REF:files:file1:id - id_file_part: NULL - internal_id: 251971551065 - xliff_mrk_id: - xliff_ext_prec_tags: - xliff_mrk_ext_prec_tags: - segment: Hello world - segment_hash: 3e25960a79dbc69b674cd4ec67a72c62 - xliff_mrk_ext_succ_tags: - xliff_ext_succ_tags: - raw_word_count: 2.00 - show_in_cattool: 1 - -segment3: - id: 3 - id_file: @REF:files:file1:id - id_file_part: NULL - internal_id: 251971551066 - xliff_mrk_id: - xliff_ext_prec_tags: - xliff_mrk_ext_prec_tags: - segment: This unit has a "comment" too; - segment_hash: 37d2a389ba71f6de1df030220703785d - xliff_mrk_ext_succ_tags: - xliff_ext_succ_tags: - raw_word_count: 6.00 - show_in_cattool: 1 - -segment4: - id: 4 - id_file: @REF:files:file1:id - id_file_part: NULL - internal_id: 251971551067 - xliff_mrk_id: - xliff_ext_prec_tags: - xliff_mrk_ext_prec_tags: - segment: Hello world qarkullimit” & faturës. - segment_hash: 3e25960a79dbc69b674cd4ec67a72c62 - xliff_mrk_ext_succ_tags: - xliff_ext_succ_tags: - raw_word_count: 2.00 - show_in_cattool: 1 diff --git a/old_tests/support/fixtures/user_metadata.yml b/old_tests/support/fixtures/user_metadata.yml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/old_tests/support/fixtures/users.yml b/old_tests/support/fixtures/users.yml deleted file mode 100644 index 6a1af09840..0000000000 --- a/old_tests/support/fixtures/users.yml +++ /dev/null @@ -1,13 +0,0 @@ -user1: - uid: @EVER_INCREMENT - email: fabrizio@translated.net - salt: foobar - pass: 1234abcd - create_date: 2017-05-29 17:46:56 - first_name: Fabrizio - last_name: Regini - oauth_access_token: - email_confirmed_at: NULL - new_pass: NULL - confirmation_token: NULL - confirmation_token_created_at: 2017-05-29 17:46:56 \ No newline at end of file diff --git a/old_tests/support/functions.php b/old_tests/support/functions.php deleted file mode 100644 index 78d0ace53f..0000000000 --- a/old_tests/support/functions.php +++ /dev/null @@ -1,324 +0,0 @@ -getSegments(); - - return $segments[ 0 ]; -} - - - -function test_file_path( $file ) { - return realpath( TEST_DIR . '/support/files/' . $file ); -} - -function integrationSetChunkAsComplete( $options ) { - $test = new CurlTest(); - - if ( array_key_exists( 'headers', $options ) ) { - $test->headers = $options[ 'headers' ]; - } - - if ( array_key_exists( 'referer', $options ) ) { - $test->referer = $options[ 'referer' ]; - } - - $test->path = '?action=Features_ProjectCompletion_SetChunkCompleted'; - $test->method = 'POST'; - $test->params = [ - 'id_job' => $options[ 'params' ][ 'id_job' ], - 'password' => $options[ 'params' ][ 'password' ] - ]; - - $response = $test->getResponse(); - - if ( !in_array( (int)$response[ 'code' ], [ 200, 201 ] ) ) { - throw new Exception( "invalid response code " . $response[ 'code' ] ); - } - - return json_decode( $response[ 'body' ] ); -} - -function do_file_conversion( $params ) { - $upload_session = $params[ 'upload_session' ]; - unset( $params[ 'upload_session' ] ); - - $curlTest = new CurlTest(); - - $curlTest->path = '/index.php?action=convertFile'; - $curlTest->method = 'POST'; - $curlTest->params = $params; - $curlTest->cookies[] = [ 'upload_session', $upload_session ]; - - $conversionResponse = $curlTest->getResponse(); - - return $conversionResponse; -} - -function prepare_file_in_upload_folder( $path, $upload_session ) { - $destDir = INIT::$UPLOAD_REPOSITORY . DIRECTORY_SEPARATOR . $upload_session . DIRECTORY_SEPARATOR; - if ( !is_dir( $destDir ) ) { - mkdir( $destDir ); - } - $dest = $destDir . basename( $path ); - copy( $path, $dest ); -} - -function get_sessid_for_user( Users_UserStruct $user ) { - - list( $new_cookie_data, $new_expire_date ) = AuthCookie::generateSignedAuthCookie( - $user->email, $user->uid - ); - $cookie = [ - INIT::$AUTHCOOKIENAME, $new_cookie_data, $new_expire_date, '/' - ]; - - $sessidCurl = new CurlTest(); - $sessidCurl->cookies = [ $cookie ]; - $sessidCurl->path = '/'; - $sessidCurl->run(); - $cookies = $sessidCurl->getCookies(); - - return $cookies[ 'PHPSESSID' ]; -} - -function createProjectWithUIParams( $params ) { - $files = $params[ 'files' ]; - - $cookies = isset( $params[ 'cookies' ] ) ? $params[ 'cookies' ] : []; - - if ( isset( $params[ 'upload_session' ] ) ) { - Log::doJsonLog( "DEPRECATION: passing upload_session as param is deprecated, pass it inside a `cookies` array instead" ); - $upload_session = $params[ 'upload_session' ]; - unset( $params[ 'upload_session' ] ); - - $cookies[] = [ 'upload_session', $upload_session ]; - } - - unset( $params[ 'files' ] ); - unset( $params[ 'cookies' ] ); - - $curlTest = new CurlTest(); - - $curlTest->path = '/index.php?action=createProject'; - $curlTest->params = $params; - - $curlTest->cookies = $cookies; - $curlTest->files = $files; - - $response = $curlTest->getResponse(); - - return $response; -} - -/** - * Creates a project via API call - * - * @param array $options - * - * @return mixed - */ -function integrationCreateTestProject( $options = [] ) { - $test = new CurlTest(); - - $test->method = 'POST'; - $test->path = '/api/new'; - - if ( array_key_exists( 'headers', $options ) ) { - $test->headers = $options[ 'headers' ]; - } - - if ( array_key_exists( 'path', $options ) ) { - $test->path = $options[ 'path' ]; - } - - $test->params = [ - 'project_name' => 'foo', - 'target_lang' => 'it-IT', - 'source_lang' => 'en-US' - ]; - - if ( array_key_exists( 'params', $options ) ) { - $test->params = array_merge( $test->params, $options[ 'params' ] ); - } - - if ( array_key_exists( 'files', $options ) ) { - $test->files = $options[ 'files' ]; - } else { - $test->files[] = test_file_path( 'xliff/amex-test.docx.xlf' ); - } - - $response = $test->getResponse(); - - return json_decode( $response[ 'body' ] ); -} - -function splitJob( $params, $options = [] ) { - $test = new CurlTest(); - - if ( array_key_exists( 'headers', $options ) ) { - $test->headers = $options[ 'headers' ]; - } - - $test->path = '?action=splitJob'; - $test->method = 'POST'; - $test->params = [ - 'job_id' => $params[ 'id_job' ], - 'project_id' => $params[ 'id_project' ], - 'project_pass' => $params[ 'project_pass' ], - 'exec' => 'apply', - 'job_pass' => $params[ 'job_pass' ], - 'num_split' => $params[ 'num_split' ], - 'split_values' => $params[ 'split_values' ] - ]; - - $response = $test->getResponse(); - - if ( !in_array( (int)$response[ 'code' ], [ 200, 201 ] ) ) { - throw new Exception( "invalid response code " . $response[ 'code' ] ); - } - - return json_decode( $response[ 'body' ] ); -} - -function mergeJob( $params, $options = [] ) { - $test = new CurlTest(); - - if ( array_key_exists( 'headers', $options ) ) { - $test->headers = $options[ 'headers' ]; - } - - $test->path = '?action=splitJob'; - $test->method = 'POST'; - $test->params = [ - 'job_id' => $params[ 'id_job' ], - 'project_id' => $params[ 'id_project' ], - 'exec' => 'merge', - 'project_pass' => $params[ 'project_pass' ], - ]; - - $response = $test->getResponse(); - - if ( !in_array( (int)$response[ 'code' ], [ 200, 201 ] ) ) { - throw new Exception( "invalid response code " . $response[ 'code' ] ); - } - - return json_decode( $response[ 'body' ] ); -} - - -function integrationSetSegmentsTranslated( $project_id ) { - $chunksDao = new Chunks_ChunkDao( Database::obtain() ); - $chunks = $chunksDao->getByProjectID( $project_id ); - - foreach ( $chunks as $chunk ) { - $segments = $chunk->getSegments(); - foreach ( $segments as $segment ) { - integrationSetTranslation( [ - 'id_segment' => $segment->id, - 'id_job' => $chunk->id, - 'password' => $chunk->password, - 'status' => 'translated' - ] ); - } - } - - return $chunks; -} - -function integrationSetTranslation( $options ) { - $default = [ - // 'id_segment' => 205, - // 'id_job' => 12, - // 'password' => '8ec640b5c874', - // 'status' => 'draft', - 'translation' => "simulated translation during tests", - 'id_translator' => false, - 'version' => time(), - 'propagate' => false, - 'status' => 'draft' - ]; - - $test = new CurlTest(); - $test->params = array_merge( $default, $options ); - $test->method = 'POST'; - $test->path = '?action=setTranslation'; - $response = $test->getResponse(); - - - if ( !in_array( (int)$response[ 'code' ], [ 200, 201 ] ) ) { - throw new Exception( "invalid response code " . $response[ 'code' ] ); - } - - $body = json_decode( $response[ 'body' ], true ); - if ( !empty( $body[ 'errors' ] ) ) { - throw new Exception( "Ajax error detected " . var_export( $body[ 'errors' ], true ) ); - } - - return $body; - - -} - -function sig_handler( $signo ) { - - echo "\n\033[41m" . str_pad( "Caught signal \033[1m$signo", 39, " ", STR_PAD_BOTH ) . "\033[0m\n"; - switch ( $signo ) { - case SIGHUP: - case SIGTERM: - case SIGINT: - // handle shutdown tasks - restoreDevelopmentConfigFile(); - exit; - break; - default: - // handle all other signals - } -} - -function setupSignalHandler() { - pcntl_signal( SIGTERM, "sig_handler" ); - pcntl_signal( SIGHUP, "sig_handler" ); - pcntl_signal( SIGINT, "sig_handler" ); - echo "\033[0;30;42m" . str_pad( "Signal handler installed.", 35, " ", STR_PAD_BOTH ) . "\033[0m\n"; -} - -function toggleChunkOptions( $options ) { - $test = new CurlTest(); - $test->params = $options[ 'features' ]; - $test->method = 'POST'; - $test->path = sprintf( - '/api/v2/jobs/%s/%s/options', - $options[ 'id_job' ], - $options[ 'job_pass' ] - ); - - $response = $test->getResponse(); - - if ( !in_array( (int)$response[ 'code' ], [ 200, 201 ] ) ) { - throw new Exception( "invalid response code " . $response[ 'code' ] ); - } - - $body = json_decode( $response[ 'body' ], true ); - - if ( !empty( $body[ 'errors' ] ) ) { - throw new Exception( "Ajax error detected " . var_export( $body[ 'errors' ], true ) ); - } - - return $body; -} diff --git a/old_tests/support/lib/CurlTest.php b/old_tests/support/lib/CurlTest.php deleted file mode 100644 index 0d0806641d..0000000000 --- a/old_tests/support/lib/CurlTest.php +++ /dev/null @@ -1,153 +0,0 @@ -params = array(); - - $this->path = @$options['path']; - $this->headers = @$options['headers']; - $this->files = @$options['files']; - $this->method = @$options['method']; - $this->referer = @$options['referer']; - - if ( array_key_exists('params', $options )) { - $this->params = $options['params'] ; - } - } - - function run() { - if ( $this->result !== null ) return $this->result ; - - $ch = curl_init(); - - $this->url = "http://" . $GLOBALS['TEST_URL_BASE'] . $this->path; - - if ( count($this->files) > 0 ) { - $this->method = 'POST' ; - - foreach($this->files as $key => $file) { - $this->params["upload_$key"] = curl_file_create($file); - } - } - - if ($this->method == 'POST') { - curl_setopt($ch, CURLOPT_POST, 1); - } - - if ( $this->method == 'PUT' ) { - curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT') ; - curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $this->params ) ) ; - } - - if ($this->method == 'POST' && empty($this->files)) { - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($this->params)); - } else if (! empty($this->files)) { - // If files are present pass an array in order to have cURL - // use a multipart form-data. - if ( $this->params ) { - curl_setopt($ch, CURLOPT_POSTFIELDS, $this->params); - } - } - - if ($this->method == 'GET' and $this->params) { - $this->url .= "?" . http_build_query( $this->params ); - } - - if ( $this->referer != null ) { - \Log::doJsonLog('referer: ' . $this->referer ); - curl_setopt($ch, CURLOPT_REFERER, $this->referer ) ; - } - - if ( $this->enable_xdebug ) { - $this->cookies[] = array( "XDEBUG_SESSION", "MATECAT_TEST" ); - } - - if ( !empty($this->cookies) ) { - $cookieString = "Cookie: "; - - foreach( $this->cookies as $cookie ) { - $cookieString .= $cookie[0] . '=' . $cookie[1]; - $cookieString .= ';' ; - } - - $this->headers[] = $cookieString ; - - } - - $this->setHeaders($ch) ; - - curl_setopt($ch, CURLOPT_URL, $this->url ); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_VERBOSE, 0); - curl_setopt($ch, CURLOPT_HEADER, 1); - - $response = curl_exec($ch); - - $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); - $this->response_header = substr($response, 0, $header_size); - $this->response_body = substr($response, $header_size); - $this->response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - - if ($response === false) { - $this->result = false; - - echo "URL $this->url \n" ; - echo "METHOD $this->method \n" ; - echo "CURL_ERROR " . curl_error($ch) . "\n"; - - } else { - $this->result = true; - } - - curl_close($ch); - return $this->result ; - } - - public function getCookies() { - preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $this->response_header, $matches); - $cookies = array(); - foreach($matches[1] as $item) { - parse_str($item, $cookie); - $cookies = array_merge($cookies, $cookie); - } - return $cookies ; - } - - public function getResponse() { - if ( $this->run() ) { - - return array( - 'header' => $this->response_header, - 'body' => $this->response_body, - 'code' => $this->response_code - ); - } - } - - private function setHeaders($ch) { - if (! empty($this->headers) ) { - curl_setopt( $ch, CURLOPT_HTTPHEADER, $this->headers ); - } - } -} diff --git a/old_tests/support/lib/Factory/ApiKey.php b/old_tests/support/lib/Factory/ApiKey.php deleted file mode 100644 index d519e81d46..0000000000 --- a/old_tests/support/lib/Factory/ApiKey.php +++ /dev/null @@ -1,24 +0,0 @@ - 1, - 'api_key' => md5(self::$unique_key), - 'api_secret' => 'api_secret', - 'enabled' => true - ), $values ); - - $dao = new ApiKeys_ApiKeyDao( Database::obtain() ); - $struct = new ApiKeys_ApiKeyStruct( $values ); - - return $dao->create( $struct ); - - - } -} diff --git a/old_tests/support/lib/Factory/Base.php b/old_tests/support/lib/Factory/Base.php deleted file mode 100644 index 542169b9d1..0000000000 --- a/old_tests/support/lib/Factory/Base.php +++ /dev/null @@ -1,5 +0,0 @@ - 1, - 'feature_code' => 'project_completion', - 'options' => '{}', - 'enabled' => true, - ), $values ); - - $dao = new OwnerFeatures_OwnerFeatureDao( Database::obtain() ); - $struct = new OwnerFeatures_OwnerFeatureStruct( $values ); - - return $dao->create( $struct ); - } -} diff --git a/old_tests/support/lib/Factory/User.php b/old_tests/support/lib/Factory/User.php deleted file mode 100644 index c0d0ade84e..0000000000 --- a/old_tests/support/lib/Factory/User.php +++ /dev/null @@ -1,38 +0,0 @@ -createUser( $userStruct ); - - $orgDao = new TeamDao(); - $orgDao->createUserTeam( $user, [ - 'type' => Constants_Teams::PERSONAL, - 'name' => 'personal' - ] ); - - return $user; - } - - public static function getNewUser( $values = [] ) { - - $values = array_merge( [ - 'email' => "test-email-" . uniqid( '', true ) . "@example.org", - 'salt' => '1234abcd', - 'pass' => '1234abcd', - 'first_name' => 'John', - 'last_name' => 'Connor', - 'api_key' => '1234abcd' - ], $values ); - - return new Users_UserStruct( $values ); - - } - -} diff --git a/old_tests/support/lib/FixturesLoader.php b/old_tests/support/lib/FixturesLoader.php deleted file mode 100644 index d6475f68fa..0000000000 --- a/old_tests/support/lib/FixturesLoader.php +++ /dev/null @@ -1,253 +0,0 @@ -fixtures_map = [] ; - - $this->loadUsers(); - $this->loadUserMetadata(); - $this->loadQaModels(); - $this->loadProjects(); - $this->loadProjectMetadata(); - $this->loadFiles(); - $this->loadJobs(); - $this->loadJobMetadata(); - $this->loadFilesJob(); - $this->loadSegments(); - $this->loadSegmentTranslations(); - $this->loadSegmentTranslationVersions(); - $this->loadQaChunkRevies(); - $this->loadQaCategories(); - } - - public function getFixtures() { - return $this->fixtures_map ; - } - - protected function loadUsers() { - $this->loadFromFile('users') ; - - foreach( $this->fixtures_map['users'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new Users_UserStruct( $record ) ; - Users_UserDao::insertStructWithAutoIncrements( $struct ) ; - } - } - - protected function loadUserMetadata() { - $this->loadFromFile('user_metadata') ; - - foreach( $this->fixtures_map['user_metadata'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new MetadataStruct( $record ) ; - MetadataDao::insertStruct( $struct ) ; - } - } - - protected function loadQaCategories() { - $this->loadFromFile('qa_categories') ; - - foreach( $this->fixtures_map['qa_categories'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new CategoryStruct( $record ) ; - CategoryDao::insertStruct( $struct ) ; - } - } - - protected function loadSegments() { - $this->loadFromFile('segments') ; - - foreach( $this->fixtures_map['segments'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new Segments_SegmentStruct( $record ) ; - Segments_SegmentDao::insertStructWithAutoIncrements( $struct ) ; - } - } - - protected function loadSegmentTranslations() { - $this->loadFromFile('segment_translations') ; - - foreach( $this->fixtures_map['segment_translations'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new Translations_SegmentTranslationStruct( $record ) ; - Translations_SegmentTranslationDao::insertStruct( $struct ) ; - } - } - - protected function loadSegmentTranslationVersions() { - $this->loadFromFile('segment_translation_versions') ; - - foreach( $this->fixtures_map['segment_translation_versions'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new TranslationVersionStruct( $record ) ; - $struct->creation_date = Utils::mysqlTimestamp( $record['creation_date'] ) ; - $insert = TranslationVersionDao::insertStruct( $struct ) ; - } - } - - protected function loadQaChunkRevies() { - $this->loadFromFile('qa_chunk_reviews') ; - - foreach( $this->fixtures_map['qa_chunk_reviews'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new ChunkReviewStruct( $record ) ; - ChunkReviewDao::insertStruct( $struct ) ; - } - } - - public function loadFilesJob() { - $this->loadFromFile('files_job') ; - - foreach( $this->fixtures_map['files_job'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new FilesJobStruct( $record ) ; - FilesJobDao::insertStruct( $struct ) ; - } - } - - public function loadFiles() { - $this->loadFromFile('files') ; - - foreach( $this->fixtures_map['files'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new Files_FileStruct( $record ) ; - Files_FileDao::insertStructWithAutoIncrements( $struct ) ; - } - } - - public function loadQaModels() { - $this->loadFromFile('qa_models') ; - - foreach( $this->fixtures_map['qa_models'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new ModelStruct( $record ) ; - ModelDao::insertStructWithAutoIncrements( $struct ) ; - } - } - - public function loadJobs() { - $this->loadFromFile('jobs') ; - - foreach( $this->fixtures_map['jobs'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new Jobs_JobStruct( $record ) ; - Jobs_JobDao::insertStructWithAutoIncrements( $struct ) ; - } - } - - public function loadProjects() { - $this->loadFromFile('projects') ; - - foreach( $this->fixtures_map['projects'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new Projects_ProjectStruct( $record ) ; - Projects_ProjectDao::insertStructWithAutoIncrements( $struct ) ; - } - } - - - public function loadProjectMetadata() { - $this->loadFromFile('project_metadata') ; - - foreach( $this->fixtures_map['project_metadata'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new Projects_MetadataStruct( $record ) ; - Projects_MetadataDao::insertStructWithAutoIncrements( $struct ) ; - } - } - - public function loadJobMetadata() { - $this->loadFromFile('job_metadata') ; - - foreach( $this->fixtures_map['job_metadata'] as $name => &$record ) { - $this->replaceTokens( $record ) ; - $struct = new \Jobs\MetadataStruct( $record ) ; - \Jobs\MetadataDao::insertStructWithAutoIncrements( $struct ) ; - } - } - - public function loadFromFile( $file ) { - $data = Yaml::parse( file_get_contents( static::path( $file ) ) ) ; - $this->saveIntoMap( $file, $data ); - } - - static function path( $file ) { - return INIT::$ROOT . '/test/support/fixtures/' . $file . '.yml' ; - } - - protected function replaceTokens( &$record ) { - foreach( $record as $key => &$value ) { - - if ( $value === '@EVER_INCREMENT' ) { - // generate non conflicting integers using microtime and keep the number small - $maxInt = 2147483647 ; - $record[ $key ] = ( round( microtime( true ) * 1000 ) - 1497097000000 ) % $maxInt ; - Log::doJsonLog( [ $key, $record[ $key ] ] ); - } - - // Assign reference idenfiers - if ( !empty( $value ) && is_string( $value ) && strpos( $value, '@REF:' ) === 0 ) { - list( $_, $table, $name, $attr ) = explode(':', $value ) ; - - if ( - !isset( $this->fixtures_map [ $table ] ) || - !isset( $this->fixtures_map [ $table ] [ $name ] ) || - !isset( $this->fixtures_map [ $table ] [ $name ] [ $attr ] ) - ) { - throw new Exception("Missing reference in fixtures: $value " ) ; - } - - $record[ $key ] = $this->fixtures_map [ $table ] [ $name ] [ $attr ] ; - } - - if ( !empty( $value ) && is_string( $value ) && strpos( $value, '@CONFIG:' ) === 0 ) { - list( $_, $file, $namespace, $needle ) = explode(':', $value ) ; - $file_content = parse_ini_file(INIT::$ROOT . "/inc/$file.ini", true ); - - if ( false === $file_content ) { - throw new Exception("Missing configuration file in fixtures: $value " ) ; - } - - $record[ $key ] = $file_content[ $namespace ][ $needle ] ; - } - } - - return $record ; - } - - private function saveIntoMap( $type, $data ) { - - if ( !isset( $this->fixtures_map[ $type ] ) ) { - $this->fixtures_map[ $type ] = [] ; - } - - foreach( $data as $key => $value ) { - if ( isset( $this->fixtures_map[ $type ] [ $key ] ) ) { - throw new Exception('fixture with same name already exists ' . $key ); - } - - $this->fixtures_map[ $type ] [ $key ] = $value; - } - } -} \ No newline at end of file diff --git a/old_tests/support/lib/IntegrationTest.php b/old_tests/support/lib/IntegrationTest.php deleted file mode 100644 index bcc464f68e..0000000000 --- a/old_tests/support/lib/IntegrationTest.php +++ /dev/null @@ -1,61 +0,0 @@ -getConnection(); - foreach( $tables as $table ) { - $conn->exec("ALTER table $table AUTO_INCREMENT = " . time() ); - } - - $conn->exec(" UPDATE sequences SET id_segment = " . time() ); - } - - protected function prepareUserAndApiKey() { - $this->test_data->user = Factory_User::create(); - $this->test_data->api_key = Factory_ApiKey::create( array( - 'uid' => $this->test_data->user->uid, - ) ); - - $this->test_data->headers = array( - "X-MATECAT-KEY: {$this->test_data->api_key->api_key}", - "X-MATECAT-SECRET: {$this->test_data->api_key->api_secret}" - ); - } - - function getResponse() { - // This is deprecated , use curlTest instance in your tests instead - return $this->makeRequest(); - } - - function makeRequest() { - $curlTest = new CurlTest( array( - 'path' => $this->path, - 'headers' => $this->headers, - 'method' => $this->method, - 'params' => $this->params, - 'files' => $this->files - ) ); - - return $curlTest->getResponse(); - } - - function assertJSONResponse($expected) { - $response = $this->getResponse(); - - if ( $this->makeRequest() ) { - $this->assertEquals( json_encode($expected), $response['body'] ); - } - } - -} diff --git a/old_tests/support/lib/UnitTestInitializer.php b/old_tests/support/lib/UnitTestInitializer.php deleted file mode 100644 index 364f79f679..0000000000 --- a/old_tests/support/lib/UnitTestInitializer.php +++ /dev/null @@ -1,103 +0,0 @@ -con = $con; - - /** - * environment initialization - */ - $this->test_data = new stdClass(); - - $this->prepareUserAndApiKey(); - $this->project = integrationCreateTestProject(array( - 'headers' => $this->test_data->headers, - 'files' => array( - test_file_path('xliff/file-with-hello-world.xliff') - ), - 'params' => array( - 'target_lang' => 'fr-FR' - ) - ) - ); - } - - /** - * @param null $index - * @return mixed - * It returns the job in position of the index if specified, otherwise it returns the first job fetched from database - */ - public function getJob($index = NULL){ - $query="SELECT j.* FROM jobs AS j JOIN projects AS p ON p.id = id_project WHERE p.id={$this->project->id_project}"; - $jobs_array=$this->con->query($query)->fetchAll(PDO::FETCH_ASSOC); - - if (!$index){ - return $jobs_array['0']; - } - - return $jobs_array["{$index}"]; - } - - /** - * @return array - * It returns an array of segments of the project, if the job was split can be specified the index of the chunk wanted. - */ - public function getSegments(){ - - $job= $this->getJob(); - - $query="SELECT s.* FROM segments AS s WHERE s.id >= {$job['job_first_segment']} AND s.id <= {$job['job_last_segment']}"; - $segments_array = $this->con->query($query)->fetchAll(PDO::FETCH_ASSOC); - - return $segments_array; - } - - /** - * It returns all the segment translations of the indexed segment. - * @param int $index - * @return array - */ - public function getSegmentTranslations($index = NULL){ - - if (!$index){ - $index = 0; - } - - $segments = $this->getSegments(); - $query="SELECT st.* FROM segment_translations AS st WHERE st.id_segment={$segments["{$index}"]['id']}"; - $segmentTranslation=$this->con->query($query)->fetchAll(PDO::FETCH_ASSOC); - return $segmentTranslation; - } - - public function getProject(){ - $query="SELECT * FROM projects WHERE id={$this->project->id_project}"; - $wrapped_job = $this->con->query($query)->fetchAll(PDO::FETCH_ASSOC); - return $wrapped_job['0']; - } -} \ No newline at end of file diff --git a/old_tests/support/lib/Utils/ZipArchiveExtendedTest.php b/old_tests/support/lib/Utils/ZipArchiveExtendedTest.php deleted file mode 100644 index 642d8b60a4..0000000000 --- a/old_tests/support/lib/Utils/ZipArchiveExtendedTest.php +++ /dev/null @@ -1,7 +0,0 @@ -\|string, string\|null given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/App/SetTranslationController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:icuEnabled\(\) should return bool but returns string\|false\.$#' - identifier: return.type + message: '#^Property Controller\\API\\App\\SetTranslationController\:\:\$icuEnabled \(bool\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 path: lib/Controller/API/App/SetTranslationController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:icuEnabled\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Template type T of method Controller\\API\\App\\SetTranslationController\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 path: lib/Controller/API/App/SetTranslationController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:isRevision\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Template type T of method Controller\\API\\App\\SetTranslationController\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 path: lib/Controller/API/App/SetTranslationController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:setSubFilteringBehavior\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/SplitSegmentController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:translate\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\App\\SplitSegmentController\:\:split\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 9 - path: lib/Controller/API/App/SetTranslationController.php + count: 2 + path: lib/Controller/API/App/SplitSegmentController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:updateJobPEE\(\) has parameter \$new_translation with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\App\\SplitSegmentController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/SplitSegmentController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:updateJobPEE\(\) has parameter \$old_translation with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$id_job of static method Model\\Jobs\\ChunkDao\:\:getByIdAndPassword\(\) expects int, string given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php - - - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:updateJobPEE\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/SplitSegmentController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:validateTheRequest\(\) should return array\{id_job\: numeric\-string, password\: string, received_password\: string, id_segment\: string, time_to_edit\: int\|numeric\-string, id_translator\: string, translation\: string, segment\: Model\\Segments\\SegmentStruct\|null, \.\.\.\} but returns array\{id_job\: non\-falsy\-string, password\: non\-falsy\-string, received_password\: string\|false, id_segment\: non\-falsy\-string, time_to_edit\: 0\|string, id_translator\: string\|false, translation\: string\|false, segment\: Model\\Segments\\SegmentStruct\|null, \.\.\.\}\.$#' - identifier: return.type + message: '#^Parameter \#3 \$Filter of static method Utils\\Tools\\CatUtils\:\:parseSegmentSplit\(\) expects Matecat\\SubFiltering\\MateCatFilter, Matecat\\SubFiltering\\AbstractFilter given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/SplitSegmentController.php - - message: '#^Method Controller\\API\\App\\SetTranslationController\:\:validateTheRequest\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/App/SetTranslationController.php + message: '#^Variable \$Filter in PHPDoc tag @var does not match assigned variable \$metadata\.$#' + identifier: varTag.differentVariable + count: 1 + path: lib/Controller/API/App/SplitSegmentController.php - - message: '#^Offset ''locked'' might not exist on Model\\Translations\\SegmentTranslationStruct\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TMXFileController.php - - message: '#^Offset ''match_type'' might not exist on Model\\Translations\\SegmentTranslationStruct\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TMXFileController.php - - message: '#^Offset ''raw_word_count'' might not exist on Model\\Segments\\SegmentStruct\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Method Controller\\API\\App\\TMXFileController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TMXFileController.php - - message: '#^Offset ''segment'' might not exist on Model\\Segments\\SegmentStruct\|null\.$#' - identifier: offsetAccess.notFound - count: 4 - path: lib/Controller/API/App/SetTranslationController.php + message: '#^Parameter \#1 \$uuid of method Utils\\TMS\\TMSService\:\:tmxUploadStatus\(\) expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/API/App/TMXFileController.php - - message: '#^Offset ''segment_hash'' might not exist on Model\\Segments\\SegmentStruct\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TMXFileController.php - - message: '#^Offset ''segment_hash'' might not exist on Model\\Translations\\SegmentTranslationStruct\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:_checkForAdaptiveEngines\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^Offset ''split_chunk_lengths'' does not exist on array\{id_job\: numeric\-string, password\: string, received_password\: string, id_segment\: string, time_to_edit\: int\|numeric\-string, id_translator\: string, translation\: string, segment\: Model\\Segments\\SegmentStruct\|null, \.\.\.\}\.$#' - identifier: offsetAccess.notFound + message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:_checkForAdaptiveEngines\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^Offset ''split_num'' on array\{id_job\: numeric\-string, password\: string, received_password\: string, id_segment\: string, time_to_edit\: int\|numeric\-string, id_translator\: string, translation\: string, segment\: Model\\Segments\\SegmentStruct\|null, \.\.\.\} in empty\(\) does not exist\.$#' - identifier: empty.offset + message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:sortKeysInTheRightOrder\(\) has parameter \$jobKeyList with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^PHPDoc tag @var has invalid value \(\$project ProjectStruct\)\: Unexpected token "\$project", expected type at offset 32 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:sortKeysInTheRightOrder\(\) has parameter \$keys with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^PHPDoc tag @var has invalid value \(\$projectStruct ProjectStruct\)\: Unexpected token "\$projectStruct", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:sortKeysInTheRightOrder\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^Parameter \#1 \$characters_count of method Utils\\LQA\\QA\:\:setCharactersCount\(\) expects int\|null, string given\.$#' + message: '#^Parameter \#1 \$id of static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\) expects int, array\|int\|object\|string given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^Parameter \#1 \$featureSet of method Utils\\LQA\\QA\:\:setFeatureSet\(\) expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' + message: '#^Parameter \#1 \$string of function html_entity_decode expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^Parameter \#1 \$id_segment of static method Model\\Segments\\SegmentMetadataDao\:\:get\(\) expects int, string given\.$#' - identifier: argument.type + message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$class_load \(string\|null\) does not accept Utils\\Engines\\AbstractEngine\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^Parameter \#1 \$id_segment of static method Model\\Translations\\SegmentTranslationDao\:\:findBySegmentAndJob\(\) expects int, string given\.$#' - identifier: argument.type + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/TmKeyManagementController.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:isRevision\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:jobOwnerIsMe\(\) has parameter \$owner with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTMKeysArray\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#1 \$sourceValidator of static method Matecat\\ICU\\MessagePatternComparator\:\:fromValidators\(\) expects Matecat\\ICU\\MessagePatternValidator, Matecat\\ICU\\MessagePatternValidator\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#1 \$string of function strtoupper expects string, string\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/App/SetTranslationController.php + message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTheRequest\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#2 \$id_job of static method Model\\Translations\\SegmentTranslationDao\:\:findBySegmentAndJob\(\) expects int, string given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/App/SetTranslationController.php + message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTheRequest\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#2 \$is_revision of static method Utils\\Tools\\CatUtils\:\:addSegmentTranslation\(\) expects bool, bool\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTheRequest\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#2 \$old_translation of method Controller\\API\\App\\SetTranslationController\:\:evalSetContribution\(\) expects Model\\Translations\\SegmentTranslationStruct, Model\\Translations\\SegmentTranslationStruct\|null given\.$#' + message: '#^Parameter \#1 \$Json_clientKeys of static method Utils\\TmKeyManagement\\TmKeyManager\:\:mergeJsonKeys\(\) expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$tm_keys of method Controller\\API\\App\\UpdateJobKeysController\:\:validateTMKeysArray\(\) expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#3 \$sourceSegment of method Controller\\API\\App\\SetTranslationController\:\:sourceContainsIcu\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\App\\UpdateJobKeysController\:\:\$id_job \(int\) does not accept string\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Parameter \#4 \$id_segment of static method Plugins\\Features\\TranslationVersions\:\:getVersionHandlerNewInstance\(\) expects int\|null, string given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\App\\UpdateJobKeysController\:\:\$request_password \(string\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UpdateJobKeysController.php - - message: '#^Property Controller\\API\\App\\SetTranslationController\:\:\$VersionsHandler \(Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\|null\) does not accept Plugins\\Features\\TranslationVersions\\VersionHandlerInterface\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\App\\UserKeysController\:\:getKeyUsersInfo\(\) has parameter \$userMemoryKeys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Controller\\API\\App\\SetTranslationController\:\:\$filter \(Matecat\\SubFiltering\\MateCatFilter\) does not accept Matecat\\SubFiltering\\AbstractFilter\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\App\\UserKeysController\:\:getKeyUsersInfo\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Controller\\API\\App\\SetTranslationController\:\:\$icuEnabled \(bool\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\App\\UserKeysController\:\:getMemoryToUpdate\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Controller\\API\\App\\SetTranslationController\:\:\$id_job \(int\) does not accept string\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/App/SetTranslationController.php + message: '#^Method Controller\\API\\App\\UserKeysController\:\:getMemoryToUpdate\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Controller\\API\\App\\SetTranslationController\:\:\$request_password \(string\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\App\\UserKeysController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$id_job \(int\) does not accept string\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$id of static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\) expects int, array\|int\|object\|string given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$id_segment \(int\) does not accept string\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$memoryKey of method Controller\\API\\App\\UserKeysController\:\:removeKeyFromEngines\(\) expects Model\\TmKeyManagement\\MemoryKeyStruct, Model\\TmKeyManagement\\MemoryKeyStruct\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Model\\Translations\\SegmentTranslationStruct\:\:\$id_job \(int\) does not accept string\.$#' - identifier: assign.propertyType + message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Model\\Translations\\SegmentTranslationStruct\:\:\$id_segment \(int\) does not accept string\.$#' + message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Model\\Translations\\SegmentTranslationStruct\:\:\$suggestion_match \(string\|null\) does not accept int\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/App/SetTranslationController.php + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 1 + path: lib/Controller/API/App/UserKeysController.php - - message: '#^Property Model\\Translations\\SegmentTranslationStruct\:\:\$suggestion_match \(string\|null\) does not accept int\|string\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\App\\XliffToTargetConverterController\:\:convert\(\) throws checked exception Klein\\Exceptions\\ResponseAlreadySentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/XliffToTargetConverterController.php - - message: '#^Property Model\\Translations\\SegmentTranslationStruct\:\:\$suggestion_position \(int\|null\) does not accept int\|string\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$body of method Klein\\AbstractResponse\:\:body\(\) expects string\|null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/App/XliffToTargetConverterController.php - - message: '#^Property Model\\Translations\\SegmentTranslationStruct\:\:\$time_to_edit \(int\) does not accept int\|string\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\Commons\\Exceptions\\ExternalServiceException\:\:__construct\(\) has parameter \$code with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Exceptions/ExternalServiceException.php - - message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$fromRevision \(bool\) does not accept bool\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\Commons\\Exceptions\\ExternalServiceException\:\:__construct\(\) has parameter \$message with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Exceptions/ExternalServiceException.php - - message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$id_file \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\Commons\\Exceptions\\NotFoundException\:\:__construct\(\) has parameter \$code with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Exceptions/NotFoundException.php - - message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$id_job \(int\) does not accept string\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\Commons\\Exceptions\\NotFoundException\:\:__construct\(\) has parameter \$message with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Exceptions/NotFoundException.php - - message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$id_segment \(int\) does not accept string\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\Commons\\Exceptions\\UnprocessableException\:\:__construct\(\) has parameter \$code with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Exceptions/UnprocessableException.php - - message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$propagationRequest \(bool\) does not accept bool\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\Commons\\Exceptions\\UnprocessableException\:\:__construct\(\) has parameter \$message with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Exceptions/UnprocessableException.php - - message: '#^Result of && is always false\.$#' - identifier: booleanAnd.alwaysFalse + message: '#^Method Controller\\API\\Commons\\Validators\\Base\:\:__construct\(\) has parameter \$args with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Validators/Base.php - - message: '#^Right side of and is always true\.$#' - identifier: logicalAnd.rightAlwaysTrue + message: '#^Method Controller\\API\\Commons\\Validators\\Base\:\:onFailure\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Validators/Base.php - - message: '#^Strict comparison using \!\=\= between string\|false and null will always evaluate to true\.$#' - identifier: notIdentical.alwaysTrue + message: '#^Property Controller\\API\\Commons\\Validators\\Base\:\:\$_failureCallback \(Closure\|null\) does not accept callable\(\)\: mixed\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Validators/Base.php - - message: '#^Template type T of method Controller\\API\\App\\SetTranslationController\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Property Controller\\API\\Commons\\Validators\\Base\:\:\$_validationCallbacks \(array\\) does not accept non\-empty\-array\\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Validators/Base.php - - message: '#^Template type T of method Controller\\API\\App\\SetTranslationController\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Property Controller\\API\\Commons\\Validators\\Base\:\:\$args type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Validators/Base.php - - message: '#^Variable \$filter in PHPDoc tag @var does not match assigned variable \$metadata\.$#' - identifier: varTag.differentVariable - count: 1 - path: lib/Controller/API/App/SetTranslationController.php + message: '#^Method Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php - - message: '#^Variable \$version on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^Method Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:getChunk\(\) should return Model\\Jobs\\JobStruct but returns Model\\Jobs\\JobStruct\|null\.$#' + identifier: return.type count: 1 - path: lib/Controller/API/App/SetTranslationController.php + path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php - - message: '#^Call to function is_null\(\) with string\|false will always evaluate to false\.$#' - identifier: function.impossibleType + message: '#^Method Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:getChunkReview\(\) should return Model\\LQA\\ChunkReviewStruct but returns Model\\LQA\\ChunkReviewStruct\|null\.$#' + identifier: return.type count: 1 - path: lib/Controller/API/App/SplitSegmentController.php + path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php - - message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Property Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:\$id_job \(int\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SplitSegmentController.php + path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php - - message: '#^Method Controller\\API\\App\\SplitSegmentController\:\:split\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/App/SplitSegmentController.php + message: '#^Property Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:\$password \(string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php - - message: '#^Method Controller\\API\\App\\SplitSegmentController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:\$revision_number \(int\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/SplitSegmentController.php + path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php - - message: '#^Parameter \#1 \$id_job of static method Model\\Jobs\\ChunkDao\:\:getByIdAndPassword\(\) expects int, string given\.$#' + message: '#^Parameter \#2 \$uid of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/SplitSegmentController.php + path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php - - message: '#^Parameter \#3 \$Filter of static method Utils\\Tools\\CatUtils\:\:parseSegmentSplit\(\) expects Matecat\\SubFiltering\\MateCatFilter, Matecat\\SubFiltering\\AbstractFilter given\.$#' + message: '#^Parameter \#3 \$engineClass of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects class\-string\\|null, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/SplitSegmentController.php + path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php - - message: '#^Variable \$Filter in PHPDoc tag @var does not match assigned variable \$metadata\.$#' - identifier: varTag.differentVariable + message: '#^Property Controller\\API\\Commons\\Validators\\EngineOwnershipValidator\:\:\$engineClass \(string\|null\) is never assigned null so it can be removed from the property type\.$#' + identifier: property.unusedType count: 1 - path: lib/Controller/API/App/SplitSegmentController.php + path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php - - message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Property Controller\\API\\Commons\\Validators\\EngineOwnershipValidator\\:\:\$engine \(T of Utils\\Engines\\AbstractEngine\) does not accept Utils\\Engines\\AbstractEngine\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/TMXFileController.php + path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php - - message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\)$#' + identifier: argument.templateType count: 1 - path: lib/Controller/API/App/TMXFileController.php + path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php - - message: '#^Method Controller\\API\\App\\TMXFileController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$email of class Model\\FeaturesBase\\Hook\\Event\\Filter\\IsAnInternalUserEvent constructor expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/TMXFileController.php + path: lib/Controller/API/Commons/Validators/InternalUserValidator.php - - message: '#^Parameter \#1 \$uuid of method Utils\\TMS\\TMSService\:\:tmxUploadStatus\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$id_job of static method Model\\Jobs\\ChunkDao\:\:getByIdAndPassword\(\) expects int, string\|false\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/TMXFileController.php + path: lib/Controller/API/Commons/Validators/JobPasswordValidator.php - - message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#2 \$password of static method Model\\Jobs\\ChunkDao\:\:getByIdAndPassword\(\) expects string, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/TMXFileController.php + path: lib/Controller/API/Commons/Validators/JobPasswordValidator.php - - message: '#^Variable \$disable_upload_limit on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable - count: 1 - path: lib/Controller/API/App/TMXFileController.php + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectAccessTokenValidator\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/Commons/Validators/ProjectAccessTokenValidator.php - - message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:_checkForAdaptiveEngines\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Controller\\API\\Commons\\Validators\\ProjectAccessTokenValidator\:\:\$accessToken \(string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + path: lib/Controller/API/Commons/Validators/ProjectAccessTokenValidator.php - - message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:_checkForAdaptiveEngines\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Controller\\API\\Commons\\Validators\\ProjectAccessTokenValidator\:\:\$id_project \(int\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + path: lib/Controller/API/Commons/Validators/ProjectAccessTokenValidator.php - - message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:sortKeysInTheRightOrder\(\) has parameter \$jobKeyList with no type specified\.$#' - identifier: missingType.parameter + message: '#^Expression in empty\(\) is not falsy\.$#' + identifier: empty.expr count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + path: lib/Controller/API/Commons/Validators/ProjectAccessValidator.php - - message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:sortKeysInTheRightOrder\(\) has parameter \$keys with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$id of method Model\\Teams\\MembershipDao\:\:findTeamByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + path: lib/Controller/API/Commons/Validators/ProjectAccessValidator.php - - message: '#^Method Controller\\API\\App\\TmKeyManagementController\:\:sortKeysInTheRightOrder\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectPasswordValidator\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/Commons/Validators/ProjectPasswordValidator.php - - message: '#^Parameter \#1 \$id of static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\) expects int, array\|int\|object\|string given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectPasswordValidator\:\:getPassword\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + path: lib/Controller/API/Commons/Validators/ProjectPasswordValidator.php - - message: '#^Parameter \#1 \$string of function html_entity_decode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\Commons\\Validators\\ProjectPasswordValidator\:\:\$id_project \(int\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + path: lib/Controller/API/Commons/Validators/ProjectPasswordValidator.php - - message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$class_load \(string\|null\) does not accept Utils\\Engines\\AbstractEngine\.$#' + message: '#^Property Controller\\API\\Commons\\Validators\\ProjectPasswordValidator\:\:\$password \(string\|null\) does not accept string\|false\|null\.$#' identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + path: lib/Controller/API/Commons/Validators/ProjectPasswordValidator.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Cannot access property \$id_customer on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/App/TmKeyManagementController.php + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:isRevision\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method isFeatureEnabled\(\) on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:jobOwnerIsMe\(\) has parameter \$owner with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:getProject\(\) should return Model\\Projects\\ProjectStruct but returns Model\\Projects\\ProjectStruct\|null\.$#' + identifier: return.type count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTMKeysArray\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setFeature\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setFeature\(\) has parameter \$feature with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTheRequest\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setFeature\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php - - - - message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTheRequest\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Method Controller\\API\\App\\UpdateJobKeysController\:\:validateTheRequest\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setIdProject\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/App/UpdateJobKeysController.php + count: 1 + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Parameter \#1 \$Json_clientKeys of static method Utils\\TmKeyManagement\\TmKeyManager\:\:mergeJsonKeys\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setProject\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Parameter \#1 \$tm_keys of method Controller\\API\\App\\UpdateJobKeysController\:\:validateTMKeysArray\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^PHPDoc tag @return with type mixed is not subtype of native type void\.$#' + identifier: return.phpDocType count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/ProjectValidator.php - - message: '#^Property Controller\\API\\App\\UpdateJobKeysController\:\:\$id_job \(int\) does not accept string\.$#' - identifier: assign.propertyType + message: '#^Cannot access property \$source_page on Model\\LQA\\EntryStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/SegmentTranslationIssueValidator.php - - message: '#^Property Controller\\API\\App\\UpdateJobKeysController\:\:\$request_password \(string\) does not accept string\|false\.$#' + message: '#^Cannot access property \$source_page on Plugins\\Features\\TranslationEvents\\Model\\TranslationEventStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Controller/API/Commons/Validators/SegmentTranslationIssueValidator.php + + - + message: '#^Property Controller\\API\\Commons\\Validators\\SegmentTranslationIssueValidator\:\:\$translation \(Model\\Translations\\SegmentTranslationStruct\) does not accept Model\\Translations\\SegmentTranslationStruct\|null\.$#' identifier: assign.propertyType count: 1 - path: lib/Controller/API/App/UpdateJobKeysController.php + path: lib/Controller/API/Commons/Validators/SegmentTranslationIssueValidator.php - - message: '#^Method Controller\\API\\App\\UserKeysController\:\:getKeyUsersInfo\(\) has parameter \$userMemoryKeys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\API\\Commons\\Validators\\SegmentValidator\:\:_validate\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/App/UserKeysController.php + path: lib/Controller/API/Commons/Validators/SegmentValidator.php - - message: '#^Method Controller\\API\\App\\UserKeysController\:\:getKeyUsersInfo\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @return with type mixed is not subtype of native type void\.$#' + identifier: return.phpDocType count: 1 - path: lib/Controller/API/App/UserKeysController.php + path: lib/Controller/API/Commons/Validators/SegmentValidator.php - - message: '#^Method Controller\\API\\App\\UserKeysController\:\:getMemoryToUpdate\(\) has parameter \$key with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/UserKeysController.php + path: lib/Controller/API/Commons/Validators/WhitelistAccessValidator.php - - message: '#^Method Controller\\API\\App\\UserKeysController\:\:getMemoryToUpdate\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Call to an undefined method Controller\\Abstracts\\KleinController\:\:redirectToWantedUrl\(\)\.$#' + identifier: method.notFound + count: 1 + path: lib/Controller/API/Commons/ViewValidators/ViewLoginRedirectValidator.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$controller BaseKleinViewController\)\: Unexpected token "\$controller", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Controller/API/Commons/ViewValidators/ViewLoginRedirectValidator.php + + - + message: '#^Method Controller\\API\\GDrive\\GDriveController\:\:changeConversionParameters\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/App/UserKeysController.php + count: 1 + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Method Controller\\API\\App\\UserKeysController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\GDrive\\GDriveController\:\:doImport\(\) has parameter \$listOfIds with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/UserKeysController.php + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Parameter \#1 \$id of static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\) expects int, array\|int\|object\|string given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\GDrive\\GDriveController\:\:formatErrorMessage\(\) has parameter \$message with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/App/UserKeysController.php + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Parameter \#1 \$memoryKey of method Controller\\API\\App\\UserKeysController\:\:removeKeyFromEngines\(\) expects Model\\TmKeyManagement\\MemoryKeyStruct, Model\\TmKeyManagement\\MemoryKeyStruct\|null given\.$#' + message: '#^Parameter \#1 \$code of method Matecat\\Locales\\Languages\:\:validateLanguage\(\) expects string\|null, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/UserKeysController.php + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$segmentation_rule of static method Utils\\Constants\\Constants\:\:validateSegmentationRules\(\) expects string\|null, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/App/UserKeysController.php + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/App/UserKeysController.php + message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Parameter \#2 \$value of static method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/UserKeysController.php + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Method Controller\\API\\App\\XliffToTargetConverterController\:\:convert\(\) throws checked exception Klein\\Exceptions\\ResponseAlreadySentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#2 \$value of static method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/App/XliffToTargetConverterController.php + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Parameter \#1 \$body of method Klein\\AbstractResponse\:\:body\(\) expects string\|null, string\|false given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\GDrive\\GDriveController\:\:\$error type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/App/XliffToTargetConverterController.php + path: lib/Controller/API/GDrive/GDriveController.php - - message: '#^Method Controller\\API\\Commons\\Exceptions\\ExternalServiceException\:\:__construct\(\) has parameter \$code with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to method Controller\\API\\GDrive\\OAuthController\:\:__handleError\(\) on a separate line has no effect\.$#' + identifier: method.resultUnused count: 1 - path: lib/Controller/API/Commons/Exceptions/ExternalServiceException.php + path: lib/Controller/API/GDrive/OAuthController.php - - message: '#^Method Controller\\API\\Commons\\Exceptions\\ExternalServiceException\:\:__construct\(\) has parameter \$message with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Controller/API/Commons/Exceptions/ExternalServiceException.php + message: '#^Method Controller\\API\\GDrive\\OAuthController\:\:__handleCode\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/GDrive/OAuthController.php - - message: '#^Method Controller\\API\\Commons\\Exceptions\\NotFoundException\:\:__construct\(\) has parameter \$code with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\GDrive\\OAuthController\:\:__handleError\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/Commons/Exceptions/NotFoundException.php + path: lib/Controller/API/GDrive/OAuthController.php - - message: '#^Method Controller\\API\\Commons\\Exceptions\\NotFoundException\:\:__construct\(\) has parameter \$message with no type specified\.$#' + message: '#^Method Controller\\API\\GDrive\\OAuthController\:\:__handleError\(\) has parameter \$error with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Exceptions/NotFoundException.php + path: lib/Controller/API/GDrive/OAuthController.php - - message: '#^Method Controller\\API\\Commons\\Exceptions\\UnprocessableException\:\:__construct\(\) has parameter \$code with no type specified\.$#' - identifier: missingType.parameter + message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 2 + path: lib/Controller/API/V1/NewController.php + + - + message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/Commons/Exceptions/UnprocessableException.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Exceptions\\UnprocessableException\:\:__construct\(\) has parameter \$message with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot assign offset ''word_count_type'' to array\\|string\.$#' + identifier: offsetAssign.dimType count: 1 - path: lib/Controller/API/Commons/Exceptions/UnprocessableException.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\Base\:\:__construct\(\) has parameter \$args with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method dispatchFilter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Controller/API/V1/NewController.php + + - + message: '#^Cannot call method getArrayCopy\(\) on Model\\Xliff\\DTO\\XliffRulesModel\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/Commons/Validators/Base.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\Base\:\:onFailure\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method loadFromUserEmail\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/Commons/Validators/Base.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\Base\:\:\$_failureCallback \(Closure\|null\) does not accept callable\(\)\: mixed\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:appendFeaturesToProject\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/Base.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\Base\:\:\$_validationCallbacks \(array\\) does not accept non\-empty\-array\\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:buildProjectStructure\(\) has parameter \$filesFound with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/Base.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\Base\:\:\$args type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V1\\NewController\:\:buildProjectStructure\(\) has parameter \$request with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/Base.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V1\\NewController\:\:buildProjectStructure\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php + count: 1 + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:getChunk\(\) should return Model\\Jobs\\JobStruct but returns Model\\Jobs\\JobStruct\|null\.$#' - identifier: return.type - count: 1 - path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php + message: '#^Method Controller\\API\\V1\\NewController\:\:buildProjectStructure\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 21 + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:getChunkReview\(\) should return Model\\LQA\\ChunkReviewStruct but returns Model\\LQA\\ChunkReviewStruct\|null\.$#' - identifier: return.type + message: '#^Method Controller\\API\\V1\\NewController\:\:generateTargetEngineAssociation\(\) has parameter \$mt_engine with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:\$id_job \(int\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:generateTargetEngineAssociation\(\) has parameter \$target_langs with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:\$password \(string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:generateTargetEngineAssociation\(\) never returns null so it can be removed from the return type\.$#' + identifier: return.unusedType count: 1 - path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\ChunkPasswordValidator\:\:\$revision_number \(int\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:generateTargetEngineAssociation\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/ChunkPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#2 \$uid of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V1\\NewController\:\:getFileMetadata\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#3 \$engineClass of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects class\-string\\|null, string\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V1\\NewController\:\:getFileMetadata\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\EngineOwnershipValidator\:\:\$engineClass \(string\|null\) is never assigned null so it can be removed from the property type\.$#' - identifier: property.unusedType + message: '#^Method Controller\\API\\V1\\NewController\:\:getFilesList\(\) has parameter \$arFiles with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\EngineOwnershipValidator\\:\:\$engine \(T of Utils\\Engines\\AbstractEngine\) does not accept Utils\\Engines\\AbstractEngine\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:getFilesList\(\) has parameter \$uploadDir with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\)$#' - identifier: argument.templateType + message: '#^Method Controller\\API\\V1\\NewController\:\:getFilesList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/EngineOwnershipValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#1 \$id_job of static method Model\\Jobs\\ChunkDao\:\:getByIdAndPassword\(\) expects int, string\|false\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V1\\NewController\:\:parseTmKeyInput\(\) has parameter \$tmKeyString with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/JobPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#2 \$password of static method Model\\Jobs\\ChunkDao\:\:getByIdAndPassword\(\) expects string, string\|false\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V1\\NewController\:\:parseTmKeyInput\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/JobPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectAccessTokenValidator\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/Commons/Validators/ProjectAccessTokenValidator.php + message: '#^Method Controller\\API\\V1\\NewController\:\:sanitizeTmKeyArr\(\) has parameter \$elem with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\ProjectAccessTokenValidator\:\:\$accessToken \(string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:sanitizeTmKeyArr\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/ProjectAccessTokenValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\ProjectAccessTokenValidator\:\:\$id_project \(int\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:validateCharacterCounterMode\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/Commons/Validators/ProjectAccessTokenValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Expression in empty\(\) is not falsy\.$#' - identifier: empty.expr + message: '#^Method Controller\\API\\V1\\NewController\:\:validateDialectStrictParam\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/ProjectAccessValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#1 \$id of method Model\\Teams\\MembershipDao\:\:findTeamByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V1\\NewController\:\:validateEngines\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/ProjectAccessValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectPasswordValidator\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V1\\NewController\:\:validateLaraGlossaries\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/Commons/Validators/ProjectPasswordValidator.php - - - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectPasswordValidator\:\:getPassword\(\) should return string but returns string\|null\.$#' - identifier: return.type count: 1 - path: lib/Controller/API/Commons/Validators/ProjectPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\ProjectPasswordValidator\:\:\$id_project \(int\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:validateMMTGlossaries\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/Commons/Validators/ProjectPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\ProjectPasswordValidator\:\:\$password \(string\|null\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:validateMTQEParametersOrDefault\(\) should return Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams but returns Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\|null\.$#' + identifier: return.type count: 1 - path: lib/Controller/API/Commons/Validators/ProjectPasswordValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot access property \$id_customer on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Controller\\API\\V1\\NewController\:\:validateMTQEPayableRateBreakdownsOrDefault\(\) should return Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns but returns Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns\|null\.$#' + identifier: return.type count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot call method isFeatureEnabled\(\) on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Controller\\API\\V1\\NewController\:\:validateMetadataParam\(\) has parameter \$metadata with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:getProject\(\) should return Model\\Projects\\ProjectStruct but returns Model\\Projects\\ProjectStruct\|null\.$#' - identifier: return.type + message: '#^Method Controller\\API\\V1\\NewController\:\:validateMetadataParam\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setFeature\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Controller\\API\\V1\\NewController\:\:validatePayableRateTemplate\(\) has parameter \$payable_rate_template_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setFeature\(\) has parameter \$feature with no type specified\.$#' + message: '#^Method Controller\\API\\V1\\NewController\:\:validatePayableRateTemplate\(\) has parameter \$payable_rate_template_name with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setFeature\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V1\\NewController\:\:validatePublicTMPenalty\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setIdProject\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\API\\V1\\NewController\:\:validateSourceLang\(\) has parameter \$source_lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\ProjectValidator\:\:setProject\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Controller\\API\\V1\\NewController\:\:validateSubject\(\) has parameter \$subject with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type void\.$#' - identifier: return.phpDocType + message: '#^Method Controller\\API\\V1\\NewController\:\:validateTargetLangs\(\) has parameter \$target_lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/Commons/Validators/ProjectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot access property \$source_page on Model\\LQA\\EntryStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Controller\\API\\V1\\NewController\:\:validateTeam\(\) never returns null so it can be removed from the return type\.$#' + identifier: return.unusedType count: 1 - path: lib/Controller/API/Commons/Validators/SegmentTranslationIssueValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot access property \$source_page on Plugins\\Features\\TranslationEvents\\Model\\TranslationEventStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Controller\\API\\V1\\NewController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/SegmentTranslationIssueValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\Commons\\Validators\\SegmentTranslationIssueValidator\:\:\$translation \(Model\\Translations\\SegmentTranslationStruct\) does not accept Model\\Translations\\SegmentTranslationStruct\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V1\\NewController\:\:validateTmAndKeys\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/Commons/Validators/SegmentTranslationIssueValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\Commons\\Validators\\SegmentValidator\:\:_validate\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Offset ''extension'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/Commons/Validators/SegmentValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type void\.$#' - identifier: return.phpDocType + message: '#^Parameter \#1 \$character_counter_mode of method Controller\\API\\V1\\NewController\:\:validateCharacterCounterMode\(\) expects string\|null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/Commons/Validators/SegmentValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' + message: '#^Parameter \#1 \$hash of method Model\\FilesStorage\\IFilesStorage\:\:cacheZipArchive\(\) expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/Commons/Validators/WhitelistAccessValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Call to an undefined method Controller\\Abstracts\\KleinController\:\:redirectToWantedUrl\(\)\.$#' - identifier: method.notFound + message: '#^Parameter \#1 \$id_qa_model of method Controller\\API\\V1\\NewController\:\:validateQaModel\(\) expects null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/Commons/ViewValidators/ViewLoginRedirectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^PHPDoc tag @var has invalid value \(\$controller BaseKleinViewController\)\: Unexpected token "\$controller", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Parameter \#1 \$id_qa_model_template of method Controller\\API\\V1\\NewController\:\:validateQaModelTemplate\(\) expects null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/Commons/ViewValidators/ViewLoginRedirectValidator.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\GDrive\\GDriveController\:\:changeConversionParameters\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$id_team of method Controller\\API\\V1\\NewController\:\:validateTeam\(\) expects null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/GDriveController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\GDrive\\GDriveController\:\:doImport\(\) has parameter \$listOfIds with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$lara_glossaries of method Controller\\API\\V1\\NewController\:\:validateLaraGlossaries\(\) expects null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/GDriveController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\GDrive\\GDriveController\:\:formatErrorMessage\(\) has parameter \$message with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$mmt_glossaries of method Controller\\API\\V1\\NewController\:\:validateMMTGlossaries\(\) expects null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/GDriveController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#1 \$code of method Matecat\\Locales\\Languages\:\:validateLanguage\(\) expects string\|null, string\|false given\.$#' + message: '#^Parameter \#1 \$mt_qe_workflow_payable_rate_template_id of method Controller\\API\\V1\\NewController\:\:validateMTQEPayableRateBreakdownsOrDefault\(\) expects int\|null, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/GDriveController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#1 \$segmentation_rule of static method Utils\\Constants\\Constants\:\:validateSegmentationRules\(\) expects string\|null, string\|false given\.$#' + message: '#^Parameter \#1 \$mt_qe_workflow_template_id of method Controller\\API\\V1\\NewController\:\:validateMTQEParametersOrDefault\(\) expects int\|null, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/GDriveController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$object of method Utils\\Engines\\Validators\\DeepLEngineOptionsValidator\:\:validate\(\) expects Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject, Utils\\Validator\\Contracts\\ValidatorObject given\.$#' identifier: argument.type - count: 2 - path: lib/Controller/API/GDrive/GDriveController.php + count: 1 + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#2 \$value of static method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$object of method Utils\\Engines\\Validators\\IntentoEngineOptionsValidator\:\:validate\(\) expects Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject, Utils\\Validator\\Contracts\\ValidatorObject given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/GDriveController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Parameter \#2 \$value of static method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$object of method Utils\\Engines\\Validators\\LaraGlossaryValidator\:\:validate\(\) expects Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject, Utils\\Validator\\Contracts\\ValidatorObject given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/GDriveController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Property Controller\\API\\GDrive\\GDriveController\:\:\$error type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$object of method Utils\\Engines\\Validators\\MMTGlossaryValidator\:\:validate\(\) expects Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject, Utils\\Validator\\Contracts\\ValidatorObject given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/GDriveController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Call to method Controller\\API\\GDrive\\OAuthController\:\:__handleError\(\) on a separate line has no effect\.$#' - identifier: method.resultUnused + message: '#^Parameter \#1 \$private_tm_key of method Controller\\API\\V1\\NewController\:\:validateTmAndKeys\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/OAuthController.php - - - - message: '#^Method Controller\\API\\GDrive\\OAuthController\:\:__handleCode\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/GDrive/OAuthController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\GDrive\\OAuthController\:\:__handleError\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$segmentation_rule of static method Utils\\Constants\\Constants\:\:validateSegmentationRules\(\) expects string\|null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/OAuthController.php + path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\GDrive\\OAuthController\:\:__handleError\(\) has parameter \$error with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#2 \$filters_extraction_parameters_template_id of method Controller\\API\\V1\\NewController\:\:validateFiltersExtractionParameters\(\) expects null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/GDrive/OAuthController.php - - - - message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable - count: 2 path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#2 \$mt_engine of method Controller\\API\\V1\\NewController\:\:appendFeaturesToProject\(\) expects int, int\|string given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot assign offset ''word_count_type'' to array\\|string\.$#' - identifier: offsetAssign.dimType + message: '#^Parameter \#2 \$mt_engine of method Controller\\API\\V1\\NewController\:\:validateEngines\(\) expects int, int\|string given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject - count: 2 + message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' + identifier: argument.type + count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot call method getArrayCopy\(\) on Model\\Xliff\\DTO\\XliffRulesModel\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Cannot call method loadFromUserEmail\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#2 \$uid of static method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:appendFeaturesToProject\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$uid of static method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:buildProjectStructure\(\) has parameter \$filesFound with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:buildProjectStructure\(\) has parameter \$request with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:buildProjectStructure\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#2 \$uid of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:buildProjectStructure\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 21 + message: '#^Parameter \#2 \$xliff_parameters_template_id of method Controller\\API\\V1\\NewController\:\:validateXliffParameters\(\) expects null, string\|false given\.$#' + identifier: argument.type + count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:generateTargetEngineAssociation\(\) has parameter \$mt_engine with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#9 \$featureSet of class Model\\Conversion\\FilesConverter constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' + identifier: argument.type count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:generateTargetEngineAssociation\(\) has parameter \$target_langs with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$id_customer \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:generateTargetEngineAssociation\(\) never returns null so it can be removed from the return type\.$#' - identifier: return.unusedType + message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$only_private \(int\) does not accept bool\.$#' + identifier: assign.propertyType count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:generateTargetEngineAssociation\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$owner \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:getFileMetadata\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:getFileMetadata\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\)$#' + identifier: argument.templateType count: 1 path: lib/Controller/API/V1/NewController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:getFilesList\(\) has parameter \$arFiles with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access property \$id on Model\\Teams\\TeamStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:getFilesList\(\) has parameter \$uploadDir with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Cannot call method getProject\(\) on Model\\Jobs\\JobStruct\|null\.$#' + identifier: method.nonObject + count: 5 + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:getFilesList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) has parameter \$actual_pwd with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:parseTmKeyInput\(\) has parameter \$tmKeyString with no type specified\.$#' + message: '#^Method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) has parameter \$id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:parseTmKeyInput\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) has parameter \$new_password with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:sanitizeTmKeyArr\(\) has parameter \$elem with no type specified\.$#' + message: '#^Method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) has parameter \$res with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:sanitizeTmKeyArr\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$id of method Model\\Projects\\ProjectDao\:\:destroyCacheById\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateCharacterCounterMode\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$id of method Model\\Teams\\MembershipDao\:\:findTeamByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateDialectStrictParam\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$jStruct of method Model\\Jobs\\JobDao\:\:changePassword\(\) expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateEngines\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$job of class Model\\FeaturesBase\\Hook\\Event\\Run\\JobPasswordChangedEvent constructor expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateFiltersExtractionParameters\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' - identifier: throws.unusedType + message: '#^Parameter \#6 \$revision_number of method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) expects null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangePasswordController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateMTQEParametersOrDefault\(\) should return Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams but returns Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\|null\.$#' - identifier: return.type + message: '#^Cannot access property \$id on Model\\Teams\\TeamStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateMTQEPayableRateBreakdownsOrDefault\(\) should return Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns but returns Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns\|null\.$#' - identifier: return.type + message: '#^Cannot access property \$id_customer on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateMetadataParam\(\) has parameter \$metadata with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method dispatchRun\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateMetadataParam\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\API\\V2\\ChangeProjectNameController\:\:changeProjectName\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validatePayableRateTemplate\(\) has parameter \$payable_rate_template_id with no type specified\.$#' + message: '#^Method Controller\\API\\V2\\ChangeProjectNameController\:\:changeProjectName\(\) has parameter \$name with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validatePayableRateTemplate\(\) has parameter \$payable_rate_template_name with no type specified\.$#' + message: '#^Method Controller\\API\\V2\\ChangeProjectNameController\:\:changeProjectName\(\) has parameter \$password with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validatePublicTMPenalty\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$id of method Model\\Teams\\MembershipDao\:\:findTeamByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateQaModel\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' - identifier: throws.unusedType + message: '#^Parameter \#1 \$name of static method Utils\\Tools\\CatUtils\:\:sanitizeOrFallbackProjectName\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateQaModelTemplate\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' - identifier: throws.unusedType + message: '#^Parameter \#2 \$project of class Controller\\API\\Commons\\Validators\\ProjectAccessValidator constructor expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChangeProjectNameController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateSourceLang\(\) has parameter \$source_lang with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/ChunkTranslationVersionController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateSubject\(\) has parameter \$subject with no type specified\.$#' - identifier: missingType.parameter + message: '#^Binary operation "\." between ''/tmp/'' and array\|string results in an error\.$#' + identifier: binaryOp.invalid count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateTargetLangs\(\) has parameter \$target_lang with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot access property \$connected_service_id on Model\\RemoteFiles\\RemoteFileStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateTeam\(\) never returns null so it can be removed from the return type\.$#' - identifier: return.unusedType - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Cannot access property \$create_date on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access property \$id on Model\\RemoteFiles\\RemoteFileStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateTmAndKeys\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Method Controller\\API\\V1\\NewController\:\:validateXliffParameters\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' - identifier: throws.unusedType + message: '#^Method Controller\\API\\V2\\DownloadController\:\:_saveActivity\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Offset ''extension'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Method Controller\\API\\V2\\DownloadController\:\:_saveActivity\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$character_counter_mode of method Controller\\API\\V1\\NewController\:\:validateCharacterCounterMode\(\) expects string\|null, string\|false given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Method Controller\\API\\V2\\DownloadController\:\:downloadFile\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$hash of method Model\\FilesStorage\\IFilesStorage\:\:cacheZipArchive\(\) expects string, string\|false given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Method Controller\\API\\V2\\DownloadController\:\:downloadFile\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$id_qa_model of method Controller\\API\\V1\\NewController\:\:validateQaModel\(\) expects null, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\DownloadController\:\:getOutputContentsWithZipFiles\(\) has parameter \$output_content with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$id_qa_model_template of method Controller\\API\\V1\\NewController\:\:validateQaModelTemplate\(\) expects null, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\DownloadController\:\:getOutputContentsWithZipFiles\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$id_team of method Controller\\API\\V1\\NewController\:\:validateTeam\(\) expects null, string\|false given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Method Controller\\API\\V2\\DownloadController\:\:ifGlobalSightXliffRemoveTargetMarks\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$lara_glossaries of method Controller\\API\\V1\\NewController\:\:validateLaraGlossaries\(\) expects null, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\DownloadController\:\:startRemoteFileService\(\) has parameter \$output_content with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$mmt_glossaries of method Controller\\API\\V1\\NewController\:\:validateMMTGlossaries\(\) expects null, string\|false given\.$#' - identifier: argument.type + message: '#^Offset ''basename'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$mt_qe_workflow_payable_rate_template_id of method Controller\\API\\V1\\NewController\:\:validateMTQEPayableRateBreakdownsOrDefault\(\) expects int\|null, string\|null given\.$#' - identifier: argument.type + message: '#^Offset ''extension'' might not exist on array\{dirname\?\: string, basename\: string, extension\?\: string, filename\: string\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$mt_qe_workflow_template_id of method Controller\\API\\V1\\NewController\:\:validateMTQEParametersOrDefault\(\) expects int\|null, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Offset ''extension'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound + count: 4 + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$object of method Utils\\Engines\\Validators\\DeepLEngineOptionsValidator\:\:validate\(\) expects Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject, Utils\\Validator\\Contracts\\ValidatorObject given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php - - - - message: '#^Parameter \#1 \$object of method Utils\\Engines\\Validators\\IntentoEngineOptionsValidator\:\:validate\(\) expects Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject, Utils\\Validator\\Contracts\\ValidatorObject given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php - - - - message: '#^Parameter \#1 \$object of method Utils\\Engines\\Validators\\LaraGlossaryValidator\:\:validate\(\) expects Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject, Utils\\Validator\\Contracts\\ValidatorObject given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php - - - - message: '#^Parameter \#1 \$object of method Utils\\Engines\\Validators\\MMTGlossaryValidator\:\:validate\(\) expects Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject, Utils\\Validator\\Contracts\\ValidatorObject given\.$#' - identifier: argument.type + message: '#^Offset ''filename'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$private_tm_key of method Controller\\API\\V1\\NewController\:\:validateTmAndKeys\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Offset ''output_filename'' might not exist on array\{document_content\: string, output_filename\?\: mixed, out_xliff_name\: non\-falsy\-string, source\: mixed, target\: mixed\}\|array\{document_content\: string, output_filename\?\: mixed\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#1 \$segmentation_rule of static method Utils\\Constants\\Constants\:\:validateSegmentationRules\(\) expects string\|null, string\|false given\.$#' - identifier: argument.type + message: '#^Offset ''output_filename'' might not exist on array\{document_content\: string\|false, output_filename\?\: mixed, out_xliff_name\: non\-falsy\-string, source\: mixed, target\: mixed\}\|array\{document_content\: string\|false, output_filename\?\: mixed\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$filters_extraction_parameters_template_id of method Controller\\API\\V1\\NewController\:\:validateFiltersExtractionParameters\(\) expects null, string\|false given\.$#' + message: '#^Parameter \#1 \$featureSet of class Utils\\XliffReplacer\\XliffReplacerCallback constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$mt_engine of method Controller\\API\\V1\\NewController\:\:appendFeaturesToProject\(\) expects int, int\|string given\.$#' + message: '#^Parameter \#1 \$id_file of static method Model\\RemoteFiles\\RemoteFileDao\:\:getByFileAndJob\(\) expects int, int\|string given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$mt_engine of method Controller\\API\\V1\\NewController\:\:validateEngines\(\) expects int, int\|string given\.$#' + message: '#^Parameter \#1 \$remoteFile of method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:updateFile\(\) expects Model\\RemoteFiles\\RemoteFileStruct, Model\\RemoteFiles\\RemoteFileStruct\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$search of function str_replace expects array\\|string, array\ given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$string of function strtoupper expects string, array\|string given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#2 \$id_job of static method Model\\RemoteFiles\\RemoteFileDao\:\:getByFileAndJob\(\) expects int, int\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php + count: 2 + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V1/NewController.php + count: 2 + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\V2\\DownloadController\:\:\$downloadToken has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\V2\\DownloadController\:\:\$download_type \(string\|null\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$uid of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\V2\\DownloadController\:\:\$id_file \(int\|null\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#2 \$xliff_parameters_template_id of method Controller\\API\\V1\\NewController\:\:validateXliffParameters\(\) expects null, string\|false given\.$#' - identifier: argument.type + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$_user_provided_filename \(string\|null\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Parameter \#9 \$featureSet of class Model\\Conversion\\FilesConverter constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' - identifier: argument.type + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$id_job \(int\) does not accept string\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$id_customer \(string\) does not accept string\|null\.$#' + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$id_job \(int\) does not accept string\|false\|null\.$#' identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$only_private \(int\) does not accept bool\.$#' + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$password \(string\) does not accept string\|false\|null\.$#' identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$owner \(string\) does not accept string\|null\.$#' + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Variable \$jobData in empty\(\) always exists and is not falsy\.$#' + identifier: empty.variable count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadController.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\)$#' - identifier: argument.templateType + message: '#^Argument of an invalid type SplFileInfo supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$deepl_engine_type on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Method Controller\\API\\V2\\DownloadJobTMXController\:\:_saveActivity\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$deepl_formality on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^Method Controller\\API\\V2\\DownloadJobTMXController\:\:index\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$deepl_id_glossary on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^PHPDoc tag @var has invalid value \(\$tmx SplTempFileObject\)\: Unexpected token "\$tmx", expected type at offset 28 on line 2$#' + identifier: phpDoc.parseError + count: 2 + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$filters_extraction_parameters in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Parameter \#2 \$jPassword of method Utils\\TMS\\TMSService\:\:exportJobAsTMX\(\) expects string, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$filters_extraction_parameters_template_id in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Parameter \#2 \$password of static method Model\\Jobs\\ChunkDao\:\:getByIdAndPassword\(\) expects string, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$id_qa_model in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Property Controller\\API\\V2\\DownloadJobTMXController\:\:\$errors type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$id_qa_model_template in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Property Controller\\API\\V2\\DownloadJobTMXController\:\:\$jobID \(int\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$id_team in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadJobTMXController.php - - message: '#^Variable \$intento_provider on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^Cannot call method getChunk\(\) on Model\\LQA\\ChunkReviewStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$intento_routing on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^Method Controller\\API\\V2\\DownloadOriginalController\:\:index\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$lara_glossaries in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable - count: 1 - path: lib/Controller/API/V1/NewController.php + message: '#^Method Controller\\API\\V2\\DownloadOriginalController\:\:index\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$lara_style on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^Offset ''basename'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$mmt_activate_context_analyzer on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^Offset ''extension'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$mmt_glossaries in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$_user_provided_filename \(string\|null\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$mmt_ignore_glossary_case on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$id_job \(int\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$targets in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$password \(string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$tm_key in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$xliff_parameters in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V1/NewController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Variable \$xliff_parameters_template_id in empty\(\) always exists and is always falsy\.$#' + message: '#^Variable \$jobData in empty\(\) always exists and is not falsy\.$#' identifier: empty.variable count: 1 - path: lib/Controller/API/V1/NewController.php - - - - message: '#^Cannot access property \$id on Model\\Teams\\TeamStruct\|null\.$#' - identifier: property.nonObject - count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/DownloadOriginalController.php - - message: '#^Cannot call method getProject\(\) on Model\\Jobs\\JobStruct\|null\.$#' - identifier: method.nonObject - count: 5 - path: lib/Controller/API/V2/ChangePasswordController.php + message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 3 + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^If condition is always false\.$#' - identifier: if.alwaysFalse + message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:afterConstruct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) has parameter \$actual_pwd with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:extractCSV\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) has parameter \$id with no type specified\.$#' + message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:extractCSV\(\) has parameter \$stdResult with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) has parameter \$new_password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:setSuccessResponse\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) has parameter \$res with no type specified\.$#' + message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:validateCSVFile\(\) has parameter \$file with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Parameter \#1 \$id of method Model\\Projects\\ProjectDao\:\:destroyCacheById\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#3 \$userEmail of method Utils\\TMS\\TMSService\:\:glossaryExport\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Parameter \#1 \$id of method Model\\Teams\\MembershipDao\:\:findTeamByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\V2\\GlossaryFilesController\:\:\$downloadToken \(string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Parameter \#1 \$jStruct of method Model\\Jobs\\JobDao\:\:changePassword\(\) expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\V2\\GlossaryFilesController\:\:\$name \(string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Parameter \#6 \$revision_number of method Controller\\API\\V2\\ChangePasswordController\:\:changeThePassword\(\) expects null, string\|false given\.$#' - identifier: argument.type + message: '#^Property Controller\\API\\V2\\GlossaryFilesController\:\:\$tm_key \(string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V2/ChangePasswordController.php + path: lib/Controller/API/V2/GlossaryFilesController.php - - message: '#^Cannot access property \$id on Model\\Teams\\TeamStruct\|null\.$#' - identifier: property.nonObject + message: '#^Property Controller\\API\\V2\\JobMergeController\:\:\$jobList type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/JobMergeController.php - - message: '#^Cannot access property \$id_customer on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Property Controller\\API\\V2\\JobMergeController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/JobMergeController.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Method Controller\\API\\V2\\JobsTranslatorsController\:\:get\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/JobsTranslatorsController.php - - message: '#^Method Controller\\API\\V2\\ChangeProjectNameController\:\:changeProjectName\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$delivery_date of method Model\\Translators\\TranslatorsModel\:\:setDeliveryDate\(\) expects int\|string, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/JobsTranslatorsController.php - - message: '#^Method Controller\\API\\V2\\ChangeProjectNameController\:\:changeProjectName\(\) has parameter \$name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$job_owner_timezone of method Model\\Translators\\TranslatorsModel\:\:setJobOwnerTimezone\(\) expects int, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/JobsTranslatorsController.php - - message: '#^Method Controller\\API\\V2\\ChangeProjectNameController\:\:changeProjectName\(\) has parameter \$password with no type specified\.$#' + message: '#^Method Controller\\API\\V2\\MarkAllSegmentStatusController\:\:sanitizeSegmentIDs\(\) has parameter \$segment_list with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/MarkAllSegmentStatusController.php - - message: '#^Parameter \#1 \$id of method Model\\Teams\\MembershipDao\:\:findTeamByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\MarkAllSegmentStatusController\:\:sanitizeSegmentIDs\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/MarkAllSegmentStatusController.php - - message: '#^Parameter \#1 \$name of static method Utils\\Tools\\CatUtils\:\:sanitizeOrFallbackProjectName\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\MemoryKeysController\:\:listKeys\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/MemoryKeysController.php - - message: '#^Parameter \#2 \$project of class Controller\\API\\Commons\\Validators\\ProjectAccessValidator constructor expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' - identifier: argument.type + message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/MemoryKeysController.php - - message: '#^Variable \$name on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^If condition is always true\.$#' + identifier: if.alwaysTrue count: 1 - path: lib/Controller/API/V2/ChangeProjectNameController.php + path: lib/Controller/API/V2/ProjectCompletionStatus.php + + - + message: '#^Property Controller\\API\\V2\\ProjectCompletionStatus\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Controller/API/V2/ProjectCompletionStatus.php - message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' identifier: method.nonObject count: 1 - path: lib/Controller/API/V2/ChunkTranslationVersionController.php + path: lib/Controller/API/V2/ProjectsController.php - - message: '#^Binary operation "\." between ''/tmp/'' and array\|string results in an error\.$#' - identifier: binaryOp.invalid + message: '#^Method Controller\\API\\V2\\ProjectsController\:\:changeStatus\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/ProjectsController.php - - message: '#^Cannot access property \$connected_service_id on Model\\RemoteFiles\\RemoteFileStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Controller\\API\\V2\\ProjectsController\:\:deleteDueDate\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/ProjectsController.php - - message: '#^Cannot access property \$create_date on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Controller\\API\\V2\\ProjectsController\:\:updateDueDate\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Controller/API/V2/ProjectsController.php + + - + message: '#^Property Controller\\API\\V2\\ProjectsController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' + identifier: assign.propertyType count: 2 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/ProjectsController.php - - message: '#^Cannot access property \$id on Model\\RemoteFiles\\RemoteFileStruct\|null\.$#' - identifier: property.nonObject + message: '#^Cannot call method getChunk\(\) on Model\\LQA\\ChunkReviewStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/ReviewsController.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$id_project of static method Model\\LQA\\ChunkReviewDao\:\:destroyCacheByProjectId\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/ReviewsController.php + + - + message: '#^Property Controller\\API\\V2\\ReviewsController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Controller/API/V2/ReviewsController.php - message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' identifier: method.nonObject count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/ReviseTranslationIssuesController.php - - message: '#^Cannot call method run\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$uid\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Loose comparison using \=\= between true and 1 will always evaluate to true\.$#' - identifier: equal.alwaysTrue + message: '#^Cannot access property \$id on Model\\LQA\\EntryStruct\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Controller/API/V2/SegmentTranslationIssueController.php + + - + message: '#^Cannot access property \$id on Model\\Teams\\TeamStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Method Controller\\API\\V2\\DownloadController\:\:_saveActivity\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot access property \$source_page on Model\\LQA\\EntryStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Method Controller\\API\\V2\\DownloadController\:\:_saveActivity\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V2\\SegmentTranslationIssueController\:\:checkLoggedUserPermissions\(\) throws checked exception Controller\\API\\Commons\\Exceptions\\AuthorizationError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 2 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Method Controller\\API\\V2\\DownloadController\:\:downloadFile\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V2\\SegmentTranslationIssueController\:\:checkLoggedUserPermissions\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/V2/DownloadController.php + count: 3 + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Method Controller\\API\\V2\\DownloadController\:\:downloadFile\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V2\\SegmentTranslationIssueController\:\:create\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 6 - path: lib/Controller/API/V2/DownloadController.php + count: 1 + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Method Controller\\API\\V2\\DownloadController\:\:getOutputContentsWithZipFiles\(\) has parameter \$output_content with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\API\\V2\\SegmentTranslationIssueController\:\:update\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Method Controller\\API\\V2\\DownloadController\:\:getOutputContentsWithZipFiles\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$entry of method Controller\\API\\V2\\SegmentTranslationIssueController\:\:checkLoggedUserPermissions\(\) expects Model\\LQA\\EntryStruct, Model\\LQA\\EntryStruct\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Method Controller\\API\\V2\\DownloadController\:\:ifGlobalSightXliffRemoveTargetMarks\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/V2/DownloadController.php + message: '#^Parameter \#1 \$id_job of method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Method Controller\\API\\V2\\DownloadController\:\:startRemoteFileService\(\) has parameter \$output_content with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$id_team of method Model\\Teams\\MembershipDao\:\:getMemberListByTeamId\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Offset ''basename'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound + message: '#^Parameter \#2 \$password of method Controller\\API\\V2\\SegmentTranslationIssueController\:\:_getSegmentTranslationIssueModel\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Controller/API/V2/SegmentTranslationIssueController.php + + - + message: '#^Parameter \#2 \$password of method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Offset ''extension'' might not exist on array\{dirname\?\: string, basename\: string, extension\?\: string, filename\: string\}\.$#' - identifier: offsetAccess.notFound + message: '#^Parameter \#3 \$issue of method Controller\\API\\V2\\SegmentTranslationIssueController\:\:_getSegmentTranslationIssueModel\(\) expects Model\\LQA\\EntryStruct, Model\\LQA\\EntryStruct\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Offset ''extension'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound - count: 4 - path: lib/Controller/API/V2/DownloadController.php + message: '#^Variable \$jobStruct in empty\(\) always exists and is not falsy\.$#' + identifier: empty.variable + count: 2 + path: lib/Controller/API/V2/SegmentTranslationIssueController.php - - message: '#^Offset ''filename'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:checkSplit\(\) has parameter \$request with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Offset ''output_filename'' might not exist on array\{document_content\: mixed, output_filename\?\: mixed, out_xliff_name\: non\-falsy\-string, source\: mixed, target\: mixed\}\|array\{document_content\: mixed, output_filename\?\: mixed\}\.$#' - identifier: offsetAccess.notFound + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:checkSplit\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Parameter \#1 \$featureSet of class Utils\\XliffReplacer\\XliffReplacerCallback constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:checkSplitAccess\(\) has parameter \$jobList with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Parameter \#1 \$id_file of static method Model\\RemoteFiles\\RemoteFileDao\:\:getByFileAndJob\(\) expects int, int\|string given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:checkSplitAccess\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Parameter \#1 \$remoteFile of method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:updateFile\(\) expects Model\\RemoteFiles\\RemoteFileStruct, Model\\RemoteFiles\\RemoteFileStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:filterJobsById\(\) has parameter \$jobList with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Parameter \#1 \$search of function str_replace expects array\\|string, array\ given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:filterJobsById\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Parameter \#1 \$string of function strtoupper expects string, array\|string given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:getProjectData\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Parameter \#2 \$id_job of static method Model\\RemoteFiles\\RemoteFileDao\:\:getByFileAndJob\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V2/DownloadController.php + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:merge\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V2/DownloadController.php + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Property Controller\\API\\V2\\DownloadController\:\:\$downloadToken has no type specified\.$#' - identifier: missingType.property - count: 1 - path: lib/Controller/API/V2/DownloadController.php + message: '#^Method Controller\\API\\V2\\SplitJobController\:\:validateTheRequest\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Property Controller\\API\\V2\\DownloadController\:\:\$download_type \(string\|null\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/V2/DownloadController.php + message: '#^PHPDoc tag @var has invalid value \(\$data SplitMergeProjectData\)\: Unexpected token "\$data", expected type at offset 10 on line 1$#' + identifier: phpDoc.parseError + count: 2 + path: lib/Controller/API/V2/SplitJobController.php - - message: '#^Property Controller\\API\\V2\\DownloadController\:\:\$id_file \(int\|null\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Cannot call method getProject\(\) on Model\\Jobs\\JobStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/StatsController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$_user_provided_filename \(string\|null\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$jobOrChunk of static method Model\\WordCount\\WordCountStruct\:\:loadFromJob\(\) expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/StatsController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$id_job \(int\) does not accept string\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V2\\SupportedFilesController\:\:getFileList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/SupportedFilesController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$id_job \(int\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/V2/DownloadController.php + message: '#^Cannot access property \$id on Model\\Teams\\TeamStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Controller/API/V2/TeamMembersController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$password \(string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Cannot call method getMembers\(\) on Model\\Teams\\TeamStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/TeamMembersController.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V2\\TeamMembersController\:\:index\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/TeamMembersController.php - - message: '#^Variable \$jobData in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable + message: '#^Parameter \#1 \$emails of method Model\\Teams\\TeamModel\:\:addMemberEmails\(\) expects array, array\\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadController.php + path: lib/Controller/API/V2/TeamMembersController.php - - message: '#^Argument of an invalid type SplFileInfo supplied for foreach, only iterables are supported\.$#' + message: '#^Parameter \#1 \$struct of class Model\\Teams\\TeamModel constructor expects Model\\Teams\\TeamStruct, Model\\Teams\\TeamStruct\|null given\.$#' + identifier: argument.type + count: 3 + path: lib/Controller/API/V2/TeamMembersController.php + + - + message: '#^Argument of an invalid type array\\|false\|null supplied for foreach, only iterables are supported\.$#' identifier: foreach.nonIterable count: 1 - path: lib/Controller/API/V2/DownloadJobTMXController.php + path: lib/Controller/API/V2/TeamsController.php - - message: '#^Method Controller\\API\\V2\\DownloadJobTMXController\:\:_saveActivity\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/V2/DownloadJobTMXController.php + message: '#^Call to an undefined method Model\\DataAccess\\IDaoStruct\:\:getUser\(\)\.$#' + identifier: method.notFound + count: 1 + path: lib/Controller/API/V2/TeamsController.php - - message: '#^Method Controller\\API\\V2\\DownloadJobTMXController\:\:index\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V2\\TeamsController\:\:getTeamList\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/DownloadJobTMXController.php + path: lib/Controller/API/V2/TeamsController.php - - message: '#^PHPDoc tag @var has invalid value \(\$tmx SplTempFileObject\)\: Unexpected token "\$tmx", expected type at offset 28 on line 2$#' - identifier: phpDoc.parseError - count: 2 - path: lib/Controller/API/V2/DownloadJobTMXController.php + message: '#^Parameter \#1 \$email of method Model\\Teams\\TeamModel\:\:addMemberEmail\(\) expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/API/V2/TeamsController.php - - message: '#^Parameter \#2 \$jPassword of method Utils\\TMS\\TMSService\:\:exportJobAsTMX\(\) expects string, string\|false\|null given\.$#' + message: '#^Parameter \#1 \$id of method Model\\Teams\\MembershipDao\:\:findTeamByIdAndUser\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadJobTMXController.php + path: lib/Controller/API/V2/TeamsController.php - - message: '#^Parameter \#2 \$password of static method Model\\Jobs\\ChunkDao\:\:getByIdAndPassword\(\) expects string, string\|false\|null given\.$#' + message: '#^Parameter \#1 \$id_team of method Model\\Teams\\MembershipDao\:\:getMemberListByTeamId\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadJobTMXController.php + path: lib/Controller/API/V2/TeamsController.php - - message: '#^Property Controller\\API\\V2\\DownloadJobTMXController\:\:\$errors type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\Teams\\TeamStruct\:\:\$id \(int\|null\) does not accept int\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V2/DownloadJobTMXController.php + path: lib/Controller/API/V2/TeamsController.php - - message: '#^Property Controller\\API\\V2\\DownloadJobTMXController\:\:\$jobID \(int\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V2\\TeamsProjectsController\:\:_appendSingleProjectTeamValidators\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/DownloadJobTMXController.php + path: lib/Controller/API/V2/TeamsProjectsController.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' + message: '#^Property Controller\\API\\V2\\TeamsProjectsController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' identifier: assign.propertyType count: 1 - path: lib/Controller/API/V2/DownloadJobTMXController.php + path: lib/Controller/API/V2/TeamsProjectsController.php - - message: '#^Cannot call method getChunk\(\) on Model\\LQA\\ChunkReviewStruct\|null\.$#' - identifier: method.nonObject + message: '#^Cannot access property \$id on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + path: lib/Controller/API/V2/UrlsController.php - - message: '#^Method Controller\\API\\V2\\DownloadOriginalController\:\:index\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Cannot call method dispatchFilter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + path: lib/Controller/API/V2/UrlsController.php - - message: '#^Method Controller\\API\\V2\\DownloadOriginalController\:\:index\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Controller/API/V2/DownloadOriginalController.php + message: '#^Cannot call method getJobs\(\) on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Controller/API/V2/UrlsController.php - - message: '#^Offset ''basename'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound + message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + path: lib/Controller/API/V2/UrlsController.php - - message: '#^Offset ''extension'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound + message: '#^Parameter \#1 \$pid of method Model\\Projects\\ProjectDao\:\:getProjectData\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + path: lib/Controller/API/V2/UrlsController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$_user_provided_filename \(string\|null\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + message: '#^Method Controller\\API\\V2\\UserController\:\:edit\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/V2/UserController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$id_job \(int\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + message: '#^Method Controller\\API\\V2\\UserController\:\:setMetadata\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/V2/UserController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$password \(string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Controller/API/V2/UserController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$uid of method Model\\Users\\MetadataDao\:\:set\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + path: lib/Controller/API/V2/UserController.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#2 \$key of method Model\\Users\\MetadataDao\:\:set\(\) expects string, array\\|string given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + path: lib/Controller/API/V2/UserController.php - - message: '#^Variable \$jobData in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable + message: '#^Cannot access offset 0 on Model\\Segments\\SegmentMetadataStruct\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Controller/API/V2/DownloadOriginalController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable - count: 3 - path: lib/Controller/API/V2/GlossaryFilesController.php + message: '#^Cannot call method hget\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:afterConstruct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:extractCSV\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' + identifier: return.type + count: 2 + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:extractCSV\(\) has parameter \$stdResult with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:setSuccessResponse\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Method Controller\\API\\V2\\GlossaryFilesController\:\:validateCSVFile\(\) has parameter \$file with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:destroySegmentDisabledCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Parameter \#3 \$userEmail of method Utils\\TMS\\TMSService\:\:glossaryExport\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Property Controller\\API\\V2\\GlossaryFilesController\:\:\$downloadToken \(string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Property Controller\\API\\V2\\GlossaryFilesController\:\:\$name \(string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Template type T of method Controller\\API\\V3\\CancelRequestController\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Property Controller\\API\\V2\\GlossaryFilesController\:\:\$tm_key \(string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Template type T of method Controller\\API\\V3\\CancelRequestController\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Controller/API/V2/GlossaryFilesController.php + path: lib/Controller/API/V3/CancelRequestController.php - - message: '#^Property Controller\\API\\V2\\JobMergeController\:\:\$jobList type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToLayer2\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Controller/API/V2/JobMergeController.php + path: lib/Controller/API/V3/CountWordController.php - - message: '#^Property Controller\\API\\V2\\JobMergeController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' - identifier: assign.propertyType + message: '#^Cannot call method loadFromUserEmail\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V2/JobMergeController.php + path: lib/Controller/API/V3/CountWordController.php - - message: '#^Method Controller\\API\\V2\\JobsTranslatorsController\:\:get\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\CountWordController\:\:afterConstruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/JobsTranslatorsController.php + path: lib/Controller/API/V3/CountWordController.php - - message: '#^Parameter \#1 \$delivery_date of method Model\\Translators\\TranslatorsModel\:\:setDeliveryDate\(\) expects int\|string, string\|false\|null given\.$#' + message: '#^PHPDoc tag @var has invalid value \(\$filter MateCatFilter\)\: Unexpected token "\$filter", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Controller/API/V3/CountWordController.php + + - + message: '#^Parameter \#1 \$featureSet of static method Matecat\\SubFiltering\\AbstractFilter\:\:getInstance\(\) expects Matecat\\SubFiltering\\Contracts\\FeatureSetInterface, Model\\FeaturesBase\\FeatureSet\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/JobsTranslatorsController.php + path: lib/Controller/API/V3/CountWordController.php - - message: '#^Parameter \#1 \$job_owner_timezone of method Model\\Translators\\TranslatorsModel\:\:setJobOwnerTimezone\(\) expects int, string\|false\|null given\.$#' + message: '#^Parameter \#2 \$featureSet of class Utils\\LQA\\SizeRestriction\\SizeRestriction constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/JobsTranslatorsController.php + path: lib/Controller/API/V3/CountWordController.php - - message: '#^Method Controller\\API\\V2\\MarkAllSegmentStatusController\:\:sanitizeSegmentIDs\(\) has parameter \$segment_list with no type specified\.$#' + message: '#^Access to protected property Klein\\Request\:\:\$id\.$#' + identifier: property.protected + count: 3 + path: lib/Controller/API/V3/DeepLGlossaryController.php + + - + message: '#^Method Controller\\API\\V3\\DeepLGlossaryController\:\:getDeepLClient\(\) has parameter \$engineId with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/MarkAllSegmentStatusController.php + path: lib/Controller/API/V3/DeepLGlossaryController.php - - message: '#^Method Controller\\API\\V2\\MarkAllSegmentStatusController\:\:sanitizeSegmentIDs\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Offset ''DeepL\-Auth\-Key'' might not exist on array\|string\|null\.$#' + identifier: offsetAccess.notFound + count: 5 + path: lib/Controller/API/V3/DeepLGlossaryController.php + + - + message: '#^Parameter \#1 \$filepath of static method Utils\\Files\\CSV\:\:parseToArray\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/MarkAllSegmentStatusController.php + path: lib/Controller/API/V3/DeepLGlossaryController.php - - message: '#^Method Controller\\API\\V2\\MemoryKeysController\:\:listKeys\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$id of method Utils\\Engines\\DeepL\:\:deleteGlossary\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/MemoryKeysController.php + path: lib/Controller/API/V3/DeepLGlossaryController.php - - message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$id of method Utils\\Engines\\DeepL\:\:getGlossary\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/MemoryKeysController.php + path: lib/Controller/API/V3/DeepLGlossaryController.php - - message: '#^If condition is always true\.$#' - identifier: if.alwaysTrue + message: '#^Parameter \#1 \$id of method Utils\\Engines\\DeepL\:\:getGlossaryEntries\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/ProjectCompletionStatus.php + path: lib/Controller/API/V3/DeepLGlossaryController.php - - message: '#^Property Controller\\API\\V2\\ProjectCompletionStatus\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#2 \$uid of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/ProjectCompletionStatus.php + path: lib/Controller/API/V3/DeepLGlossaryController.php - - message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:buildArrayOfSegmentIds\(\) has parameter \$ids with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ProjectsController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Method Controller\\API\\V2\\ProjectsController\:\:changeStatus\(\) has parameter \$status with no type specified\.$#' + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:buildFileContentFromArrayOfSegmentIds\(\) has parameter \$segments_ids with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/ProjectsController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Method Controller\\API\\V2\\ProjectsController\:\:deleteDueDate\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:buildFileContentFromArrayOfSegmentIds\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ProjectsController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Method Controller\\API\\V2\\ProjectsController\:\:updateDueDate\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createCSVFile\(\) has parameter \$categoryIssues with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ProjectsController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Property Controller\\API\\V2\\ProjectsController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' - identifier: assign.propertyType - count: 2 - path: lib/Controller/API/V2/ProjectsController.php + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createCSVFile\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Cannot call method getChunk\(\) on Model\\LQA\\ChunkReviewStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createJsonFile\(\) has parameter \$categoryIssues with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ReviewsController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Parameter \#1 \$id_project of static method Model\\LQA\\ChunkReviewDao\:\:destroyCacheByProjectId\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createJsonFile\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ReviewsController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Property Controller\\API\\V2\\ReviewsController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createXMLFile\(\) has parameter \$categoryIssues with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ReviewsController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createXMLFile\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/ReviseTranslationIssuesController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$uid\.$#' - identifier: property.notFound - count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:download\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Cannot access property \$id on Model\\LQA\\EntryStruct\|null\.$#' - identifier: property.nonObject - count: 3 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + message: '#^Parameter \#1 \$stream of function fclose expects resource, resource\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Cannot access property \$id on Model\\Teams\\TeamStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$stream of function fputcsv expects resource, resource\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Cannot access property \$source_page on Model\\LQA\\EntryStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$string of function strlen expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Method Controller\\API\\V2\\SegmentTranslationIssueController\:\:checkLoggedUserPermissions\(\) throws checked exception Controller\\API\\Commons\\Exceptions\\AuthorizationError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + message: '#^Property Controller\\API\\V3\\DownloadQRController\:\:\$allowedFormats type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Controller/API/V3/DownloadQRController.php - - message: '#^Method Controller\\API\\V2\\SegmentTranslationIssueController\:\:checkLoggedUserPermissions\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + message: '#^Cannot call method dispatchFilter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Controller/API/V3/FileInfoController.php - - message: '#^Method Controller\\API\\V2\\SegmentTranslationIssueController\:\:create\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\FileInfoController\:\:setInstructions\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/FileInfoController.php - - message: '#^Method Controller\\API\\V2\\SegmentTranslationIssueController\:\:update\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\API\\V3\\FiltersConfigTemplateController\:\:validateJSON\(\) has parameter \$json with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Parameter \#1 \$entry of method Controller\\API\\V2\\SegmentTranslationIssueController\:\:checkLoggedUserPermissions\(\) expects Model\\LQA\\EntryStruct, Model\\LQA\\EntryStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\FiltersConfigTemplateController\:\:validateJSON\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Parameter \#1 \$id_job of method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Parameter \#1 \$id_team of method Model\\Teams\\MembershipDao\:\:getMemberListByTeamId\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$json of static method Model\\Filters\\FiltersConfigTemplateDao\:\:createFromJSON\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Parameter \#2 \$password of method Controller\\API\\V2\\SegmentTranslationIssueController\:\:_getSegmentTranslationIssueModel\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' identifier: argument.type - count: 2 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + count: 1 + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Parameter \#2 \$password of method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#2 \$json of static method Model\\Filters\\FiltersConfigTemplateDao\:\:editFromJSON\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Parameter \#3 \$issue of method Controller\\API\\V2\\SegmentTranslationIssueController\:\:_getSegmentTranslationIssueModel\(\) expects Model\\LQA\\EntryStruct, Model\\LQA\\EntryStruct\|null given\.$#' + message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:createFromJSON\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Variable \$jobStruct in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable + message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 2 - path: lib/Controller/API/V2/SegmentTranslationIssueController.php + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:checkSplit\(\) has parameter \$request with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:remove\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/SplitJobController.php + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:checkSplit\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/V2/SplitJobController.php + message: '#^Parameter \#3 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:editFromJSON\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/API/V3/FiltersConfigTemplateController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:checkSplitAccess\(\) has parameter \$jobList with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$password of method Model\\Translations\\SegmentTranslationDao\:\:getSegmentTranslationsModifiedByRevisorWithIssueCount\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/SplitJobController.php + path: lib/Controller/API/V3/IssueCheckController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:checkSplitAccess\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\LaraController\:\:glossaries\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/SplitJobController.php + path: lib/Controller/API/V3/LaraController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:filterJobsById\(\) has parameter \$jobList with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$engineId of class Controller\\API\\Commons\\Validators\\EngineOwnershipValidator constructor expects int, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/SplitJobController.php + path: lib/Controller/API/V3/LaraController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:filterJobsById\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Argument of an invalid type array\\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Controller/API/V2/SplitJobController.php + path: lib/Controller/API/V3/MetaDataController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:getProjectData\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\MetaDataController\:\:getJobFilesMetaData\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/SplitJobController.php + path: lib/Controller/API/V3/MetaDataController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:merge\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getByJobIdAndPassword\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/SplitJobController.php + path: lib/Controller/API/V3/MetaDataController.php - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$id_project of method Model\\Files\\MetadataDao\:\:getByJobIdProjectAndIdFile\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/SplitJobController.php - - - - message: '#^Method Controller\\API\\V2\\SplitJobController\:\:validateTheRequest\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Controller/API/V2/SplitJobController.php + path: lib/Controller/API/V3/MetaDataController.php - - message: '#^PHPDoc tag @var has invalid value \(\$data SplitMergeProjectData\)\: Unexpected token "\$data", expected type at offset 10 on line 1$#' - identifier: phpDoc.parseError - count: 2 - path: lib/Controller/API/V2/SplitJobController.php + message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getByJobIdAndPassword\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/API/V3/MetaDataController.php - - message: '#^Cannot call method getProject\(\) on Model\\Jobs\\JobStruct\|null\.$#' - identifier: method.nonObject + message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Controller/API/V2/StatsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Parameter \#1 \$jobOrChunk of static method Model\\WordCount\\WordCountStruct\:\:loadFromJob\(\) expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:buildResult\(\) has parameter \$memory with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/StatsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Method Controller\\API\\V2\\SupportedFilesController\:\:getFileList\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:buildResult\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/SupportedFilesController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Cannot access property \$id on Model\\Teams\\TeamStruct\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Controller/API/V2/TeamMembersController.php + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:extractCSV\(\) has parameter \$glossary with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Cannot call method getMembers\(\) on Model\\Teams\\TeamStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:extractCSV\(\) throws checked exception PhpOffice\\PhpSpreadsheet\\Writer\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V2/TeamMembersController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Method Controller\\API\\V2\\TeamMembersController\:\:index\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:filterResult\(\) has parameter \$memory with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/TeamMembersController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Parameter \#1 \$emails of method Model\\Teams\\TeamModel\:\:addMemberEmails\(\) expects array, array\\|false\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:filterResult\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V2/TeamMembersController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Parameter \#1 \$struct of class Model\\Teams\\TeamModel constructor expects Model\\Teams\\TeamStruct, Model\\Teams\\TeamStruct\|null given\.$#' - identifier: argument.type - count: 3 - path: lib/Controller/API/V2/TeamMembersController.php + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:getCsvType\(\) has parameter \$csv with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Argument of an invalid type array\\|false\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:getModernMTClient\(\) has parameter \$engineId with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/TeamsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Call to an undefined method Model\\DataAccess\\IDaoStruct\:\:getUser\(\)\.$#' - identifier: method.notFound + message: '#^Method Controller\\API\\V3\\ModernMTController\:\:validateCSVContent\(\) has parameter \$csvContent with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V2/TeamsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Method Controller\\API\\V2\\TeamsController\:\:getTeamList\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Offset ''id'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V2/TeamsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Parameter \#1 \$email of method Model\\Teams\\TeamModel\:\:addMemberEmail\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$filename of class CURLFile constructor expects string, string\|false given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V2/TeamsController.php + count: 2 + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Parameter \#1 \$id of method Model\\Teams\\MembershipDao\:\:findTeamByIdAndUser\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$filepath of static method Utils\\Files\\CSV\:\:parseToArray\(\) expects string, string\|false given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V2/TeamsController.php + count: 2 + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Parameter \#1 \$id_team of method Model\\Teams\\MembershipDao\:\:getMemberListByTeamId\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$id of method Utils\\Engines\\MMT\:\:importGlossary\(\) expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/TeamsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Property Model\\Teams\\TeamStruct\:\:\$id \(int\|null\) does not accept int\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$id of method Utils\\Engines\\MMT\:\:updateGlossary\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/TeamsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Method Controller\\API\\V2\\TeamsProjectsController\:\:_appendSingleProjectTeamValidators\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$id of method Utils\\Engines\\MMT\:\:updateMemory\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/TeamsProjectsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Property Controller\\API\\V2\\TeamsProjectsController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/API/V2/TeamsProjectsController.php + message: '#^Parameter \#1 \$name of method Utils\\Engines\\MMT\:\:createMemory\(\) expects string, string\|false given\.$#' + identifier: argument.type + count: 2 + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Cannot access property \$id on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$string of function strtolower expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/UrlsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$uuid of method Utils\\Engines\\MMT\:\:importJobStatus\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/UrlsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Cannot call method getJobs\(\) on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#2 \$description of method Utils\\Engines\\MMT\:\:createMemory\(\) expects string\|null, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/UrlsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#2 \$name of method Utils\\Engines\\MMT\:\:updateMemory\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V2/UrlsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Parameter \#1 \$pid of method Model\\Projects\\ProjectDao\:\:getProjectData\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#2 \$uid of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/UrlsController.php + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Method Controller\\API\\V2\\UserController\:\:edit\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/V2/UserController.php + message: '#^Parameter \#3 \$externalId of method Utils\\Engines\\MMT\:\:createMemory\(\) expects string\|null, string\|false\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/API/V3/ModernMTController.php - - message: '#^Method Controller\\API\\V2\\UserController\:\:setMetadata\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\MyMemoryController\:\:saveMemoryKey\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/V2/UserController.php + count: 1 + path: lib/Controller/API/V3/MyMemoryController.php - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|null given\.$#' identifier: argument.type - count: 2 - path: lib/Controller/API/V2/UserController.php + count: 1 + path: lib/Controller/API/V3/MyMemoryController.php - - message: '#^Parameter \#1 \$uid of method Model\\Users\\MetadataDao\:\:set\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$key of method Controller\\API\\V3\\MyMemoryController\:\:checkTheKeyAndAssignToUser\(\) expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/UserController.php + path: lib/Controller/API/V3/MyMemoryController.php - - message: '#^Parameter \#2 \$key of method Model\\Users\\MetadataDao\:\:set\(\) expects string, array\\|string given\.$#' + message: '#^Parameter \#1 \$name of method Controller\\API\\V3\\MyMemoryController\:\:createANewKeyAndAssignToUser\(\) expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V2/UserController.php + path: lib/Controller/API/V3/MyMemoryController.php - - message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#2 \$name of method Controller\\API\\V3\\MyMemoryController\:\:checkTheKeyAndAssignToUser\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/CancelRequestController.php + path: lib/Controller/API/V3/MyMemoryController.php - - message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' - identifier: return.type - count: 2 - path: lib/Controller/API/V3/CancelRequestController.php + message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Controller/API/V3/MyMemoryController.php - - message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType count: 1 - path: lib/Controller/API/V3/CancelRequestController.php + path: lib/Controller/API/V3/MyMemoryController.php - - message: '#^Method Controller\\API\\V3\\CancelRequestController\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method Throwable\:\:getFormattedError\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Controller/API/V3/CancelRequestController.php + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\PayableRateController\:\:validateJSON\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/CancelRequestController.php + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' + message: '#^Parameter \#1 \$json of class Utils\\Validator\\JSONSchema\\JSONValidatorObject constructor expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/CancelRequestController.php + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Template type T of method Controller\\API\\V3\\CancelRequestController\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter - count: 1 - path: lib/Controller/API/V3/CancelRequestController.php + message: '#^Parameter \#1 \$json of method Controller\\API\\V3\\PayableRateController\:\:validateJSON\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Template type T of method Controller\\API\\V3\\CancelRequestController\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Parameter \#1 \$json of method Model\\PayableRates\\CustomPayableRateStruct\:\:hydrateFromJSON\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/CancelRequestController.php + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToLayer2\(\)\.$#' - identifier: method.notFound + message: '#^Parameter \#1 \$json of static method Model\\PayableRates\\CustomPayableRateDao\:\:createFromJSON\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/CountWordController.php + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Cannot call method loadFromUserEmail\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/CountWordController.php + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Method Controller\\API\\V3\\CountWordController\:\:afterConstruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Controller/API/V3/CountWordController.php + message: '#^Parameter \#1 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:getDefaultTemplate\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^PHPDoc tag @var has invalid value \(\$filter MateCatFilter\)\: Unexpected token "\$filter", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Parameter \#2 \$json of static method Model\\PayableRates\\CustomPayableRateDao\:\:editFromJSON\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/CountWordController.php + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Parameter \#1 \$featureSet of static method Matecat\\SubFiltering\\AbstractFilter\:\:getInstance\(\) expects Matecat\\SubFiltering\\Contracts\\FeatureSetInterface, Model\\FeaturesBase\\FeatureSet\|null given\.$#' + message: '#^Parameter \#2 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V3/CountWordController.php + count: 2 + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Parameter \#2 \$featureSet of class Utils\\LQA\\SizeRestriction\\SizeRestriction constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' + message: '#^Parameter \#2 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:remove\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/CountWordController.php + path: lib/Controller/API/V3/PayableRateController.php - - message: '#^Access to protected property Klein\\Request\:\:\$id\.$#' - identifier: property.protected - count: 3 - path: lib/Controller/API/V3/DeepLGlossaryController.php + message: '#^Access to an undefined property object\:\:\$properties\.$#' + identifier: property.notFound + count: 1 + path: lib/Controller/API/V3/ProjectTemplateController.php - - message: '#^Method Controller\\API\\V3\\DeepLGlossaryController\:\:getDeepLClient\(\) has parameter \$engineId with no type specified\.$#' + message: '#^Method Controller\\API\\V3\\ProjectTemplateController\:\:getProjectTemplateModelSchema\(\) should return string but returns object\.$#' + identifier: return.type + count: 1 + path: lib/Controller/API/V3/ProjectTemplateController.php + + - + message: '#^Method Controller\\API\\V3\\ProjectTemplateController\:\:validateJSON\(\) has parameter \$json with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/DeepLGlossaryController.php + path: lib/Controller/API/V3/ProjectTemplateController.php - - message: '#^Offset ''DeepL\-Auth\-Key'' might not exist on array\|string\|null\.$#' - identifier: offsetAccess.notFound - count: 5 - path: lib/Controller/API/V3/DeepLGlossaryController.php + message: '#^Parameter \#1 \$error of class Utils\\Validator\\JSONSchema\\Errors\\JSONValidatorException constructor expects Swaggest\\JsonSchema\\Exception\\Error, array given\.$#' + identifier: argument.type + count: 2 + path: lib/Controller/API/V3/ProjectTemplateController.php - - message: '#^Parameter \#1 \$filepath of static method Utils\\Files\\CSV\:\:parseToArray\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$jsonSchema of static method Utils\\Validator\\JSONSchema\\JSONValidator\:\:getValidJSONSchema\(\) expects string, string\|false given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V3/DeepLGlossaryController.php + count: 2 + path: lib/Controller/API/V3/ProjectTemplateController.php - - message: '#^Parameter \#1 \$id of method Utils\\Engines\\DeepL\:\:deleteGlossary\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$uid of static method Model\\Projects\\ProjectTemplateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/DeepLGlossaryController.php + path: lib/Controller/API/V3/ProjectTemplateController.php - - message: '#^Parameter \#1 \$id of method Utils\\Engines\\DeepL\:\:getGlossary\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$uid of static method Model\\Projects\\ProjectTemplateDao\:\:markAsNotDefault\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/DeepLGlossaryController.php + path: lib/Controller/API/V3/ProjectTemplateController.php - - message: '#^Parameter \#1 \$id of method Utils\\Engines\\DeepL\:\:getGlossaryEntries\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#2 \$uid of static method Model\\Projects\\ProjectTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V3/DeepLGlossaryController.php + count: 2 + path: lib/Controller/API/V3/ProjectTemplateController.php - - message: '#^Parameter \#2 \$uid of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#2 \$uid of static method Model\\Projects\\ProjectTemplateDao\:\:remove\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/DeepLGlossaryController.php + path: lib/Controller/API/V3/ProjectTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:buildArrayOfSegmentIds\(\) has parameter \$ids with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method Throwable\:\:getFormattedError\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QAModelTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:buildFileContentFromArrayOfSegmentIds\(\) has parameter \$segments_ids with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\V3\\QAModelTemplateController\:\:getQaModelSchema\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QAModelTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:buildFileContentFromArrayOfSegmentIds\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\API\\V3\\QAModelTemplateController\:\:validateJSON\(\) has parameter \$json with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QAModelTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createCSVFile\(\) has parameter \$categoryIssues with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\API\\V3\\QAModelTemplateController\:\:validateJSON\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QAModelTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createCSVFile\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$json of class Utils\\Validator\\JSONSchema\\JSONValidatorObject constructor expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QAModelTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createJsonFile\(\) has parameter \$categoryIssues with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$uid of static method Model\\LQA\\QAModelTemplate\\QAModelTemplateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QAModelTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createJsonFile\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$uid of static method Model\\LQA\\QAModelTemplate\\QAModelTemplateDao\:\:createFromJSON\(\) expects null, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QAModelTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createXMLFile\(\) has parameter \$categoryIssues with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$uid of static method Model\\LQA\\QAModelTemplate\\QAModelTemplateDao\:\:remove\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QAModelTemplateController.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:createXMLFile\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Cannot access offset ''path'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: lib/Controller/API/V3/QualityReportControllerAPI.php + + - + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) has parameter \$filesInfo with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Method Controller\\API\\V3\\DownloadQRController\:\:download\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Controller/API/V3/DownloadQRController.php + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) has parameter \$ttlArray with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#1 \$stream of function fclose expects resource, resource\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#1 \$stream of function fputcsv expects resource, resource\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_getPaginationLinks\(\) has parameter \$filter with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#1 \$string of function strlen expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_getPaginationLinks\(\) has parameter \$segments_id with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Property Controller\\API\\V3\\DownloadQRController\:\:\$allowedFormats type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_getPaginationLinks\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/DownloadQRController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_getPaginationLinks\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/FileInfoController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Method Controller\\API\\V3\\FileInfoController\:\:setInstructions\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:getSecsPerWord\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/FileInfoController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Method Controller\\API\\V3\\FiltersConfigTemplateController\:\:validateJSON\(\) has parameter \$json with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:getTteArrayForSegment\(\) has parameter \$tteArray with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Method Controller\\API\\V3\\FiltersConfigTemplateController\:\:validateJSON\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:getTteArrayForSegment\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Controller/API/V3/QualityReportControllerAPI.php + + - + message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:show\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' - identifier: argument.type + message: '#^PHPDoc tag @var for variable \$filter has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#1 \$json of static method Model\\Filters\\FiltersConfigTemplateDao\:\:createFromJSON\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$mt_we_workflow_enabled of static method Model\\Analysis\\Constants\\MatchConstantsFactory\:\:getInstance\(\) expects bool\|null, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#1 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#2 \$id_job of method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getTteForSegments\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#2 \$json of static method Model\\Filters\\FiltersConfigTemplateDao\:\:editFromJSON\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#2 \$ttlArray of method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) expects array, array\\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:createFromJSON\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#4 \$mt_qe_workflow_enabled of method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) expects bool, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/QualityReportControllerAPI.php - - message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + message: '#^Method Controller\\API\\V3\\RevisionFeedbackController\:\:feedback\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Controller/API/V3/RevisionFeedbackController.php - - message: '#^Parameter \#2 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:remove\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Cannot access offset 0 on Model\\Segments\\SegmentMetadataStruct\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#3 \$uid of static method Model\\Filters\\FiltersConfigTemplateDao\:\:editFromJSON\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Cannot access property \$id_project on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/API/V3/FiltersConfigTemplateController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#2 \$password of method Model\\Translations\\SegmentTranslationDao\:\:getSegmentTranslationsModifiedByRevisorWithIssueCount\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Cannot call method hget\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V3/IssueCheckController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\LaraController\:\:glossaries\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/LaraController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#2 \$engineId of class Controller\\API\\Commons\\Validators\\EngineOwnershipValidator constructor expects int, string\|false given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V3/LaraController.php + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' + identifier: return.type + count: 2 + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Argument of an invalid type array\\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/MetaDataController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\MetaDataController\:\:getJobFilesMetaData\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/MetaDataController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getByJobIdAndPassword\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:destroySegmentDisabledCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/MetaDataController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$id_project of method Model\\Files\\MetadataDao\:\:getByJobIdProjectAndIdFile\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) has parameter \$idRequestsAggregate with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/MetaDataController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getByJobIdAndPassword\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) has parameter \$issuesAggregate with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/MetaDataController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) has parameter \$notesAggregate with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:buildResult\(\) has parameter \$memory with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) has parameter \$projectPasswordsMap with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:buildResult\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:extractCSV\(\) has parameter \$glossary with no type specified\.$#' + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getIssuesNotesAndIdRequests\(\) has parameter \$segmentsForAnalysis with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:extractCSV\(\) throws checked exception PhpOffice\\PhpSpreadsheet\\Writer\\Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getIssuesNotesAndIdRequests\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:filterResult\(\) has parameter \$memory with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getJobUrls\(\) has parameter \$projectPasswordsMap with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:filterResult\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getJobUrls\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:getCsvType\(\) has parameter \$csv with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAJob\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:getModernMTClient\(\) has parameter \$engineId with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAJob\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\ModernMTController\:\:validateCSVContent\(\) has parameter \$csvContent with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAProject\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Offset ''id'' might not exist on array\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAProject\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$filename of class CURLFile constructor expects string, string\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/ModernMTController.php + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsFromIdJobAndPassword\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$filepath of static method Utils\\Files\\CSV\:\:parseToArray\(\) expects string, string\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/ModernMTController.php + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsFromIdProjectAndPassword\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$id of method Utils\\Engines\\MMT\:\:importGlossary\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getStatusObject\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$id of method Utils\\Engines\\MMT\:\:updateGlossary\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:humanReadableSourcePage\(\) has parameter \$sourcePage with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$id of method Utils\\Engines\\MMT\:\:updateMemory\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:job\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$name of method Utils\\Engines\\MMT\:\:createMemory\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$featureSet of static method Matecat\\SubFiltering\\AbstractFilter\:\:getInstance\(\) expects Matecat\\SubFiltering\\Contracts\\FeatureSetInterface, Model\\FeaturesBase\\FeatureSet\|null given\.$#' identifier: argument.type - count: 2 - path: lib/Controller/API/V3/ModernMTController.php + count: 1 + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$string of function strtolower expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$idJob of static method Model\\Segments\\SegmentDao\:\:getSegmentsForAnalysisFromIdJobAndPassword\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$uuid of method Utils\\Engines\\MMT\:\:importJobStatus\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#2 \$description of method Utils\\Engines\\MMT\:\:createMemory\(\) expects string\|null, string\|false\|null given\.$#' + message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#2 \$name of method Utils\\Engines\\MMT\:\:updateMemory\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$mt_we_workflow_enabled of static method Model\\Analysis\\Constants\\MatchConstantsFactory\:\:getInstance\(\) expects bool\|null, string\|false given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V3/ModernMTController.php + count: 2 + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#2 \$uid of static method Utils\\Engines\\EnginesFactory\:\:getInstanceByIdAndUser\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#2 \$password of static method Model\\Segments\\SegmentDao\:\:getSegmentsForAnalysisFromIdJobAndPassword\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/ModernMTController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#3 \$externalId of method Utils\\Engines\\MMT\:\:createMemory\(\) expects string\|null, string\|false\|null given\.$#' + message: '#^Parameter \#3 \$filter of static method Utils\\Tools\\CatUtils\:\:segment_raw_word_count\(\) expects Matecat\\SubFiltering\\MateCatFilter\|null, Matecat\\SubFiltering\\AbstractFilter given\.$#' identifier: argument.type - count: 1 - path: lib/Controller/API/V3/ModernMTController.php + count: 2 + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Method Controller\\API\\V3\\MyMemoryController\:\:saveMemoryKey\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#5 \$segmentsCount of method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAProject\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/MyMemoryController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Template type T of method Controller\\API\\V3\\SegmentAnalysisController\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Controller/API/V3/MyMemoryController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$key of method Controller\\API\\V3\\MyMemoryController\:\:checkTheKeyAndAssignToUser\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Template type T of method Controller\\API\\V3\\SegmentAnalysisController\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Controller/API/V3/MyMemoryController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#1 \$name of method Controller\\API\\V3\\MyMemoryController\:\:createANewKeyAndAssignToUser\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Variable \$filter in PHPDoc tag @var does not match assigned variable \$jobStruct\.$#' + identifier: varTag.differentVariable count: 1 - path: lib/Controller/API/V3/MyMemoryController.php + path: lib/Controller/API/V3/SegmentAnalysisController.php - - message: '#^Parameter \#2 \$name of method Controller\\API\\V3\\MyMemoryController\:\:checkTheKeyAndAssignToUser\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#2 \$features of class Model\\Analysis\\Status constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/MyMemoryController.php + path: lib/Controller/API/V3/StatusController.php - - message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Cannot access offset ''path'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: lib/Controller/API/V3/TeamsProjectsController.php + + - + message: '#^Cannot call method loadFromUserEmail\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V3/MyMemoryController.php + path: lib/Controller/API/V3/TeamsProjectsController.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:_getPaginationLinks\(\) has parameter \$search with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/MyMemoryController.php + path: lib/Controller/API/V3/TeamsProjectsController.php - - message: '#^Call to an undefined method Throwable\:\:getFormattedError\(\)\.$#' - identifier: method.notFound + message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:_getPaginationLinks\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/PayableRateController.php + path: lib/Controller/API/V3/TeamsProjectsController.php - - message: '#^Method Controller\\API\\V3\\PayableRateController\:\:validateJSON\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:getTotalPages\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/PayableRateController.php + path: lib/Controller/API/V3/TeamsProjectsController.php - - message: '#^Parameter \#1 \$json of class Utils\\Validator\\JSONSchema\\JSONValidatorObject constructor expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:setTeam\(\) has parameter \$team with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/PayableRateController.php + path: lib/Controller/API/V3/TeamsProjectsController.php - - message: '#^Parameter \#1 \$json of method Controller\\API\\V3\\PayableRateController\:\:validateJSON\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/PayableRateController.php + message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:setTeam\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Controller/API/V3/TeamsProjectsController.php - - message: '#^Parameter \#1 \$json of method Model\\PayableRates\\CustomPayableRateStruct\:\:hydrateFromJSON\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V3/PayableRateController.php + message: '#^Access to an undefined property object\:\:\$definitions\.$#' + identifier: property.notFound + count: 2 + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#1 \$json of static method Model\\PayableRates\\CustomPayableRateDao\:\:createFromJSON\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V3/PayableRateController.php + message: '#^Access to an undefined property object\:\:\$properties\.$#' + identifier: property.notFound + count: 2 + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#1 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\XliffConfigTemplateController\:\:validateJSON\(\) has parameter \$json with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/PayableRateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#1 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:getDefaultTemplate\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\API\\V3\\XliffConfigTemplateController\:\:validateJSON\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/PayableRateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#2 \$json of static method Model\\PayableRates\\CustomPayableRateDao\:\:editFromJSON\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$json of static method Model\\Xliff\\XliffConfigTemplateDao\:\:createFromJSON\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/PayableRateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#2 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$jsonSchema of static method Utils\\Validator\\JSONSchema\\JSONValidator\:\:getValidJSONSchema\(\) expects string, string\|false given\.$#' identifier: argument.type count: 2 - path: lib/Controller/API/V3/PayableRateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#2 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:remove\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/PayableRateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Access to an undefined property object\:\:\$properties\.$#' - identifier: property.notFound + message: '#^Parameter \#2 \$json of static method Model\\Xliff\\XliffConfigTemplateDao\:\:editFromJSON\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/ProjectTemplateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Method Controller\\API\\V3\\ProjectTemplateController\:\:getProjectTemplateModelSchema\(\) should return string but returns object\.$#' - identifier: return.type + message: '#^Parameter \#2 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:createFromJSON\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/ProjectTemplateController.php - - - - message: '#^Method Controller\\API\\V3\\ProjectTemplateController\:\:validateJSON\(\) has parameter \$json with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Controller/API/V3/ProjectTemplateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#1 \$error of class Utils\\Validator\\JSONSchema\\Errors\\JSONValidatorException constructor expects Swaggest\\JsonSchema\\Exception\\Error, array given\.$#' + message: '#^Parameter \#2 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' identifier: argument.type count: 2 - path: lib/Controller/API/V3/ProjectTemplateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#1 \$jsonSchema of static method Utils\\Validator\\JSONSchema\\JSONValidator\:\:getValidJSONSchema\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#2 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:remove\(\) expects int, int\|null given\.$#' identifier: argument.type - count: 2 - path: lib/Controller/API/V3/ProjectTemplateController.php + count: 1 + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#1 \$uid of static method Model\\Projects\\ProjectTemplateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#3 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:editFromJSON\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/ProjectTemplateController.php + path: lib/Controller/API/V3/XliffConfigTemplateController.php - - message: '#^Parameter \#1 \$uid of static method Model\\Projects\\ProjectTemplateDao\:\:markAsNotDefault\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:composeZip\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Controller/API/V3/ProjectTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\Projects\\ProjectTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/ProjectTemplateController.php + message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:finalize\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\Projects\\ProjectTemplateDao\:\:remove\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:finalize\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/ProjectTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Call to an undefined method Throwable\:\:getFormattedError\(\)\.$#' - identifier: method.notFound + message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:nocache\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/V3/QAModelTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Method Controller\\API\\V3\\QAModelTemplateController\:\:getQaModelSchema\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:setMimeType\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/V3/QAModelTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Method Controller\\API\\V3\\QAModelTemplateController\:\:validateJSON\(\) has parameter \$json with no type specified\.$#' + message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:unlockToken\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Controller/Abstracts/AbstractDownloadController.php + + - + message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:unlockToken\(\) has parameter \$tokenContent with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/QAModelTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Method Controller\\API\\V3\\QAModelTemplateController\:\:validateJSON\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Offset ''basename'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V3/QAModelTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Parameter \#1 \$json of class Utils\\Validator\\JSONSchema\\JSONValidatorObject constructor expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Offset ''extension'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/API/V3/QAModelTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Parameter \#1 \$uid of static method Model\\LQA\\QAModelTemplate\\QAModelTemplateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$id_project of static method Model\\Files\\FileDao\:\:getByProjectId\(\) expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/QAModelTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\LQA\\QAModelTemplate\\QAModelTemplateDao\:\:createFromJSON\(\) expects null, int\|null given\.$#' + message: '#^Parameter \#1 \$string of function strtolower expects string, array\|string given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/QAModelTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Parameter \#2 \$uid of static method Model\\LQA\\QAModelTemplate\\QAModelTemplateDao\:\:remove\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#2 \$value of static method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/QAModelTemplateController.php + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Cannot access offset ''path'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible - count: 2 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Controller/Abstracts/AbstractDownloadController.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) has parameter \$filesInfo with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:destroyAuthentication\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthCookie.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) has parameter \$ttlArray with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:generateSignedAuthCookie\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthCookie.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:getCredentials\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthCookie.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_getPaginationLinks\(\) has parameter \$filter with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:getCredentials\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthCookie.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_getPaginationLinks\(\) has parameter \$segments_id with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:getData\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthCookie.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_getPaginationLinks\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$userId of method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:removeLoginCookieFromStore\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthCookie.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:_getPaginationLinks\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$userId of method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:setCookieLoginTokenActive\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Controller/Abstracts/Authentication/AuthCookie.php + + - + message: '#^Anonymous function has an unused use \$membersDao\.$#' + identifier: closure.unusedUse count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:getSecsPerWord\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method getUser\(\) on Model\\ApiKeys\\ApiKeyStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:getTteArrayForSegment\(\) has parameter \$tteArray with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:__construct\(\) has parameter \$session with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:getTteArrayForSegment\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:destroyAuthentication\(\) has parameter \$session with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Method Controller\\API\\V3\\QualityReportControllerAPI\:\:show\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:getInstance\(\) has parameter \$session with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^PHPDoc tag @var for variable \$filter has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:getUserProfile\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Parameter \#1 \$mt_we_workflow_enabled of static method Model\\Analysis\\Constants\\MatchConstantsFactory\:\:getInstance\(\) expects bool\|null, string\|false given\.$#' - identifier: argument.type + message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:refreshSession\(\) has parameter \$session with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Parameter \#2 \$id_job of method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getTteForSegments\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^PHPDoc tag @var has invalid value \(\$team TeamStruct\)\: Unexpected token "\$team", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Parameter \#2 \$ttlArray of method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) expects array, array\\|null given\.$#' - identifier: argument.type + message: '#^PHPDoc tag @var has invalid value \(\$user UserStruct\)\: Unexpected token "\$user", expected type at offset 28 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Parameter \#4 \$mt_qe_workflow_enabled of method Controller\\API\\V3\\QualityReportControllerAPI\:\:_formatSegments\(\) expects bool, string\|false given\.$#' + message: '#^Parameter \#2 \$array of function array_map expects array, array\\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/API/V3/QualityReportControllerAPI.php - - - - message: '#^Method Controller\\API\\V3\\RevisionFeedbackController\:\:feedback\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Controller/API/V3/RevisionFeedbackController.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Cannot access property \$id_project on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Property Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:\$logged \(true\) does not accept bool\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:\$session type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' - identifier: return.type + message: '#^Property Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:\$user \(Model\\Users\\UserStruct\) does not accept Model\\Users\\UserStruct\|null\.$#' + identifier: assign.propertyType count: 2 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/CookieManager.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method hget\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) has parameter \$idRequestsAggregate with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) has parameter \$issuesAggregate with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' + identifier: return.type + count: 2 + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) has parameter \$notesAggregate with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) has parameter \$projectPasswordsMap with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:formatSegment\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:isLoginCookieStillActive\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getIssuesNotesAndIdRequests\(\) has parameter \$segmentsForAnalysis with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:setCookieLoginTokenActive\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getIssuesNotesAndIdRequests\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getJobUrls\(\) has parameter \$projectPasswordsMap with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getJobUrls\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Template type T of method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAJob\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Template type T of method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAJob\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$ajaxDomainsNumber\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAProject\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$basepath\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAProject\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$build_number\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsFromIdJobAndPassword\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$config_js\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsFromIdProjectAndPassword\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$css_resources\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:getStatusObject\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$enableMultiDomainApi\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:humanReadableSourcePage\(\) has parameter \$sourcePage with no type specified\.$#' - identifier: missingType.parameter + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$facebookAuthUrl\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\SegmentAnalysisController\:\:job\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$flashMessages\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#1 \$featureSet of static method Matecat\\SubFiltering\\AbstractFilter\:\:getInstance\(\) expects Matecat\\SubFiltering\\Contracts\\FeatureSetInterface, Model\\FeaturesBase\\FeatureSet\|null given\.$#' - identifier: argument.type + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$footer_js\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#1 \$idJob of static method Model\\Segments\\SegmentDao\:\:getSegmentsForAnalysisFromIdJobAndPassword\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$gdriveAuthURL\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' - identifier: argument.type + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$githubAuthUrl\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' - identifier: argument.type + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$googleAuthURL\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#1 \$mt_we_workflow_enabled of static method Model\\Analysis\\Constants\\MatchConstantsFactory\:\:getInstance\(\) expects bool\|null, string\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/SegmentAnalysisController.php + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$googleDriveEnabled\.$#' + identifier: property.notFound + count: 1 + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#2 \$password of static method Model\\Segments\\SegmentDao\:\:getSegmentsForAnalysisFromIdJobAndPassword\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$hostpath\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#3 \$filter of static method Utils\\Tools\\CatUtils\:\:segment_raw_word_count\(\) expects Matecat\\SubFiltering\\MateCatFilter\|null, Matecat\\SubFiltering\\AbstractFilter given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/SegmentAnalysisController.php + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$isAnInternalUser\.$#' + identifier: property.notFound + count: 1 + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#5 \$segmentsCount of method Controller\\API\\V3\\SegmentAnalysisController\:\:getSegmentsForAProject\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$isLoggedIn\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Template type T of method Controller\\API\\V3\\SegmentAnalysisController\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$linkedInAuthUrl\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Template type T of method Controller\\API\\V3\\SegmentAnalysisController\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$maxFileSize\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Variable \$filter in PHPDoc tag @var does not match assigned variable \$jobStruct\.$#' - identifier: varTag.differentVariable + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$maxTMXFileSize\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/SegmentAnalysisController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#2 \$features of class Model\\Analysis\\Status constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' - identifier: argument.type + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$microsoftAuthUrl\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/StatusController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Cannot access offset ''path'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible - count: 2 - path: lib/Controller/API/V3/TeamsProjectsController.php + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$support_mail\.$#' + identifier: property.notFound + count: 1 + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Cannot call method loadFromUserEmail\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$userMail\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/TeamsProjectsController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:_getPaginationLinks\(\) has parameter \$search with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$user_plugins\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/TeamsProjectsController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:_getPaginationLinks\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$x_nonce_unique_id\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/TeamsProjectsController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:getTotalPages\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$x_self_ajax_location_hosts\.$#' + identifier: property.notFound count: 1 - path: lib/Controller/API/V3/TeamsProjectsController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:setTeam\(\) has parameter \$team with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot access offset ''host'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Controller/API/V3/TeamsProjectsController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\TeamsProjectsController\:\:setTeam\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method dispatchFilter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/API/V3/TeamsProjectsController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Access to an undefined property object\:\:\$definitions\.$#' - identifier: property.notFound - count: 2 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + message: '#^Cannot call method getCodes\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Access to an undefined property object\:\:\$properties\.$#' - identifier: property.notFound - count: 2 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + message: '#^Cannot call method loadFromUserEmail\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\XliffConfigTemplateController\:\:validateJSON\(\) has parameter \$json with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\Abstracts\\BaseKleinViewController\:\:addParamsToView\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Method Controller\\API\\V3\\XliffConfigTemplateController\:\:validateJSON\(\) throws checked exception Swaggest\\JsonSchema\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\Abstracts\\BaseKleinViewController\:\:render\(\) throws checked exception Klein\\Exceptions\\ResponseAlreadySentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#1 \$json of static method Model\\Xliff\\XliffConfigTemplateDao\:\:createFromJSON\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Abstracts\\BaseKleinViewController\:\:setView\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + path: lib/Controller/Abstracts/BaseKleinViewController.php - - message: '#^Parameter \#1 \$jsonSchema of static method Utils\\Validator\\JSONSchema\\JSONValidator\:\:getValidJSONSchema\(\) expects string, string\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + message: '#^Method Controller\\Abstracts\\FlashMessage\:\:flush\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Controller/Abstracts/FlashMessage.php - - message: '#^Parameter \#1 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:getAllPaginated\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Abstracts\\FlashMessage\:\:set\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + path: lib/Controller/Abstracts/FlashMessage.php - - message: '#^Parameter \#2 \$json of static method Model\\Xliff\\XliffConfigTemplateDao\:\:editFromJSON\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Abstracts\\FlashMessage\:\:set\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + path: lib/Controller/Abstracts/FlashMessage.php - - message: '#^Parameter \#2 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:createFromJSON\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Abstracts\\FlashMessage\:\:set\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + path: lib/Controller/Abstracts/FlashMessage.php - - message: '#^Parameter \#2 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:getByIdAndUser\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + message: '#^Method Controller\\Abstracts\\FlashMessage\:\:set\(\) has parameter \$value with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Controller/Abstracts/FlashMessage.php - - message: '#^Parameter \#2 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:remove\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Abstracts\\IController\:\:getFeatureSet\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/API/V3/XliffConfigTemplateController.php + path: lib/Controller/Abstracts/IController.php - - message: '#^Parameter \#3 \$uid of static method Model\\Xliff\\XliffConfigTemplateDao\:\:editFromJSON\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/API/V3/XliffConfigTemplateController.php - - - - message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:composeZip\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Cannot access offset ''query'' on \$this\(Controller\\Abstracts\\KleinController\)\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:finalize\(\) has no return type specified\.$#' + message: '#^Method Controller\\Abstracts\\KleinController\:\:afterValidate\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:finalize\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\Abstracts\\KleinController\:\:broadcastLogout\(\) throws checked exception Stomp\\Exception\\ConnectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:nocache\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Controller\\Abstracts\\KleinController\:\:getFeatureSet\(\) should return Model\\FeaturesBase\\FeatureSet but returns Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: return.type count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:setMimeType\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Controller\\Abstracts\\KleinController\:\:getParams\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:unlockToken\(\) has no return type specified\.$#' + message: '#^Method Controller\\Abstracts\\KleinController\:\:getPutParams\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Method Controller\\Abstracts\\AbstractDownloadController\:\:unlockToken\(\) has parameter \$tokenContent with no type specified\.$#' + message: '#^Method Controller\\Abstracts\\KleinController\:\:parseIdSegment\(\) has parameter \$id_segment with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Offset ''basename'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound + message: '#^Method Controller\\Abstracts\\KleinController\:\:parseIdSegment\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Offset ''extension'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound + message: '#^Method Controller\\Abstracts\\KleinController\:\:setAuthKeysIfExists\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/Abstracts/KleinController.php + + - + message: '#^Method Controller\\Abstracts\\KleinController\:\:startTimer\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Parameter \#1 \$id_project of static method Model\\Files\\FileDao\:\:getByProjectId\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^PHPDoc tag @var with type \$this\(Controller\\Abstracts\\KleinController\) is not subtype of native type array\|int\|string\|false\|null\.$#' + identifier: varTag.nativeType count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Parameter \#1 \$string of function strtolower expects string, array\|string given\.$#' + message: '#^Parameter \#1 \$body of class Stomp\\Transport\\Message constructor expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Parameter \#2 \$value of static method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Property Controller\\Abstracts\\AbstractDownloadController\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' - identifier: assign.propertyType + message: '#^Property Controller\\Abstracts\\KleinController\:\:\$params type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/AbstractDownloadController.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:destroyAuthentication\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Controller\\Abstracts\\KleinController\:\:\$timingCustomObject type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/Authentication/AuthCookie.php + path: lib/Controller/Abstracts/KleinController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:generateSignedAuthCookie\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileDownloadFromPointer\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/Authentication/AuthCookie.php + path: lib/Controller/Traits/KleinResponseFileStream.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:getCredentials\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileDownloadFromPointer\(\) has parameter \$filePointer with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/Authentication/AuthCookie.php + path: lib/Controller/Traits/KleinResponseFileStream.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:getCredentials\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileDownloadFromPointer\(\) has parameter \$filename with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/Authentication/AuthCookie.php + path: lib/Controller/Traits/KleinResponseFileStream.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthCookie\:\:getData\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileFromPointer\(\) throws checked exception Klein\\Exceptions\\ResponseAlreadySentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/Authentication/AuthCookie.php + path: lib/Controller/Traits/KleinResponseFileStream.php - - message: '#^Parameter \#1 \$userId of method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:removeLoginCookieFromStore\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileInlineFromPointer\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/Authentication/AuthCookie.php + path: lib/Controller/Traits/KleinResponseFileStream.php - - message: '#^Parameter \#1 \$userId of method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:setCookieLoginTokenActive\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Controller/Abstracts/Authentication/AuthCookie.php + message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileInlineFromPointer\(\) has parameter \$filePointer with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Controller/Traits/KleinResponseFileStream.php - - message: '#^Anonymous function has an unused use \$membersDao\.$#' - identifier: closure.unusedUse + message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileInlineFromPointer\(\) has parameter \$filename with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Traits/KleinResponseFileStream.php - - message: '#^Cannot call method getUser\(\) on Model\\ApiKeys\\ApiKeyStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileInlineFromPointer\(\) has parameter \$mimeType with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Traits/KleinResponseFileStream.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:__construct\(\) has parameter \$session with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access offset ''id_project'' on array\|false\|null\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 3 + path: lib/Controller/Views/ActivityLogController.php + + - + message: '#^Cannot access offset ''password'' on array\|false\|null\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/ActivityLogController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:destroyAuthentication\(\) has parameter \$session with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Views\\ActivityLogController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/ActivityLogController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:getInstance\(\) has parameter \$session with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method dispatchFilter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:getUserProfile\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method getCodes\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:refreshSession\(\) has parameter \$session with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^PHPDoc tag @var has invalid value \(\$team TeamStruct\)\: Unexpected token "\$team", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Expression on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.expr count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^PHPDoc tag @var has invalid value \(\$user UserStruct\)\: Unexpected token "\$user", expected type at offset 28 on line 2$#' - identifier: phpDoc.parseError + message: '#^If condition is always true\.$#' + identifier: if.alwaysTrue count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Parameter \#2 \$array of function array_map expects array, array\\|null given\.$#' - identifier: argument.type + message: '#^Method Controller\\Views\\AnalyzeController\:\:renderView\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Property Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:\$logged \(true\) does not accept bool\.$#' - identifier: assign.propertyType + message: '#^Method Controller\\Views\\AnalyzeController\:\:renderView\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Property Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:\$session type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Views\\AnalyzeController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Property Controller\\Abstracts\\Authentication\\AuthenticationHelper\:\:\$user \(Model\\Users\\UserStruct\) does not accept Model\\Users\\UserStruct\|null\.$#' - identifier: assign.propertyType - count: 2 - path: lib/Controller/Abstracts/Authentication/AuthenticationHelper.php + message: '#^Parameter \#1 \$id_project of method Model\\Jobs\\ChunkDao\:\:getByProjectID\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Comparison operation "\>\=" between 1 and 0 is always true\.$#' - identifier: greaterOrEqual.alwaysTrue + message: '#^Parameter \#2 \$features of class Model\\Analysis\\Status constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Abstracts/Authentication/CookieManager.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Abstracts/Authentication/CookieManager.php + path: lib/Controller/Views/AnalyzeController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method appendDecorators\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' - identifier: return.type - count: 2 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + message: '#^Cannot call method dispatchFilter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Controller/Views/CattoolController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method getCodes\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_setInCacheMap\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\Views\\CattoolController\:\:_saveActivity\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:isLoginCookieStillActive\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Controller\\Views\\CattoolController\:\:archived\(\) has parameter \$jobOwnership with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' - identifier: argument.type + message: '#^Method Controller\\Views\\CattoolController\:\:cancelled\(\) has parameter \$jobOwnership with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php - - - - message: '#^Template type T of method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Method Controller\\Views\\CattoolController\:\:findOwnerEmailAndTeam\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Template type T of method Controller\\Abstracts\\Authentication\\SessionTokenStoreHandler\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Method Controller\\Views\\CattoolController\:\:getActiveEngine\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/Authentication/SessionTokenStoreHandler.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$ajaxDomainsNumber\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\CattoolController\:\:getCategoriesAsJson\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$basepath\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\CattoolController\:\:searchableStatuses\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$build_number\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\CattoolController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$config_js\.$#' - identifier: property.notFound - count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + message: '#^Method Controller\\Views\\CattoolController\:\:validateTheRequest\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$css_resources\.$#' - identifier: property.notFound + message: '#^Offset 0 might not exist on array\\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$enableMultiDomainApi\.$#' - identifier: property.notFound + message: '#^PHPDoc tag @var has invalid value \(\$chunkReviewStruct \?ChunkReviewStruct\)\: Unexpected token "\$chunkReviewStruct", expected type at offset 10 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$facebookAuthUrl\.$#' - identifier: property.notFound + message: '#^PHPDoc tag @var has invalid value \(\$chunkReviewStruct ChunkReviewStruct\)\: Unexpected token "\$chunkReviewStruct", expected type at offset 36 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$flashMessages\.$#' - identifier: property.notFound + message: '#^PHPDoc tag @var has invalid value \(\$chunkStruct JobStruct\)\: Unexpected token "\$chunkStruct", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$footer_js\.$#' - identifier: property.notFound + message: '#^PHPDoc tag @var has invalid value \(\$memberStruct MembershipStruct\)\: Unexpected token "\$memberStruct", expected type at offset 32 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$gdriveAuthURL\.$#' - identifier: property.notFound + message: '#^Parameter \#2 \$array of function array_map expects array, array\\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$githubAuthUrl\.$#' - identifier: property.notFound + message: '#^Property Controller\\Views\\CattoolController\:\:\$id_job \(int\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$googleAuthURL\.$#' - identifier: property.notFound + message: '#^Property Controller\\Views\\CattoolController\:\:\$request_password \(string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$googleDriveEnabled\.$#' - identifier: property.notFound + message: '#^Property Controller\\Views\\CattoolController\:\:\$request_password is never read, only written\.$#' + identifier: property.onlyWritten count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$hostpath\.$#' - identifier: property.notFound + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/CattoolController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$isAnInternalUser\.$#' - identifier: property.notFound + message: '#^Cannot access offset ''id_project'' on array\|false\|null\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/ContextReviewController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$isLoggedIn\.$#' - identifier: property.notFound + message: '#^Cannot access offset ''password'' on array\|false\|null\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/ContextReviewController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$linkedInAuthUrl\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\ContextReviewController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/ContextReviewController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$maxFileSize\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\ManageController\:\:renderView\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/ManageController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$maxTMXFileSize\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\ManageController\:\:renderView\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/ManageController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$microsoftAuthUrl\.$#' - identifier: property.notFound + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/ManageController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$support_mail\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\OauthResponseHandlerController\:\:_initRemoteUser\(\) has parameter \$code with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/OauthResponseHandlerController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$userMail\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\OauthResponseHandlerController\:\:_processSuccessfulOAuth\(\) has parameter \$code with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/OauthResponseHandlerController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$user_plugins\.$#' - identifier: property.notFound - count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + message: '#^Method Controller\\Views\\OauthResponseHandlerController\:\:_processSuccessfulOAuth\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Controller/Views/OauthResponseHandlerController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$x_nonce_unique_id\.$#' - identifier: property.notFound + message: '#^Parameter \#2 \$provider of method Controller\\Views\\OauthResponseHandlerController\:\:_processSuccessfulOAuth\(\) expects null, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/OauthResponseHandlerController.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$x_self_ajax_location_hosts\.$#' - identifier: property.notFound + message: '#^Method Controller\\Views\\OutsourceTo\\AbstractController\:\:afterConstruct\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/OutsourceTo/AbstractController.php - - message: '#^Cannot access offset ''host'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Method Controller\\Views\\OutsourceTo\\AbstractController\:\:validateTheRequest\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/OutsourceTo/AbstractController.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Offset ''currency'' might not exist on Utils\\Shop\\AbstractItem\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/OutsourceTo/AbstractController.php - - message: '#^Cannot call method getCodes\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject - count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + message: '#^Offset ''id'' might not exist on Utils\\Shop\\AbstractItem\|null\.$#' + identifier: offsetAccess.notFound + count: 2 + path: lib/Controller/Views/OutsourceTo/AbstractController.php - - message: '#^Cannot call method loadFromUserEmail\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Offset ''quote_pid'' might not exist on Utils\\Shop\\AbstractItem\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/OutsourceTo/AbstractController.php - - message: '#^Method Controller\\Abstracts\\BaseKleinViewController\:\:addParamsToView\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Views\\QualityReportController\:\:renderView\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/QualityReportController.php - - message: '#^Method Controller\\Abstracts\\BaseKleinViewController\:\:render\(\) throws checked exception Klein\\Exceptions\\ResponseAlreadySentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\Views\\QualityReportController\:\:renderView\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/QualityReportController.php - - message: '#^Method Controller\\Abstracts\\BaseKleinViewController\:\:setView\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Views\\QualityReportController\:\:searchableStatuses\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/BaseKleinViewController.php + path: lib/Controller/Views/QualityReportController.php - - message: '#^Method Controller\\Abstracts\\FlashMessage\:\:flush\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Controller\\Views\\QualityReportController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/FlashMessage.php + path: lib/Controller/Views/QualityReportController.php - - message: '#^Method Controller\\Abstracts\\FlashMessage\:\:set\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Abstracts/FlashMessage.php + path: lib/Controller/Views/QualityReportController.php - - message: '#^Method Controller\\Abstracts\\FlashMessage\:\:set\(\) has parameter \$key with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\Views\\TemplateDecorator\\AbstractDecorator\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/FlashMessage.php + path: lib/Controller/Views/TemplateDecorator/AbstractDecorator.php - - message: '#^Method Controller\\Abstracts\\FlashMessage\:\:set\(\) has parameter \$type with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Controller\\Views\\TemplateDecorator\\AbstractDecorator\:\:decorate\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/FlashMessage.php + path: lib/Controller/Views/TemplateDecorator/AbstractDecorator.php - - message: '#^Method Controller\\Abstracts\\FlashMessage\:\:set\(\) has parameter \$value with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Controller\\Views\\TemplateDecorator\\AbstractDecorator\:\:\$template \(Utils\\Templating\\PHPTALWithAppend\) does not accept Utils\\Templating\\PHPTALWithAppend\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Abstracts/FlashMessage.php + path: lib/Controller/Views/TemplateDecorator/AbstractDecorator.php - - message: '#^Method Controller\\Abstracts\\IController\:\:getFeatureSet\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Controller/Abstracts/IController.php + message: '#^Loose comparison using \=\= between ''LuceneArabicTokeniz…''\|''LuceneArmenianToken…''\|''LuceneBasqueTokeniz…''\|''LuceneBulgarianToke…''\|''LuceneCatalanTokeni…''\|''LuceneCzechTokenizer''\|''LuceneDanishTokeniz…''\|''LuceneDutchTokenizer''\|''LuceneEnglishTokeni…''\|''LuceneFinnishTokeni…''\|''LuceneFrenchTokeniz…''\|''LuceneGalicianToken…''\|''LuceneGermanTokeniz…''\|''LuceneGreekTokenizer''\|''LuceneHindiTokenizer''\|''LuceneHungarianToke…''\|''LuceneIndonesianTok…''\|''LuceneIrishTokenizer''\|''LuceneItalianTokeni…''\|''LuceneJapaneseToken…''\|''LuceneKoreanTokeniz…''\|''LuceneLatvianTokeni…''\|''LuceneNorwegianToke…''\|''LucenePersianTokeni…''\|''LucenePortugueseTok…''\|''LuceneRomanianToken…''\|''LuceneRussianTokeni…''\|''LuceneSmartChineseT…''\|''LuceneSpanishTokeni…''\|''LuceneSwedishTokeni…''\|''LuceneThaiTokenizer''\|''LuceneTurkishTokeni…'' and null will always evaluate to false\.$#' + identifier: equal.alwaysFalse + count: 2 + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Cannot access offset ''query'' on \$this\(Controller\\Abstracts\\KleinController\)\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:createOmegaTZip\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Method Controller\\Abstracts\\KleinController\:\:afterValidate\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:createOmegaTZip\(\) has parameter \$output_content with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Method Controller\\Abstracts\\KleinController\:\:broadcastLogout\(\) throws checked exception Stomp\\Exception\\ConnectionException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:createOmegaTZip\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Controller/Abstracts/KleinController.php - - - - message: '#^Method Controller\\Abstracts\\KleinController\:\:getFeatureSet\(\) should return Model\\FeaturesBase\\FeatureSet but returns Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: return.type - count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Method Controller\\Abstracts\\KleinController\:\:getParams\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:decorate\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Method Controller\\Abstracts\\KleinController\:\:getPutParams\(\) has no return type specified\.$#' + message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:getOmegatProjectFile\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Method Controller\\Abstracts\\KleinController\:\:parseIdSegment\(\) has parameter \$id_segment with no type specified\.$#' + message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:getOmegatProjectFile\(\) has parameter \$source with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Method Controller\\Abstracts\\KleinController\:\:parseIdSegment\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:getOmegatProjectFile\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Method Controller\\Abstracts\\KleinController\:\:setAuthKeysIfExists\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Offset ''extension'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 2 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Method Controller\\Abstracts\\KleinController\:\:startTimer\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Controller/Abstracts/KleinController.php + message: '#^Offset ''filename'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound + count: 4 + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^PHPDoc tag @var with type \$this\(Controller\\Abstracts\\KleinController\) is not subtype of native type array\|int\|string\|false\|null\.$#' - identifier: varTag.nativeType + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Parameter \#1 \$body of class Stomp\\Transport\\Message constructor expects string, string\|false given\.$#' + message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' + message: '#^Parameter \#2 \$value of static method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/UploadPageController.php - - message: '#^Property Controller\\Abstracts\\KleinController\:\:\$params type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Controller\\Views\\XliffToTargetController\:\:renderView\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Controller/Views/XliffToTargetController.php - - message: '#^Property Controller\\Abstracts\\KleinController\:\:\$timingCustomObject type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Abstracts/KleinController.php + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileDownloadFromPointer\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:create\(\) should return int but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Controller/Traits/KleinResponseFileStream.php + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileDownloadFromPointer\(\) has parameter \$filePointer with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Controller/Traits/KleinResponseFileStream.php + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:create\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileDownloadFromPointer\(\) has parameter \$filename with no type specified\.$#' + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getAllForProject\(\) has parameter \$id_project with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/Traits/KleinResponseFileStream.php + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileFromPointer\(\) throws checked exception Klein\\Exceptions\\ResponseAlreadySentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getAllForProject\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Traits/KleinResponseFileStream.php + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileInlineFromPointer\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Controller/Traits/KleinResponseFileStream.php + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getAllForProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileInlineFromPointer\(\) has parameter \$filePointer with no type specified\.$#' + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getByID\(\) has parameter \$activity_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/Traits/KleinResponseFileStream.php + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileInlineFromPointer\(\) has parameter \$filename with no type specified\.$#' + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getByID\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ActivityLog/ActivityLogDao.php + + - + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getLastActionInProject\(\) has parameter \$id_project with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/Traits/KleinResponseFileStream.php + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Traits\\KleinResponseFileStream\:\:streamFileInlineFromPointer\(\) has parameter \$mimeType with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getLastActionInProject\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Traits/KleinResponseFileStream.php + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Cannot access offset ''id_project'' on array\|false\|null\.$#' - identifier: offsetAccess.nonOffsetAccessible - count: 3 - path: lib/Controller/Views/ActivityLogController.php + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getLastActionInProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Cannot access offset ''password'' on array\|false\|null\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:read\(\) has parameter \$whereKeys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/ActivityLogController.php + path: lib/Model/ActivityLog/ActivityLogDao.php - - message: '#^Method Controller\\Views\\ActivityLogController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$actionsStrings type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/ActivityLogController.php + path: lib/Model/ActivityLog/ActivityLogStruct.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$cached_results type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/AnalyzeController.php + path: lib/Model/ActivityLog/ActivityLogStruct.php - - message: '#^Cannot call method getCodes\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Method Model\\Analysis\\AbstractStatus\:\:__construct\(\) has parameter \$_project_data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/AnalyzeController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Method Model\\Analysis\\AbstractStatus\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Controller/Views/AnalyzeController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^If condition is always true\.$#' - identifier: if.alwaysTrue - count: 1 - path: lib/Controller/Views/AnalyzeController.php + message: '#^Method Model\\Analysis\\AbstractStatus\:\:_fetchProjectData\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\AnalyzeController\:\:renderView\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Model\\Analysis\\AbstractStatus\:\:fetchData\(\) should return \$this\(Model\\Analysis\\AbstractStatus\) but returns Model\\Analysis\\AbstractStatus\.$#' + identifier: return.type count: 1 - path: lib/Controller/Views/AnalyzeController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\AnalyzeController\:\:renderView\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Analysis\\AbstractStatus\:\:getResult\(\) should return View\\API\\App\\Json\\Analysis\\AnalysisProject but returns View\\API\\App\\Json\\Analysis\\AnalysisProject\|null\.$#' + identifier: return.type count: 1 - path: lib/Controller/Views/AnalyzeController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\AnalyzeController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Analysis\\AbstractStatus\:\:isOutsourceEnabled\(\) has parameter \$idJob with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Views/AnalyzeController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Parameter \#1 \$id_project of method Model\\Jobs\\ChunkDao\:\:getByProjectID\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Analysis\\AbstractStatus\:\:isOutsourceEnabled\(\) has parameter \$id_customer with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Views/AnalyzeController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Parameter \#2 \$features of class Model\\Analysis\\Status constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Analysis\\AbstractStatus\:\:isOutsourceEnabled\(\) has parameter \$targetLang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Views/AnalyzeController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/Views/AnalyzeController.php + message: '#^Method Model\\Analysis\\AbstractStatus\:\:loadObjects\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Cannot call method appendDecorators\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$mt_we_workflow_enabled of static method Model\\Analysis\\Constants\\MatchConstantsFactory\:\:getInstance\(\) expects bool\|null, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$pid of static method Model\\Analysis\\AnalysisDao\:\:getProjectStatsVolumeAnalysis\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Cannot call method getCodes\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$qid of method Utils\\ActiveMQ\\AMQHandler\:\:getActualForQID\(\) expects null, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Cannot call method loadForProject\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$raw of method View\\API\\App\\Json\\Analysis\\AnalysisJob\:\:incrementRaw\(\) expects int, float given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\CattoolController\:\:_saveActivity\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Controller/Views/CattoolController.php + message: '#^Parameter \#3 \$user of class View\\API\\App\\Json\\Analysis\\AnalysisChunk constructor expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\CattoolController\:\:archived\(\) has parameter \$jobOwnership with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#6 \$metadata of class View\\API\\App\\Json\\Analysis\\AnalysisFile constructor expects array, array\\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\CattoolController\:\:cancelled\(\) has parameter \$jobOwnership with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\Analysis\\AbstractStatus\:\:\$_others_in_queue \(int\) does not accept int\|string\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\CattoolController\:\:findOwnerEmailAndTeam\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Analysis\\AbstractStatus\:\:\$_project_data type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\CattoolController\:\:getActiveEngine\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Analysis\\AbstractStatus\:\:\$_resultSet type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\CattoolController\:\:getCategoriesAsJson\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\Analysis\\AbstractStatus\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AbstractStatus.php - - message: '#^Method Controller\\Views\\CattoolController\:\:searchableStatuses\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Controller/Views/CattoolController.php - - - - message: '#^Method Controller\\Views\\CattoolController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Analysis\\AnalysisDao\:\:destroyCacheByProjectId\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AnalysisDao.php - - message: '#^Method Controller\\Views\\CattoolController\:\:validateTheRequest\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Analysis\\AnalysisDao\:\:destroyCacheByProjectId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Controller/Views/CattoolController.php - - - - message: '#^Offset 0 might not exist on array\\|null\.$#' - identifier: offsetAccess.notFound count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AnalysisDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$chunkReviewStruct \?ChunkReviewStruct\)\: Unexpected token "\$chunkReviewStruct", expected type at offset 10 on line 1$#' - identifier: phpDoc.parseError + message: '#^Method Model\\Analysis\\AnalysisDao\:\:getProjectStatsVolumeAnalysis\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AnalysisDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$chunkReviewStruct ChunkReviewStruct\)\: Unexpected token "\$chunkReviewStruct", expected type at offset 36 on line 2$#' - identifier: phpDoc.parseError - count: 1 - path: lib/Controller/Views/CattoolController.php + message: '#^Method Model\\Analysis\\AnalysisDao\:\:getProjectStatsVolumeAnalysis\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Analysis/AnalysisDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$chunkStruct JobStruct\)\: Unexpected token "\$chunkStruct", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/AnalysisDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$memberStruct MembershipStruct\)\: Unexpected token "\$memberStruct", expected type at offset 32 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Model\\Analysis\\Constants\\AbstractConstants\:\:forValue\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/Constants/AbstractConstants.php - - message: '#^Parameter \#2 \$array of function array_map expects array, array\\|null given\.$#' - identifier: argument.type + message: '#^Property Model\\Analysis\\Constants\\AbstractConstants\:\:\$forValue type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/Constants/AbstractConstants.php - - message: '#^Property Controller\\Views\\CattoolController\:\:\$id_job \(int\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Model\\Analysis\\Constants\\ConstantsInterface\:\:forValue\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/Constants/ConstantsInterface.php - - message: '#^Property Controller\\Views\\CattoolController\:\:\$request_password \(string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Property Model\\Analysis\\Constants\\MTQEMatchTypeNamesConstants\:\:\$forValue type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/Constants/MTQEMatchTypeNamesConstants.php - - message: '#^Property Controller\\Views\\CattoolController\:\:\$request_password is never read, only written\.$#' - identifier: property.onlyWritten + message: '#^Property Model\\Analysis\\Constants\\StandardMatchTypeNamesConstants\:\:\$forValue type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/Constants/StandardMatchTypeNamesConstants.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Model\\Analysis\\PayableRates\:\:getBreakDown\(\) has parameter \$breakdowns with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/CattoolController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Method Controller\\Views\\ManageController\:\:renderView\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Model\\Analysis\\PayableRates\:\:getBreakDown\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/ManageController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Method Controller\\Views\\ManageController\:\:renderView\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Analysis\\PayableRates\:\:getPayableRates\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/ManageController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Model\\Analysis\\PayableRates\:\:resolveBreakdowns\(\) has parameter \$breakdowns with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/ManageController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Method Controller\\Views\\OauthResponseHandlerController\:\:_initRemoteUser\(\) has parameter \$code with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\Analysis\\PayableRates\:\:resolveBreakdowns\(\) has parameter \$default with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/OauthResponseHandlerController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Method Controller\\Views\\OauthResponseHandlerController\:\:_processSuccessfulOAuth\(\) has parameter \$code with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\Analysis\\PayableRates\:\:resolveBreakdowns\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/OauthResponseHandlerController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Method Controller\\Views\\OauthResponseHandlerController\:\:_processSuccessfulOAuth\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#4 \$isoSource of static method Model\\Analysis\\PayableRates\:\:getBreakDown\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 2 - path: lib/Controller/Views/OauthResponseHandlerController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Parameter \#2 \$provider of method Controller\\Views\\OauthResponseHandlerController\:\:_processSuccessfulOAuth\(\) expects null, string\|false\|null given\.$#' + message: '#^Parameter \#5 \$isoTarget of static method Model\\Analysis\\PayableRates\:\:getBreakDown\(\) expects string, string\|null given\.$#' identifier: argument.type + count: 2 + path: lib/Model/Analysis/PayableRates.php + + - + message: '#^Property Model\\Analysis\\PayableRates\:\:\$DEFAULT_PAYABLE_RATES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/OauthResponseHandlerController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Method Controller\\Views\\OutsourceTo\\AbstractController\:\:afterConstruct\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Model\\Analysis\\PayableRates\:\:\$langPair2MTpayableRates type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/OutsourceTo/AbstractController.php + path: lib/Model/Analysis/PayableRates.php - - message: '#^Method Controller\\Views\\OutsourceTo\\AbstractController\:\:validateTheRequest\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method format\(\) on DateTime\|false\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Views/OutsourceTo/AbstractController.php + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Offset ''currency'' might not exist on Utils\\Shop\\AbstractItem\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Cannot call method getCreateDate\(\) on View\\API\\App\\Json\\Analysis\\AnalysisProject\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Views/OutsourceTo/AbstractController.php + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Offset ''id'' might not exist on Utils\\Shop\\AbstractItem\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Cannot call method getJobs\(\) on View\\API\\App\\Json\\Analysis\\AnalysisProject\|null\.$#' + identifier: method.nonObject count: 2 - path: lib/Controller/Views/OutsourceTo/AbstractController.php + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Offset ''quote_pid'' might not exist on Utils\\Shop\\AbstractItem\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Cannot call method getName\(\) on View\\API\\App\\Json\\Analysis\\AnalysisProject\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Controller/Views/OutsourceTo/AbstractController.php + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Method Controller\\Views\\QualityReportController\:\:renderView\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Model\\Analysis\\XTRFStatus\:\:formatFile\(\) has parameter \$vector with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Views/QualityReportController.php + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Method Controller\\Views\\QualityReportController\:\:renderView\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Analysis\\XTRFStatus\:\:formatFile\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Controller/Views/QualityReportController.php + count: 13 + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Method Controller\\Views\\QualityReportController\:\:searchableStatuses\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Analysis\\XTRFStatus\:\:getResultArray\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Controller/Views/QualityReportController.php + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Method Controller\\Views\\QualityReportController\:\:validateTheRequest\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$string of function str_pad expects string, float given\.$#' + identifier: argument.type count: 1 - path: lib/Controller/Views/QualityReportController.php + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$ip \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/Views/QualityReportController.php + message: '#^Parameter \#1 \$string of function str_pad expects string, int given\.$#' + identifier: argument.type + count: 13 + path: lib/Model/Analysis/XTRFStatus.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\AbstractDecorator\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot access property \$id on Model\\ApiKeys\\ApiKeyStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Controller/Views/TemplateDecorator/AbstractDecorator.php + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\AbstractDecorator\:\:decorate\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:create\(\) has parameter \$obj with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Views/TemplateDecorator/AbstractDecorator.php + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Property Controller\\Views\\TemplateDecorator\\AbstractDecorator\:\:\$template \(Utils\\Templating\\PHPTALWithAppend\) does not accept Utils\\Templating\\PHPTALWithAppend\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Controller/Views/TemplateDecorator/AbstractDecorator.php + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:create\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Loose comparison using \=\= between ''LuceneArabicTokeniz…''\|''LuceneArmenianToken…''\|''LuceneBasqueTokeniz…''\|''LuceneBulgarianToke…''\|''LuceneCatalanTokeni…''\|''LuceneCzechTokenizer''\|''LuceneDanishTokeniz…''\|''LuceneDutchTokenizer''\|''LuceneEnglishTokeni…''\|''LuceneFinnishTokeni…''\|''LuceneFrenchTokeniz…''\|''LuceneGalicianToken…''\|''LuceneGermanTokeniz…''\|''LuceneGreekTokenizer''\|''LuceneHindiTokenizer''\|''LuceneHungarianToke…''\|''LuceneIndonesianTok…''\|''LuceneIrishTokenizer''\|''LuceneItalianTokeni…''\|''LuceneJapaneseToken…''\|''LuceneKoreanTokeniz…''\|''LuceneLatvianTokeni…''\|''LuceneNorwegianToke…''\|''LucenePersianTokeni…''\|''LucenePortugueseTok…''\|''LuceneRomanianToken…''\|''LuceneRussianTokeni…''\|''LuceneSmartChineseT…''\|''LuceneSpanishTokeni…''\|''LuceneSwedishTokeni…''\|''LuceneThaiTokenizer''\|''LuceneTurkishTokeni…'' and null will always evaluate to false\.$#' - identifier: equal.alwaysFalse - count: 2 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:deleteByUid\(\) has parameter \$uid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:createOmegaTZip\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:deleteByUid\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:createOmegaTZip\(\) has parameter \$output_content with no type specified\.$#' + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:findByKey\(\) has parameter \$key with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:createOmegaTZip\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:findByKey\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php + count: 4 + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:decorate\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:getById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:getOmegatProjectFile\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:getById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:getOmegatProjectFile\(\) has parameter \$source with no type specified\.$#' + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:getByUid\(\) has parameter \$uid with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php + path: lib/Model/ApiKeys/ApiKeyDao.php - - message: '#^Method Controller\\Views\\TemplateDecorator\\DownloadOmegaTOutputDecorator\:\:getOmegatProjectFile\(\) has parameter \$target with no type specified\.$#' + message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:getByUid\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ApiKeys/ApiKeyDao.php + + - + message: '#^Method Model\\ApiKeys\\ApiKeyStruct\:\:validSecret\(\) has parameter \$secret with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php + path: lib/Model/ApiKeys/ApiKeyStruct.php - - message: '#^Offset ''extension'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound - count: 2 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - - - message: '#^Offset ''filename'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound - count: 4 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - - - message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/Views/TemplateDecorator/DownloadOmegaTOutputDecorator.php - - - - message: '#^Parameter \#2 \$value of static method Controller\\Abstracts\\Authentication\\CookieManager\:\:setCookie\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Controller/Views/UploadPageController.php - - - - message: '#^Method Controller\\Views\\XliffToTargetController\:\:renderView\(\) has no return type specified\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:_buildResult\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Controller/Views/XliffToTargetController.php + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ActivityLog/ActivityLogDao.php + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:create\(\) should return int but returns string\|false\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:createFromChunk\(\) should return string but returns string\|false\.$#' identifier: return.type count: 1 - path: lib/Model/ActivityLog/ActivityLogDao.php + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:create\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:createFromChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/ActivityLog/ActivityLogDao.php - - - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getAllForProject\(\) has parameter \$id_project with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Model/ActivityLog/ActivityLogDao.php - - - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getAllForProject\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/ActivityLog/ActivityLogDao.php + count: 3 + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getAllForProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:deleteEvent\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/ActivityLog/ActivityLogDao.php + count: 3 + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getByID\(\) has parameter \$activity_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:getByIdAndChunk\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/ActivityLog/ActivityLogDao.php + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getByID\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:getByIdAndChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 4 - path: lib/Model/ActivityLog/ActivityLogDao.php + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getLastActionInProject\(\) has parameter \$id_project with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:lastCompletionRecord\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ActivityLog/ActivityLogDao.php + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getLastActionInProject\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:lastCompletionRecord\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ActivityLog/ActivityLogDao.php + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:getLastActionInProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:updatePassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/ActivityLog/ActivityLogDao.php - - - - message: '#^Method Model\\ActivityLog\\ActivityLogDao\:\:read\(\) has parameter \$whereKeys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/ActivityLog/ActivityLogDao.php + count: 3 + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$actionsStrings type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:validSources\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ActivityLog/ActivityLogStruct.php + path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - message: '#^Property Model\\ActivityLog\\ActivityLogStruct\:\:\$cached_results type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/ActivityLog/ActivityLogStruct.php + path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:__construct\(\) has parameter \$_project_data with no value type specified in iterable type array\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/AbstractStatus.php - - - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:_fetchProjectData\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:createOrUpdateFromStruct\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Model/Analysis/AbstractStatus.php - - - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:fetchData\(\) should return \$this\(Model\\Analysis\\AbstractStatus\) but returns Model\\Analysis\\AbstractStatus\.$#' - identifier: return.type - count: 1 - path: lib/Model/Analysis/AbstractStatus.php - - - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:getResult\(\) should return View\\API\\App\\Json\\Analysis\\AnalysisProject but returns View\\API\\App\\Json\\Analysis\\AnalysisProject\|null\.$#' - identifier: return.type - count: 1 - path: lib/Model/Analysis/AbstractStatus.php + count: 3 + path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:isOutsourceEnabled\(\) has parameter \$idJob with no type specified\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:updatePassword\(\) has parameter \$id_job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:isOutsourceEnabled\(\) has parameter \$id_customer with no type specified\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:updatePassword\(\) has parameter \$old_password with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:isOutsourceEnabled\(\) has parameter \$targetLang with no type specified\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:updatePassword\(\) has parameter \$password with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - message: '#^Method Model\\Analysis\\AbstractStatus\:\:loadObjects\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:updatePassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 3 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - message: '#^Parameter \#1 \$mt_we_workflow_enabled of static method Model\\Analysis\\Constants\\MatchConstantsFactory\:\:getInstance\(\) expects bool\|null, string\|false given\.$#' - identifier: argument.type + message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:validSources\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - message: '#^Parameter \#1 \$pid of static method Model\\Analysis\\AnalysisDao\:\:getProjectStatsVolumeAnalysis\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Comments\\BaseCommentStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/Comments/BaseCommentStruct.php - - message: '#^Parameter \#1 \$qid of method Utils\\ActiveMQ\\AMQHandler\:\:getActualForQID\(\) expects null, int\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Comments\\BaseCommentStruct\:\:templateMessage\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/Comments/BaseCommentStruct.php - - message: '#^Parameter \#1 \$raw of method View\\API\\App\\Json\\Analysis\\AnalysisJob\:\:incrementRaw\(\) expects int, float given\.$#' + message: '#^Parameter \#1 \$object of function date_format expects DateTimeInterface, DateTime\|false given\.$#' identifier: argument.type - count: 1 - path: lib/Model/Analysis/AbstractStatus.php + count: 2 + path: lib/Model/Comments/BaseCommentStruct.php - - message: '#^Parameter \#3 \$user of class View\\API\\App\\Json\\Analysis\\AnalysisChunk constructor expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Comments\\CommentDao\:\:deleteComment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Parameter \#6 \$metadata of class View\\API\\App\\Json\\Analysis\\AnalysisFile constructor expects array, array\\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Comments\\CommentDao\:\:destroySegmentIdSegmentCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Property Model\\Analysis\\AbstractStatus\:\:\$_others_in_queue \(int\) does not accept int\|string\.$#' - identifier: assign.propertyType + message: '#^Method Model\\Comments\\CommentDao\:\:getById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Property Model\\Analysis\\AbstractStatus\:\:\$_project_data type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Comments\\CommentDao\:\:getCommentsForChunk\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Property Model\\Analysis\\AbstractStatus\:\:\$_resultSet type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Analysis/AbstractStatus.php + message: '#^Method Model\\Comments\\CommentDao\:\:getCommentsForChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/Comments/CommentDao.php - - message: '#^Property Model\\Analysis\\AbstractStatus\:\:\$project \(Model\\Projects\\ProjectStruct\) does not accept Model\\Projects\\ProjectStruct\|null\.$#' - identifier: assign.propertyType + message: '#^Method Model\\Comments\\CommentDao\:\:getOpenThreadsForProjects\(\) has parameter \$projectIds with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/AbstractStatus.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\AnalysisDao\:\:destroyCacheByProjectId\(\) has parameter \$project_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\Comments\\CommentDao\:\:getOpenThreadsForProjects\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/AnalysisDao.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\AnalysisDao\:\:destroyCacheByProjectId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Comments\\CommentDao\:\:getOpenThreadsForProjects\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/Analysis/AnalysisDao.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\AnalysisDao\:\:getProjectStatsVolumeAnalysis\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Comments\\CommentDao\:\:getThreadContributorUids\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/AnalysisDao.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\AnalysisDao\:\:getProjectStatsVolumeAnalysis\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Comments\\CommentDao\:\:getThreadContributorUids\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Model/Analysis/AnalysisDao.php + count: 4 + path: lib/Model/Comments/CommentDao.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Model\\Comments\\CommentDao\:\:getThreadsBySegments\(\) has parameter \$job_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/AnalysisDao.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\Constants\\AbstractConstants\:\:forValue\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Comments\\CommentDao\:\:getThreadsBySegments\(\) has parameter \$segments_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/Constants/AbstractConstants.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Property Model\\Analysis\\Constants\\AbstractConstants\:\:\$forValue type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Comments\\CommentDao\:\:getThreadsBySegments\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/Constants/AbstractConstants.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\Constants\\ConstantsInterface\:\:forValue\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Analysis/Constants/ConstantsInterface.php + message: '#^Method Model\\Comments\\CommentDao\:\:getThreadsBySegments\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Comments/CommentDao.php - - message: '#^Property Model\\Analysis\\Constants\\MTQEMatchTypeNamesConstants\:\:\$forValue type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Comments\\CommentDao\:\:getUsersIdFromContent\(\) has parameter \$content with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/Constants/MTQEMatchTypeNamesConstants.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Property Model\\Analysis\\Constants\\StandardMatchTypeNamesConstants\:\:\$forValue type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Comments\\CommentDao\:\:getUsersIdFromContent\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/Constants/StandardMatchTypeNamesConstants.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\PayableRates\:\:getBreakDown\(\) has parameter \$breakdowns with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Comments\\CommentDao\:\:placeholdContent\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Analysis/PayableRates.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\PayableRates\:\:getBreakDown\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Comments\\CommentDao\:\:placeholdContent\(\) has parameter \$content with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/PayableRates.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\PayableRates\:\:getPayableRates\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Comments\\CommentDao\:\:validateComment\(\) has parameter \$obj with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/PayableRates.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\PayableRates\:\:resolveBreakdowns\(\) has parameter \$breakdowns with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Offset 1 on array\{list\, list\\} in isset\(\) always exists and is not nullable\.$#' + identifier: isset.offset count: 1 - path: lib/Model/Analysis/PayableRates.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\PayableRates\:\:resolveBreakdowns\(\) has parameter \$default with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @return has invalid value \(OpenThreadsStruct\[\];\)\: Unexpected token ";", expected TOKEN_HORIZONTAL_WS at offset 136 on line 6$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Analysis/PayableRates.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Method Model\\Analysis\\PayableRates\:\:resolveBreakdowns\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$res BaseCommentStruct\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Analysis/PayableRates.php + path: lib/Model/Comments/CommentDao.php - - message: '#^Parameter \#4 \$isoSource of static method Model\\Analysis\\PayableRates\:\:getBreakDown\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Analysis/PayableRates.php + message: '#^Property Model\\Comments\\CommentDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Comments/CommentDao.php - - message: '#^Parameter \#5 \$isoTarget of static method Model\\Analysis\\PayableRates\:\:getBreakDown\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Analysis/PayableRates.php + message: '#^Property Model\\Comments\\CommentDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Comments/CommentDao.php - - message: '#^Property Model\\Analysis\\PayableRates\:\:\$DEFAULT_PAYABLE_RATES type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Comments\\CommentStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/PayableRates.php + path: lib/Model/Comments/CommentStruct.php - - message: '#^Property Model\\Analysis\\PayableRates\:\:\$langPair2MTpayableRates type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Analysis/PayableRates.php + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Cannot call method format\(\) on DateTime\|false\.$#' - identifier: method.nonObject + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Analysis/XTRFStatus.php + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Cannot call method getCreateDate\(\) on View\\API\\App\\Json\\Analysis\\AnalysisProject\|null\.$#' - identifier: method.nonObject + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/XTRFStatus.php + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Cannot call method getJobs\(\) on View\\API\\App\\Json\\Analysis\\AnalysisProject\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/Analysis/XTRFStatus.php + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Cannot call method getName\(\) on View\\API\\App\\Json\\Analysis\\AnalysisProject\|null\.$#' - identifier: method.nonObject - count: 1 - path: lib/Model/Analysis/XTRFStatus.php + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findDefaultServiceByUserAndName\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Method Model\\Analysis\\XTRFStatus\:\:formatFile\(\) has parameter \$vector with no type specified\.$#' + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findServiceByUserAndId\(\) has parameter \$id_service with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Analysis/XTRFStatus.php + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Method Model\\Analysis\\XTRFStatus\:\:formatFile\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findServiceByUserAndId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 13 - path: lib/Model/Analysis/XTRFStatus.php + count: 4 + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Method Model\\Analysis\\XTRFStatus\:\:getResultArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Analysis/XTRFStatus.php + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findServicesByUser\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Parameter \#1 \$string of function str_pad expects string, float given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/Analysis/XTRFStatus.php + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findUserServicesByNameAndEmail\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Parameter \#1 \$string of function str_pad expects string, int given\.$#' - identifier: argument.type - count: 13 - path: lib/Model/Analysis/XTRFStatus.php + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:setDefaultService\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Cannot access property \$id on Model\\ApiKeys\\ApiKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:setServiceExpired\(\) has parameter \$time with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/ApiKeys/ApiKeyDao.php + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:create\(\) has parameter \$obj with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Model\\ConnectedServices\\ConnectedServiceDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ApiKeys/ApiKeyDao.php + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:create\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ApiKeys/ApiKeyDao.php + message: '#^Property Model\\ConnectedServices\\ConnectedServiceDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:deleteByUid\(\) has parameter \$uid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method decrypt\(\) on Model\\ConnectedServices\\Oauth\\OauthTokenEncryption\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/ApiKeys/ApiKeyDao.php + path: lib/Model/ConnectedServices/ConnectedServiceStruct.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:deleteByUid\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ApiKeys/ApiKeyDao.php + message: '#^Cannot call method encrypt\(\) on Model\\ConnectedServices\\Oauth\\OauthTokenEncryption\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/ConnectedServices/ConnectedServiceStruct.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:findByKey\(\) has parameter \$key with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\ConnectedServiceStruct\:\:getDecodedOauthAccessToken\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ApiKeys/ApiKeyDao.php + path: lib/Model/ConnectedServices/ConnectedServiceStruct.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:findByKey\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/ApiKeys/ApiKeyDao.php + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/ConnectedServices/ConnectedServiceStruct.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:getById\(\) has parameter \$id with no type specified\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveTokenHandler\:\:accessTokenToJsonString\(\) has parameter \$token with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/ApiKeys/ApiKeyDao.php + path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:getById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ApiKeys/ApiKeyDao.php + message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveTokenHandler\:\:accessTokenToJsonString\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:getByUid\(\) has parameter \$uid with no type specified\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveTokenHandler\:\:getNewToken\(\) has parameter \$client with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/ApiKeys/ApiKeyDao.php - - - - message: '#^Method Model\\ApiKeys\\ApiKeyDao\:\:getByUid\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/ApiKeys/ApiKeyDao.php + path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php - - message: '#^Method Model\\ApiKeys\\ApiKeyStruct\:\:validSecret\(\) has parameter \$secret with no type specified\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveTokenHandler\:\:getNewToken\(\) has parameter \$raw_token with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/ApiKeys/ApiKeyStruct.php + path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#2 \$flags of function json_encode expects int, true given\.$#' + identifier: argument.type count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\ConnectedServices\\GDrive\\GDriveTokenVerifyModel\:\:\$refreshed has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + path: lib/Model/ConnectedServices/GDrive/GDriveTokenVerifyModel.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:createFromChunk\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Strict comparison using \=\=\= between false and string\|null will always evaluate to false\.$#' + identifier: identical.alwaysFalse count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + path: lib/Model/ConnectedServices/GDrive/GDriveTokenVerifyModel.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:createFromChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveUserAuthorizationModel\:\:__collectProperties\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + count: 5 + path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:deleteEvent\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveUserAuthorizationModel\:\:__insertService\(\) should return Model\\ConnectedServices\\ConnectedServiceStruct but returns Model\\ConnectedServices\\ConnectedServiceStruct\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:getByIdAndChunk\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$token of method Model\\ConnectedServices\\ConnectedServiceDao\:\:updateOauthToken\(\) expects string, array\|string given\.$#' + identifier: argument.type count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:getByIdAndChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + message: '#^Parameter \#1 \$token of method Model\\ConnectedServices\\ConnectedServiceStruct\:\:setEncryptedAccessToken\(\) expects string, array\|string given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:lastCompletionRecord\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Property Model\\ConnectedServices\\GDrive\\GDriveUserAuthorizationModel\:\:\$token type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:lastCompletionRecord\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:__construct\(\) has parameter \$raw_token with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:updatePassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php - - - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:validSources\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionEventDao.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:copyFile\(\) has parameter \$copyTitle with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:copyFile\(\) has parameter \$originFileId with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php - - - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:createOrUpdateFromStruct\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:updatePassword\(\) has parameter \$id_job with no type specified\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:getFileLink\(\) has parameter \$remote_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:updatePassword\(\) has parameter \$old_password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:getService\(\) has parameter \$token with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:updatePassword\(\) has parameter \$password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:getService\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:updatePassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php + message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:updateFileOnGDrive\(\) has parameter \$parents with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\ChunksCompletion\\ChunkCompletionUpdateDao\:\:validSources\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$mimeType of method Google\\Service\\Drive\\DriveFile\:\:setMimeType\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/ChunksCompletion/ChunkCompletionUpdateDao.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\Comments\\BaseCommentStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$token of method Google\\Client\:\:setAccessToken\(\) expects array\|string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Comments/BaseCommentStruct.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Method Model\\Comments\\BaseCommentStruct\:\:templateMessage\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:\$raw_token type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/BaseCommentStruct.php + path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - message: '#^Parameter \#1 \$object of function date_format expects DateTimeInterface, DateTime\|false given\.$#' - identifier: argument.type + message: '#^Cannot access property \$id on Google\\Service\\Drive\\DriveFile\|null\.$#' + identifier: property.nonObject count: 2 - path: lib/Model/Comments/BaseCommentStruct.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:deleteComment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Comments/CommentDao.php + message: '#^Cannot access property \$id on Model\\ConnectedServices\\ConnectedServiceStruct\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:destroySegmentIdSegmentCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:addFiles\(\) has parameter \$fileHash with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getById\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:deleteDirectory\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getCommentsForChunk\(\) has parameter \$options with no value type specified in iterable type array\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:doConversion\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getCommentsForChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 5 - path: lib/Model/Comments/CommentDao.php + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getCacheFileDir\(\) has parameter \$file with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getOpenThreadsForProjects\(\) has parameter \$projectIds with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getFileStructureForJsonOutput\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getOpenThreadsForProjects\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getGDriveFilePath\(\) has parameter \$file with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getOpenThreadsForProjects\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getGDriveFilePathForS3\(\) has parameter \$file with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getThreadContributorUids\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getInstanceForCLI\(\) has parameter \$session with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getThreadContributorUids\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getInstanceForCLI\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/Comments/CommentDao.php + count: 1 + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getThreadsBySegments\(\) has parameter \$job_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getInstanceForCLI\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getThreadsBySegments\(\) has parameter \$segments_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getToken\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getThreadsBySegments\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getTokenByUser\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getThreadsBySegments\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:removeFile\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/Comments/CommentDao.php + count: 1 + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getUsersIdFromContent\(\) has parameter \$content with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:removeFile\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:getUsersIdFromContent\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:sanitizeFileName\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:placeholdContent\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$googleMime of static method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:officeExtensionFromMime\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:placeholdContent\(\) has parameter \$content with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$length of method Psr\\Http\\Message\\StreamInterface\:\:read\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Method Model\\Comments\\CommentDao\:\:validateComment\(\) has parameter \$obj with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Model/Comments/CommentDao.php + message: '#^Parameter \#4 \$connected_service_id of static method Model\\RemoteFiles\\RemoteFileDao\:\:insert\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Offset 1 on array\{list\, list\\} in isset\(\) always exists and is not nullable\.$#' - identifier: isset.offset + message: '#^Property Model\\ConnectedServices\\GDrive\\Session\:\:\$gDriveSession type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^PHPDoc tag @return has invalid value \(OpenThreadsStruct\[\];\)\: Unexpected token ";", expected TOKEN_HORIZONTAL_WS at offset 136 on line 6$#' - identifier: phpDoc.parseError + message: '#^Property Model\\ConnectedServices\\GDrive\\Session\:\:\$session type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^PHPDoc tag @var has invalid value \(\$res BaseCommentStruct\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Property Model\\ConnectedServices\\GDrive\\Session\:\:\$token type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/GDrive/Session.php - - message: '#^Property Model\\Comments\\CommentDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ConnectedServices\\Oauth\\DefuseEncryption\:\:decrypt\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php - - message: '#^Property Model\\Comments\\CommentDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ConnectedServices\\Oauth\\DefuseEncryption\:\:encrypt\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Comments/CommentDao.php + path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php - - message: '#^Method Model\\Comments\\CommentStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$key of static method Defuse\\Crypto\\Crypto\:\:decrypt\(\) expects Defuse\\Crypto\\Key, Defuse\\Crypto\\Key\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Comments/CommentStruct.php + path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#2 \$key of static method Defuse\\Crypto\\Crypto\:\:encrypt\(\) expects Defuse\\Crypto\\Key, Defuse\\Crypto\\Key\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$length of function fread expects int\<1, max\>, int\<0, max\>\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findById\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Variable \$keyFile might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Facebook\\FacebookProvider\:\:getAccessTokenFromAuthCode\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + count: 1 + path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findDefaultServiceByUserAndName\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Facebook\\FacebookProvider\:\:getClient\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + count: 1 + path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findServiceByUserAndId\(\) has parameter \$id_service with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\Oauth\\Facebook\\FacebookProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php + + - + message: '#^Property Model\\ConnectedServices\\Oauth\\ProviderUser\:\:\$email \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findServiceByUserAndId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + message: '#^Property Model\\ConnectedServices\\Oauth\\ProviderUser\:\:\$name \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findServicesByUser\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Github\\GithubProvider\:\:getAccessTokenFromAuthCode\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + count: 1 + path: lib/Model/ConnectedServices/Oauth/Github/GithubProvider.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:findUserServicesByNameAndEmail\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Github\\GithubProvider\:\:getAuthorizationUrl\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + count: 1 + path: lib/Model/ConnectedServices/Oauth/Github/GithubProvider.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:setDefaultService\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Github\\GithubProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + count: 3 + path: lib/Model/ConnectedServices/Oauth/Github/GithubProvider.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceDao\:\:setServiceExpired\(\) has parameter \$time with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\Oauth\\Github\\GithubProvider\:\:getResourceOwner\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + path: lib/Model/ConnectedServices/Oauth/Github/GithubProvider.php - - message: '#^Property Model\\ConnectedServices\\ConnectedServiceDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\AccessToken\:\:__construct\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php + path: lib/Model/ConnectedServices/Oauth/Google/AccessToken.php - - message: '#^Property Model\\ConnectedServices\\ConnectedServiceDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\AccessToken\:\:__toArray\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceDao.php - - - - message: '#^Cannot call method decrypt\(\) on Model\\ConnectedServices\\Oauth\\OauthTokenEncryption\|null\.$#' - identifier: method.nonObject - count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceStruct.php + path: lib/Model/ConnectedServices/Oauth/Google/AccessToken.php - - message: '#^Cannot call method encrypt\(\) on Model\\ConnectedServices\\Oauth\\OauthTokenEncryption\|null\.$#' - identifier: method.nonObject + message: '#^Property Model\\ConnectedServices\\Oauth\\Google\\AccessToken\:\:\$originalValues type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceStruct.php + path: lib/Model/ConnectedServices/Oauth/Google/AccessToken.php - - message: '#^Method Model\\ConnectedServices\\ConnectedServiceStruct\:\:getDecodedOauthAccessToken\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\GoogleClientLogsFormatter\:\:formatBatch\(\) has parameter \$records with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceStruct.php + path: lib/Model/ConnectedServices/Oauth/Google/GoogleClientLogsFormatter.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\GoogleClientLogsFormatter\:\:formatBatch\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/ConnectedServiceStruct.php + path: lib/Model/ConnectedServices/Oauth/Google/GoogleClientLogsFormatter.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveTokenHandler\:\:accessTokenToJsonString\(\) has parameter \$token with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @return with type mixed is not subtype of native type string\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php + path: lib/Model/ConnectedServices/Oauth/Google/GoogleClientLogsFormatter.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveTokenHandler\:\:accessTokenToJsonString\(\) should return string but returns string\|false\.$#' - identifier: return.type - count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php + message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\GoogleProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveTokenHandler\:\:getNewToken\(\) has parameter \$client with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$applicationName of method Google\\Client\:\:setApplicationName\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php + path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveTokenHandler\:\:getNewToken\(\) has parameter \$raw_token with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$clientId of method Google\\Client\:\:setClientId\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php + path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php - - message: '#^Parameter \#2 \$flags of function json_encode expects int, true given\.$#' + message: '#^Parameter \#1 \$clientSecret of method Google\\Client\:\:setClientSecret\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveTokenHandler.php + path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php - - message: '#^Property Model\\ConnectedServices\\GDrive\\GDriveTokenVerifyModel\:\:\$refreshed has no type specified\.$#' - identifier: missingType.property + message: '#^Parameter \#1 \$redirectUri of method Google\\Client\:\:setRedirectUri\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveTokenVerifyModel.php + path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php - - message: '#^Strict comparison using \=\=\= between false and string\|null will always evaluate to false\.$#' - identifier: identical.alwaysFalse + message: '#^Property Model\\ConnectedServices\\Oauth\\Google\\GoogleProvider\:\:\$OAUTH_SCOPES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveTokenVerifyModel.php + path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveUserAuthorizationModel\:\:__collectProperties\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\LinkedIn\\LinkedInProvider\:\:getAccessTokenFromAuthCode\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 5 - path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php - - - - message: '#^Method Model\\ConnectedServices\\GDrive\\GDriveUserAuthorizationModel\:\:__insertService\(\) should return Model\\ConnectedServices\\ConnectedServiceStruct but returns Model\\ConnectedServices\\ConnectedServiceStruct\|false\.$#' - identifier: return.type count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php + path: lib/Model/ConnectedServices/Oauth/LinkedIn/LinkedInProvider.php - - message: '#^Parameter \#1 \$token of method Model\\ConnectedServices\\ConnectedServiceDao\:\:updateOauthToken\(\) expects string, array\|string given\.$#' - identifier: argument.type + message: '#^Method Model\\ConnectedServices\\Oauth\\LinkedIn\\LinkedInProvider\:\:getResourceOwner\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php + path: lib/Model/ConnectedServices/Oauth/LinkedIn/LinkedInProvider.php - - message: '#^Parameter \#1 \$token of method Model\\ConnectedServices\\ConnectedServiceStruct\:\:setEncryptedAccessToken\(\) expects string, array\|string given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php + message: '#^Method Model\\ConnectedServices\\Oauth\\LinkedIn\\LinkedInProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/ConnectedServices/Oauth/LinkedIn/LinkedInProvider.php - - message: '#^Property Model\\ConnectedServices\\GDrive\\GDriveUserAuthorizationModel\:\:\$token type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\ConnectedServices\\Oauth\\Microsoft\\MicrosoftProvider\:\:getAccessTokenFromAuthCode\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/GDrive/GDriveUserAuthorizationModel.php + path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:__construct\(\) has parameter \$raw_token with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\Oauth\\Microsoft\\MicrosoftProvider\:\:getAuthorizationUrl\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\Microsoft\\MicrosoftProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + count: 3 + path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:copyFile\(\) has parameter \$copyTitle with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\ConnectedServices\\Oauth\\Microsoft\\MicrosoftProvider\:\:getResourceOwner\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:copyFile\(\) has parameter \$originFileId with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @return with type mixed is not subtype of native type Model\\ConnectedServices\\Oauth\\ProviderUser\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:getFileLink\(\) has parameter \$remote_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Model\\ConnectedServices\\Oauth\\ProviderUser\:\:\$email \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:getService\(\) has parameter \$token with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\ConnectedServices\\Oauth\\ProviderUser\:\:\$name \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:getService\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\OauthClient\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/OauthClient.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:updateFileOnGDrive\(\) has parameter \$parents with no value type specified in iterable type array\.$#' + message: '#^Method Model\\ConnectedServices\\Oauth\\OauthClient\:\:getAuthorizationUrl\(\) has parameter \$_session with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/OauthClient.php - - message: '#^Parameter \#1 \$mimeType of method Google\\Service\\Drive\\DriveFile\:\:setMimeType\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\ConnectedServices\\Oauth\\OauthClient\:\:getInstance\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/OauthClient.php - - message: '#^Parameter \#1 \$token of method Google\\Client\:\:setAccessToken\(\) expects array\|string, string\|false given\.$#' - identifier: argument.type + message: '#^Property Model\\ConnectedServices\\Oauth\\OauthClient\:\:\$provider \(Model\\ConnectedServices\\Oauth\\AbstractProvider\) does not accept object\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php + path: lib/Model/ConnectedServices/Oauth/OauthClient.php - - message: '#^Property Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:\$raw_token type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\ConnectedServices\\Oauth\\OauthClient\:\:\$provider_name \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/ConnectedServices/GDrive/RemoteFileService.php - - - - message: '#^Cannot access property \$id on Google\\Service\\Drive\\DriveFile\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Model/ConnectedServices/GDrive/Session.php - - - - message: '#^Cannot access property \$id on Model\\ConnectedServices\\ConnectedServiceStruct\|null\.$#' - identifier: property.nonObject - count: 3 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/ConnectedServices/Oauth/OauthClient.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:addFiles\(\) has parameter \$fileHash with no value type specified in iterable type array\.$#' + message: '#^Property Model\\ConnectedServices\\Oauth\\OauthClient\:\:\$providers type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/ConnectedServices/Oauth/OauthClient.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:deleteDirectory\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConversionHandler.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:doConversion\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\ConversionHandler\:\:extractZipFile\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConversionHandler.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getCacheFileDir\(\) has parameter \$file with no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\ConversionHandler\:\:getZipExtractionErrorFiles\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConversionHandler.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getFileStructureForJsonOutput\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @param for parameter \$filters_extraction_parameters with type mixed is not subtype of native type Model\\Filters\\FiltersConfigTemplateStruct\|null\.$#' + identifier: parameter.phpDocType count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConversionHandler.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getGDriveFilePath\(\) has parameter \$file with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @return with type mixed is not subtype of native type array\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConversionHandler.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getGDriveFilePathForS3\(\) has parameter \$file with no value type specified in iterable type array\.$#' + message: '#^Parameter \#1 \$size of method Model\\Conversion\\ConvertedFileModel\:\:setSize\(\) expects int, int\<0, max\>\|false given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Conversion/ConversionHandler.php + + - + message: '#^Property Model\\Conversion\\ConversionHandler\:\:\$zipExtractionErrorFiles type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConversionHandler.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getInstanceForCLI\(\) has parameter \$session with no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\ConvertedFileList\:\:getData\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileList.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getInstanceForCLI\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\ConvertedFileList\:\:getErrors\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileList.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getInstanceForCLI\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\ConvertedFileList\:\:getWarnings\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileList.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getToken\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Conversion\\ConvertedFileList\:\:\$erroredFiles type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileList.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:getTokenByUser\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Conversion\\ConvertedFileList\:\:\$warnedFiles type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileList.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:removeFile\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\ConvertedFileModel\:\:getPdfAnalysis\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileModel.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:removeFile\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\ConvertedFileModel\:\:getResult\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileModel.php - - message: '#^Method Model\\ConnectedServices\\GDrive\\Session\:\:sanitizeFileName\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\ConvertedFileModel\:\:setPdfAnalysis\(\) has parameter \$pdfAnalysis with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileModel.php - - message: '#^Parameter \#1 \$googleMime of static method Model\\ConnectedServices\\GDrive\\RemoteFileService\:\:officeExtensionFromMime\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Model\\Conversion\\ConvertedFileModel\:\:\$pdfAnalysis type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/ConvertedFileModel.php - - message: '#^Parameter \#1 \$length of method Psr\\Http\\Message\\StreamInterface\:\:read\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + message: '#^Cannot call method isError\(\) on Model\\Conversion\\ConvertedFileModel\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Parameter \#4 \$connected_service_id of static method Model\\RemoteFiles\\RemoteFileDao\:\:insert\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Cannot call method isWarning\(\) on Model\\Conversion\\ConvertedFileModel\|null\.$#' + identifier: method.nonObject count: 2 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Property Model\\ConnectedServices\\GDrive\\Session\:\:\$gDriveSession type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\FilesConverter\:\:__construct\(\) has parameter \$files with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Property Model\\ConnectedServices\\GDrive\\Session\:\:\$session type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Conversion\\FilesConverter\:\:convertFile\(\) never returns null so it can be removed from the return type\.$#' + identifier: return.unusedType count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Property Model\\ConnectedServices\\GDrive\\Session\:\:\$token type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\FilesConverter\:\:getExtractedFilesContentList\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/GDrive/Session.php + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\DefuseEncryption\:\:decrypt\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php + message: '#^Parameter \#1 \$convertedFileModel of method Model\\Conversion\\ConvertedFileList\:\:add\(\) expects Model\\Conversion\\ConvertedFileModel, Model\\Conversion\\ConvertedFileModel\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\DefuseEncryption\:\:encrypt\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php + message: '#^Parameter \#1 \$erroredFile of method Model\\Conversion\\ConvertedFileList\:\:setErroredFile\(\) expects Model\\Conversion\\ConvertedFileModel, Model\\Conversion\\ConvertedFileModel\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Parameter \#2 \$key of static method Defuse\\Crypto\\Crypto\:\:decrypt\(\) expects Defuse\\Crypto\\Key, Defuse\\Crypto\\Key\|null given\.$#' + message: '#^Parameter \#1 \$message of class DomainException constructor expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Parameter \#2 \$key of static method Defuse\\Crypto\\Crypto\:\:encrypt\(\) expects Defuse\\Crypto\\Key, Defuse\\Crypto\\Key\|null given\.$#' + message: '#^Parameter \#1 \$warnedFile of method Model\\Conversion\\ConvertedFileList\:\:setWarnedFile\(\) expects Model\\Conversion\\ConvertedFileModel, Model\\Conversion\\ConvertedFileModel\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php + count: 2 + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Parameter \#2 \$length of function fread expects int\<1, max\>, int\<0, max\>\|false given\.$#' - identifier: argument.type + message: '#^Property Model\\Conversion\\FilesConverter\:\:\$files type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php + path: lib/Model/Conversion/FilesConverter.php - - message: '#^Variable \$keyFile might not be defined\.$#' - identifier: variable.undefined + message: '#^Call to an undefined method Model\\Filters\\DTO\\IDto\:\:jsonSerialize\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/ConnectedServices/Oauth/DefuseEncryption.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Facebook\\FacebookProvider\:\:getAccessTokenFromAuthCode\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot access offset ''host'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Facebook\\FacebookProvider\:\:getClient\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\Filters\:\:extractInstanceInfoFromHeaders\(\) has parameter \$headers with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Facebook\\FacebookProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php + message: '#^Method Model\\Conversion\\Filters\:\:extractInstanceInfoFromHeaders\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Conversion/Filters.php - - message: '#^Property Model\\ConnectedServices\\Oauth\\ProviderUser\:\:\$email \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Model\\Conversion\\Filters\:\:logConversion\(\) has parameter \$jobData with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php + path: lib/Model/Conversion/Filters.php - - message: '#^Property Model\\ConnectedServices\\Oauth\\ProviderUser\:\:\$name \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Model\\Conversion\\Filters\:\:logConversion\(\) has parameter \$response with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Facebook/FacebookProvider.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Github\\GithubProvider\:\:getAccessTokenFromAuthCode\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\Filters\:\:logConversion\(\) has parameter \$sourceFileData with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Github/GithubProvider.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Github\\GithubProvider\:\:getAuthorizationUrl\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\Filters\:\:logConversionToTarget\(\) has parameter \$response with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Github/GithubProvider.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Github\\GithubProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ConnectedServices/Oauth/Github/GithubProvider.php + message: '#^Method Model\\Conversion\\Filters\:\:logConversionToTarget\(\) has parameter \$sourceFileData with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Github\\GithubProvider\:\:getResourceOwner\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\Filters\:\:logConversionToXliff\(\) has parameter \$response with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Github/GithubProvider.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\AccessToken\:\:__construct\(\) has parameter \$options with no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\Filters\:\:sendToFilters\(\) has parameter \$dataGroups with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/AccessToken.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\AccessToken\:\:__toArray\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\Filters\:\:sendToFilters\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/AccessToken.php + path: lib/Model/Conversion/Filters.php - - message: '#^Property Model\\ConnectedServices\\Oauth\\Google\\AccessToken\:\:\$originalValues type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\Filters\:\:xliffToTarget\(\) has parameter \$xliffsData with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/AccessToken.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\GoogleClientLogsFormatter\:\:formatBatch\(\) has parameter \$records with no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\Filters\:\:xliffToTarget\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleClientLogsFormatter.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\GoogleClientLogsFormatter\:\:formatBatch\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Part \$basename \(array\|string\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleClientLogsFormatter.php + path: lib/Model/Conversion/Filters.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type string\.$#' - identifier: return.phpDocType + message: '#^Part \$extension \(array\|string\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleClientLogsFormatter.php + path: lib/Model/Conversion/Filters.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Google\\GoogleProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 5 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php + message: '#^Method Model\\Conversion\\InternalHashPaths\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Conversion/InternalHashPaths.php - - message: '#^Parameter \#1 \$applicationName of method Google\\Client\:\:setApplicationName\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Conversion\\InternalHashPaths\:\:__construct\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php + path: lib/Model/Conversion/InternalHashPaths.php - - message: '#^Parameter \#1 \$clientId of method Google\\Client\:\:setClientId\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$string of function trim expects string, string\|false given\.$#' identifier: argument.type + count: 2 + path: lib/Model/Conversion/MimeTypes/Guesser/FileBinaryMimeTypeGuesser.php + + - + message: '#^Method Model\\Conversion\\MimeTypes\\Guesser\\FileinfoMimeTypeGuesser\:\:guessMimeType\(\) should return string\|null but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php + path: lib/Model/Conversion/MimeTypes/Guesser/FileinfoMimeTypeGuesser.php - - message: '#^Parameter \#1 \$clientSecret of method Google\\Client\:\:setClientSecret\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Conversion\\MimeTypes\\Guesser\\SimpleMarkupMimeTypeGuesser\:\:guessMimeType\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php + path: lib/Model/Conversion/MimeTypes/Guesser/SimpleMarkupMimeTypeGuesser.php - - message: '#^Parameter \#1 \$redirectUri of method Google\\Client\:\:setRedirectUri\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$haystack of function stripos expects string, string\|false given\.$#' identifier: argument.type - count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php + count: 4 + path: lib/Model/Conversion/MimeTypes/Guesser/SimpleMarkupMimeTypeGuesser.php - - message: '#^Property Model\\ConnectedServices\\Oauth\\Google\\GoogleProvider\:\:\$OAUTH_SCOPES type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\MimeTypes\\MimeTypes\:\:getExtensions\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Google/GoogleProvider.php + path: lib/Model/Conversion/MimeTypes/MimeTypes.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\LinkedIn\\LinkedInProvider\:\:getAccessTokenFromAuthCode\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Conversion\\MimeTypes\\MimeTypes\:\:getMimeTypes\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/LinkedIn/LinkedInProvider.php + path: lib/Model/Conversion/MimeTypes/MimeTypes.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\LinkedIn\\LinkedInProvider\:\:getResourceOwner\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Conversion\\MimeTypes\\MimeTypes\:\:guessMimeType\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Model/ConnectedServices/Oauth/LinkedIn/LinkedInProvider.php + count: 3 + path: lib/Model/Conversion/MimeTypes/MimeTypes.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\LinkedIn\\LinkedInProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 5 - path: lib/Model/ConnectedServices/Oauth/LinkedIn/LinkedInProvider.php + message: '#^Property Model\\Conversion\\MimeTypes\\MimeTypes\:\:\$extensions type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Conversion/MimeTypes/MimeTypes.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Microsoft\\MicrosoftProvider\:\:getAccessTokenFromAuthCode\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Model\\Conversion\\MimeTypes\\MimeTypes\:\:\$mimeTypes type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php + path: lib/Model/Conversion/MimeTypes/MimeTypes.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Microsoft\\MicrosoftProvider\:\:getAuthorizationUrl\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php + message: '#^Parameter \#1 \$haystack of function stripos expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Conversion/OCRCheck.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Microsoft\\MicrosoftProvider\:\:getResourceOwner\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php + message: '#^Property Model\\Conversion\\OCRCheck\:\:\$mimeTypes type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Conversion/OCRCheck.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\Microsoft\\MicrosoftProvider\:\:getResourceOwner\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property object\:\:\$error\.$#' + identifier: property.notFound count: 1 - path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php + path: lib/Model/Conversion/Upload.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type Model\\ConnectedServices\\Oauth\\ProviderUser\.$#' - identifier: return.phpDocType + message: '#^Access to an undefined property object\:\:\$name\.$#' + identifier: property.notFound count: 1 - path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php + path: lib/Model/Conversion/Upload.php - - message: '#^Property Model\\ConnectedServices\\Oauth\\ProviderUser\:\:\$email \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Access to an undefined property object\:\:\$type\.$#' + identifier: property.notFound count: 1 - path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php + path: lib/Model/Conversion/Upload.php - - message: '#^Property Model\\ConnectedServices\\Oauth\\ProviderUser\:\:\$name \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Model/ConnectedServices/Oauth/Microsoft/MicrosoftProvider.php + path: lib/Model/Conversion/Upload.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\OauthClient\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Conversion\\Upload\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/Oauth/OauthClient.php + path: lib/Model/Conversion/Upload.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\OauthClient\:\:getAuthorizationUrl\(\) has parameter \$_session with no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\Upload\:\:_filesAreTooMuch\(\) has parameter \$filesToUpload with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/OauthClient.php + path: lib/Model/Conversion/Upload.php - - message: '#^Method Model\\ConnectedServices\\Oauth\\OauthClient\:\:getInstance\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Conversion\\Upload\:\:fixFileName\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/ConnectedServices/Oauth/OauthClient.php - - - - message: '#^Property Model\\ConnectedServices\\Oauth\\OauthClient\:\:\$provider \(Model\\ConnectedServices\\Oauth\\AbstractProvider\) does not accept object\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Model/ConnectedServices/Oauth/OauthClient.php + path: lib/Model/Conversion/Upload.php - - message: '#^Property Model\\ConnectedServices\\Oauth\\OauthClient\:\:\$provider_name \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Model\\Conversion\\Upload\:\:getUniformGlobalFilesStructure\(\) has parameter \$filesToUpload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/OauthClient.php + path: lib/Model/Conversion/Upload.php - - message: '#^Property Model\\ConnectedServices\\Oauth\\OauthClient\:\:\$providers type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\Upload\:\:uploadFiles\(\) has parameter \$filesToUpload with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/ConnectedServices/Oauth/OauthClient.php + path: lib/Model/Conversion/Upload.php - - message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Offset ''extension'' might not exist on array\{dirname\?\: string, basename\: string, extension\?\: string, filename\: string\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/Conversion/ConversionHandler.php + path: lib/Model/Conversion/Upload.php - - message: '#^Method Model\\Conversion\\ConversionHandler\:\:extractZipFile\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\Conversion\\Upload\:\:\$uploadToken \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/Conversion/ConversionHandler.php + path: lib/Model/Conversion/Upload.php - - message: '#^Method Model\\Conversion\\ConversionHandler\:\:getZipExtractionErrorFiles\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Class Model\\Conversion\\UploadElement implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Model/Conversion/ConversionHandler.php + path: lib/Model/Conversion/UploadElement.php - - message: '#^PHPDoc tag @param for parameter \$filters_extraction_parameters with type mixed is not subtype of native type Model\\Filters\\FiltersConfigTemplateStruct\|null\.$#' - identifier: parameter.phpDocType + message: '#^Method Model\\Conversion\\UploadElement\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ConversionHandler.php + path: lib/Model/Conversion/UploadElement.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type array\.$#' - identifier: return.phpDocType + message: '#^Method Model\\Conversion\\UploadElement\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ConversionHandler.php - - - - message: '#^Parameter \#1 \$size of method Model\\Conversion\\ConvertedFileModel\:\:setSize\(\) expects int, int\<0, max\>\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Conversion/ConversionHandler.php + path: lib/Model/Conversion/UploadElement.php - - message: '#^Property Model\\Conversion\\ConversionHandler\:\:\$zipExtractionErrorFiles type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\UploadElement\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ConversionHandler.php + path: lib/Model/Conversion/UploadElement.php - - message: '#^Method Model\\Conversion\\ConvertedFileList\:\:getData\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\UploadElement\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ConvertedFileList.php + path: lib/Model/Conversion/UploadElement.php - - message: '#^Method Model\\Conversion\\ConvertedFileList\:\:getErrors\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Binary operation "\." between array\|string and ''___SEP___'' results in an error\.$#' + identifier: binaryOp.invalid count: 1 - path: lib/Model/Conversion/ConvertedFileList.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\ConvertedFileList\:\:getWarnings\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot assign new offset to array\<\(array\\|string\)\>\|string\.$#' + identifier: offsetAssign.dimType count: 1 - path: lib/Model/Conversion/ConvertedFileList.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Property Model\\Conversion\\ConvertedFileList\:\:\$erroredFiles type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Conversion/ConvertedFileList.php + message: '#^Cannot assign offset \(array\\|string\) to array\<\(array\\|string\)\>\|string\.$#' + identifier: offsetAssign.dimType + count: 2 + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Property Model\\Conversion\\ConvertedFileList\:\:\$warnedFiles type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:extractFilesInTmp\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ConvertedFileList.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\ConvertedFileModel\:\:getPdfAnalysis\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:extractFilesInTmp\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Conversion/ConvertedFileModel.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\ConvertedFileModel\:\:getResult\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:prependZipFileName\(\) is unused\.$#' + identifier: method.unused count: 1 - path: lib/Model/Conversion/ConvertedFileModel.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\ConvertedFileModel\:\:setPdfAnalysis\(\) has parameter \$pdfAnalysis with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:treeKey\(\) is unused\.$#' + identifier: method.unused count: 1 - path: lib/Model/Conversion/ConvertedFileModel.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Property Model\\Conversion\\ConvertedFileModel\:\:\$pdfAnalysis type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:zipPathInfo\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ConvertedFileModel.php - - - - message: '#^Cannot call method isError\(\) on Model\\Conversion\\ConvertedFileModel\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/Conversion/FilesConverter.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Cannot call method isWarning\(\) on Model\\Conversion\\ConvertedFileModel\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/Conversion/FilesConverter.php + message: '#^Parameter \#1 \$array \(list\\) of array_values is already a list, call has no effect\.$#' + identifier: arrayValues.list + count: 1 + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\FilesConverter\:\:__construct\(\) has parameter \$files with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$callback of function array_map expects \(callable\(string\)\: mixed\)\|null, array\{''Model\\\\Conversion\\\\ZipArchiveHandler'', ''prependZipFileName''\} given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Conversion/FilesConverter.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\FilesConverter\:\:convertFile\(\) never returns null so it can be removed from the return type\.$#' - identifier: return.unusedType + message: '#^Parameter \#1 \$callback of function array_map expects \(callable\(string\)\: mixed\)\|null, array\{''Model\\\\Conversion\\\\ZipArchiveHandler'', ''treeKey''\} given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Conversion/FilesConverter.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\FilesConverter\:\:getExtractedFilesContentList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$path of method Model\\Conversion\\ZipArchiveHandler\:\:isDir\(\) expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Conversion/FilesConverter.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Parameter \#1 \$convertedFileModel of method Model\\Conversion\\ConvertedFileList\:\:add\(\) expects Model\\Conversion\\ConvertedFileModel, Model\\Conversion\\ConvertedFileModel\|null given\.$#' + message: '#^Parameter \#1 \$search of function str_replace expects array\\|string, array\ given\.$#' identifier: argument.type - count: 2 - path: lib/Model/Conversion/FilesConverter.php + count: 1 + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Parameter \#1 \$erroredFile of method Model\\Conversion\\ConvertedFileList\:\:setErroredFile\(\) expects Model\\Conversion\\ConvertedFileModel, Model\\Conversion\\ConvertedFileModel\|null given\.$#' + message: '#^Parameter \#1 \$stream of function fclose expects resource, resource\|false given\.$#' identifier: argument.type - count: 2 - path: lib/Model/Conversion/FilesConverter.php + count: 1 + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Parameter \#1 \$message of class DomainException constructor expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$stream of function fwrite expects resource, resource\|false given\.$#' identifier: argument.type count: 1 - path: lib/Model/Conversion/FilesConverter.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Parameter \#1 \$warnedFile of method Model\\Conversion\\ConvertedFileList\:\:setWarnedFile\(\) expects Model\\Conversion\\ConvertedFileModel, Model\\Conversion\\ConvertedFileModel\|null given\.$#' + message: '#^Parameter \#2 \$data of function fwrite expects string, string\|false given\.$#' identifier: argument.type - count: 2 - path: lib/Model/Conversion/FilesConverter.php + count: 1 + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Property Model\\Conversion\\FilesConverter\:\:\$files type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$string of function explode expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Conversion/FilesConverter.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Call to an undefined method Model\\Filters\\DTO\\IDto\:\:jsonSerialize\(\)\.$#' - identifier: method.notFound + message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Cannot access offset ''host'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, array\, string\|false\> given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\Filters\:\:extractInstanceInfoFromHeaders\(\) has parameter \$headers with no value type specified in iterable type array\.$#' + message: '#^Property Model\\Conversion\\ZipArchiveHandler\:\:\$tree type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\Filters\:\:extractInstanceInfoFromHeaders\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Conversion\\ZipArchiveHandler\:\:\$treeList type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/Conversion/ZipArchiveHandler.php - - message: '#^Method Model\\Conversion\\Filters\:\:logConversion\(\) has parameter \$jobData with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method hget\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:logConversion\(\) has parameter \$response with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:logConversion\(\) has parameter \$sourceFileData with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:logConversionToTarget\(\) has parameter \$response with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:logConversionToTarget\(\) has parameter \$sourceFileData with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Conversion/Filters.php + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' + identifier: return.type + count: 2 + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:logConversionToXliff\(\) has parameter \$response with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_destroyObjectCache\(\) has parameter \$bindParams with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:sendToFilters\(\) has parameter \$dataGroups with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\) has parameter \$bindParams with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:sendToFilters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\) should return array\ but returns array\\.$#' + identifier: return.type count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:xliffToTarget\(\) has parameter \$xliffsData with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Conversion/Filters.php + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Filters\:\:xliffToTarget\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Conversion/Filters.php + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Part \$basename \(array\|string\) of encapsed string cannot be cast to string\.$#' - identifier: encapsedStringPart.nonString + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_getStatementForQuery\(\) has parameter \$query with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Part \$extension \(array\|string\) of encapsed string cannot be cast to string\.$#' - identifier: encapsedStringPart.nonString + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_getStatementForQuery\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Conversion/Filters.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\InternalHashPaths\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_sanitizeInputArray\(\) has parameter \$input with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/InternalHashPaths.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\InternalHashPaths\:\:__construct\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_sanitizeInputArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/InternalHashPaths.php - - - - message: '#^Parameter \#1 \$string of function trim expects string, string\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Conversion/MimeTypes/Guesser/FileBinaryMimeTypeGuesser.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Variable \$pathinfo in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/MimeTypes/Guesser/FileExtensionMimeTypeGuesser.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\MimeTypes\\Guesser\\FileinfoMimeTypeGuesser\:\:guessMimeType\(\) should return string\|null but returns string\|false\.$#' - identifier: return.type + message: '#^Method Model\\DataAccess\\AbstractDao\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/MimeTypes/Guesser/FileinfoMimeTypeGuesser.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\MimeTypes\\Guesser\\SimpleMarkupMimeTypeGuesser\:\:guessMimeType\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildInsertStatement\(\) has parameter \$attrs with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/MimeTypes/Guesser/SimpleMarkupMimeTypeGuesser.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Parameter \#1 \$haystack of function stripos expects string, string\|false given\.$#' - identifier: argument.type - count: 4 - path: lib/Model/Conversion/MimeTypes/Guesser/SimpleMarkupMimeTypeGuesser.php + message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildInsertStatement\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\MimeTypes\\MimeTypes\:\:getExtensions\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildInsertStatement\(\) has parameter \$on_duplicate_fields with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/MimeTypes/MimeTypes.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\MimeTypes\\MimeTypes\:\:getMimeTypes\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildInsertStatement\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/MimeTypes/MimeTypes.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\MimeTypes\\MimeTypes\:\:guessMimeType\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Conversion/MimeTypes/MimeTypes.php + message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildPkeyCondition\(\) has parameter \$attrs with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Property Model\\Conversion\\MimeTypes\\MimeTypes\:\:\$extensions type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildUpdateSet\(\) has parameter \$attrs with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/MimeTypes/MimeTypes.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Property Model\\Conversion\\MimeTypes\\MimeTypes\:\:\$mimeTypes type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildUpdateSet\(\) has parameter \$mask with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/MimeTypes/MimeTypes.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Parameter \#1 \$haystack of function stripos expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Conversion/OCRCheck.php + message: '#^Method Model\\DataAccess\\AbstractDao\:\:createList\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Property Model\\Conversion\\OCRCheck\:\:\$mimeTypes type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:createList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/OCRCheck.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Access to an undefined property object\:\:\$error\.$#' - identifier: property.notFound + message: '#^Method Model\\DataAccess\\AbstractDao\:\:insertStruct\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Access to an undefined property object\:\:\$name\.$#' - identifier: property.notFound + message: '#^Method Model\\DataAccess\\AbstractDao\:\:insertStruct\(\) should return int\|false but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Access to an undefined property object\:\:\$type\.$#' - identifier: property.notFound + message: '#^Method Model\\DataAccess\\AbstractDao\:\:sanitizeArray\(\) has parameter \$input with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Model\\DataAccess\\AbstractDao\:\:sanitizeArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Upload\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\DataAccess\\AbstractDao\:\:structKeys\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Upload\:\:_filesAreTooMuch\(\) has parameter \$filesToUpload with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:updateFields\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Upload\:\:fixFileName\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\DataAccess\\AbstractDao\:\:updateFields\(\) has parameter \$where with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Upload\:\:getUniformGlobalFilesStructure\(\) has parameter \$filesToUpload with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:updateList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\Upload\:\:uploadFiles\(\) has parameter \$filesToUpload with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDao\:\:updateStruct\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Offset ''extension'' might not exist on array\{dirname\?\: string, basename\: string, extension\?\: string, filename\: string\}\.$#' - identifier: offsetAccess.notFound + message: '#^Negated boolean expression is always false\.$#' + identifier: booleanNot.alwaysFalse count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Property Model\\Conversion\\Upload\:\:\$uploadToken \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Offset ''class'' might not exist on array\{function\: string, line\?\: int, file\?\: string, class\?\: class\-string, type\?\: ''\-\>''\|''\:\:'', args\?\: list\, object\?\: object\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/Conversion/Upload.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Class Model\\Conversion\\UploadElement implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^PHPDoc tag @var has invalid value \(\$con IDatabase\)\: Unexpected token "\$con", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Conversion/UploadElement.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\UploadElement\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Conversion/UploadElement.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\UploadElement\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Conversion/UploadElement.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\UploadElement\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + message: '#^Property Model\\DataAccess\\AbstractDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/UploadElement.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\UploadElement\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\DataAccess\\AbstractDao\:\:\$database \(Model\\DataAccess\\Database\) does not accept Model\\DataAccess\\IDatabase\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/Conversion/UploadElement.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Binary operation "\." between array\|string and ''___SEP___'' results in an error\.$#' - identifier: binaryOp.invalid + message: '#^Property Model\\DataAccess\\AbstractDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Cannot assign new offset to array\<\(array\\|string\)\>\|string\.$#' - identifier: offsetAssign.dimType + message: '#^Template type T of method Model\\DataAccess\\AbstractDao\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Cannot assign offset \(array\\|string\) to array\<\(array\\|string\)\>\|string\.$#' - identifier: offsetAssign.dimType - count: 2 - path: lib/Model/Conversion/ZipArchiveHandler.php + message: '#^Template type T of method Model\\DataAccess\\AbstractDao\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter + count: 1 + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:extractFilesInTmp\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Template type T of method Model\\DataAccess\\AbstractDao\:\:sanitize\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDao.php - - message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:extractFilesInTmp\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:prependZipFileName\(\) is unused\.$#' - identifier: method.unused + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:__construct\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:treeKey\(\) is unused\.$#' - identifier: method.unused + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:__get\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Method Model\\Conversion\\ZipArchiveHandler\:\:zipPathInfo\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#1 \$array \(non\-empty\-list\\) of array_values is already a list, call has no effect\.$#' - identifier: arrayValues.list + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:setTimestamp\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#1 \$callback of function array_map expects \(callable\(string\)\: mixed\)\|null, array\{''Model\\\\Conversion\\\\ZipArchiveHandler'', ''prependZipFileName''\} given\.$#' - identifier: argument.type + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:setTimestamp\(\) has parameter \$attribute with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#1 \$callback of function array_map expects \(callable\(string\)\: mixed\)\|null, array\{''Model\\\\Conversion\\\\ZipArchiveHandler'', ''treeKey''\} given\.$#' - identifier: argument.type + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:setTimestamp\(\) has parameter \$timestamp with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#1 \$path of method Model\\Conversion\\ZipArchiveHandler\:\:isDir\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:setTimestamp\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#1 \$search of function str_replace expects array\\|string, array\ given\.$#' - identifier: argument.type + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#1 \$stream of function fclose expects resource, resource\|false given\.$#' - identifier: argument.type + message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#1 \$stream of function fwrite expects resource, resource\|false given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + message: '#^PHPDoc tag @var has invalid value \(\$resultset \?T\)\: Unexpected token "\$resultset", expected type at offset 10 on line 1$#' + identifier: phpDoc.parseError + count: 2 + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#2 \$data of function fwrite expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Property Model\\DataAccess\\AbstractDaoObjectStruct\:\:\$cached_results type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/AbstractDaoObjectStruct.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Model\\DataAccess\\Database\:\:begin\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/Database.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\DataAccess\\Database\:\:buildInsertStatement\(\) has parameter \$attrs with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/Database.php - - message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, array\, string\|false\> given\.$#' - identifier: argument.type + message: '#^Method Model\\DataAccess\\Database\:\:buildInsertStatement\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/Database.php - - message: '#^Property Model\\Conversion\\ZipArchiveHandler\:\:\$tree type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:buildInsertStatement\(\) has parameter \$on_duplicate_fields with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/Database.php - - message: '#^Property Model\\Conversion\\ZipArchiveHandler\:\:\$treeList type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:buildInsertStatement\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Conversion/ZipArchiveHandler.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Model\\DataAccess\\Database\:\:commit\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:getConnection\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/DataAccess/Database.php + + - + message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$ignore with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' - identifier: return.type - count: 2 - path: lib/Model/DataAccess/AbstractDao.php + message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_destroyObjectCache\(\) has parameter \$bindParams with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$no_nulls with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\) has parameter \$bindParams with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$onDuplicateKey with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\) should return array\ but returns array\\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) should return string but returns string\|false\.$#' identifier: return.type count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:last_insert\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/DataAccess/AbstractDao.php + message: '#^Method Model\\DataAccess\\Database\:\:nextSequence\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_getStatementForQuery\(\) has parameter \$query with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Model/DataAccess/AbstractDao.php + message: '#^Method Model\\DataAccess\\Database\:\:nextSequence\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 9 + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_getStatementForQuery\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:rollback\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_sanitizeInputArray\(\) has parameter \$input with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:update\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_sanitizeInputArray\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\Database\:\:update\(\) has parameter \$where with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/DataAccess/AbstractDao.php + message: '#^Method Model\\DataAccess\\Database\:\:update\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/DataAccess/AbstractDao.php + message: '#^Method Model\\DataAccess\\Database\:\:useDb\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildInsertStatement\(\) has parameter \$attrs with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$server of class Model\\DataAccess\\Database constructor expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildInsertStatement\(\) has parameter \$mask with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$user of class Model\\DataAccess\\Database constructor expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildInsertStatement\(\) has parameter \$on_duplicate_fields with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#3 \$password of class Model\\DataAccess\\Database constructor expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildPkeyCondition\(\) has parameter \$attrs with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#4 \$database of class Model\\DataAccess\\Database constructor expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildUpdateSet\(\) has parameter \$attrs with no value type specified in iterable type array\.$#' + message: '#^Property Model\\DataAccess\\Database\:\:\$SEQUENCES type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/Database.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:buildUpdateSet\(\) has parameter \$mask with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\DataAccess\\IDaoStruct\:\:count\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/IDaoStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:createList\(\) has no return type specified\.$#' + message: '#^Method Model\\DataAccess\\IDaoStruct\:\:getArrayCopy\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/IDaoStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:createList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\IDaoStruct\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/IDaoStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:insertStruct\(\) has parameter \$options with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\IDaoStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/IDaoStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:insertStruct\(\) should return int\|false but returns string\|false\.$#' - identifier: return.type + message: '#^Method Model\\DataAccess\\IDatabase\:\:insert\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/IDatabase.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:sanitizeArray\(\) has parameter \$input with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\IDatabase\:\:update\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/IDatabase.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:sanitizeArray\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\IDatabase\:\:update\(\) has parameter \$where with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/IDatabase.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:structKeys\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/DataAccess/AbstractDao.php + message: '#^Class Model\\DataAccess\\ShapelessConcreteStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/DataAccess/ShapelessConcreteStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:updateFields\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:__get\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/ShapelessConcreteStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:updateFields\(\) has parameter \$where with no value type specified in iterable type array\.$#' + message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/ShapelessConcreteStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:updateList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/ShapelessConcreteStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDao\:\:updateStruct\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/ShapelessConcreteStruct.php - - message: '#^Negated boolean expression is always false\.$#' - identifier: booleanNot.alwaysFalse + message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/ShapelessConcreteStruct.php - - message: '#^Offset ''class'' might not exist on array\{function\: string, line\?\: int, file\?\: string, class\?\: class\-string, type\?\: ''\-\>''\|''\:\:'', args\?\: list\, object\?\: object\}\.$#' - identifier: offsetAccess.notFound + message: '#^Method Model\\DataAccess\\XFetchEnvelope\:\:__construct\(\) has parameter \$value with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/DataAccess/XFetchEnvelope.php - - message: '#^PHPDoc tag @var has invalid value \(\$con IDatabase\)\: Unexpected token "\$con", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Model\\EditLog\\EditLogSegmentStruct\:\:getSecsPerWord\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/EditLog/EditLogSegmentStruct.php - - message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' - identifier: argument.type + message: '#^Loose comparison using \=\= between int and ''NULL'' will always evaluate to false\.$#' + identifier: equal.alwaysFalse count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Engines\\EngineDAO\:\:_buildQueryForEngine\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Property Model\\DataAccess\\AbstractDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\Engines\\EngineDAO\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Property Model\\DataAccess\\AbstractDao\:\:\$database \(Model\\DataAccess\\Database\) does not accept Model\\DataAccess\\IDatabase\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Model/DataAccess/AbstractDao.php + message: '#^Method Model\\Engines\\EngineDAO\:\:create\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Engines/EngineDAO.php - - message: '#^Property Model\\DataAccess\\AbstractDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Engines\\EngineDAO\:\:disable\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Template type T of method Model\\DataAccess\\AbstractDao\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter - count: 1 - path: lib/Model/DataAccess/AbstractDao.php + message: '#^Method Model\\Engines\\EngineDAO\:\:sanitize\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Engines/EngineDAO.php - - message: '#^Template type T of method Model\\DataAccess\\AbstractDao\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^PHPDoc tag @var has invalid value \(\$obj EngineStruct\)\: Unexpected token "\$obj", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Template type T of method Model\\DataAccess\\AbstractDao\:\:sanitize\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^PHPDoc tag @var has invalid value \(\$obj EngineStruct\)\: Unexpected token "\$obj", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/DataAccess/AbstractDao.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' + message: '#^Parameter \#1 \$json of function json_decode expects string, array\|string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Engines/EngineDAO.php + + - + message: '#^Property Model\\Engines\\EngineDAO\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:__construct\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Model\\Engines\\EngineDAO\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:__get\(\) has parameter \$name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$active \(bool\|null\) does not accept int\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$extra_parameters \(array\|string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:setTimestamp\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$id \(int\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:setTimestamp\(\) has parameter \$attribute with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$others \(array\|string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/EngineDAO.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:setTimestamp\(\) has parameter \$timestamp with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Model\\Engines\\Structs\\AltlangStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\AltlangStruct\) but returns Model\\Engines\\Structs\\AltlangStruct\.$#' + identifier: return.type count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/Structs/AltlangStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:setTimestamp\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\AltlangStruct is not subtype of native type static\(Model\\Engines\\Structs\\AltlangStruct\)\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/Structs/AltlangStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Engines\\Structs\\ApertiumStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\ApertiumStruct\) but returns Model\\Engines\\Structs\\ApertiumStruct\.$#' + identifier: return.type count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/Structs/ApertiumStruct.php - - message: '#^Method Model\\DataAccess\\AbstractDaoObjectStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\ApertiumStruct is not subtype of native type static\(Model\\Engines\\Structs\\ApertiumStruct\)\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/Structs/ApertiumStruct.php - - message: '#^PHPDoc tag @var has invalid value \(\$resultset \?T\)\: Unexpected token "\$resultset", expected type at offset 10 on line 1$#' - identifier: phpDoc.parseError - count: 2 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + message: '#^Method Model\\Engines\\Structs\\DeepLStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\DeepLStruct\) but returns Model\\Engines\\Structs\\DeepLStruct\.$#' + identifier: return.type + count: 1 + path: lib/Model/Engines/Structs/DeepLStruct.php - - message: '#^Property Model\\DataAccess\\AbstractDaoObjectStruct\:\:\$cached_results type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\DeepLStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/AbstractDaoObjectStruct.php + path: lib/Model/Engines/Structs/DeepLStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:begin\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Model\\Engines\\Structs\\DeepLStruct\:\:\$others type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/DeepLStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:buildInsertStatement\(\) has parameter \$attrs with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Class Model\\Engines\\Structs\\EngineStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:buildInsertStatement\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + message: '#^Method Model\\Engines\\Structs\\EngineStruct\:\:arrayRepresentation\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:buildInsertStatement\(\) has parameter \$on_duplicate_fields with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Engines\\Structs\\EngineStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\EngineStruct\) but returns Model\\Engines\\Structs\\EngineStruct\.$#' + identifier: return.type count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:commit\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Engines\\Structs\\EngineStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:getConnection\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Model\\Engines\\Structs\\EngineStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Model/DataAccess/Database.php + count: 1 + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\EngineStruct is not subtype of native type static\(Model\\Engines\\Structs\\EngineStruct\)\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$ignore with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$no_nulls with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$others type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) has parameter \$onDuplicateKey with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Template type T of method Model\\Engines\\Structs\\EngineStruct\:\:getStruct\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/EngineStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:insert\(\) should return string but returns string\|false\.$#' + message: '#^Method Model\\Engines\\Structs\\GoogleTranslateStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\GoogleTranslateStruct\) but returns Model\\Engines\\Structs\\GoogleTranslateStruct\.$#' identifier: return.type count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/GoogleTranslateStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:last_insert\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\GoogleTranslateStruct is not subtype of native type static\(Model\\Engines\\Structs\\GoogleTranslateStruct\)\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/GoogleTranslateStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:nextSequence\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\GoogleTranslateStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php - - - - message: '#^Method Model\\DataAccess\\Database\:\:nextSequence\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 9 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/GoogleTranslateStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:rollback\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Engines\\Structs\\IntentoStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\IntentoStruct\) but returns Model\\Engines\\Structs\\IntentoStruct\.$#' + identifier: return.type count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/IntentoStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:update\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\IntentoStruct is not subtype of native type static\(Model\\Engines\\Structs\\IntentoStruct\)\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/IntentoStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:update\(\) has parameter \$where with no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\IntentoStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/IntentoStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:update\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/DataAccess/Database.php + message: '#^Method Model\\Engines\\Structs\\LaraStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\LaraStruct\) but returns Model\\Engines\\Structs\\LaraStruct\.$#' + identifier: return.type + count: 1 + path: lib/Model/Engines/Structs/LaraStruct.php - - message: '#^Method Model\\DataAccess\\Database\:\:useDb\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/DataAccess/Database.php + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\LaraStruct is not subtype of native type static\(Model\\Engines\\Structs\\LaraStruct\)\.$#' + identifier: return.phpDocType + count: 1 + path: lib/Model/Engines/Structs/LaraStruct.php - - message: '#^Parameter \#1 \$server of class Model\\DataAccess\\Database constructor expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Model\\Engines\\Structs\\LaraStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/LaraStruct.php - - message: '#^Parameter \#2 \$user of class Model\\DataAccess\\Database constructor expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Model\\Engines\\Structs\\LaraStruct\:\:\$others type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/LaraStruct.php - - message: '#^Parameter \#3 \$password of class Model\\DataAccess\\Database constructor expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\Engines\\Structs\\MMTStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\MMTStruct\) but returns Model\\Engines\\Structs\\MMTStruct\.$#' + identifier: return.type count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/MMTStruct.php - - message: '#^Parameter \#4 \$database of class Model\\DataAccess\\Database constructor expects string, string\|null given\.$#' - identifier: argument.type + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\MMTStruct is not subtype of native type static\(Model\\Engines\\Structs\\MMTStruct\)\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/MMTStruct.php - - message: '#^Property Model\\DataAccess\\Database\:\:\$SEQUENCES type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\MMTStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/Database.php + path: lib/Model/Engines/Structs/MMTStruct.php - - message: '#^Method Model\\DataAccess\\IDaoStruct\:\:count\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Property Model\\Engines\\Structs\\MMTStruct\:\:\$others type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/IDaoStruct.php + path: lib/Model/Engines/Structs/MMTStruct.php - - message: '#^Method Model\\DataAccess\\IDaoStruct\:\:getArrayCopy\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Class Utils\\Engines\\MicrosoftHub not found\.$#' + identifier: class.notFound count: 1 - path: lib/Model/DataAccess/IDaoStruct.php + path: lib/Model/Engines/Structs/MicrosoftHubStruct.php - - message: '#^Method Model\\DataAccess\\IDaoStruct\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Model\\Engines\\Structs\\MicrosoftHubStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\MicrosoftHubStruct\) but returns Model\\Engines\\Structs\\MicrosoftHubStruct\.$#' + identifier: return.type count: 1 - path: lib/Model/DataAccess/IDaoStruct.php + path: lib/Model/Engines/Structs/MicrosoftHubStruct.php - - message: '#^Method Model\\DataAccess\\IDaoStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\MicrosoftHubStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/IDaoStruct.php + path: lib/Model/Engines/Structs/MicrosoftHubStruct.php - - message: '#^Method Model\\DataAccess\\IDatabase\:\:insert\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\MicrosoftHubStruct\:\:\$others type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/IDatabase.php + path: lib/Model/Engines/Structs/MicrosoftHubStruct.php - - message: '#^Method Model\\DataAccess\\IDatabase\:\:update\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\NONEStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/IDatabase.php + path: lib/Model/Engines/Structs/NONEStruct.php - - message: '#^Method Model\\DataAccess\\IDatabase\:\:update\(\) has parameter \$where with no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\NONEStruct\:\:\$others type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/IDatabase.php + path: lib/Model/Engines/Structs/NONEStruct.php - - message: '#^Class Model\\DataAccess\\ShapelessConcreteStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Model\\Engines\\Structs\\SmartMATEStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\SmartMATEStruct\) but returns Model\\Engines\\Structs\\SmartMATEStruct\.$#' + identifier: return.type count: 1 - path: lib/Model/DataAccess/ShapelessConcreteStruct.php + path: lib/Model/Engines/Structs/SmartMATEStruct.php - - message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:__get\(\) has parameter \$name with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\SmartMATEStruct is not subtype of native type static\(Model\\Engines\\Structs\\SmartMATEStruct\)\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/DataAccess/ShapelessConcreteStruct.php + path: lib/Model/Engines/Structs/SmartMATEStruct.php - - message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Model\\Engines\\Structs\\SmartMATEStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/ShapelessConcreteStruct.php + path: lib/Model/Engines/Structs/SmartMATEStruct.php - - message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Model\\Engines\\Structs\\SmartMATEStruct\:\:\$others type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/DataAccess/ShapelessConcreteStruct.php + path: lib/Model/Engines/Structs/SmartMATEStruct.php - - message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\Engines\\Structs\\YandexTranslateStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\YandexTranslateStruct\) but returns Model\\Engines\\Structs\\YandexTranslateStruct\.$#' + identifier: return.type count: 1 - path: lib/Model/DataAccess/ShapelessConcreteStruct.php + path: lib/Model/Engines/Structs/YandexTranslateStruct.php - - message: '#^Method Model\\DataAccess\\ShapelessConcreteStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\YandexTranslateStruct is not subtype of native type static\(Model\\Engines\\Structs\\YandexTranslateStruct\)\.$#' + identifier: return.phpDocType count: 1 - path: lib/Model/DataAccess/ShapelessConcreteStruct.php + path: lib/Model/Engines/Structs/YandexTranslateStruct.php - - message: '#^Method Model\\EditLog\\EditLogSegmentStruct\:\:getSecsPerWord\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Model\\Engines\\Structs\\YandexTranslateStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/EditLog/EditLogSegmentStruct.php + path: lib/Model/Engines/Structs/YandexTranslateStruct.php - - message: '#^Loose comparison using \=\= between int and ''NULL'' will always evaluate to false\.$#' - identifier: equal.alwaysFalse + message: '#^Template type T of method Model\\FeaturesBase\\FeatureSet\:\:dispatchRun\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/FeatureSet.php - - message: '#^Method Model\\Engines\\EngineDAO\:\:_buildQueryForEngine\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AnalysisBeforeMTGetContributionEvent\:\:__construct\(\) has parameter \$config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/AnalysisBeforeMTGetContributionEvent.php - - message: '#^Method Model\\Engines\\EngineDAO\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AnalysisBeforeMTGetContributionEvent\:\:getConfig\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/AnalysisBeforeMTGetContributionEvent.php - - message: '#^Method Model\\Engines\\EngineDAO\:\:create\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Engines/EngineDAO.php + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AnalysisBeforeMTGetContributionEvent\:\:setConfig\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/FeaturesBase/Hook/Event/Filter/AnalysisBeforeMTGetContributionEvent.php - - message: '#^Method Model\\Engines\\EngineDAO\:\:disable\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AppendFieldToAnalysisObjectEvent\:\:__construct\(\) has parameter \$metadata with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/AppendFieldToAnalysisObjectEvent.php - - message: '#^Method Model\\Engines\\EngineDAO\:\:sanitize\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Engines/EngineDAO.php + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AppendFieldToAnalysisObjectEvent\:\:getMetadata\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/FeaturesBase/Hook/Event/Filter/AppendFieldToAnalysisObjectEvent.php - - message: '#^Negated boolean expression is always false\.$#' - identifier: booleanNot.alwaysFalse + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AppendFieldToAnalysisObjectEvent\:\:setMetadata\(\) has parameter \$metadata with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/AppendFieldToAnalysisObjectEvent.php - - message: '#^PHPDoc tag @var has invalid value \(\$obj EngineStruct\)\: Unexpected token "\$obj", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AppendInitialTemplateVarsEvent\:\:__construct\(\) has parameter \$codes with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/AppendInitialTemplateVarsEvent.php - - message: '#^PHPDoc tag @var has invalid value \(\$obj EngineStruct\)\: Unexpected token "\$obj", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AppendInitialTemplateVarsEvent\:\:getCodes\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/AppendInitialTemplateVarsEvent.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, array\|string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Engines/EngineDAO.php + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\AppendInitialTemplateVarsEvent\:\:setCodes\(\) has parameter \$codes with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/FeaturesBase/Hook/Event/Filter/AppendInitialTemplateVarsEvent.php - - message: '#^Property Model\\Engines\\EngineDAO\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\CorrectTagErrorsEvent\:\:__construct\(\) has parameter \$originalDataMap with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/CorrectTagErrorsEvent.php - - message: '#^Property Model\\Engines\\EngineDAO\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\CorrectTagErrorsEvent\:\:getOriginalDataMap\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/CorrectTagErrorsEvent.php - - message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$active \(bool\|null\) does not accept int\.$#' - identifier: assign.propertyType + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterCreateProjectFeaturesEvent\:\:__construct\(\) has parameter \$projectFeatures with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterCreateProjectFeaturesEvent.php - - message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$extra_parameters \(array\|string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterCreateProjectFeaturesEvent\:\:getProjectFeatures\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterCreateProjectFeaturesEvent.php - - message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$id \(int\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterCreateProjectFeaturesEvent\:\:setProjectFeatures\(\) has parameter \$projectFeatures with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterCreateProjectFeaturesEvent.php - - message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$others \(array\|string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterGetSegmentsResultEvent\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/EngineDAO.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterGetSegmentsResultEvent.php - - message: '#^Method Model\\Engines\\Structs\\AltlangStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\AltlangStruct\) but returns Model\\Engines\\Structs\\AltlangStruct\.$#' - identifier: return.type + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterGetSegmentsResultEvent\:\:getData\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/AltlangStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterGetSegmentsResultEvent.php - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\AltlangStruct is not subtype of native type static\(Model\\Engines\\Structs\\AltlangStruct\)\.$#' - identifier: return.phpDocType + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterGetSegmentsResultEvent\:\:setData\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/AltlangStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterGetSegmentsResultEvent.php - - message: '#^Method Model\\Engines\\Structs\\ApertiumStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\ApertiumStruct\) but returns Model\\Engines\\Structs\\ApertiumStruct\.$#' - identifier: return.type + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterMyMemoryGetParametersEvent\:\:__construct\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/ApertiumStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterMyMemoryGetParametersEvent.php - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\ApertiumStruct is not subtype of native type static\(Model\\Engines\\Structs\\ApertiumStruct\)\.$#' - identifier: return.phpDocType + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterMyMemoryGetParametersEvent\:\:__construct\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/ApertiumStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterMyMemoryGetParametersEvent.php - - message: '#^Method Model\\Engines\\Structs\\DeepLStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\DeepLStruct\) but returns Model\\Engines\\Structs\\DeepLStruct\.$#' - identifier: return.type + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterMyMemoryGetParametersEvent\:\:getConfig\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/DeepLStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterMyMemoryGetParametersEvent.php - - message: '#^Property Model\\Engines\\Structs\\DeepLStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterMyMemoryGetParametersEvent\:\:getParameters\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/DeepLStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterMyMemoryGetParametersEvent.php - - message: '#^Property Model\\Engines\\Structs\\DeepLStruct\:\:\$others type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterMyMemoryGetParametersEvent\:\:setParameters\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/DeepLStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterMyMemoryGetParametersEvent.php - - message: '#^Class Model\\Engines\\Structs\\EngineStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterPayableRatesEvent\:\:__construct\(\) has parameter \$rates with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterPayableRatesEvent.php - - message: '#^Method Model\\Engines\\Structs\\EngineStruct\:\:arrayRepresentation\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterPayableRatesEvent\:\:getRates\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterPayableRatesEvent.php - - message: '#^Method Model\\Engines\\Structs\\EngineStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\EngineStruct\) but returns Model\\Engines\\Structs\\EngineStruct\.$#' - identifier: return.type + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterPayableRatesEvent\:\:setRates\(\) has parameter \$rates with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterPayableRatesEvent.php - - message: '#^Method Model\\Engines\\Structs\\EngineStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterRevisionChangeNotificationListEvent\:\:__construct\(\) has parameter \$emails with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterRevisionChangeNotificationListEvent.php - - message: '#^Method Model\\Engines\\Structs\\EngineStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterRevisionChangeNotificationListEvent\:\:getEmails\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterRevisionChangeNotificationListEvent.php - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\EngineStruct is not subtype of native type static\(Model\\Engines\\Structs\\EngineStruct\)\.$#' - identifier: return.phpDocType + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterRevisionChangeNotificationListEvent\:\:setEmails\(\) has parameter \$emails with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/FilterRevisionChangeNotificationListEvent.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\InjectExcludedTagsInQaEvent\:\:__construct\(\) has parameter \$excludedTags with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/InjectExcludedTagsInQaEvent.php - - message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\InjectExcludedTagsInQaEvent\:\:getExcludedTags\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/InjectExcludedTagsInQaEvent.php - - message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$others type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\InjectExcludedTagsInQaEvent\:\:setExcludedTags\(\) has parameter \$excludedTags with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/InjectExcludedTagsInQaEvent.php - - message: '#^Template type T of method Model\\Engines\\Structs\\EngineStruct\:\:getStruct\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\PrepareNotesForRenderingEvent\:\:__construct\(\) has parameter \$notes with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/EngineStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/PrepareNotesForRenderingEvent.php - - message: '#^Method Model\\Engines\\Structs\\GoogleTranslateStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\GoogleTranslateStruct\) but returns Model\\Engines\\Structs\\GoogleTranslateStruct\.$#' - identifier: return.type + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\PrepareNotesForRenderingEvent\:\:getNotes\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/GoogleTranslateStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/PrepareNotesForRenderingEvent.php - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\GoogleTranslateStruct is not subtype of native type static\(Model\\Engines\\Structs\\GoogleTranslateStruct\)\.$#' - identifier: return.phpDocType + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\PrepareNotesForRenderingEvent\:\:setNotes\(\) has parameter \$notes with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/GoogleTranslateStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/PrepareNotesForRenderingEvent.php - - message: '#^Property Model\\Engines\\Structs\\GoogleTranslateStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/GoogleTranslateStruct.php - - - - message: '#^Method Model\\Engines\\Structs\\IntentoStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\IntentoStruct\) but returns Model\\Engines\\Structs\\IntentoStruct\.$#' - identifier: return.type - count: 1 - path: lib/Model/Engines/Structs/IntentoStruct.php - - - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\IntentoStruct is not subtype of native type static\(Model\\Engines\\Structs\\IntentoStruct\)\.$#' - identifier: return.phpDocType - count: 1 - path: lib/Model/Engines/Structs/IntentoStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\IntentoStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/IntentoStruct.php - - - - message: '#^Method Model\\Engines\\Structs\\LaraStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\LaraStruct\) but returns Model\\Engines\\Structs\\LaraStruct\.$#' - identifier: return.type - count: 1 - path: lib/Model/Engines/Structs/LaraStruct.php - - - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\LaraStruct is not subtype of native type static\(Model\\Engines\\Structs\\LaraStruct\)\.$#' - identifier: return.phpDocType - count: 1 - path: lib/Model/Engines/Structs/LaraStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\LaraStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/LaraStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\LaraStruct\:\:\$others type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/LaraStruct.php - - - - message: '#^Method Model\\Engines\\Structs\\MMTStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\MMTStruct\) but returns Model\\Engines\\Structs\\MMTStruct\.$#' - identifier: return.type - count: 1 - path: lib/Model/Engines/Structs/MMTStruct.php - - - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\MMTStruct is not subtype of native type static\(Model\\Engines\\Structs\\MMTStruct\)\.$#' - identifier: return.phpDocType - count: 1 - path: lib/Model/Engines/Structs/MMTStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\MMTStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/MMTStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\MMTStruct\:\:\$others type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/MMTStruct.php - - - - message: '#^Class Utils\\Engines\\MicrosoftHub not found\.$#' - identifier: class.notFound - count: 1 - path: lib/Model/Engines/Structs/MicrosoftHubStruct.php - - - - message: '#^Method Model\\Engines\\Structs\\MicrosoftHubStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\MicrosoftHubStruct\) but returns Model\\Engines\\Structs\\MicrosoftHubStruct\.$#' - identifier: return.type - count: 1 - path: lib/Model/Engines/Structs/MicrosoftHubStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\MicrosoftHubStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/MicrosoftHubStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\MicrosoftHubStruct\:\:\$others type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/MicrosoftHubStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\NONEStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/NONEStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\NONEStruct\:\:\$others type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/NONEStruct.php - - - - message: '#^Method Model\\Engines\\Structs\\SmartMATEStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\SmartMATEStruct\) but returns Model\\Engines\\Structs\\SmartMATEStruct\.$#' - identifier: return.type - count: 1 - path: lib/Model/Engines/Structs/SmartMATEStruct.php - - - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\SmartMATEStruct is not subtype of native type static\(Model\\Engines\\Structs\\SmartMATEStruct\)\.$#' - identifier: return.phpDocType - count: 1 - path: lib/Model/Engines/Structs/SmartMATEStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\SmartMATEStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Engines/Structs/SmartMATEStruct.php - - - - message: '#^Property Model\\Engines\\Structs\\SmartMATEStruct\:\:\$others type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\RewriteContributionContextsEvent\:\:__construct\(\) has parameter \$requestData with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/SmartMATEStruct.php - - - - message: '#^Method Model\\Engines\\Structs\\YandexTranslateStruct\:\:getStruct\(\) should return static\(Model\\Engines\\Structs\\YandexTranslateStruct\) but returns Model\\Engines\\Structs\\YandexTranslateStruct\.$#' - identifier: return.type - count: 1 - path: lib/Model/Engines/Structs/YandexTranslateStruct.php - - - - message: '#^PHPDoc tag @return with type Model\\Engines\\Structs\\YandexTranslateStruct is not subtype of native type static\(Model\\Engines\\Structs\\YandexTranslateStruct\)\.$#' - identifier: return.phpDocType - count: 1 - path: lib/Model/Engines/Structs/YandexTranslateStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/RewriteContributionContextsEvent.php - - message: '#^Property Model\\Engines\\Structs\\YandexTranslateStruct\:\:\$extra_parameters type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\RewriteContributionContextsEvent\:\:getRequestData\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Engines/Structs/YandexTranslateStruct.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/RewriteContributionContextsEvent.php - - message: '#^Property Model\\FeaturesBase\\BasicFeatureStruct\:\:\$options type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\SanitizeOriginalDataMapEvent\:\:__construct\(\) has parameter \$originalDataMap with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/FeaturesBase/BasicFeatureStruct.php - - - - message: '#^Call to an undefined method Model\\DataAccess\\IDaoStruct\:\:toNewObject\(\)\.$#' - identifier: method.notFound - count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php - - - - message: '#^Cannot call method isAutoActivableOnProject\(\) on Plugins\\Features\\BaseFeature\|null\.$#' - identifier: method.nonObject - count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php - - - - message: '#^Method Model\\FeaturesBase\\FeatureSet\:\:__construct\(\) has parameter \$features with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/SanitizeOriginalDataMapEvent.php - - message: '#^Method Model\\FeaturesBase\\FeatureSet\:\:getAutoloadPlugins\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\SanitizeOriginalDataMapEvent\:\:getOriginalDataMap\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/SanitizeOriginalDataMapEvent.php - - message: '#^Method Model\\FeaturesBase\\FeatureSet\:\:getCodes\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Filter\\SanitizeOriginalDataMapEvent\:\:setOriginalDataMap\(\) has parameter \$originalDataMap with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php + path: lib/Model/FeaturesBase/Hook/Event/Filter/SanitizeOriginalDataMapEvent.php - - message: '#^Method Model\\FeaturesBase\\FeatureSet\:\:merge\(\) has parameter \$new_features with no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Run\\BeforeProjectCreationEvent\:\:__construct\(\) has parameter \$context with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php - - - - message: '#^Method Model\\FeaturesBase\\FeatureSet\:\:merge\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php + path: lib/Model/FeaturesBase/Hook/Event/Run/BeforeProjectCreationEvent.php - - message: '#^Method Model\\FeaturesBase\\FeatureSet\:\:runOnFeature\(\) has parameter \$args with no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Run\\PostAddSegmentTranslationEvent\:\:__construct\(\) has parameter \$context with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php + path: lib/Model/FeaturesBase/Hook/Event/Run/PostAddSegmentTranslationEvent.php - - message: '#^Method Model\\FeaturesBase\\FeatureSet\:\:splitString\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Model\\FeaturesBase\\Hook\\Event\\Run\\SetTranslationCommittedEvent\:\:__construct\(\) has parameter \$context with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php - - - - message: '#^Parameter \#1 \$callback of function call_user_func_array expects callable\(\)\: mixed, array\{Plugins\\Features\\IBaseFeature, string\} given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php - - - - message: '#^Parameter \#1 \$callback of function call_user_func_array expects callable\(\)\: mixed, array\{object, string\} given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/FeaturesBase/FeatureSet.php + path: lib/Model/FeaturesBase/Hook/Event/Run/SetTranslationCommittedEvent.php - message: '#^Method Model\\FeaturesBase\\PluginsLoader\:\:getInstance\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' @@ -10536,6 +10092,18 @@ parameters: count: 1 path: lib/Model/Files/FilesInfoUtility.php + - + message: '#^Method Model\\Files\\FilesMetadataMarshaller\:\:marshall\(\) never returns null so it can be removed from the return type\.$#' + identifier: return.unusedType + count: 1 + path: lib/Model/Files/FilesMetadataMarshaller.php + + - + message: '#^Method Model\\Files\\FilesMetadataMarshaller\:\:marshall\(\) should return string\|null but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/Files/FilesMetadataMarshaller.php + - message: '#^Method Model\\Files\\FilesPartsDao\:\:getByFileId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException @@ -12792,12 +12360,6 @@ parameters: count: 2 path: lib/Model/LQA/QAModelTemplate/QAModelTemplateDao.php - - - message: '#^If condition is always false\.$#' - identifier: if.alwaysFalse - count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateDao.php - - message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateDao\:\:createFromJSON\(\) has parameter \$json with no type specified\.$#' identifier: missingType.parameter @@ -12937,16231 +12499,22777 @@ parameters: path: lib/Model/LQA/QAModelTemplate/QAModelTemplateDao.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateDao.php + + - + message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplatePassfailStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplatePassfailStruct.php + + - + message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplatePassfailThresholdStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplatePassfailThresholdStruct.php + + - + message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateSeverityStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateSeverityStruct.php + + - + message: '#^Cannot access property \$passfail_type on Model\\LQA\\QAModelTemplate\\QAModelTemplatePassfailStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + + - + message: '#^Cannot access property \$thresholds on Model\\LQA\\QAModelTemplate\\QAModelTemplatePassfailStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + + - + message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:getDecodedModel\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + + - + message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:hydrateFromJSON\(\) has parameter \$json with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + + - + message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 15 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + + - + message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + + - + message: '#^Parameter \#1 \$date of static method Utils\\Date\\DateTimeUtil\:\:formatIsoDate\(\) expects null, string\|null given\.$#' + identifier: argument.type + count: 3 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + + - + message: '#^Property Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:\$id \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 1 + path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/MTQE/PayableRate/DTO/MTQEPayableRateBreakdowns.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/PayableRate/DTO/MTQEPayableRateBreakdowns.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:hydrateBreakdownsFromDataArray\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:hydrateFromJSON\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 7 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:destroyQueryByIdAndUserCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:destroyQueryByUidCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:getById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:getByUid\(\) should return array\ but returns list\\.$#' + identifier: return.type + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:hydrateTemplateStruct\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:hydrateTemplateStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^PHPDoc tag @return with type Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns\|null is not subtype of native type Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\|null\.$#' + identifier: return.phpDocType + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Unsafe access to private property Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:\$instance through static\:\:\.$#' + identifier: staticClassAccess.privateProperty + count: 3 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static + count: 1 + path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/MTQE/Templates/DTO/MTQEWorkflowParams.php + + - + message: '#^Method Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/Templates/DTO/MTQEWorkflowParams.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:destroyQueryByIdAndUserCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:destroyQueryByUidCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:getById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:getByUid\(\) should return array\ but returns list\\.$#' + identifier: return.type + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:hydrateTemplateStruct\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:hydrateTemplateStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Unsafe access to private property Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:\$instance through static\:\:\.$#' + identifier: staticClassAccess.privateProperty + count: 3 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:hydrateParamsFromDataArray\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + + - + message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + + - + message: '#^Method Model\\Outsource\\ConfirmationDao\:\:updatePassword\(\) has parameter \$jid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Outsource/ConfirmationDao.php + + - + message: '#^Method Model\\Outsource\\ConfirmationDao\:\:updatePassword\(\) has parameter \$new_password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Outsource/ConfirmationDao.php + + - + message: '#^Method Model\\Outsource\\ConfirmationDao\:\:updatePassword\(\) has parameter \$old_password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Outsource/ConfirmationDao.php + + - + message: '#^Method Model\\Outsource\\ConfirmationDao\:\:updatePassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Model/Outsource/ConfirmationDao.php + + - + message: '#^Property Model\\Outsource\\ConfirmationDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Outsource/ConfirmationDao.php + + - + message: '#^Property Model\\Outsource\\ConfirmationDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Outsource/ConfirmationDao.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$create_date has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$currency has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$delivery_date has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$id has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$id_job has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$id_vendor has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$password has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$price has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$quote_pid has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$vendor_name has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/Outsource/ConfirmationStruct.php + + - + message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:create\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + + - + message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:getById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + + - + message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:getByIdCustomer\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + + - + message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:getByUserId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + + - + message: '#^Method Model\\OwnerFeatures\\OwnerFeatureStruct\:\:getOptions\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/OwnerFeatures/OwnerFeatureStruct.php + + - + message: '#^PHPDoc type array\|string\|null of property Model\\OwnerFeatures\\OwnerFeatureStruct\:\:\$options is not covariant with PHPDoc type array\\|string\|null of overridden property Model\\FeaturesBase\\BasicFeatureStruct\:\:\$options\.$#' + identifier: property.phpDocType + count: 1 + path: lib/Model/OwnerFeatures/OwnerFeatureStruct.php + + - + message: '#^Parameter \#1 \$json of function json_decode expects string, array\|string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/OwnerFeatures/OwnerFeatureStruct.php + + - + message: '#^Property Model\\OwnerFeatures\\OwnerFeatureStruct\:\:\$options type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/OwnerFeatures/OwnerFeatureStruct.php + + - + message: '#^Cannot call method hget\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' + identifier: return.type + count: 2 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:count\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:count\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:format\(\) has parameter \$items with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:format\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:getPagination\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:getPagination\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:getPagination\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\Pager\:\:getPagination\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Parameter \#3 \$pages of method Model\\Pagination\\Pager\:\:format\(\) expects int, float given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Template type T of method Model\\Pagination\\Pager\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Template type T of method Model\\Pagination\\Pager\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter + count: 1 + path: lib/Model/Pagination/Pager.php + + - + message: '#^Method Model\\Pagination\\PaginationParameters\:\:__construct\(\) has parameter \$bindParams with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/PaginationParameters.php + + - + message: '#^Method Model\\Pagination\\PaginationParameters\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Pagination/PaginationParameters.php + + - + message: '#^Method Model\\Pagination\\PaginationParameters\:\:getBindParams\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/PaginationParameters.php + + - + message: '#^Property Model\\Pagination\\PaginationParameters\:\:\$bindParams type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Pagination/PaginationParameters.php + + - + message: '#^Property Model\\Pagination\\PaginationParameters\:\:\$current \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Pagination/PaginationParameters.php + + - + message: '#^Property Model\\Pagination\\PaginationParameters\:\:\$pagination \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Pagination/PaginationParameters.php + + - + message: '#^Cannot call method _deleteCacheByKey\(\) on Model\\PayableRates\\CustomPayableRateDao\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Cannot call method _destroyObjectCache\(\) on Model\\PayableRates\\CustomPayableRateDao\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Cannot call method _getStatementForQuery\(\) on Model\\PayableRates\\CustomPayableRateDao\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Cannot call method setCacheTTL\(\) on Model\\PayableRates\\CustomPayableRateDao\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:assocModelToJob\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:assocModelToJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdAndUserCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:getDefaultTemplate\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:getInstance\(\) never returns null so it can be removed from the return type\.$#' + identifier: return.unusedType + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:save\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$result CustomPayableRateStruct\[\]\)\: Unexpected token "\$result", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 2 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Parameter \#1 \$date of static method Utils\\Date\\DateTimeUtil\:\:formatIsoDate\(\) expects null, string given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Parameter \#1 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryPaginated\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Parameter \#2 \$id of static method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdAndUserCache\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Parameter \#2 \$id of static method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdCache\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Parameter \#3 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdAndUserCache\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Property Model\\PayableRates\\CustomPayableRateStruct\:\:\$id \(int\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/PayableRates/CustomPayableRateDao.php + + - + message: '#^Argument of an invalid type array\|string supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:breakdownsToJson\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:getBreakdownsArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:getBreakdownsArray\(\) should return array but returns array\|string\.$#' + identifier: return.type + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:getBreakdownsArray\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:getPayableRates\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:validateBreakdowns\(\) has parameter \$breakdowns with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:validateLanguage\(\) has parameter \$lang with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:validateLanguage\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Parameter \#1 \$date of static method Utils\\Date\\DateTimeUtil\:\:formatIsoDate\(\) expects null, string given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Parameter \#1 \$string of function mb_strlen expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Property Model\\PayableRates\\CustomPayableRateStruct\:\:\$breakdowns type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/PayableRates/CustomPayableRateStruct.php + + - + message: '#^Method Model\\ProjectCreation\\JobCreationService\:\:buildTmKeysJson\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/ProjectCreation/JobCreationService.php + + - + message: '#^Method Model\\ProjectCreation\\ProjectManager\:\:insertContextsForFile\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/ProjectCreation/ProjectManager.php + + - + message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$instance_id \(int\) on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.property + count: 1 + path: lib/Model/ProjectCreation/ProjectManagerModel.php + + - + message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$pretranslate_101 \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 1 + path: lib/Model/ProjectCreation/ProjectMetadataService.php + + - + message: '#^Class Model\\Xliff\\DTO\\XliffRulesModel does not have a constructor and must be instantiated without any parameters\.$#' + identifier: new.noConstructor + count: 1 + path: lib/Model/ProjectCreation/SegmentExtractor.php + + - + message: '#^Method Model\\ProjectCreation\\SegmentExtractor\:\:persistXliffFileAttributes\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/ProjectCreation/SegmentExtractor.php + + - + message: '#^Method Model\\ProjectCreation\\SegmentStorageService\:\:linkSegmentIdsToRelatedData\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/ProjectCreation/SegmentStorageService.php + + - + message: '#^Method Model\\ProjectCreation\\SegmentStorageService\:\:persistSegmentMetadata\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/ProjectCreation/SegmentStorageService.php + + - + message: '#^Parameter \#1 \$id_segment of method Model\\ProjectCreation\\SegmentStorageService\:\:insertOriginalDataRecord\(\) expects int, int\|string given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/ProjectCreation/SegmentStorageService.php + + - + message: '#^Parameter \#1 \$id_segment of method Model\\ProjectCreation\\SegmentStorageService\:\:saveSegmentMetadata\(\) expects int, int\|string given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/ProjectCreation/SegmentStorageService.php + + - + message: '#^Method Model\\ProjectCreation\\TmKeyService\:\:setPrivateTMKeys\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/ProjectCreation/TmKeyService.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:_getProjects\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:_getProjects\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:conditionsForProjectsQuery\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:getProjects\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_in_pname with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_only_completed with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_source with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_status with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_target with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Parameter \#1 \$datetime of class DateTime constructor expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ManageModel.php + + - + message: '#^Method Model\\Projects\\MetadataDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Method Model\\Projects\\MetadataDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Method Model\\Projects\\MetadataDao\:\:allByProjectId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Method Model\\Projects\\MetadataDao\:\:bulkSet\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Method Model\\Projects\\MetadataDao\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Method Model\\Projects\\MetadataDao\:\:getProjectStaticSubfilteringCustomHandlers\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Method Model\\Projects\\MetadataDao\:\:set\(\) should return bool but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Method Model\\Projects\\MetadataDao\:\:set\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Using nullsafe property access "\?\-\>value" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' + identifier: nullsafe.neverNull + count: 1 + path: lib/Model/Projects/MetadataDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:_getProjectDataSQLAndValues\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:assignToAssignee\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:assignToAssignee\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:assignToTeam\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:assignToTeam\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:changeProjectStatus\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:changeProjectStatus\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:deleteFailedProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheByIdAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheForProjectData\(\) has parameter \$jid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheForProjectData\(\) has parameter \$jpassword with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheForProjectData\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheForProjectData\(\) has parameter \$project_password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:exists\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdAndPassword\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdAndPassword\(\) has parameter \$password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdCustomer\(\) has parameter \$id_customer with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdCustomer\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findByTeamId\(\) has parameter \$filter with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:findByTeamId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getByIdList\(\) has parameter \$id_list with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getByIdList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getByIdList\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getJobIds\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getJobIds\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getJobIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getPasswordsMap\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getPasswordsMap\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getPasswordsMap\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getProjectAndJobData\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getProjectAndJobData\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getRemoteFileServiceName\(\) has parameter \$project_ids with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getRemoteFileServiceName\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getTotalCountByTeamId\(\) has parameter \$filter with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:getTotalCountByTeamId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:isGDriveProject\(\) has parameter \$id_project with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:isGDriveProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:massiveSelfAssignment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:unassignProjects\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:uncompletedChunksByProjectId\(\) has parameter \$id_project with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:uncompletedChunksByProjectId\(\) has parameter \$params with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:updateAnalysisStatus\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:updateAnalysisStatus\(\) has parameter \$stWordCount with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:updateAnalysisStatus\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:updateAnalysisStatus\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:updateField\(\) has parameter \$value with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Method Model\\Projects\\ProjectDao\:\:updateField\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^PHPDoc tag @return has invalid value \(ProjectStruct\[\]\|IDaoStruct\[\]\|\[\]\)\: Unexpected token "\[", expected type at offset 84 on line 4$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Parameter \#1 \$id of method Model\\Projects\\ProjectDao\:\:destroyCacheById\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Property Model\\Projects\\ProjectDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Property Model\\Projects\\ProjectDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectDao.php + + - + message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$uid\.$#' + identifier: property.notFound + count: 2 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Cannot access property \$type on Model\\Teams\\TeamStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Method Model\\Projects\\ProjectModel\:\:checkAssigneeChangeInPersonalTeam\(\) has parameter \$id_team with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Method Model\\Projects\\ProjectModel\:\:checkIdAssignee\(\) has parameter \$id_team with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Method Model\\Projects\\ProjectModel\:\:prepareUpdate\(\) has parameter \$value with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Parameter \#1 \$id of method Model\\Projects\\ProjectDao\:\:destroyCacheById\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Parameter \#1 \$team of method Model\\Teams\\TeamDao\:\:destroyCacheAssignee\(\) expects Model\\Teams\\TeamStruct, Model\\Teams\\TeamStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Parameter \#1 \$uid of method Model\\Teams\\TeamDao\:\:getPersonalByUid\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Parameter \#2 \$callback of function array_filter expects \(callable\(Model\\DataAccess\\IDaoStruct\)\: bool\)\|null, Closure\(Model\\Teams\\MembershipStruct\)\: bool given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Parameter \#3 \$assignee of class Utils\\Email\\ProjectAssignedEmail constructor expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Property Model\\Projects\\ProjectModel\:\:\$cacheTeamsToClean type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Property Model\\Projects\\ProjectModel\:\:\$changedFields type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Property Model\\Projects\\ProjectModel\:\:\$willChange type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectModel.php + + - + message: '#^Class Model\\Projects\\ProjectStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Method Model\\Projects\\ProjectStruct\:\:getAllMetadataAsKeyValue\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Method Model\\Projects\\ProjectStruct\:\:hasFeature\(\) has parameter \$feature_code with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Method Model\\Projects\\ProjectStruct\:\:isFeatureEnabled\(\) has parameter \$feature_code with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Method Model\\Projects\\ProjectStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Method Model\\Projects\\ProjectStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Method Model\\Projects\\ProjectStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Parameter \#1 \$id of method Model\\Projects\\MetadataDao\:\:allByProjectId\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Parameter \#1 \$id_project of method Model\\Jobs\\ChunkDao\:\:getByProjectID\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Parameter \#1 \$id_project of method Model\\Projects\\MetadataDao\:\:get\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Parameter \#1 \$id_project of method Model\\Projects\\MetadataDao\:\:set\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Parameter \#1 \$id_project of static method Model\\Jobs\\JobDao\:\:getByProjectId\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectStruct.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:destroyDefaultTemplateCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:destroyQueryByIdAndUserCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:getDefaultTemplate\(\) has parameter \$uid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:getDefaultTemplate\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:getUserDefaultMt\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:markAsNotDefault\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:removeSubTemplateByIdAndUser\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:save\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$result ProjectTemplateStruct\[\]\)\: Unexpected token "\$result", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 3 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Parameter \#2 \$excludeId of static method Model\\Projects\\ProjectTemplateDao\:\:markAsNotDefault\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Parameter \#2 \$id of static method Model\\Projects\\ProjectTemplateDao\:\:destroyQueryByIdAndUserCache\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Parameter \#2 \$id of static method Model\\Projects\\ProjectTemplateDao\:\:destroyQueryByIdCache\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Parameter \#2 \$uid of method Model\\Projects\\ProjectTemplateStruct\:\:hydrateFromJSON\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$id \(int\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$id_team \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$mt \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$segmentation_rule \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$subfiltering_handlers \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$tm \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 1 + path: lib/Model/Projects/ProjectTemplateDao.php + + - + message: '#^Access to an undefined property object\:\:\$character_counter_count_tags\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$character_counter_mode\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$dialect_strict\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$filters_template_id\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$get_public_matches\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$id_team\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$mt\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$name\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$payable_rate_template_id\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$pretranslate_100\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$pretranslate_101\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$qa_model_template_id\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$source_language\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$subfiltering_handlers\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$subject\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$tm_prioritization\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Access to an undefined property object\:\:\$xliff_config_template_id\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Cannot call method format\(\) on DateTime\|false\.$#' + identifier: method.nonObject + count: 2 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:getSubfilteringHandlers\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:getTargetLanguage\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:getTm\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 24 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Parameter \#1 \$datetime of function date_create expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$mt \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$segmentation_rule \(string\|null\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$subfiltering_handlers \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$tm \(string\|null\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Projects/ProjectTemplateStruct.php + + - + message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getAllToPropagate\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getPropagatedIds\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getPropagatedIdsToUpdateVersion\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getSegmentsForPropagation\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getTotals\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:setTotals\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Property Model\\Propagation\\PropagationTotalStruct\:\:\$propagated_ids type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Property Model\\Propagation\\PropagationTotalStruct\:\:\$propagated_ids_to_update_version type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Property Model\\Propagation\\PropagationTotalStruct\:\:\$segments_for_propagation type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Property Model\\Propagation\\PropagationTotalStruct\:\:\$totals type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Propagation/PropagationTotalStruct.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getAverages\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getAverages\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getIssuesBySegments\(\) has parameter \$segments_id with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getIssuesBySegments\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getIssuesBySegments\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getReviseIssuesByChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getSegmentsForQualityReport\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getSegmentsForQualityReport\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/QualityReport/QualityReportDao.php + + - + message: '#^Cannot call method fullName\(\) on Model\\Users\\UserStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:buildFilesSegmentsNestedTree\(\) has parameter \$records with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:buildQualityReportStructure\(\) has parameter \$records with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:buildQualityReportStructure\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:filterDate\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:filterDate\(\) has parameter \$date with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:getAndDecodePossiblyProjectMetadataJson\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:getStructure\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:resetScore\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:structureNestComment\(\) has parameter \$record with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:structureNestFile\(\) has parameter \$record with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:structureNestIssue\(\) has parameter \$record with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportModel\:\:structureNestSegment\(\) has parameter \$record with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Property Model\\LQA\\ChunkReviewStruct\:\:\$is_pass \(bool\|null\) does not accept int\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Property Model\\LQA\\ChunkReviewStruct\:\:\$undo_data \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$all_segments is never read, only written\.$#' + identifier: property.onlyWritten + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$all_segments type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$current_file with generic class ArrayObject does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$current_issue with generic class ArrayObject does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$current_segment with generic class ArrayObject does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$quality_report_structure type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignComments\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignComments\(\) has parameter \$seg with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignComments\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignIssues\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignIssues\(\) has parameter \$issue_comments with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignIssues\(\) has parameter \$issues with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignIssues\(\) has parameter \$seg with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_commonSegmentAssignments\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_commonSegmentAssignments\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_getChunkReviews\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_populateLastTranslationAndRevision\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:getSegmentsForQR\(\) has parameter \$segment_ids with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:getSegmentsIdForQR\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:getSegmentsIdForQR\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Parameter \#1 \$segment of method Matecat\\SubFiltering\\MateCatFilter\:\:fromLayer0ToLayer2\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 3 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentModel\:\:\$_chunkReviews has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentModel\:\:\$chunk has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$last_translation \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$secs_per_word \(int\) does not accept float\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Variable \$issues on left side of \?\? always exists and is not nullable\.$#' + identifier: nullCoalesce.variable + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentModel.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getLocalWarning\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getPEE\(\) should return int but returns float\.$#' + identifier: return.type + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getPEEBwtTranslationRevise\(\) should return int but returns float\.$#' + identifier: return.type + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getPEEBwtTranslationSuggestion\(\) should return int but returns float\.$#' + identifier: return.type + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getSecsPerWord\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Parameter \#1 \$seg1 of static method Utils\\Tools\\PostEditing\:\:getPee\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$comments type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$dataRefMap type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$issues type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$last_revisions type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$parsed_time_to_edit type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$warnings type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/QualityReport/QualityReportSegmentStruct.php + + - + message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/RemoteFiles/RemoteFileDao.php + + - + message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:getByFileAndJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/RemoteFiles/RemoteFileDao.php + + - + message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:getByFileId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/RemoteFiles/RemoteFileDao.php + + - + message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:getByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/RemoteFiles/RemoteFileDao.php + + - + message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:getOriginalsByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/RemoteFiles/RemoteFileDao.php + + - + message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:jobHasRemoteFiles\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/RemoteFiles/RemoteFileDao.php + + - + message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:getFeedback\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/ReviseFeedback/FeedbackDAO.php + + - + message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:getFeedback\(\) has parameter \$password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/ReviseFeedback/FeedbackDAO.php + + - + message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:getFeedback\(\) has parameter \$revision_number with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/ReviseFeedback/FeedbackDAO.php + + - + message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:getFeedback\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/ReviseFeedback/FeedbackDAO.php + + - + message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:insertOrUpdate\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/ReviseFeedback/FeedbackDAO.php + + - + message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:updateFeedbackPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/ReviseFeedback/FeedbackDAO.php + + - + message: '#^Method Model\\Search\\MySQLReplaceEventDAO\:\:getEvents\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Search/MySQLReplaceEventDAO.php + + - + message: '#^Method Model\\Search\\MySQLReplaceEventDAO\:\:save\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Search/MySQLReplaceEventDAO.php + + - + message: '#^Method Model\\Search\\MySQLReplaceEventIndexDAO\:\:getActualIndex\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Search/MySQLReplaceEventIndexDAO.php + + - + message: '#^Method Model\\Search\\MySQLReplaceEventIndexDAO\:\:save\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Search/MySQLReplaceEventIndexDAO.php + + - + message: '#^Call to an undefined method Predis\\Client\:\:hgetAll\(\)\.$#' + identifier: method.notFound + count: 1 + path: lib/Model/Search/RedisReplaceEventDAO.php + + - + message: '#^Method Model\\Search\\RedisReplaceEventDAO\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Search/RedisReplaceEventDAO.php + + - + message: '#^Parameter \#2 \$field of method Predis\\ClientInterface\:\:hset\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Search/RedisReplaceEventDAO.php + + - + message: '#^Parameter \#2 \$version of method Model\\Search\\RedisReplaceEventDAO\:\:getEvents\(\) expects int, string given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Search/RedisReplaceEventDAO.php + + - + message: '#^Parameter \#2 \$version of method Model\\Search\\RedisReplaceEventDAO\:\:getRedisKey\(\) expects int, string given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Search/RedisReplaceEventDAO.php + + - + message: '#^Method Model\\Search\\RedisReplaceEventIndexDAO\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Search/RedisReplaceEventIndexDAO.php + + - + message: '#^PHPDoc tag @return with type mixed is not subtype of native type int\.$#' + identifier: return.phpDocType + count: 1 + path: lib/Model/Search/ReplaceEventIndexDAOInterface.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:_getQuery\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:_getQuery\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:_loadParams\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:_loadSearchInSourceQuery\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:_loadSearchInTargetQuery\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:_loadSearchStatusOnlyQuery\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:find\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:hasMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Search\\SearchModel\:\:search\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Parameter \#2 \$needle of method Model\\Search\\SearchModel\:\:find\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 3 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Property Model\\Search\\SearchModel\:\:\$db \(Model\\DataAccess\\Database\) does not accept Model\\DataAccess\\IDatabase\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Strict comparison using \!\=\= between mixed and null will always evaluate to true\.$#' + identifier: notIdentical.alwaysTrue + count: 1 + path: lib/Model/Search/SearchModel.php + + - + message: '#^Method Model\\Segments\\ContextGroupDao\:\:getByFileID\(\) has parameter \$fid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Segments/ContextGroupDao.php + + - + message: '#^Method Model\\Segments\\ContextGroupDao\:\:getBySIDRange\(\) has parameter \$start with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Segments/ContextGroupDao.php + + - + message: '#^Method Model\\Segments\\ContextGroupDao\:\:getBySIDRange\(\) has parameter \$stop with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Segments/ContextGroupDao.php + + - + message: '#^Method Model\\Segments\\ContextGroupDao\:\:getBySegmentID\(\) has parameter \$sid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Segments/ContextGroupDao.php + + - + message: '#^Property Model\\Segments\\ContextGroupDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/ContextGroupDao.php + + - + message: '#^Property Model\\Segments\\ContextGroupDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/ContextGroupDao.php + + - + message: '#^Class Model\\Segments\\ContextStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/Segments/ContextStruct.php + + - + message: '#^Method Model\\Segments\\ContextStruct\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/ContextStruct.php + + - + message: '#^Method Model\\Segments\\ContextStruct\:\:__construct\(\) has parameter \$decode with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Segments/ContextStruct.php + + - + message: '#^Method Model\\Segments\\ContextStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/ContextStruct.php + + - + message: '#^Method Model\\Segments\\ContextStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/ContextStruct.php + + - + message: '#^Method Model\\Segments\\ContextStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/ContextStruct.php + + - + message: '#^Parameter \#1 \$json of function json_decode expects string, array\|string given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Segments/ContextStruct.php + + - + message: '#^Property Model\\Segments\\ContextStruct\:\:\$context_json type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/ContextStruct.php + + - + message: '#^Cannot access property \$job_last_segment on Model\\Jobs\\JobStruct\|false\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Expression on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.expr + count: 2 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:countByFile\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getByChunkId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getByChunkIdAndSegmentId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getContextAndSegmentByIDs\(\) has parameter \$id_list with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getNextSegment\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getNextSegment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getPaginationSegments\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getPaginationSegments\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsDownload\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsDownload\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForAnalysisFromIdJobAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForAnalysisFromIdProjectAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForQr\(\) has parameter \$job_id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForQr\(\) has parameter \$job_password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForQr\(\) has parameter \$segments_id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForQr\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsIdForQR\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsIdForQR\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentDao\:\:getTranslationsMismatches\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$fetched SegmentStruct\[\]\)\: Unexpected token "\$fetched", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$res SegmentStruct\[\]\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Property Model\\Segments\\SegmentDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentDao.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataCollection\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentMetadataCollection.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:destroyGetAllCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentMetadataDao.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:destroyGetCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentMetadataDao.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:get\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentMetadataDao.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:getAll\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentMetadataDao.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:getBySegmentIds\(\) has parameter \$ids with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentMetadataDao.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:getBySegmentIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentMetadataDao.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:save\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Segments/SegmentMetadataDao.php + + - + message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:upsert\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Segments/SegmentMetadataDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getAggregatedBySegmentIdInInterval\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getAggregatedBySegmentIdInInterval\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getAllAggregatedBySegmentIdInInterval\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getAllAggregatedBySegmentIdInInterval\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getBySegmentId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getBySegmentIds\(\) has parameter \$ids with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getBySegmentIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getJsonNotesByRange\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentNoteDao.php + + - + message: '#^Method Model\\Segments\\SegmentOriginalDataDao\:\:getBySegmentId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentOriginalDataDao.php + + - + message: '#^Method Model\\Segments\\SegmentOriginalDataDao\:\:getSegmentDataRefMap\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentOriginalDataDao.php + + - + message: '#^Method Model\\Segments\\SegmentOriginalDataDao\:\:insertRecord\(\) has parameter \$map with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentOriginalDataDao.php + + - + message: '#^Method Model\\Segments\\SegmentOriginalDataDao\:\:insertRecord\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Segments/SegmentOriginalDataDao.php + + - + message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Segments/SegmentOriginalDataDao.php + + - + message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Segments/SegmentOriginalDataDao.php + + - + message: '#^Method Model\\Segments\\SegmentOriginalDataStruct\:\:getMap\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentOriginalDataStruct.php + + - + message: '#^Method Model\\Segments\\SegmentOriginalDataStruct\:\:getMap\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentOriginalDataStruct.php + + - + message: '#^Method Model\\Segments\\SegmentOriginalDataStruct\:\:setMap\(\) has parameter \$map with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentOriginalDataStruct.php + + - + message: '#^Method Model\\Segments\\SegmentOriginalDataStruct\:\:setMap\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentOriginalDataStruct.php + + - + message: '#^Property Model\\Segments\\SegmentOriginalDataStruct\:\:\$decoded_map type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentOriginalDataStruct.php + + - + message: '#^Property Model\\Segments\\SegmentOriginalDataStruct\:\:\$map \(string\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Segments/SegmentOriginalDataStruct.php + + - + message: '#^Class Model\\Segments\\SegmentStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/Segments/SegmentStruct.php + + - + message: '#^Method Model\\Segments\\SegmentStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentStruct.php + + - + message: '#^Method Model\\Segments\\SegmentStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentStruct.php + + - + message: '#^Method Model\\Segments\\SegmentStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentStruct.php + + - + message: '#^Class Model\\Segments\\SegmentUIStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Method Model\\Segments\\SegmentUIStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Method Model\\Segments\\SegmentUIStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Method Model\\Segments\\SegmentUIStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$data_ref_map type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$metadata type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$notes type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$parsed_time_to_edit type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$source_chunk_lengths type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$target_chunk_lengths type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Segments/SegmentUIStruct.php + + - + message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getMTForTMXExport\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TMSService/TMSServiceDao.php + + - + message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getMTForTMXExport\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/TMSService/TMSServiceDao.php + + - + message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getTMForTMXExport\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TMSService/TMSServiceDao.php + + - + message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getTMForTMXExport\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/TMSService/TMSServiceDao.php + + - + message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getTranslationsForTMXExport\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TMSService/TMSServiceDao.php + + - + message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getTranslationsForTMXExport\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/TMSService/TMSServiceDao.php + + - + message: '#^Method Model\\Teams\\InvitedUser\:\:completeTeamSignUp\(\) has parameter \$invitation with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/InvitedUser.php + + - + message: '#^Method Model\\Teams\\InvitedUser\:\:completeTeamSignUp\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Teams/InvitedUser.php + + - + message: '#^Method Model\\Teams\\InvitedUser\:\:hasPendingInvitations\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/InvitedUser.php + + - + message: '#^Parameter \#1 \$struct of class Model\\Teams\\TeamModel constructor expects Model\\Teams\\TeamStruct, Model\\Teams\\TeamStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/InvitedUser.php + + - + message: '#^Property Model\\Teams\\InvitedUser\:\:\$jwt type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/InvitedUser.php + + - + message: '#^Expression on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.expr + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Method Model\\Teams\\MembershipDao\:\:createList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Method Model\\Teams\\MembershipDao\:\:deleteUserFromTeam\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Method Model\\Teams\\MembershipDao\:\:findById\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Method Model\\Teams\\MembershipDao\:\:findById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Method Model\\Teams\\MembershipDao\:\:findById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$members MembershipStruct\[\]\)\: Unexpected token "\$members", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Parameter \#1 \$user of method Model\\Teams\\MembershipDao\:\:destroyCacheUserTeams\(\) expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Parameter \#2 \$user of method Model\\Teams\\MembershipDao\:\:destroyCacheTeamByIdAndUser\(\) expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Property Model\\Teams\\MembershipDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Property Model\\Teams\\MembershipDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/MembershipDao.php + + - + message: '#^Method Model\\Teams\\MembershipStruct\:\:getTeam\(\) should return Model\\Teams\\TeamStruct but returns Model\\Teams\\TeamStruct\|null\.$#' + identifier: return.type + count: 1 + path: lib/Model/Teams/MembershipStruct.php + + - + message: '#^Method Model\\Teams\\MembershipStruct\:\:getUser\(\) should return Model\\Users\\UserStruct but returns Model\\Users\\UserStruct\|null\.$#' + identifier: return.type + count: 1 + path: lib/Model/Teams/MembershipStruct.php + + - + message: '#^Method Model\\Teams\\MembershipStruct\:\:getUserMetadata\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/MembershipStruct.php + + - + message: '#^Method Model\\Teams\\MembershipStruct\:\:setUserMetadata\(\) has parameter \$user_metadata with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/MembershipStruct.php + + - + message: '#^Property Model\\Teams\\MembershipStruct\:\:\$user_metadata type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/MembershipStruct.php + + - + message: '#^Method Model\\Teams\\PendingInvitations\:\:hasPendingInvitation\(\) has parameter \$id_team with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Teams/PendingInvitations.php + + - + message: '#^Method Model\\Teams\\PendingInvitations\:\:hasPendingInvitation\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/PendingInvitations.php + + - + message: '#^Property Model\\Teams\\PendingInvitations\:\:\$payload type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/PendingInvitations.php + + - + message: '#^Method Model\\Teams\\TeamDao\:\:createPersonalTeam\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Method Model\\Teams\\TeamDao\:\:createUserTeam\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Method Model\\Teams\\TeamDao\:\:createUserTeam\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Method Model\\Teams\\TeamDao\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Method Model\\Teams\\TeamDao\:\:deleteTeam\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Method Model\\Teams\\TeamDao\:\:destroyCacheUserCreatedTeams\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Method Model\\Teams\\TeamDao\:\:findById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Method Model\\Teams\\TeamDao\:\:updateTeamName\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$res TeamStruct\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Parameter \#1 \$uid of method Model\\Teams\\TeamDao\:\:getPersonalByUid\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Property Model\\Teams\\TeamDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Property Model\\Teams\\TeamDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Property Model\\Teams\\TeamStruct\:\:\$created_by \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Property Model\\Teams\\TeamStruct\:\:\$id \(int\|null\) does not accept int\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Teams/TeamDao.php + + - + message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$uid\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Call to an undefined method Model\\DataAccess\\IDaoStruct\:\:setAssignedProjects\(\)\.$#' + identifier: method.notFound + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_checkAddMembersToPersonalTeam\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_checkPersonalUnique\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_checkType\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_createTeamWithMatecatUsers\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_createTeamWithMatecatUsers\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_getInvitedEmails\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_getInvitedEmails\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_getRemovedMembersEmailList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:_setPendingStatuses\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:addMemberEmails\(\) has parameter \$emails with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Method Model\\Teams\\TeamModel\:\:removeMemberUids\(\) has parameter \$uids with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Parameter \#1 \$id_team of method Model\\Teams\\MembershipDao\:\:destroyCacheForListByTeamId\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Parameter \#1 \$id_team of method Model\\Teams\\MembershipDao\:\:getMemberListByTeamId\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 3 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Parameter \#1 \$list of method Model\\Teams\\TeamStruct\:\:setMembers\(\) expects array\, array\ given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Parameter \#1 \$user of method Model\\Teams\\TeamDao\:\:getPersonalByUser\(\) expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Parameter \#2 \$payload of class Model\\Teams\\PendingInvitations constructor expects array\{team_id\?\: int, email\?\: string\}, array\{team_id\: int\|null, email\: mixed\} given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Parameter \#2 \$teamId of method Model\\Teams\\MembershipDao\:\:deleteUserFromTeam\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Parameter \#2 \$user of method Model\\Projects\\ProjectDao\:\:massiveSelfAssignment\(\) expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Property Model\\Teams\\TeamModel\:\:\$all_memberships \(array\\) does not accept array\\.$#' + identifier: assign.propertyType + count: 2 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Property Model\\Teams\\TeamModel\:\:\$all_memberships \(array\\) does not accept array\\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Property Model\\Teams\\TeamModel\:\:\$member_emails type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Property Model\\Teams\\TeamModel\:\:\$new_memberships \(array\\) does not accept array\\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Property Model\\Teams\\TeamModel\:\:\$uids_to_remove type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Right side of && is always true\.$#' + identifier: booleanAnd.rightAlwaysTrue + count: 1 + path: lib/Model/Teams/TeamModel.php + + - + message: '#^Argument of an invalid type array\\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 1 + path: lib/Model/Teams/TeamStruct.php + + - + message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$tm_key\.$#' + identifier: property.notFound + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Argument of an invalid type Model\\DataAccess\\ShapelessConcreteStruct supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 2 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Cannot access property \$glos on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject + count: 5 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Cannot access property \$tm on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:createList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:sanitize\(\) should return Model\\TmKeyManagement\\MemoryKeyStruct but returns Model\\DataAccess\\IDaoStruct\.$#' + identifier: return.type + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:sanitizeArray\(\) has parameter \$input with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:sanitizeArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$chunk MemoryKeyStruct\[\]\)\: Unexpected token "\$chunk", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$obj MemoryKeyStruct\)\: Unexpected token "\$obj", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 2 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^PHPDoc tag @var with type Model\\DataAccess\\ShapelessConcreteStruct is not subtype of native type array\.$#' + identifier: varTag.nativeType + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Parameter \#1 \$array_result of method Model\\TmKeyManagement\\MemoryKeyDao\:\:_buildResult\(\) expects array, Model\\DataAccess\\ShapelessConcreteStruct given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Parameter \#2 \$length of function array_chunk expects int\<1, max\>, int given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Template type T of method Model\\TmKeyManagement\\MemoryKeyDao\:\:sanitize\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyDao.php + + - + message: '#^Method Model\\TmKeyManagement\\MemoryKeyStruct\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyStruct.php + + - + message: '#^Method Model\\TmKeyManagement\\MemoryKeyStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TmKeyManagement/MemoryKeyStruct.php + + - + message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/TmKeyManagement/UserKeysModel.php + + - + message: '#^Cannot call method isShared\(\) on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/TmKeyManagement/UserKeysModel.php + + - + message: '#^Method Model\\TmKeyManagement\\UserKeysModel\:\:getKeys\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TmKeyManagement/UserKeysModel.php + + - + message: '#^Method Model\\TmKeyManagement\\UserKeysModel\:\:getKeys\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/TmKeyManagement/UserKeysModel.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$_client_tm_key TmKeyStruct\)\: Unexpected token "\$_client_tm_key", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/TmKeyManagement/UserKeysModel.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$keyList MemoryKeyStruct\[\]\)\: Unexpected token "\$keyList", expected type at offset 84 on line 4$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/TmKeyManagement/UserKeysModel.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$keyList array\)\: Unexpected token "\$keyList", expected type at offset 159 on line 5$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/TmKeyManagement/UserKeysModel.php + + - + message: '#^Property Model\\TmKeyManagement\\UserKeysModel\:\:\$_user_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TmKeyManagement/UserKeysModel.php + + - + message: '#^Call to function is_array\(\) with list\ will always evaluate to true\.$#' + identifier: function.alreadyNarrowedType + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:addTranslation\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:findBySegmentAndJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getAllSegmentsByIdListAndJobId\(\) has parameter \$id_list with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getAllSegmentsByIdListAndJobId\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getAllSegmentsByIdListAndJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getByFile\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getLast10TranslatedSegmentIDsInLastHour\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getMaxSegmentIdsFromJob\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getMaxSegmentIdsFromJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getUnchangeableStatus\(\) has parameter \$segments_ids with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getUnchangeableStatus\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getWordsPerSecond\(\) has parameter \$estimation_seg_ids with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getWordsPerSecond\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getWordsPerSecond\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:propagateTranslation\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:rebuildFromReplaceEvents\(\) has parameter \$events with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:rebuildFromReplaceEvents\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:setAnalysisValue\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:setAnalysisValue\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateFirstTimeOpenedContribution\(\) has parameter \$data with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateFirstTimeOpenedContribution\(\) has parameter \$where with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateLastTranslationDateByIdList\(\) has parameter \$segmentIdList with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateLastTranslationDateByIdList\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateSuggestionsArray\(\) has parameter \$id_segment with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateSuggestionsArray\(\) has parameter \$suggestions with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateSuggestionsArray\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$result SegmentTranslationStruct\[\]\)\: Unexpected token "\$result", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$result SegmentTranslationStruct\[\]\)\: Unexpected token "\$result", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Parameter \#1 \$string of function strlen expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Parameter \#1 \$value of function count expects array\|Countable, array\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Parameter \#2 \.\.\.\$arrays of function array_merge expects array, array\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Property Model\\Translations\\SegmentTranslationDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/SegmentTranslationDao.php + + - + message: '#^Class Model\\Translations\\SegmentTranslationStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/Translations/SegmentTranslationStruct.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Translations/SegmentTranslationStruct.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Translations/SegmentTranslationStruct.php + + - + message: '#^Method Model\\Translations\\SegmentTranslationStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Translations/SegmentTranslationStruct.php + + - + message: '#^PHPDoc tag @return with type array\\|null is not subtype of native type Model\\Jobs\\JobStruct\|null\.$#' + identifier: return.phpDocType + count: 1 + path: lib/Model/Translations/SegmentTranslationStruct.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:getErrorsByChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByJobIdAndPassword\(\) has parameter \$jid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByJobIdAndPassword\(\) has parameter \$jpassword with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByJobIdAndPassword\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByJobIdAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByProjectIds\(\) has parameter \$projectIds with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByProjectIds\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByProjectIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Translations/WarningDao.php + + - + message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$source_chunk_lengths type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TranslationsSplit/SegmentSplitStruct.php + + - + message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$target_chunk_lengths type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TranslationsSplit/SegmentSplitStruct.php + + - + message: '#^Method Model\\TranslationsSplit\\SplitDAO\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/TranslationsSplit/SplitDAO.php + + - + message: '#^Method Model\\TranslationsSplit\\SplitDAO\:\:_validatePrimaryKey\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' + identifier: throws.unusedType + count: 1 + path: lib/Model/TranslationsSplit/SplitDAO.php + + - + message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$source_chunk_lengths \(array\|string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/TranslationsSplit/SplitDAO.php + + - + message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$target_chunk_lengths \(array\|string\) does not accept string\|false\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/TranslationsSplit/SplitDAO.php + + - + message: '#^Property Model\\Translators\\JobsTranslatorsDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translators/JobsTranslatorsDao.php + + - + message: '#^Property Model\\Translators\\JobsTranslatorsDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translators/JobsTranslatorsDao.php + + - + message: '#^Method Model\\Translators\\JobsTranslatorsStruct\:\:getUser\(\) should return Model\\Users\\UserStruct but returns Model\\Users\\UserStruct\|null\.$#' + identifier: return.type + count: 1 + path: lib/Model/Translators/JobsTranslatorsStruct.php + + - + message: '#^Cannot access property \$name on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Cannot access property \$uid on Model\\Users\\UserStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Method Model\\Translators\\TranslatorsModel\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Method Model\\Translators\\TranslatorsModel\:\:getTranslator\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Method Model\\Translators\\TranslatorsModel\:\:saveProfile\(\) should return int but returns int\|null\.$#' + identifier: return.type + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Method Model\\Translators\\TranslatorsModel\:\:saveProfile\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Method Model\\Translators\\TranslatorsModel\:\:setDeliveryDate\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Method Model\\Translators\\TranslatorsModel\:\:update\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^PHPDoc tag @param for parameter \$job_password with type mixed is not subtype of native type string\.$#' + identifier: parameter.phpDocType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Parameter \#1 \$datetime of function strtotime expects string, int\|string given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Parameter \#1 \$id_job of static method Model\\Projects\\ProjectDao\:\:findByJobId\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Parameter \#2 \$oldPassword of class Model\\FeaturesBase\\Hook\\Event\\Run\\JobPasswordChangedEvent constructor expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Parameter \#2 \$translator of class Utils\\Email\\SendToTranslatorForDeliveryChangeEmail constructor expects Model\\Translators\\JobsTranslatorsStruct, Model\\Translators\\JobsTranslatorsStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Parameter \#2 \$translator of class Utils\\Email\\SendToTranslatorForJobSplitEmail constructor expects Model\\Translators\\JobsTranslatorsStruct, Model\\Translators\\JobsTranslatorsStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Parameter \#2 \$translator of class Utils\\Email\\SendToTranslatorForNewJobEmail constructor expects Model\\Translators\\JobsTranslatorsStruct, Model\\Translators\\JobsTranslatorsStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\JobsTranslatorsStruct\:\:\$added_by \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\JobsTranslatorsStruct\:\:\$id_job \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\JobsTranslatorsStruct\:\:\$job_password \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\TranslatorProfilesStruct\:\:\$id \(int\|null\) does not accept int\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\TranslatorProfilesStruct\:\:\$uid_translator \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\TranslatorsModel\:\:\$delivery_date \(int\) does not accept int\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\TranslatorsModel\:\:\$delivery_date \(int\) does not accept int\|string\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\TranslatorsModel\:\:\$job_password \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\TranslatorsModel\:\:\$mailsToBeSent type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Unsafe access to private property Model\\Translators\\TranslatorsModel\:\:\$__transactionStarted through static\:\:\.$#' + identifier: staticClassAccess.privateProperty + count: 5 + path: lib/Model/Translators/TranslatorsModel.php + + - + message: '#^Property Model\\Translators\\TranslatorsProfilesDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translators/TranslatorsProfilesDao.php + + - + message: '#^Property Model\\Translators\\TranslatorsProfilesDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Translators/TranslatorsProfilesDao.php + + - + message: '#^Method Model\\Users\\Authentication\\ChangePasswordModel\:\:changePassword\(\) has parameter \$new_password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/Authentication/ChangePasswordModel.php + + - + message: '#^Method Model\\Users\\Authentication\\ChangePasswordModel\:\:changePassword\(\) has parameter \$old_password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/Authentication/ChangePasswordModel.php + + - + message: '#^Cannot call method encrypt\(\) on Model\\ConnectedServices\\Oauth\\OauthTokenEncryption\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/Users/Authentication/OAuthSignInModel.php + + - + message: '#^Method Model\\Users\\Authentication\\OAuthSignInModel\:\:_createNewUser\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Users/Authentication/OAuthSignInModel.php + + - + message: '#^Parameter \#1 \$email of method Model\\Users\\UserDao\:\:getByEmail\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/Authentication/OAuthSignInModel.php + + - + message: '#^Parameter \#1 \$uid of method Model\\Users\\MetadataDao\:\:set\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Users/Authentication/OAuthSignInModel.php + + - + message: '#^Parameter \#3 \$value of method Model\\Users\\MetadataDao\:\:set\(\) expects array\|string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/Authentication/OAuthSignInModel.php + + - + message: '#^Property Model\\Users\\UserStruct\:\:\$uid \(int\|null\) does not accept int\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Users/Authentication/OAuthSignInModel.php + + - + message: '#^Method Model\\Users\\Authentication\\PasswordResetModel\:\:__construct\(\) has parameter \$session with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/Authentication/PasswordResetModel.php + + - + message: '#^Method Model\\Users\\Authentication\\PasswordResetModel\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Users/Authentication/PasswordResetModel.php + + - + message: '#^Parameter \#1 \$datetime of function strtotime expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/Authentication/PasswordResetModel.php + + - + message: '#^Property Model\\Users\\Authentication\\PasswordResetModel\:\:\$session type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/Authentication/PasswordResetModel.php + + - + message: '#^Method Model\\Users\\Authentication\\SignupModel\:\:__construct\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Method Model\\Users\\Authentication\\SignupModel\:\:__construct\(\) has parameter \$session with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Method Model\\Users\\Authentication\\SignupModel\:\:getParams\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Method Model\\Users\\Authentication\\SignupModel\:\:processSignup\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Parameter \#1 \$datetime of function strtotime expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Parameter \#1 \$email of method Model\\Users\\UserDao\:\:getByEmail\(\) expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Parameter \#1 \$email of method Model\\Users\\UserDao\:\:getByEmail\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Property Model\\Users\\Authentication\\SignupModel\:\:\$params type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Property Model\\Users\\Authentication\\SignupModel\:\:\$session type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Property Model\\Users\\UserStruct\:\:\$uid \(int\|null\) does not accept int\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Users/Authentication/SignupModel.php + + - + message: '#^Argument of an invalid type Model\\Users\\UserStruct supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 1 + path: lib/Model/Users/ClientUserFacade.php + + - + message: '#^Method Model\\Users\\ClientUserFacade\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/Users/ClientUserFacade.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:_buildResult\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:destroyCacheKey\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:destroyCacheKey\(\) has parameter \$uid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:get\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:get\(\) has parameter \$uid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUid\(\) has parameter \$uid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUid\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUid\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUidList\(\) has parameter \$UIDs with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUidList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:set\(\) has parameter \$value with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataDao\:\:set\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$result MetadataStruct\)\: Unexpected token "\$result", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$rs MetadataStruct\[\]\)\: Unexpected token "\$rs", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Users/MetadataDao.php + + - + message: '#^Method Model\\Users\\MetadataStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/MetadataStruct.php + + - + message: '#^Property Model\\Users\\MetadataStruct\:\:\$value type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/MetadataStruct.php + + - + message: '#^Cannot access property \$id on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Cannot access property \$id_assignee on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Cannot access property \$id_customer on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Cannot access property \$id_team on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Cannot access property \$name on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Cannot access property \$password on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Method Model\\Users\\RedeemableProject\:\:__construct\(\) has parameter \$session with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Method Model\\Users\\RedeemableProject\:\:getProject\(\) should return Model\\Projects\\ProjectStruct but returns Model\\Projects\\ProjectStruct\|null\.$#' + identifier: return.type + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Method Model\\Users\\RedeemableProject\:\:tryToRedeem\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Parameter \#1 \$project of method Model\\Jobs\\JobDao\:\:updateOwner\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Parameter \#1 \$struct of static method Model\\DataAccess\\AbstractDao\:\:updateStruct\(\) expects Model\\DataAccess\\AbstractDaoObjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Property Model\\Users\\RedeemableProject\:\:\$session type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/RedeemableProject.php + + - + message: '#^Call to function is_iterable\(\) with array will always evaluate to true\.$#' + identifier: function.alreadyNarrowedType + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:_buildReadQuery\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:createUser\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:destroyCacheByEmail\(\) has parameter \$email with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:destroyCacheByEmail\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:destroyCacheByUid\(\) has parameter \$uid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:getByConfirmationToken\(\) has parameter \$token with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:getByConfirmationToken\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:getByEmails\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:getByUid\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:getByUids\(\) has parameter \$uids_array with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:getProjectOwner\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:updateUser\(\) should return Model\\Users\\UserStruct but returns Model\\Users\\UserStruct\|null\.$#' + identifier: return.type + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Method Model\\Users\\UserDao\:\:updateUser\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Users/UserDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$__resultSet UserStruct\[\]\)\: Unexpected token "\$__resultSet", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$res \?UserStruct\)\: Unexpected token "\$res", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 2 + path: lib/Model/Users/UserDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$res UserStruct\)\: Unexpected token "\$res", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$res UserStruct\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Parameter \#1 \$input of method Model\\Users\\UserDao\:\:sanitize\(\) expects Model\\Users\\UserStruct, Model\\DataAccess\\IDaoStruct given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Property Model\\Users\\UserDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Property Model\\Users\\UserDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/UserDao.php + + - + message: '#^Argument of an invalid type array\\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 1 + path: lib/Model/Users/UserStruct.php + + - + message: '#^Cannot call method decrypt\(\) on Model\\ConnectedServices\\Oauth\\OauthTokenEncryption\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/Users/UserStruct.php + + - + message: '#^Method Model\\Users\\UserStruct\:\:belongsToTeam\(\) has parameter \$teamId with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/UserStruct.php + + - + message: '#^Method Model\\Users\\UserStruct\:\:getMetadataAsKeyValue\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Users/UserStruct.php + + - + message: '#^Method Model\\Users\\UserStruct\:\:passwordMatch\(\) has parameter \$password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Users/UserStruct.php + + - + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Model/Users/UserStruct.php + + - + message: '#^Parameter \#1 \$string of function mb_substr expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Users/UserStruct.php + + - + message: '#^Class Model\\Warnings\\GlobalWarningStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: lib/Model/Warnings/GlobalWarningStruct.php + + - + message: '#^Method Model\\Warnings\\GlobalWarningStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Warnings/GlobalWarningStruct.php + + - + message: '#^Method Model\\Warnings\\GlobalWarningStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Warnings/GlobalWarningStruct.php + + - + message: '#^Method Model\\Warnings\\GlobalWarningStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Warnings/GlobalWarningStruct.php + + - + message: '#^Cannot call method getApproved2RawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getApproved2Words\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getApprovedRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getApprovedWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getDraftRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getDraftWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getIdJob\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getIdSegment\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getJobPassword\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getNewRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getNewWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getRejectedRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getRejectedWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getTranslatedRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Cannot call method getTranslatedWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Method Model\\WordCount\\CounterModel\:\:_verifyStatus\(\) throws checked exception BadMethodCallException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Method Model\\WordCount\\CounterModel\:\:getUpdatedValues\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Method Model\\WordCount\\CounterModel\:\:methodNameForStatusCall\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Property Model\\WordCount\\CounterModel\:\:\$constCache type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/WordCount/CounterModel.php + + - + message: '#^Method Model\\WordCount\\WordCountStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/WordCount/WordCountStruct.php + + - + message: '#^Method Model\\WordCount\\WordCountStruct\:\:loadFromJob\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/WordCount/WordCountStruct.php + + - + message: '#^Method Model\\WordCount\\WordCountStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/WordCount/WordCountStruct.php + + - + message: '#^Property Model\\WordCount\\WordCountStruct\:\:\$job_password \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/WordCount/WordCountStruct.php + + - + message: '#^Method Model\\WordCount\\WordCounterDao\:\:getStatsForJob\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/WordCount/WordCounterDao.php + + - + message: '#^Method Model\\WordCount\\WordCounterDao\:\:getStatsForJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: lib/Model/WordCount/WordCounterDao.php + + - + message: '#^Method Model\\WordCount\\WordCounterDao\:\:initializeWordCount\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Model/WordCount/WordCounterDao.php + + - + message: '#^Method Model\\WordCount\\WordCounterDao\:\:updateWordCount\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/WordCount/WordCounterDao.php + + - + message: '#^Cannot assign new offset to string\.$#' + identifier: offsetAssign.dimType + count: 2 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:__construct\(\) has parameter \$states with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:asEquivalentWordCount\(\) has parameter \$payable_rates with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:asStandardWordCount\(\) has parameter \$payable_rates with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:getStates\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:getStates\(\) should return array but returns array\\|string\.$#' + identifier: return.type + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setAnalysis\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setEditor\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setMatchCategory\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setStates\(\) has parameter \$states with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setStates\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Parameter \#1 \.\.\.\$arrays of function array_merge expects array, string given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Parameter \#2 \.\.\.\$arrays of function array_merge expects array, string given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Property Model\\Xliff\\DTO\\AbstractXliffRule\:\:\$_STATES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Property Model\\Xliff\\DTO\\AbstractXliffRule\:\:\$_STATE_QUALIFIERS type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Property Model\\Xliff\\DTO\\AbstractXliffRule\:\:\$states \(array\\) does not accept default value of type array\\.$#' + identifier: property.defaultValue + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static + count: 1 + path: lib/Model/Xliff/DTO/AbstractXliffRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\DefaultRule\:\:isTranslated\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Model/Xliff/DTO/DefaultRule.php + + - + message: '#^Method Model\\Xliff\\DTO\\DefaultRule\:\:setAnalysis\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Xliff/DTO/DefaultRule.php + + - + message: '#^Property Model\\Xliff\\DTO\\DefaultRule\:\:\$_STATES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/DefaultRule.php + + - + message: '#^Property Model\\Xliff\\DTO\\DefaultRule\:\:\$_STATE_QUALIFIERS type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/DefaultRule.php + + - + message: '#^Property Model\\Xliff\\DTO\\Xliff12Rule\:\:\$_STATES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/Xliff12Rule.php + + - + message: '#^Property Model\\Xliff\\DTO\\Xliff12Rule\:\:\$_STATE_QUALIFIERS type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/Xliff12Rule.php + + - + message: '#^Property Model\\Xliff\\DTO\\Xliff20Rule\:\:\$_STATES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/Xliff20Rule.php + + - + message: '#^Method Model\\Xliff\\DTO\\XliffRuleInterface\:\:asEquivalentWordCount\(\) has parameter \$payable_rates with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/XliffRuleInterface.php + + - + message: '#^Method Model\\Xliff\\DTO\\XliffRuleInterface\:\:asStandardWordCount\(\) has parameter \$payable_rates with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/XliffRuleInterface.php + + - + message: '#^Method Model\\Xliff\\DTO\\XliffRulesModel\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Model/Xliff/DTO/XliffRulesModel.php + + - + message: '#^Method Model\\Xliff\\DTO\\XliffRulesModel\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/XliffRulesModel.php + + - + message: '#^Method Model\\Xliff\\DTO\\XliffRulesModel\:\:getRulesForVersion\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Xliff/DTO/XliffRulesModel.php + + - + message: '#^Method Model\\Xliff\\DTO\\XliffRulesModel\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/XliffRulesModel.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$rule AbstractXliffRule \*\)\: Unexpected token "\$rule", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Model/Xliff/DTO/XliffRulesModel.php + + - + message: '#^Property Model\\Xliff\\DTO\\XliffRulesModel\:\:\$ruleSets type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/DTO/XliffRulesModel.php + + - + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static + count: 1 + path: lib/Model/Xliff/DTO/XliffRulesModel.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:destroyQueryByIdAndUidCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:destroyQueryByUidCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:getById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:getByUid\(\) should return array\ but returns list\\.$#' + identifier: return.type + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:hydrateTemplateStruct\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:hydrateTemplateStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:save\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Property Model\\Xliff\\XliffConfigTemplateStruct\:\:\$id \(int\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Unsafe access to private property Model\\Xliff\\XliffConfigTemplateDao\:\:\$instance through static\:\:\.$#' + identifier: staticClassAccess.privateProperty + count: 3 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateDao.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Model/Xliff/XliffConfigTemplateStruct.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateStruct\:\:hydrateRulesFromDataArray\(\) has parameter \$rules with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateStruct.php + + - + message: '#^Method Model\\Xliff\\XliffConfigTemplateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Model/Xliff/XliffConfigTemplateStruct.php + + - + message: '#^Parameter \#1 \$date of static method Utils\\Date\\DateTimeUtil\:\:formatIsoDate\(\) expects null, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Model/Xliff/XliffConfigTemplateStruct.php + + - + message: '#^Cannot call method isDeleted\(\) on Model\\Jobs\\JobStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Instanceof between class\-string and Plugins\\Features\\ReviewExtended will always evaluate to false\.$#' + identifier: instanceof.alwaysFalse + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:_validateUndoData\(\) has parameter \$undo_data with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:alterChunkReviewStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:createQaChunkReviewRecords\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:createQaChunkReviewRecords\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:postProjectCreate\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#1 \$id_job of method Model\\LQA\\ChunkReviewDao\:\:updatePassword\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#1 \$id_job of method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventsInSegmentInterval\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#1 \$id_job of static method Model\\Jobs\\JobDao\:\:getById\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#1 \$id_job of static method Model\\LQA\\ChunkReviewDao\:\:deleteByJobId\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#1 \$password of method Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterJobPasswordToReviewPasswordEvent\:\:setPassword\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#1 \$project of method Model\\Projects\\ProjectDao\:\:updateField\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#1 \$project of method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:recountAndUpdatePassFailResult\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#2 \$project of method Plugins\\Features\\AbstractRevisionFeature\:\:createQaChunkReviewRecords\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + identifier: argument.type + count: 3 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Parameter \#3 \$new_password of method Model\\LQA\\ChunkReviewDao\:\:updatePassword\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$create_2_pass_review \(bool\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$features \(array\\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Property Plugins\\Features\\AbstractRevisionFeature\:\:\$dependencies type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/AbstractRevisionFeature.php + + - + message: '#^Method Plugins\\Features\\BaseFeature\:\:getBuildFiles\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Method Plugins\\Features\\BaseFeature\:\:getConfig\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Method Plugins\\Features\\BaseFeature\:\:getConfig\(\) should return array but returns array\|false\.$#' + identifier: return.type + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Method Plugins\\Features\\BaseFeature\:\:getConflictingDependencies\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Method Plugins\\Features\\BaseFeature\:\:getDependencies\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Method Plugins\\Features\\BaseFeature\:\:loadRoutes\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^PHPDoc tag @return with type array\|false is not subtype of native type array\|null\.$#' + identifier: return.phpDocType + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Parameter \#1 \$filename of function file_exists expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Parameter \#1 \$filename of function parse_ini_file expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Parameter \#1 \$path of function dirname expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Parameter \#1 \$path of function pathinfo expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Property Plugins\\Features\\BaseFeature\:\:\$conflictingDependencies type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Property Plugins\\Features\\BaseFeature\:\:\$dependencies type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/BaseFeature.php + + - + message: '#^Method Plugins\\Features\\IBaseFeature\:\:getConflictingDependencies\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/IBaseFeature.php + + - + message: '#^Method Plugins\\Features\\IBaseFeature\:\:getDependencies\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/IBaseFeature.php + + - + message: '#^Method Plugins\\Features\\ProjectCompletion\:\:postAddSegmentTranslation\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Plugins/Features/ProjectCompletion.php + + - + message: '#^Parameter \#1 \$id_job of method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:updatePassword\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ProjectCompletion.php + + - + message: '#^Parameter \#2 \$password of method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:updatePassword\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ProjectCompletion.php + + - + message: '#^Property Model\\ChunksCompletion\\ChunkCompletionUpdateStruct\:\:\$id_job \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/ProjectCompletion.php + + - + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$job_completion_current_phase\.$#' + identifier: property.notFound + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$job_completion_last_event_id\.$#' + identifier: property.notFound + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$job_marked_complete\.$#' + identifier: property.notFound + count: 2 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$mark_as_complete_button_enabled\.$#' + identifier: property.notFound + count: 3 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$project_completion_feature_enabled\.$#' + identifier: property.notFound + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Cannot call method getJob\(\) on Controller\\Views\\TemplateDecorator\\Arguments\\CatDecoratorArguments\|null\.$#' + identifier: method.nonObject + count: 3 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Cannot call method getWordCountStruct\(\) on Controller\\Views\\TemplateDecorator\\Arguments\\CatDecoratorArguments\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Cannot call method isRevision\(\) on Controller\\Views\\TemplateDecorator\\Arguments\\CatDecoratorArguments\|null\.$#' + identifier: method.nonObject + count: 3 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Property Plugins\\Features\\ProjectCompletion\\Decorator\\CatDecorator\:\:\$stats type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + + - + message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\EventModel\:\:save\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/EventModel.php + + - + message: '#^Parameter \#1 \$project of method Model\\FeaturesBase\\FeatureSet\:\:loadForProject\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/EventModel.php + + - + message: '#^Property Plugins\\Features\\ProjectCompletion\\Model\\EventModel\:\:\$chunkCompletionEventId \(int\|null\) does not accept string\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/EventModel.php + + - + message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:dataForChunkStatus\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + + - + message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:getStatus\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + + - + message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:getStatus\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + + - + message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:populateStatus\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + + - + message: '#^Parameter \#1 \$password of class Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterJobPasswordToReviewPasswordEvent constructor expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + + - + message: '#^Parameter \#2 \$idJob of class Model\\FeaturesBase\\Hook\\Event\\Filter\\FilterJobPasswordToReviewPasswordEvent constructor expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + + - + message: '#^Property Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:\$cachedStatus type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + + - + message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\UndoModel\:\:__construct\(\) has parameter \$event with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ProjectCompletion/Model/UndoModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:getOrCreateChunkReviews\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:getOrCreateChunkReviews\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:setPreparedEvents\(\) has parameter \$prepared_events with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:updateJobWordCounter\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^PHPDoc tag @var for property Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:\$chunk with type mixed is not subtype of native type Model\\Jobs\\JobStruct\.$#' + identifier: property.phpDocType + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Parameter \#1 \$penalty_points of method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:updateChunkReviewCountersAndPassFail\(\) expects float, float\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Property Model\\Jobs\\JobStruct\:\:\$approved2_raw_words \(int\) does not accept float\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Property Model\\Jobs\\JobStruct\:\:\$approved_raw_words \(int\) does not accept float\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Property Model\\Jobs\\JobStruct\:\:\$draft_raw_words \(int\) does not accept float\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Property Model\\Jobs\\JobStruct\:\:\$new_raw_words \(int\) does not accept float\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Property Model\\Jobs\\JobStruct\:\:\$rejected_raw_words \(int\) does not accept float\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Property Model\\Jobs\\JobStruct\:\:\$translated_raw_words \(int\) does not accept float\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:_updatePassFailResult\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:addPenaltyPoints\(\) has parameter \$penalty_points with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:recountAndUpdatePassFailResult\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php + + - + message: '#^Parameter \#1 \$chunkReviewID of method Model\\LQA\\ChunkReviewDao\:\:passFailCountsAtomicUpdate\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\BatchReviewProcessorAlertEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/BatchReviewProcessorAlertEmail.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:__construct\(\) has parameter \$changeAuthor with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:__construct\(\) has parameter \$data with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:__construct\(\) has parameter \$segmentInfo with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:__construct\(\) has parameter \$segmentUrl with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Parameter \#1 \$address of method Utils\\Email\\AbstractEmail\:\:sendTo\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Parameter \#1 \$email of method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:isRecipientTheChangeAuthor\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Property Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:\$_segmentInfo has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Property Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:\$data has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Property Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:\$segmentUrl has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\IChunkReviewModel\:\:addPenaltyPoints\(\) has parameter \$penalty_points with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/IChunkReviewModel.php + + - + message: '#^Call to function is_array\(\) with array will always evaluate to true\.$#' + identifier: function.alreadyNarrowedType + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:filterLQAModelLimit\(\) should return int but returns int\|false\.$#' + identifier: return.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:sourcePageToTranslationStatus\(\) has parameter \$number with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:validRevisionNumbers\(\) should return array\ but returns array\\.$#' + identifier: return.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:validRevisionNumbers\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + + - + message: '#^Cannot access property \$id on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Cannot access property \$id on Model\\Segments\\SegmentStruct\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Cannot access property \$password on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Cannot access property \$raw_word_count on Model\\Segments\\SegmentStruct\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Cannot access property \$segment on Model\\Segments\\SegmentStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Cannot access property \$source on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Cannot access property \$target on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Cannot call method getProject\(\) on Model\\Jobs\\JobStruct\|null\.$#' + identifier: method.nonObject + count: 6 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:__construct\(\) has parameter \$chunkReviews with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:_sendNotificationEmail\(\) has parameter \$chunkReviewsWithFinalRevisions with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:_sendNotificationEmail\(\) has parameter \$finalRevisions with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Parameter \#1 \$id of method Model\\LQA\\EntryCommentStruct\:\:getEntriesById\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Parameter \#1 \$id_job of method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getAllFinalRevisionsForSegment\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Parameter \#1 \$string of static method Utils\\Tools\\Utils\:\:htmlentitiesToUft8WithoutDoubleEncoding\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Parameter \#1 \$weighted_words_amount of method Model\\WordCount\\CounterModel\:\:setUpdatedValues\(\) expects float, float\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Parameter \#2 \$id_job of static method Model\\LQA\\EntryDao\:\:findByIdSegmentAndSourcePage\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Parameter \#2 \$id_job of static method Utils\\Url\\CanonicalRoutes\:\:translate\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Parameter \#3 \$password of static method Utils\\Url\\CanonicalRoutes\:\:translate\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Property Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:\$_finalRevisions type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Property Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:\$_sourcePagesWithFinalRevisions type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Unsafe access to private property Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:\$__transactionStarted through static\:\:\.$#' + identifier: staticClassAccess.privateProperty + count: 5 + path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + + - + message: '#^Cannot call method getChunk\(\) on Model\\LQA\\ChunkReviewStruct\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:__construct\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:__construct\(\) has parameter \$password with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:__construct\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:saveDiff\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:setDiff\(\) has parameter \$diff with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Parameter \#1 \$chunk_review of class Plugins\\Features\\ReviewExtended\\ChunkReviewModel constructor expects Model\\LQA\\ChunkReviewStruct, Model\\LQA\\ChunkReviewStruct\|null given\.$#' + identifier: argument.type + count: 3 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Parameter \#1 \$id_job of static method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Parameter \#1 \$penalty_points of method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:subtractPenaltyPoints\(\) expects float, float\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Parameter \#2 \$password of static method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Property Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:\$diff type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Property Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionStruct\:\:\$raw_diff \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType + count: 2 + path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + + - + message: '#^Method Plugins\\Features\\RevisionFactory\:\:initFromProject\(\) should return static\(Plugins\\Features\\RevisionFactory\) but returns Plugins\\Features\\RevisionFactory\.$#' + identifier: return.type + count: 2 + path: lib/Plugins/Features/RevisionFactory.php + + - + message: '#^Parameter \#1 \$revisionFeature of class Plugins\\Features\\RevisionFactory constructor expects Plugins\\Features\\AbstractRevisionFeature, Plugins\\Features\\AbstractRevisionFeature\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/RevisionFactory.php + + - + message: '#^Property Plugins\\Features\\SecondPassReview\:\:\$dependencies type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/SecondPassReview.php + + - + message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\FilterDefinition\:\:__construct\(\) has parameter \$filter_data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/SegmentFilter/Model/FilterDefinition.php + + - + message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\FilterDefinition\:\:sampleData\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/SegmentFilter/Model/FilterDefinition.php + + - + message: '#^Property Plugins\\Features\\SegmentFilter\\Model\\FilterDefinition\:\:\$filter_data type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/SegmentFilter/Model/FilterDefinition.php + + - + message: '#^Access to an undefined property object\:\:\$count\.$#' + identifier: property.notFound + count: 1 + path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + + - + message: '#^Access to an undefined property object\:\:\$limit\.$#' + identifier: property.notFound + count: 3 + path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + + - + message: '#^Access to an undefined property object\:\:\$sql\.$#' + identifier: property.notFound + count: 11 + path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + + - + message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\SegmentFilterDao\:\:__getData\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + + - + message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\SegmentFilterDao\:\:__getLimit\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + + - + message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\SegmentFilterDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + + - + message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\SegmentFilterDao\:\:getSqlForRegularIntervals\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEvent\:\:__construct\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + + - + message: '#^Parameter \#1 \$id_job of method Model\\Segments\\SegmentDao\:\:getByChunkIdAndSegmentId\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + + - + message: '#^Parameter \#2 \$password of method Model\\Segments\\SegmentDao\:\:getByChunkIdAndSegmentId\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + + - + message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEvent\:\:\$chunk \(Model\\Jobs\\JobStruct\) does not accept Model\\Jobs\\JobStruct\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + + - + message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEvent\:\:\$unsetFinalRevision type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + + - + message: '#^Expression on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.expr + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getAllFinalRevisionsForSegment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventForSegment\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventForSegment\(\) has parameter \$id_segment with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventForSegment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventsInSegmentInterval\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getTteForSegments\(\) has parameter \$id_segment_list with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:unsetFinalRevisionFlag\(\) has parameter \$id_segments with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:unsetFinalRevisionFlag\(\) has parameter \$source_pages with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:unsetFinalRevisionFlag\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + + - + message: '#^Cannot access property \$id on Model\\Segments\\SegmentStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\TranslationEventsHandler\:\:prepareEventStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationEvents\\TranslationEventsHandler\:\:saveEvent\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + + - + message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventStruct\:\:\$final_revision \(int\) does not accept bool\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + + - + message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventStruct\:\:\$id \(int\|null\) does not accept int\|false\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + + - + message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventStruct\:\:\$uid \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + + - + message: '#^Unsafe access to private property Plugins\\Features\\TranslationEvents\\TranslationEventsHandler\:\:\$__transactionStarted through static\:\:\.$#' + identifier: staticClassAccess.privateProperty + count: 5 + path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\DummyTranslationVersionHandler\:\:propagateTranslation\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 2 + path: lib/Plugins/Features/TranslationVersions/Handlers/DummyTranslationVersionHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\DummyTranslationVersionHandler\:\:storeTranslationEvent\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationVersions/Handlers/DummyTranslationVersionHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:propagateTranslation\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 2 + path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:saveVersion\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:storeTranslationEvent\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + + - + message: '#^Property Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:\$id_job \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + + - + message: '#^Property Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:\$id_segment \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + + - + message: '#^Property Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:\$uid \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + + - + message: '#^Property Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:\$uid is never read, only written\.$#' + identifier: property.onlyWritten + count: 1 + path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getAllRelevantEvents\(\) has parameter \$segments_id with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getAllRelevantEvents\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getLastRevisionsBySegmentsAndSourcePage\(\) has parameter \$job_id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getLastRevisionsBySegmentsAndSourcePage\(\) has parameter \$segments_id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getLastRevisionsBySegmentsAndSourcePage\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getLastRevisionsBySegmentsAndSourcePage\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionNumberForTranslation\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForChunk\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForJob\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForRevision\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForRevision\(\) has parameter \$id_segment with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForRevision\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForRevision\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForTranslation\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:insertVersionRecords\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:insertVersionRecords\(\) has parameter \$params with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:insertVersionRecords\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:insertVersionRecords\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:saveVersion\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:saveVersion\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:updateVersion\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:updateVersion\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Parameter \$segmentsToUpdate of method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:savePropagationVersions\(\) has invalid type Plugins\\Features\\TranslationVersions\\Model\\Propagation_PropagationTotalStruct\.$#' + identifier: class.notFound + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Property Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\VersionHandlerInterface\:\:propagateTranslation\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 2 + path: lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php + + - + message: '#^Method Plugins\\Features\\TranslationVersions\\VersionHandlerInterface\:\:storeTranslationEvent\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php + + - + message: '#^PHPDoc tag @return with type mixed is not subtype of native type bool\.$#' + identifier: return.phpDocType + count: 1 + path: lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php + + - + message: '#^Parameter \#3 \$callback of function route expects array\{class\-string\, string\}, array\{''Controller\\\\API\\\\App…'', ''update''\} given\.$#' + identifier: argument.type + count: 1 + path: lib/Routes/app_routes.php + + - + message: '#^Method Utils\\AIAssistant\\AIClientFactory\:\:create\(\) has parameter \$agent with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AIAssistant/AIClientFactory.php + + - + message: '#^Access to static property \$GEMINI_API_MODEL on an unknown class Utils\\AIAssistant\\AppConfig\.$#' + identifier: class.notFound + count: 1 + path: lib/Utils/AIAssistant/GeminiClient.php + + - + message: '#^Method Utils\\AIAssistant\\GeminiClient\:\:manageAlternativeTranslations\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AIAssistant/GeminiClient.php + + - + message: '#^PHPDoc tag @return with type mixed is not subtype of native type array\.$#' + identifier: return.phpDocType + count: 1 + path: lib/Utils/AIAssistant/GeminiClient.php + + - + message: '#^Parameter \#2 \$callback of function preg_replace_callback expects callable\(array\\)\: string, Closure\(mixed\)\: \(int\|string\) given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/AIAssistant/GeminiClient.php + + - + message: '#^Method Utils\\AIAssistant\\OpenAIClient\:\:evaluateTranslation\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AIAssistant/OpenAIClient.php + + - + message: '#^Method Utils\\AIAssistant\\OpenAIClient\:\:findContextForAWord\(\) has parameter \$phrase with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AIAssistant/OpenAIClient.php + + - + message: '#^Method Utils\\AIAssistant\\OpenAIClient\:\:findContextForAWord\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AIAssistant/OpenAIClient.php + + - + message: '#^Method Utils\\AIAssistant\\OpenAIClient\:\:findContextForAWord\(\) has parameter \$word with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateDao.php + path: lib/Utils/AIAssistant/OpenAIClient.php - - message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplatePassfailStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string given\.$#' + identifier: argument.type count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplatePassfailStruct.php + path: lib/Utils/AIAssistant/OpenAIClient.php - - message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplatePassfailThresholdStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$stream of method Orhanerday\\OpenAi\\OpenAi\:\:chat\(\) expects null, callable given\.$#' + identifier: argument.type count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplatePassfailThresholdStruct.php + path: lib/Utils/AIAssistant/OpenAIClient.php - - message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateSeverityStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateSeverityStruct.php + message: '#^Strict comparison using \!\=\= between non\-falsy\-string and '''' will always evaluate to true\.$#' + identifier: notIdentical.alwaysTrue + count: 4 + path: lib/Utils/AIAssistant/OpenAIClient.php - - message: '#^Cannot access property \$passfail_type on Model\\LQA\\QAModelTemplate\\QAModelTemplatePassfailStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:__construct\(\) has parameter \$brokerUri with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + path: lib/Utils/ActiveMQ/AMQHandler.php - - message: '#^Cannot access property \$thresholds on Model\\LQA\\QAModelTemplate\\QAModelTemplatePassfailStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:__construct\(\) has parameter \$usePersistentConnection with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + path: lib/Utils/ActiveMQ/AMQHandler.php - - message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:getDecodedModel\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:callAmqJmx\(\) has parameter \$queue_interface_url with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + path: lib/Utils/ActiveMQ/AMQHandler.php - - message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:hydrateFromJSON\(\) has parameter \$json with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:getNewInstanceForDaemons\(\) throws checked exception Stomp\\Exception\\ConnectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + path: lib/Utils/ActiveMQ/AMQHandler.php - - message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:getRedisClient\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 15 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + count: 1 + path: lib/Utils/ActiveMQ/AMQHandler.php - - message: '#^Method Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:subscribe\(\) has parameter \$header with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + path: lib/Utils/ActiveMQ/AMQHandler.php - - message: '#^Parameter \#1 \$date of static method Utils\\Date\\DateTimeUtil\:\:formatIsoDate\(\) expects null, string\|null given\.$#' + message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string\|null given\.$#' identifier: argument.type - count: 3 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php - - - - message: '#^Property Model\\LQA\\QAModelTemplate\\QAModelTemplateStruct\:\:\$id \(int\) in isset\(\) is not nullable\.$#' - identifier: isset.property count: 1 - path: lib/Model/LQA/QAModelTemplate/QAModelTemplateStruct.php + path: lib/Utils/ActiveMQ/AMQHandler.php - - message: '#^Method Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Utils\\ActiveMQ\\ClientHelpers\\ProjectQueue\:\:getPublishedResults\(\) has parameter \$id_project with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/MTQE/PayableRate/DTO/MTQEPayableRateBreakdowns.php + path: lib/Utils/ActiveMQ/ClientHelpers/ProjectQueue.php - - message: '#^Method Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\ActiveMQ\\ClientHelpers\\ProjectQueue\:\:getPublishedResults\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/PayableRate/DTO/MTQEPayableRateBreakdowns.php + path: lib/Utils/ActiveMQ/ClientHelpers/ProjectQueue.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Utils\\ActiveMQ\\ClientHelpers\\ProjectQueue\:\:getPublishedResults\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + path: lib/Utils/ActiveMQ/ClientHelpers/ProjectQueue.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:hydrateBreakdownsFromDataArray\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\ActiveMQ\\ClientHelpers\\ProjectQueue\:\:publishResults\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + path: lib/Utils/ActiveMQ/ClientHelpers/ProjectQueue.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:hydrateFromJSON\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueue\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/ActiveMQ/WorkerClient.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 7 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueue\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/ActiveMQ/WorkerClient.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueueWithClient\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + path: lib/Utils/ActiveMQ/WorkerClient.php - - message: '#^Variable \$uid in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueueWithClient\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateStruct.php + path: lib/Utils/ActiveMQ/WorkerClient.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:destroyQueryByIdAndUserCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueueWithClient\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/ActiveMQ/WorkerClient.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\ActiveMQ\\WorkerClient\:\:\$_QUEUES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/ActiveMQ/WorkerClient.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:destroyQueryByUidCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Binary operation "/" between string and 2 results in an error\.$#' + identifier: binaryOp.invalid count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method Utils\\AIAssistant\\AIClientInterface\:\:evaluateTranslation\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:getById\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to an undefined method Utils\\AIAssistant\\AIClientInterface\:\:findContextForAWord\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:getByUid\(\) should return array\ but returns list\\.$#' - identifier: return.type + message: '#^Call to an undefined method Utils\\AIAssistant\\AIClientInterface\:\:manageAlternativeTranslations\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:hydrateTemplateStruct\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:alternative_translations\(\) has parameter \$payload with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:hydrateTemplateStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:alternative_translations\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 6 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + count: 1 + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:emitErrorMessage\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^PHPDoc tag @return with type Model\\MTQE\\PayableRate\\DTO\\MTQEPayableRateBreakdowns\|null is not subtype of native type Model\\MTQE\\PayableRate\\MTQEPayableRateStruct\|null\.$#' - identifier: return.phpDocType + message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:emitMessage\(\) has parameter \$message with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Unsafe access to private property Model\\MTQE\\PayableRate\\MTQEPayableRateTemplateDao\:\:\$instance through static\:\:\.$#' - identifier: staticClassAccess.privateProperty - count: 3 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:explain_meaning\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:feedback\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/PayableRate/MTQEPayableRateTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\:\:__toString\(\) should return string but returns string\|false\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:getLockValue\(\) should return string but returns string\|null\.$#' identifier: return.type count: 1 - path: lib/Model/MTQE/Templates/DTO/MTQEWorkflowParams.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$max_words of static method Utils\\Tools\\Utils\:\:truncatePhrase\(\) expects int, float given\.$#' + identifier: argument.type count: 1 - path: lib/Model/MTQE/Templates/DTO/MTQEWorkflowParams.php + path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:destroyQueryByIdAndUserCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Call to an undefined method Model\\DataAccess\\IDatabase\:\:ping\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/ActivityLogWorker.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/ActivityLogWorker.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:destroyQueryByUidCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property object\:\:\$message\.$#' + identifier: property.notFound count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method Model\\DataAccess\\IDatabase\:\:ping\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:getById\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to an undefined method Utils\\Engines\\AbstractEngine\:\:fastAnalysis\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:getByUid\(\) should return array\ but returns list\\.$#' - identifier: return.type + message: '#^Call to function is_null\(\) with int will always evaluate to false\.$#' + identifier: function.impossibleType count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:hydrateTemplateStruct\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access property \$persistent on Utils\\ActiveMQ\\AMQHandler\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:hydrateTemplateStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + message: '#^Cannot access property \$queue_name on Utils\\TaskRunner\\Commons\\Context\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + + - + message: '#^Cannot call method format\(\) on DateTime\|false\.$#' + identifier: method.nonObject + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + + - + message: '#^Cannot call method getClient\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + message: '#^Cannot call method getQueueLength\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Unsafe access to private property Model\\MTQE\\Templates\\MTQEWorkflowTemplateDao\:\:\$instance through static\:\:\.$#' - identifier: staticClassAccess.privateProperty - count: 3 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + message: '#^Cannot call method getRedisClient\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' + identifier: method.nonObject + count: 9 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Cannot call method publishToQueues\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_executeInsert\(\) has parameter \$bind_values with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_executeInsert\(\) has parameter \$tuple_list with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_fetchMyMemoryFast\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:hydrateParamsFromDataArray\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getLockProjectForVolumeAnalysis\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\MTQE\\Templates\\MTQEWorkflowTemplateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getSegmentsForFastVolumeAnalysis\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Variable \$uid in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getSegmentsForFastVolumeAnalysis\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/MTQE/Templates/MTQEWorkflowTemplateStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\Outsource\\ConfirmationDao\:\:updatePassword\(\) has parameter \$jid with no type specified\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getWordCountForSegment\(\) has parameter \$equivalentWordMapping with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Outsource/ConfirmationDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\Outsource\\ConfirmationDao\:\:updatePassword\(\) has parameter \$new_password with no type specified\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getWordCountForSegment\(\) has parameter \$segmentArray with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Outsource/ConfirmationDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\Outsource\\ConfirmationDao\:\:updatePassword\(\) has parameter \$old_password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getWordCountForSegment\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Outsource/ConfirmationDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\Outsource\\ConfirmationDao\:\:updatePassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Model/Outsource/ConfirmationDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_insertFastAnalysis\(\) has parameter \$equivalentWordMapping with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_insertFastAnalysis\(\) has parameter \$subfiltering_handlers with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Outsource/ConfirmationDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_setTotal\(\) has parameter \$config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Outsource/ConfirmationDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$create_date has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_updateProject\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$currency has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_updateProject\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$delivery_date has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:getProjectSegmentsTranslationSummary\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$id has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:getProjectSegmentsTranslationSummary\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$id_job has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:getProjectSegmentsTranslationSummary\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$id_vendor has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:main\(\) has parameter \$args with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$password has no type specified\.$#' - identifier: missingType.property + message: '#^PHPDoc tag @var has invalid value \(\$myMemory MyMemory\)\: Unexpected token "\$myMemory", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$price has no type specified\.$#' - identifier: missingType.property + message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:get\(\) expects int, string given\.$#' + identifier: argument.type + count: 3 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + + - + message: '#^Property Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:\$actual_project_row type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$quote_pid has no type specified\.$#' - identifier: missingType.property + message: '#^Property Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:\$segment_hashes type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Property Model\\Outsource\\ConfirmationStruct\:\:\$vendor_name has no type specified\.$#' - identifier: missingType.property + message: '#^Property Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:\$segments type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Outsource/ConfirmationStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr - count: 2 - path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 3 + path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php - - message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:create\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\Health\:\:fastAnalysisIsRunning\(\) has parameter \$redisHandler with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/Health.php - - message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:destroyCacheByIdCustomer\(\) has parameter \$id_customer with no type specified\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\Health\:\:tmAnalysisIsRunning\(\) has parameter \$redisHandler with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/Health.php - - message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:getById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + message: '#^PHPDoc tag @var has invalid value \(\$redisHandler Client\)\: Unexpected token "\$redisHandler", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 2 + path: lib/Utils/AsyncTasks/Workers/Analysis/Health.php - - message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:getByIdCustomer\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:getByUserId\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Binary operation "\-" between non\-falsy\-string and string\|null results in an error\.$#' + identifier: binaryOp.invalid count: 1 - path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\OwnerFeatures\\OwnerFeatureDao\:\:getByUserId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + message: '#^Binary operation "/" between string\|null and 1000 results in an error\.$#' + identifier: binaryOp.invalid + count: 2 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#1 \$id of method Model\\OwnerFeatures\\OwnerFeatureDao\:\:getById\(\) expects int, string\|false given\.$#' - identifier: argument.type + message: '#^Call to an undefined method Utils\\Engines\\Results\\TMSAbstractResponse\:\:get_matches_as_array\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/OwnerFeatures/OwnerFeatureDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\OwnerFeatures\\OwnerFeatureStruct\:\:getOptions\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Cannot access property \$analysis_ignore_100 on Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/OwnerFeatures/OwnerFeatureStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, array\|string\|null given\.$#' - identifier: argument.type + message: '#^Cannot access property \$analysis_ignore_101 on Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/OwnerFeatures/OwnerFeatureStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Property Model\\OwnerFeatures\\OwnerFeatureStruct\:\:\$options type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access property \$qe_model_version on Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/OwnerFeatures/OwnerFeatureStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:_cacheSetConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method getChunks\(\) on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:_deleteCacheByKey\(\) should return bool but returns int\.$#' - identifier: return.type - count: 2 - path: lib/Model/Pagination/Pager.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__compareScoreDesc\(\) has parameter \$a with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:_serializeForCacheKey\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__compareScoreDesc\(\) has parameter \$b with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:_setInCacheMap\(\) has parameter \$value with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__filterTMMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:count\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__filterTMMatches\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:count\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_endQueueCallback\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Model/Pagination/Pager.php + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:format\(\) has parameter \$items with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getMT\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:format\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getMT\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:getPagination\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getMatches\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:getPagination\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getNewMatchTypeAndEquivalentWordDiscount\(\) has parameter \$bestMatch with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:getPagination\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getNewMatchTypeAndEquivalentWordDiscount\(\) has parameter \$equivalentWordMapping with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\Pager\:\:getPagination\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Pagination/Pager.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getNewMatchTypeAndEquivalentWordDiscount\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#1 \$key of method Predis\\ClientInterface\:\:get\(\) expects string, int given\.$#' - identifier: argument.type + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getTM\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#1 \$keyOrKeys of method Predis\\ClientInterface\:\:del\(\) expects array\\|string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getTM\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#3 \$pages of method Model\\Pagination\\Pager\:\:format\(\) expects int, float given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Pagination/Pager.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_incrementAnalyzedCount\(\) has parameter \$eq_words with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Template type T of method Model\\Pagination\\Pager\:\:_getFromCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_incrementAnalyzedCount\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Template type T of method Model\\Pagination\\Pager\:\:_setInCacheMap\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_incrementAnalyzedCount\(\) has parameter \$standard_words with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Pagination/Pager.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\PaginationParameters\:\:__construct\(\) has parameter \$bindParams with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_lockAndPreTranslateStatusCheck\(\) has parameter \$tm_data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/PaginationParameters.php - - - - message: '#^Method Model\\Pagination\\PaginationParameters\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Pagination/PaginationParameters.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\Pagination\\PaginationParameters\:\:getBindParams\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_lockAndPreTranslateStatusCheck\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/PaginationParameters.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Property Model\\Pagination\\PaginationParameters\:\:\$bindParams type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_sortMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/PaginationParameters.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Property Model\\Pagination\\PaginationParameters\:\:\$current \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_sortMatches\(\) has parameter \$mt_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/PaginationParameters.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Property Model\\Pagination\\PaginationParameters\:\:\$pagination \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_sortMatches\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Pagination/PaginationParameters.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Cannot call method _deleteCacheByKey\(\) on Model\\PayableRates\\CustomPayableRateDao\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_tryToCloseProject\(\) has parameter \$_params with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Cannot call method _destroyObjectCache\(\) on Model\\PayableRates\\CustomPayableRateDao\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/PayableRates/CustomPayableRateDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_tryToCloseProject\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Cannot call method _getStatementForQuery\(\) on Model\\PayableRates\\CustomPayableRateDao\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/PayableRates/CustomPayableRateDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:getProjectSegmentsTranslationSummary\(\) has parameter \$pid with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Cannot call method setCacheTTL\(\) on Model\\PayableRates\\CustomPayableRateDao\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/PayableRates/CustomPayableRateDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:getProjectSegmentsTranslationSummary\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:assocModelToJob\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:getProjectSegmentsTranslationSummary\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:assocModelToJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/PayableRates/CustomPayableRateDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:initPostProcess\(\) has parameter \$source_lang with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdAndUserCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:initPostProcess\(\) has parameter \$source_seg with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:initPostProcess\(\) has parameter \$target_lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:initPostProcess\(\) has parameter \$target_seg with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:getDefaultTemplate\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:isMtMatch\(\) has parameter \$match with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:getInstance\(\) never returns null so it can be removed from the return type\.$#' - identifier: return.unusedType + message: '#^Offset 0 might not exist on array\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/PayableRates/CustomPayableRateDao.php + message: '#^PHPDoc tag @var has invalid value \(\$tms_match GetMemoryResponse\)\: Unexpected token "\$tms_match", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateDao\:\:save\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$matches of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__filterTMMatches\(\) expects array, array\|Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^PHPDoc tag @var has invalid value \(\$result CustomPayableRateStruct\[\]\)\: Unexpected token "\$result", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Parameter \#1 \$mt_penalty of method Utils\\Engines\\AbstractEngine\:\:setMTPenalty\(\) expects int\|null, float\|int\|null given\.$#' + identifier: argument.type count: 2 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#1 \$date of static method Utils\\Date\\DateTimeUtil\:\:formatIsoDate\(\) expects null, string given\.$#' + message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_checkWordCount\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type - count: 2 - path: lib/Model/PayableRates/CustomPayableRateDao.php + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#1 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryPaginated\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getMatches\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type - count: 2 - path: lib/Model/PayableRates/CustomPayableRateDao.php + count: 1 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#2 \$id of static method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdAndUserCache\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_initializeTMAnalysis\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#2 \$id of static method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdCache\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_updateRecord\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Parameter \#3 \$uid of static method Model\\PayableRates\\CustomPayableRateDao\:\:destroyQueryByIdAndUserCache\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Property Model\\PayableRates\\CustomPayableRateStruct\:\:\$id \(int\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:\$_matches type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/PayableRates/CustomPayableRateDao.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php - - message: '#^Argument of an invalid type array\|string supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Property Utils\\Engines\\Results\\TMSAbstractResponse\:\:\$responseStatus \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + + - + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 4 + path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + + - + message: '#^Access to an undefined property object\:\:\$status\.$#' + identifier: property.notFound + count: 1 + path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + + - + message: '#^Access to an undefined property object\:\:\$translation_date\.$#' + identifier: property.notFound + count: 1 + path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + + - + message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + + - + message: '#^Parameter \#1 \$translation_struct of static method Model\\Translations\\SegmentTranslationDao\:\:updateTranslationAndStatusAndDateByList\(\) expects array\, list\ given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:breakdownsToJson\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Parameter \#2 \$jobId of static method Model\\Translations\\SegmentTranslationDao\:\:getAllSegmentsByIdListAndJobId\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:getBreakdownsArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$translation of class Plugins\\Features\\TranslationEvents\\Model\\TranslationEvent constructor expects Model\\Translations\\SegmentTranslationStruct, object given\.$#' + identifier: argument.type count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:getBreakdownsArray\(\) should return array but returns array\|string\.$#' - identifier: return.type + message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/ErrMailWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:getBreakdownsArray\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property object\:\:\$context_after\.$#' + identifier: property.notFound count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:getPayableRates\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property object\:\:\$context_before\.$#' + identifier: property.notFound count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property object\:\:\$segment\.$#' + identifier: property.notFound count: 3 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access property \$id on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:validateBreakdowns\(\) has parameter \$breakdowns with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access property \$id on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:validateLanguage\(\) has parameter \$lang with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot access property \$password on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\PayableRates\\CustomPayableRateStruct\:\:validateLanguage\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot access property \$source on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Parameter \#1 \$date of static method Utils\\Date\\DateTimeUtil\:\:formatIsoDate\(\) expects null, string given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + message: '#^Cannot access property \$status on Model\\Translations\\SegmentTranslationStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Parameter \#1 \$string of function mb_strlen expects string, string\|false given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + message: '#^Cannot access property \$target on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Property Model\\PayableRates\\CustomPayableRateStruct\:\:\$breakdowns type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/PayableRates/CustomPayableRateStruct.php + message: '#^Cannot access property \$tm_keys on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\ProjectCreation\\JobCreationService\:\:buildTmKeysJson\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot access property \$uid on Model\\Users\\UserStruct\|null\.$#' + identifier: property.nonObject count: 5 - path: lib/Model/ProjectCreation/JobCreationService.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$instance_id \(int\) on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.property - count: 1 - path: lib/Model/ProjectCreation/ProjectManagerModel.php + message: '#^Cannot call method isAnonymous\(\) on Model\\Users\\UserStruct\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$pretranslate_101 \(int\) in isset\(\) is not nullable\.$#' - identifier: isset.property + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:__compareScoreDesc\(\) has parameter \$a with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ProjectCreation/ProjectMetadataService.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Loose comparison using \=\= between 0 and 0 will always evaluate to true\.$#' - identifier: equal.alwaysTrue + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:__compareScoreDesc\(\) has parameter \$b with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ProjectCreation/SegmentExtractor.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\ProjectCreation\\SegmentExtractor\:\:persistXliffFileAttributes\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_extractAvailableKeysForUser\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ProjectCreation/SegmentExtractor.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Result of \|\| is always true\.$#' - identifier: booleanOr.alwaysTrue + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_formatConcordanceValues\(\) has parameter \$_source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/ProjectCreation/SegmentExtractor.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\ProjectCreation\\SegmentStorageService\:\:linkSegmentIdsToRelatedData\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_formatConcordanceValues\(\) has parameter \$_target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/ProjectCreation/SegmentStorageService.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Parameter \#1 \$id_segment of method Model\\ProjectCreation\\SegmentStorageService\:\:insertOriginalDataRecord\(\) expects int, int\|string given\.$#' - identifier: argument.type + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_formatConcordanceValues\(\) has parameter \$regularExpressions with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/ProjectCreation/SegmentStorageService.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Parameter \#1 \$id_segment of method Model\\ProjectCreation\\SegmentStorageService\:\:saveSegmentMetadata\(\) expects int, int\|string given\.$#' - identifier: argument.type + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_formatConcordanceValues\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ProjectCreation/SegmentStorageService.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\ProjectCreation\\TmKeyService\:\:setPrivateTMKeys\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_getMatches\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ProjectCreation/TmKeyService.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:_getProjects\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_matchRewrite\(\) has parameter \$match with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ManageModel.php - - - - message: '#^Method Model\\Projects\\ManageModel\:\:_getProjects\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:conditionsForProjectsQuery\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_matchRewrite\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:getProjects\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_publishPayload\(\) has parameter \$content with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_in_pname with no type specified\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_publishPayload\(\) has parameter \$targetLang with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_only_completed with no type specified\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortByLenDesc\(\) has parameter \$stringA with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_source with no type specified\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortByLenDesc\(\) has parameter \$stringB with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) has parameter \$search_target with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortMatches\(\) has parameter \$mt_result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortMatches\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ManageModel.php - - - - message: '#^Method Model\\Projects\\ManageModel\:\:getProjectsNumber\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Parameter \#1 \$datetime of class DateTime constructor expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:isMtMatch\(\) has parameter \$match with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ManageModel.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\MetadataDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:issetSourceAndTarget\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/MetadataDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\MetadataDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:normalizeMTMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/MetadataDao.php - - - - message: '#^Method Model\\Projects\\MetadataDao\:\:allByProjectId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/Projects/MetadataDao.php - - - - message: '#^Method Model\\Projects\\MetadataDao\:\:bulkSet\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Projects/MetadataDao.php - - - - message: '#^Method Model\\Projects\\MetadataDao\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Projects/MetadataDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\MetadataDao\:\:getProjectStaticSubfilteringCustomHandlers\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:tokenizeSourceSearch\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/MetadataDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\MetadataDao\:\:set\(\) should return bool but returns string\|false\.$#' - identifier: return.type + message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:updateAnalysisSuggestion\(\) has parameter \$matches with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/MetadataDao.php - - - - message: '#^Method Model\\Projects\\MetadataDao\:\:set\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/MetadataDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Using nullsafe property access "\?\-\>value" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' - identifier: nullsafe.neverNull + message: '#^PHPDoc tag @return has invalid value \(array\[string \=\> string\] \$regularExpressions Pattern is in the key and replacement in the value of the array\)\: Unexpected token "\[", expected TOKEN_HORIZONTAL_WS at offset 213 on line 7$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Projects/MetadataDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:_getProjectDataSQLAndValues\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$tm_key MemoryKeyStruct\)\: Unexpected token "\$tm_key", expected type at offset 32 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:assignToAssignee\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$pattern of function preg_replace expects array\\|string, list\ given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:assignToAssignee\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ProjectDao.php + message: '#^Parameter \#1 \$project of method Model\\FeaturesBase\\FeatureSet\:\:loadForProject\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:assignToTeam\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:assignToTeam\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#2 \$jobStruct of method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_getMatches\(\) expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' + identifier: argument.type count: 2 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:changeProjectStatus\(\) has parameter \$pid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:changeProjectStatus\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:deleteFailedProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ProjectDao.php + message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Model\\Jobs\\JobStruct\:\:\$tm_keys \(string\) on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.property count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheByIdAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$mt_quality_value_in_editor \(int\) on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.property count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheForProjectData\(\) has parameter \$jid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Variable \$queueElement on left side of \?\? is never defined\.$#' + identifier: nullCoalesce.variable count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheForProjectData\(\) has parameter \$jpassword with no type specified\.$#' - identifier: missingType.parameter + message: '#^Match arm comparison between int\<300, max\> and 202 is always false\.$#' + identifier: match.alwaysFalse count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheForProjectData\(\) has parameter \$pid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:formatGetGlossaryMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:destroyCacheForProjectData\(\) has parameter \$project_password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:formatGetGlossaryMatches\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:exists\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ProjectDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:formatGetGlossaryMatches\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findById\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:get\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:keys\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdAndPassword\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:search\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdAndPassword\(\) has parameter \$password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:set\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) has parameter \$id_client with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdCustomer\(\) has parameter \$id_customer with no type specified\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) has parameter \$jobData with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findByIdCustomer\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Projects/ProjectDao.php + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) has parameter \$message with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findByTeamId\(\) has parameter \$filter with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:findByTeamId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:update\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getByIdList\(\) has parameter \$id_list with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$queueElement QueueElement\)\: Unexpected token "\$queueElement", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getByIdList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var with type Utils\\Engines\\Results\\MyMemory\\UpdateGlossaryResponse is not subtype of native type Utils\\Engines\\Results\\MyMemory\\DeleteGlossaryResponse\.$#' + identifier: varTag.nativeType count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getByIdList\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#2 \$idJob of method Utils\\Engines\\MyMemory\:\:glossaryDelete\(\) expects string, int given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getJobIds\(\) has parameter \$pid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getJobIds\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\AsyncTasks\\Workers\\JobsWorker\:\:_recountAvgPee\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/JobsWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getJobIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\JobsWorker\:\:process\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/Projects/ProjectDao.php + count: 1 + path: lib/Utils/AsyncTasks/Workers/JobsWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getPasswordsMap\(\) has parameter \$pid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\JobsWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/JobsWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getPasswordsMap\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Model\\Jobs\\JobStruct\:\:\$avg_post_editing_effort \(int\) does not accept float\|int\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/JobsWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getPasswordsMap\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Projects/ProjectDao.php + message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 2 + path: lib/Utils/AsyncTasks/Workers/JobsWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getProjectAndJobData\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php - - - - message: '#^Method Model\\Projects\\ProjectDao\:\:getProjectAndJobData\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/MailWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getRemoteFileServiceName\(\) has parameter \$project_ids with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\ProjectCreationWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/ProjectCreationWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getRemoteFileServiceName\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\ProjectCreationWorker\:\:_createProject\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/ProjectCreationWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getTotalCountByTeamId\(\) has parameter \$filter with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Projects/ProjectDao.php + message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 2 + path: lib/Utils/AsyncTasks/Workers/ProjectCreationWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:getTotalCountByTeamId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\AsyncTasks\\Workers\\PropagationWorker\:\:propagateTranslation\(\) has parameter \$structures with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:isGDriveProject\(\) has parameter \$id_project with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\PropagationWorker\:\:rebuildObjects\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:isGDriveProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Projects/ProjectDao.php + message: '#^PHPDoc tag @var has invalid value \(\$propagationTotalStruct \?PropagationTotalStruct\)\: Unexpected token "\$propagationTotalStruct", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:massiveSelfAssignment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ProjectDao.php + message: '#^PHPDoc tag @var has invalid value \(\$propagatorSegment SegmentTranslationStruct\)\: Unexpected token "\$propagatorSegment", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:unassignProjects\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ProjectDao.php + message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:uncompletedChunksByProjectId\(\) has parameter \$id_project with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method set\(\) on Utils\\Engines\\EngineInterface\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:uncompletedChunksByProjectId\(\) has parameter \$params with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method update\(\) on Utils\\Engines\\EngineInterface\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:updateAnalysisStatus\(\) has parameter \$project_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionMTWorker\:\:_extractAvailableKeysForUser\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:updateAnalysisStatus\(\) has parameter \$stWordCount with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionMTWorker\:\:_set\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:updateAnalysisStatus\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionMTWorker\:\:_update\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:updateAnalysisStatus\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Projects/ProjectDao.php + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 1 + path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:updateField\(\) has parameter \$value with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method getConfigStruct\(\) on Utils\\Engines\\EngineInterface\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectDao\:\:updateField\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method isAdaptiveMT\(\) on Utils\\Engines\\EngineInterface\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^PHPDoc tag @return has invalid value \(ProjectStruct\[\]\|IDaoStruct\[\]\|\[\]\)\: Unexpected token "\[", expected type at offset 84 on line 4$#' - identifier: phpDoc.parseError + message: '#^Cannot call method isTMS\(\) on Utils\\Engines\\EngineInterface\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Parameter \#1 \$id of method Model\\Projects\\ProjectDao\:\:destroyCacheById\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Projects/ProjectDao.php + message: '#^Cannot call method set\(\) on Utils\\Engines\\EngineInterface\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Property Model\\Projects\\ProjectDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method update\(\) on Utils\\Engines\\EngineInterface\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Property Model\\Projects\\ProjectDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_extractAvailableKeysForUser\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectDao.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$uid\.$#' - identifier: property.notFound - count: 2 - path: lib/Model/Projects/ProjectModel.php + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseEndQueueException\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Cannot access property \$type on Model\\Teams\\TeamStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseEndQueueException\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectModel\:\:checkAssigneeChangeInPersonalTeam\(\) has parameter \$id_team with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseReQueueException\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectModel\:\:checkIdAssignee\(\) has parameter \$id_team with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseReQueueException\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Method Model\\Projects\\ProjectModel\:\:prepareUpdate\(\) has parameter \$value with no type specified\.$#' + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseReQueueException\(\) has parameter \$type with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Negated boolean expression is always true\.$#' - identifier: booleanNot.alwaysTrue + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_set\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Parameter \#1 \$id of method Model\\Projects\\ProjectDao\:\:destroyCacheById\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_update\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Parameter \#1 \$team of method Model\\Teams\\TeamDao\:\:destroyCacheAssignee\(\) expects Model\\Teams\\TeamStruct, Model\\Teams\\TeamStruct\|null given\.$#' + message: '#^Parameter \#1 \$object of function get_class expects object, Utils\\Engines\\EngineInterface\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Model/Projects/ProjectModel.php + count: 3 + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Parameter \#1 \$uid of method Model\\Teams\\TeamDao\:\:getPersonalByUid\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:toSetContributionRequest\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Parameter \#2 \$callback of function array_filter expects \(callable\(Model\\DataAccess\\IDaoStruct\)\: bool\)\|null, Closure\(Model\\Teams\\MembershipStruct\)\: bool given\.$#' + message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Parameter \#3 \$assignee of class Utils\\Email\\ProjectAssignedEmail constructor expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' - identifier: argument.type + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Property Model\\Projects\\ProjectModel\:\:\$cacheTeamsToClean type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Projects/ProjectModel.php + message: '#^Using nullsafe property access on non\-nullable type mixed\. Use \-\> instead\.$#' + identifier: nullsafe.neverNull + count: 4 + path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php - - message: '#^Property Model\\Projects\\ProjectModel\:\:\$changedFields type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Projects/ProjectModel.php + message: '#^Parameter \#1 \$id_segment of method Model\\Propagation\\PropagationTotalStruct\:\:addPropagatedId\(\) expects string, int given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/Autopropagation/PropagationAnalyser.php - - message: '#^Property Model\\Projects\\ProjectModel\:\:\$willChange type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$id_segment of method Model\\Propagation\\PropagationTotalStruct\:\:addPropagatedIdToUpdateVersion\(\) expects string, int given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/Autopropagation/PropagationAnalyser.php + + - + message: '#^Loose comparison using \=\= between non\-empty\-string and null will always evaluate to false\.$#' + identifier: equal.alwaysFalse count: 1 - path: lib/Model/Projects/ProjectModel.php + path: lib/Utils/Constants/Constants.php - - message: '#^Class Model\\Projects\\ProjectStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Property Utils\\Constants\\Constants\:\:\$allowed_seg_rules type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/Constants.php - - message: '#^Method Model\\Projects\\ProjectStruct\:\:getAllMetadataAsKeyValue\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Constants\\EngineConstants\:\:\$ENGINES_LIST type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/EngineConstants.php - - message: '#^Method Model\\Projects\\ProjectStruct\:\:hasFeature\(\) has parameter \$feature_code with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Constants\\Ices\:\:\$iceLockDisabledForTargetLangs type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/Ices.php - - message: '#^Method Model\\Projects\\ProjectStruct\:\:isFeatureEnabled\(\) has parameter \$feature_code with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Constants\\JobStatus\:\:\$ALLOWED_STATUSES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/JobStatus.php - - message: '#^Method Model\\Projects\\ProjectStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Constants\\Mime2Extension\:\:getMimeTypes\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/Mime2Extension.php - - message: '#^Method Model\\Projects\\ProjectStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Constants\\Mime2Extension\:\:\$reference type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/Mime2Extension.php - - message: '#^Method Model\\Projects\\ProjectStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Constants\\ProjectStatus\:\:isAllowedStatus\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/ProjectStatus.php - - message: '#^Parameter \#1 \$id of method Model\\Projects\\MetadataDao\:\:allByProjectId\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\Constants\\ProjectStatus\:\:\$ALLOWED_STATUSES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/ProjectStatus.php - - message: '#^Parameter \#1 \$id_project of method Model\\Jobs\\ChunkDao\:\:getByProjectID\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Constants\\Teams\:\:isAllowedType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/Teams.php - - message: '#^Parameter \#1 \$id_project of method Model\\Projects\\MetadataDao\:\:get\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\Constants\\Teams\:\:\$TYPES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/Teams.php - - message: '#^Parameter \#1 \$id_project of method Model\\Projects\\MetadataDao\:\:set\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\Constants\\TmKeyPermissions\:\:\$_accepted_grants type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/TmKeyPermissions.php - - message: '#^Parameter \#1 \$id_project of static method Model\\Jobs\\JobDao\:\:getByProjectId\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Constants\\TranslationStatus\:\:isNotInitialStatus\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectStruct.php + path: lib/Utils/Constants/TranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:destroyDefaultTemplateCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Constants\\TranslationStatus\:\:isReviewedStatus\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Constants/TranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:destroyQueryByIdAndUserCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$DB_STATUSES_MAP type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Constants/TranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$INITIAL_STATUSES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Constants/TranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$REVISION_STATUSES type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Constants/TranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:getDefaultTemplate\(\) has parameter \$uid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$STATUSES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Constants/TranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:getDefaultTemplate\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Model/Projects/ProjectTemplateDao.php + message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$TRANSLATION_STATUSES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Constants/TranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:getUserDefaultMt\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isFinalState\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Constants/XliffTranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:markAsNotDefault\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 5 - path: lib/Model/Projects/ProjectTemplateDao.php + message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isR1\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Constants/XliffTranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ProjectTemplateDao.php + message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isRevision\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Constants/XliffTranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:removeSubTemplateByIdAndUser\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Projects/ProjectTemplateDao.php + message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isStateQualifierNew\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Constants/XliffTranslationStatus.php - - message: '#^Method Model\\Projects\\ProjectTemplateDao\:\:save\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isStatusNew\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Constants/XliffTranslationStatus.php - - message: '#^PHPDoc tag @var has invalid value \(\$result ProjectTemplateStruct\[\]\)\: Unexpected token "\$result", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError - count: 3 - path: lib/Model/Projects/ProjectTemplateDao.php + message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isTranslated\(\) has parameter \$status with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Constants/XliffTranslationStatus.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Cannot access property \$id_mt_engine on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Parameter \#2 \$excludeId of static method Model\\Projects\\ProjectTemplateDao\:\:markAsNotDefault\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Cannot access property \$id_tms on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Parameter \#2 \$id of static method Model\\Projects\\ProjectTemplateDao\:\:destroyQueryByIdAndUserCache\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$array_params of class Model\\Jobs\\JobStruct constructor expects array, array\|null given\.$#' identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Parameter \#2 \$id of static method Model\\Projects\\ProjectTemplateDao\:\:destroyQueryByIdCache\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$array_params of class Model\\Projects\\ProjectStruct constructor expects array, array\|null given\.$#' identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Parameter \#2 \$uid of method Model\\Projects\\ProjectTemplateStruct\:\:hydrateFromJSON\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$array_params of class Model\\Users\\UserStruct constructor expects array, array\|null given\.$#' identifier: argument.type - count: 2 - path: lib/Model/Projects/ProjectTemplateDao.php + count: 1 + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$id \(int\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$context_list_after type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$id_team \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$context_list_before type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$mt \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$contexts type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$segmentation_rule \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$crossLangTargets type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$subfiltering_handlers \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$dataRefMap type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$tm \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$jobStruct type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$mt_qe_workflow_parameters type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateDao.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$character_counter_count_tags\.$#' - identifier: property.notFound + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$projectStruct type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$character_counter_mode\.$#' - identifier: property.notFound + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$subfiltering_handlers type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$dialect_strict\.$#' - identifier: property.notFound + message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$user type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$filters_template_id\.$#' - identifier: property.notFound - count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 2 + path: lib/Utils/Contribution/GetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$get_public_matches\.$#' - identifier: property.notFound + message: '#^Cannot call method toArray\(\) on string\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/SetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$id_team\.$#' - identifier: property.notFound + message: '#^Method Utils\\Contribution\\SetContributionRequest\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/SetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$mt\.$#' - identifier: property.notFound + message: '#^Method Utils\\Contribution\\SetContributionRequest\:\:getProp\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/SetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$name\.$#' - identifier: property.notFound + message: '#^PHPDoc tag @var has invalid value \(\$props Params\)\: Unexpected token "\$props", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/SetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$payable_rate_template_id\.$#' - identifier: property.notFound + message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$cached_results type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/SetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$pretranslate_100\.$#' - identifier: property.notFound + message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$props type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Contribution/SetContributionRequest.php - - message: '#^Access to an undefined property object\:\:\$pretranslate_101\.$#' - identifier: property.notFound + message: '#^Method Utils\\Currency\\ChangeRatesFetcher\:\:fetchChangeRates\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Currency/ChangeRatesFetcher.php - - message: '#^Access to an undefined property object\:\:\$qa_model_template_id\.$#' - identifier: property.notFound + message: '#^Method Utils\\Currency\\TranslatedChangeRatesFetcher\:\:fetchChangeRates\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Currency/TranslatedChangeRatesFetcher.php - - message: '#^Access to an undefined property object\:\:\$source_language\.$#' - identifier: property.notFound + message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Currency/TranslatedChangeRatesFetcher.php - - message: '#^Access to an undefined property object\:\:\$subfiltering_handlers\.$#' - identifier: property.notFound + message: '#^Property Utils\\Currency\\ChangeRatesFetcher\:\:\$changeRates \(string\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Currency/TranslatedChangeRatesFetcher.php - - message: '#^Access to an undefined property object\:\:\$subject\.$#' - identifier: property.notFound + message: '#^Method Utils\\Email\\AbstractEmail\:\:_buildHTMLMessage\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Access to an undefined property object\:\:\$tm_prioritization\.$#' - identifier: property.notFound + message: '#^Method Utils\\Email\\AbstractEmail\:\:_buildMessageContent\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Access to an undefined property object\:\:\$xliff_config_template_id\.$#' - identifier: property.notFound + message: '#^Method Utils\\Email\\AbstractEmail\:\:_buildTxtMessage\(\) has parameter \$messageBody with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Cannot call method format\(\) on DateTime\|false\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/Projects/ProjectTemplateStruct.php + message: '#^Method Utils\\Email\\AbstractEmail\:\:_buildTxtMessage\(\) should return string but returns string\|null\.$#' + identifier: return.type + count: 1 + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:getSubfilteringHandlers\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\AbstractEmail\:\:_enqueueEmailDelivery\(\) has parameter \$mailConf with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:getTargetLanguage\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\AbstractEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:getTm\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\AbstractEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 24 - path: lib/Model/Projects/ProjectTemplateStruct.php + message: '#^Method Utils\\Email\\AbstractEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Method Model\\Projects\\ProjectTemplateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\AbstractEmail\:\:doSend\(\) has parameter \$address with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Parameter \#1 \$datetime of function date_create expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$string of function html_entity_decode expects string, array\\|string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$mt \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$segmentation_rule \(string\|null\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, array\\|string\|null given\.$#' + identifier: argument.type + count: 3 + path: lib/Utils/Email/AbstractEmail.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$subfiltering_handlers \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Email\\BaseCommentEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/BaseCommentEmail.php - - message: '#^Property Model\\Projects\\ProjectTemplateStruct\:\:\$tm \(string\|null\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Projects/ProjectTemplateStruct.php + path: lib/Utils/Email/BaseCommentEmail.php - - message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getAllToPropagate\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\CommentEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/CommentEmail.php - - message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getPropagatedIds\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\CommentMentionEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/CommentMentionEmail.php - - message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getPropagatedIdsToUpdateVersion\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\CommentResolveEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/CommentResolveEmail.php - - message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getSegmentsForPropagation\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\ForgotPasswordEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/ForgotPasswordEmail.php - - message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:getTotals\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\ForgotPasswordEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/ForgotPasswordEmail.php - - message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\ForgotPasswordEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/ForgotPasswordEmail.php - - message: '#^Method Model\\Propagation\\PropagationTotalStruct\:\:setTotals\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$confirmation_token of static method Utils\\Url\\CanonicalRoutes\:\:passwordReset\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/ForgotPasswordEmail.php - - message: '#^Property Model\\Propagation\\PropagationTotalStruct\:\:\$propagated_ids type has no value type specified in iterable type array\.$#' + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Email/ForgotPasswordEmail.php + + - + message: '#^Method Utils\\Email\\InvitedToTeamEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/InvitedToTeamEmail.php - - message: '#^Property Model\\Propagation\\PropagationTotalStruct\:\:\$propagated_ids_to_update_version type has no value type specified in iterable type array\.$#' + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Email/InvitedToTeamEmail.php + + - + message: '#^Method Utils\\Email\\MembershipCreatedEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/MembershipCreatedEmail.php - - message: '#^Property Model\\Propagation\\PropagationTotalStruct\:\:\$segments_for_propagation type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\MembershipCreatedEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/MembershipCreatedEmail.php - - message: '#^Property Model\\Propagation\\PropagationTotalStruct\:\:\$totals type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\MembershipCreatedEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Propagation/PropagationTotalStruct.php + path: lib/Utils/Email/MembershipCreatedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/QualityReport/QualityReportDao.php + path: lib/Utils/Email/MembershipCreatedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\MembershipDeletedEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportDao.php + path: lib/Utils/Email/MembershipDeletedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getAverages\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Email\\MembershipDeletedEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportDao.php + path: lib/Utils/Email/MembershipDeletedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getAverages\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/QualityReport/QualityReportDao.php + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Email/MembershipDeletedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getIssuesBySegments\(\) has parameter \$segments_id with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\ProjectAssignedEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportDao.php + path: lib/Utils/Email/ProjectAssignedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getIssuesBySegments\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\ProjectAssignedEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportDao.php + path: lib/Utils/Email/ProjectAssignedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getIssuesBySegments\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Email\\ProjectAssignedEmail\:\:_getTemplateVariables\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/QualityReport/QualityReportDao.php + count: 1 + path: lib/Utils/Email/ProjectAssignedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getReviseIssuesByChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/QualityReport/QualityReportDao.php + message: '#^Parameter \#1 \$id_job of method Model\\WordCount\\WordCountStruct\:\:setIdJob\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Email/ProjectAssignedEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getSegmentsForQualityReport\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Parameter \#1 \$job_password of method Model\\WordCount\\WordCountStruct\:\:setJobPassword\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Email/ProjectAssignedEmail.php + + - + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Email/ProjectAssignedEmail.php + + - + message: '#^Method Utils\\Email\\SendToTranslatorAbstract\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportDao.php + path: lib/Utils/Email/SendToTranslatorAbstract.php - - message: '#^Method Model\\QualityReport\\QualityReportDao\:\:getSegmentsForQualityReport\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/QualityReport/QualityReportDao.php + message: '#^Method Utils\\Email\\SendToTranslatorAbstract\:\:_offsetToTimeZone\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Utils/Email/SendToTranslatorAbstract.php - - message: '#^Cannot call method fullName\(\) on Model\\Users\\UserStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Email\\SendToTranslatorAbstract\:\:_offsetToTimeZone\(\) has parameter \$offset with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/SendToTranslatorAbstract.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:buildFilesSegmentsNestedTree\(\) has parameter \$records with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$callback of function call_user_func expects callable\(\)\: mixed, array given\.$#' + identifier: argument.type count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/SendToTranslatorAbstract.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:buildQualityReportStructure\(\) has parameter \$records with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/SendToTranslatorAbstract.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:buildQualityReportStructure\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Email\\SendToTranslatorAbstract\:\:\$_RoutesMethod type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/SendToTranslatorAbstract.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:filterDate\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Email\\SendToTranslatorForDeliveryChangeEmail\:\:__construct\(\) has parameter \$projectName with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/SendToTranslatorForDeliveryChangeEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:filterDate\(\) has parameter \$date with no type specified\.$#' + message: '#^Method Utils\\Email\\SendToTranslatorForJobSplitEmail\:\:__construct\(\) has parameter \$projectName with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/SendToTranslatorForJobSplitEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:getAndDecodePossiblyProjectMetadataJson\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\SendToTranslatorForNewJobEmail\:\:__construct\(\) has parameter \$projectName with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Email/SendToTranslatorForNewJobEmail.php + + - + message: '#^Method Utils\\Email\\SignupEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/SignupEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:getStructure\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\SignupEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/SignupEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:resetScore\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/QualityReport/QualityReportModel.php + message: '#^Method Utils\\Email\\SignupEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Email/SignupEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:structureNestComment\(\) has parameter \$record with no value type specified in iterable type array\.$#' + message: '#^Parameter \#1 \$confirmation_token of static method Utils\\Url\\CanonicalRoutes\:\:signupConfirmation\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Email/SignupEmail.php + + - + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Email/SignupEmail.php + + - + message: '#^Method Utils\\Email\\WelcomeEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/WelcomeEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:structureNestFile\(\) has parameter \$record with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\WelcomeEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/WelcomeEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:structureNestIssue\(\) has parameter \$record with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Email\\WelcomeEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/WelcomeEmail.php - - message: '#^Method Model\\QualityReport\\QualityReportModel\:\:structureNestSegment\(\) has parameter \$record with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Email\\WelcomeEmail\:\:send\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/WelcomeEmail.php - - message: '#^Property Model\\LQA\\ChunkReviewStruct\:\:\$is_pass \(bool\|null\) does not accept int\.$#' - identifier: assign.propertyType + message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Email/WelcomeEmail.php - - message: '#^Property Model\\LQA\\ChunkReviewStruct\:\:\$undo_data \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Cannot assign offset ''client_secret'' to array\|string\|null\.$#' + identifier: offsetAssign.dimType count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$all_segments is never read, only written\.$#' - identifier: property.onlyWritten + message: '#^Method Utils\\Engines\\AbstractEngine\:\:GoogleTranslateFallback\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$all_segments type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\AbstractEngine\:\:GoogleTranslateFallback\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$current_file with generic class ArrayObject does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Utils\\Engines\\AbstractEngine\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$current_issue with generic class ArrayObject does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Utils\\Engines\\AbstractEngine\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$current_segment with generic class ArrayObject does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Utils\\Engines\\AbstractEngine\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportModel\:\:\$quality_report_structure type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\AbstractEngine\:\:__get\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignComments\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Engines\\AbstractEngine\:\:__set\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignComments\(\) has parameter \$seg with no type specified\.$#' + message: '#^Method Utils\\Engines\\AbstractEngine\:\:__set\(\) has parameter \$value with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignComments\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\AbstractEngine\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + count: 2 + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignIssues\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Engines\\AbstractEngine\:\:_call\(\) has parameter \$curl_options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignIssues\(\) has parameter \$issue_comments with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\AbstractEngine\:\:_composeMTResponseAsMatch\(\) has parameter \$decoded with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignIssues\(\) has parameter \$issues with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\AbstractEngine\:\:_composeMTResponseAsMatch\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_assignIssues\(\) has parameter \$seg with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\AbstractEngine\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_commonSegmentAssignments\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Engines\\AbstractEngine\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_commonSegmentAssignments\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\AbstractEngine\:\:_setAdditionalCurlParams\(\) has parameter \$curlOptParams with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_getChunkReviews\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\AbstractEngine\:\:call\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:_populateLastTranslationAndRevision\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\AbstractEngine\:\:deleteMemory\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' + identifier: throws.unusedType count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:getSegmentsForQR\(\) has parameter \$segment_ids with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\AbstractEngine\:\:deleteMemory\(\) has parameter \$memoryKey with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:getSegmentsIdForQR\(\) has parameter \$options with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\AbstractEngine\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentModel\:\:getSegmentsIdForQR\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\AbstractEngine\:\:getConfigStruct\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Parameter \#1 \$segment of method Matecat\\SubFiltering\\MateCatFilter\:\:fromLayer0ToLayer2\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 3 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + message: '#^Method Utils\\Engines\\AbstractEngine\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentModel\:\:\$_chunkReviews has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\Engines\\AbstractEngine\:\:getCurlFile\(\) has parameter \$file with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentModel\:\:\$chunk has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\Engines\\AbstractEngine\:\:getMemoryIfMine\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$last_translation \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\AbstractEngine\:\:getName\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$secs_per_word \(int\) does not accept float\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\AbstractEngine\:\:memoryExists\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' + identifier: throws.unusedType count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Variable \$issues on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.variable + message: '#^Method Utils\\Engines\\AbstractEngine\:\:memoryExists\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentModel.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getLocalWarning\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\AbstractEngine\:\:syncMemories\(\) has parameter \$projectRow with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getPEE\(\) should return int but returns float\.$#' - identifier: return.type + message: '#^Method Utils\\Engines\\AbstractEngine\:\:syncMemories\(\) has parameter \$segments with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getPEEBwtTranslationRevise\(\) should return int but returns float\.$#' - identifier: return.type + message: '#^PHPDoc tag @param for parameter \$bool with type bool\|null is not subtype of native type bool\.$#' + identifier: parameter.phpDocType count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getPEEBwtTranslationSuggestion\(\) should return int but returns float\.$#' - identifier: return.type + message: '#^PHPDoc tag @var has invalid value \(\$gtEngine GoogleTranslate\)\: Unexpected token "\$gtEngine", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Method Model\\QualityReport\\QualityReportSegmentStruct\:\:getSecsPerWord\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$filename of class CURLFile constructor expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Parameter \#1 \$seg1 of static method Utils\\Tools\\PostEditing\:\:getPee\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$tokenHash of method Utils\\Network\\MultiCurlHandler\:\:hasError\(\) expects string, string\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + count: 2 + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#2 \$array of function array_key_exists expects array, array\|string\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + count: 4 + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$comments type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#3 \$function of method Utils\\Engines\\AbstractEngine\:\:_decode\(\) expects null, string given\.$#' + identifier: argument.type count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$dataRefMap type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Engines\\AbstractEngine\:\:\$_config type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$issues type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Engines\\AbstractEngine\:\:\$curl_additional_params type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$last_revisions type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Engines\\AbstractEngine\:\:\$error type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/AbstractEngine.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$parsed_time_to_edit type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Altlang\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/Altlang.php - - message: '#^Property Model\\QualityReport\\QualityReportSegmentStruct\:\:\$warnings type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Altlang\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/QualityReport/QualityReportSegmentStruct.php + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Altlang\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/RemoteFiles/RemoteFileDao.php - - - - message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:getByFileAndJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/RemoteFiles/RemoteFileDao.php - - - - message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:getByFileId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/RemoteFiles/RemoteFileDao.php + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:getByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/RemoteFiles/RemoteFileDao.php + message: '#^Method Utils\\Engines\\Altlang\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:getOriginalsByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/RemoteFiles/RemoteFileDao.php + message: '#^Method Utils\\Engines\\Altlang\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\RemoteFiles\\RemoteFileDao\:\:jobHasRemoteFiles\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/RemoteFiles/RemoteFileDao.php + message: '#^Method Utils\\Engines\\Altlang\:\:get\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:getFeedback\(\) has parameter \$id_job with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\Altlang\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ReviseFeedback/FeedbackDAO.php + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:getFeedback\(\) has parameter \$password with no type specified\.$#' + message: '#^Method Utils\\Engines\\Altlang\:\:set\(\) has parameter \$_config with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/ReviseFeedback/FeedbackDAO.php + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:getFeedback\(\) has parameter \$revision_number with no type specified\.$#' + message: '#^Method Utils\\Engines\\Altlang\:\:update\(\) has parameter \$_config with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/ReviseFeedback/FeedbackDAO.php + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:getFeedback\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Altlang\:\:\$_config type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/ReviseFeedback/FeedbackDAO.php + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:insertOrUpdate\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ReviseFeedback/FeedbackDAO.php + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 1 + path: lib/Utils/Engines/Altlang.php - - message: '#^Method Model\\ReviseFeedback\\FeedbackDAO\:\:updateFeedbackPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/ReviseFeedback/FeedbackDAO.php + message: '#^Access to an undefined property Utils\\Engines\\Apertium\:\:\$client_secret\.$#' + identifier: property.notFound + count: 1 + path: lib/Utils/Engines/Apertium.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr + message: '#^Method Utils\\Engines\\Apertium\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Search/MySQLReplaceEventDAO.php + path: lib/Utils/Engines/Apertium.php - - message: '#^Method Model\\Search\\MySQLReplaceEventDAO\:\:getEvents\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Search/MySQLReplaceEventDAO.php + message: '#^Method Utils\\Engines\\Apertium\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/Apertium.php - - message: '#^Method Model\\Search\\MySQLReplaceEventDAO\:\:save\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Search/MySQLReplaceEventDAO.php + message: '#^Method Utils\\Engines\\Apertium\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/Apertium.php - - message: '#^Method Model\\Search\\MySQLReplaceEventIndexDAO\:\:getActualIndex\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Search/MySQLReplaceEventIndexDAO.php + message: '#^Method Utils\\Engines\\Apertium\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Engines/Apertium.php - - message: '#^Method Model\\Search\\MySQLReplaceEventIndexDAO\:\:save\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Search/MySQLReplaceEventIndexDAO.php + message: '#^Method Utils\\Engines\\Apertium\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/Apertium.php - - message: '#^Call to an undefined method Predis\\Client\:\:hgetAll\(\)\.$#' - identifier: method.notFound + message: '#^Method Utils\\Engines\\Apertium\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/RedisReplaceEventDAO.php + path: lib/Utils/Engines/Apertium.php - - message: '#^Method Model\\Search\\RedisReplaceEventDAO\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Apertium\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Search/RedisReplaceEventDAO.php + path: lib/Utils/Engines/Apertium.php - - message: '#^Parameter \#2 \$field of method Predis\\ClientInterface\:\:hset\(\) expects string, int given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Apertium\:\:update\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Search/RedisReplaceEventDAO.php + path: lib/Utils/Engines/Apertium.php - - message: '#^Parameter \#2 \$version of method Model\\Search\\RedisReplaceEventDAO\:\:getEvents\(\) expects int, string given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Search/RedisReplaceEventDAO.php + message: '#^PHPDoc tag @property has invalid value \(string client_secret\)\: Unexpected token "client_secret", expected variable at offset 48 on line 3$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Utils/Engines/Apertium.php - - message: '#^Parameter \#2 \$version of method Model\\Search\\RedisReplaceEventDAO\:\:getRedisKey\(\) expects int, string given\.$#' - identifier: argument.type + message: '#^Property Utils\\Engines\\Apertium\:\:\$_config type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/RedisReplaceEventDAO.php + path: lib/Utils/Engines/Apertium.php - - message: '#^Method Model\\Search\\RedisReplaceEventIndexDAO\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Variable \$original might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Model/Search/RedisReplaceEventIndexDAO.php + path: lib/Utils/Engines/Apertium.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type int\.$#' - identifier: return.phpDocType + message: '#^Method Utils\\Engines\\DeepL\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/ReplaceEventIndexDAOInterface.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Search\\SearchModel\:\:_getQuery\(\) has parameter \$sql with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\DeepL\:\:_getClient\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Search/SearchModel.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Search\\SearchModel\:\:_getQuery\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\DeepL\:\:createGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/SearchModel.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Search\\SearchModel\:\:_loadParams\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\DeepL\:\:createGlossary\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/DeepL.php + + - + message: '#^Method Utils\\Engines\\DeepL\:\:delete\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Model/Search/SearchModel.php + count: 1 + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Search\\SearchModel\:\:find\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\DeepL\:\:deleteGlossary\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/SearchModel.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Search\\SearchModel\:\:hasMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\DeepL\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/SearchModel.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Search\\SearchModel\:\:search\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\DeepL\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/SearchModel.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Parameter \#1 \$string of method Model\\DataAccess\\Database\:\:escape\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\DeepL\:\:getGlossary\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/SearchModel.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Parameter \#2 \$needle of method Model\\Search\\SearchModel\:\:find\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 3 - path: lib/Model/Search/SearchModel.php + message: '#^Method Utils\\Engines\\DeepL\:\:getGlossaryEntries\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/DeepL.php - - message: '#^Property Model\\Search\\SearchModel\:\:\$db \(Model\\DataAccess\\Database\) does not accept Model\\DataAccess\\IDatabase\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\DeepL\:\:glossaries\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Search/SearchModel.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Strict comparison using \!\=\= between mixed and null will always evaluate to true\.$#' - identifier: notIdentical.alwaysTrue + message: '#^Method Utils\\Engines\\DeepL\:\:set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Search/SearchModel.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Segments\\ContextGroupDao\:\:getByFileID\(\) has parameter \$fid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\DeepL\:\:update\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Segments/ContextGroupDao.php + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Segments\\ContextGroupDao\:\:getBySIDRange\(\) has parameter \$start with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Model/Segments/ContextGroupDao.php + message: '#^Using nullsafe property access "\?\-\>value" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' + identifier: nullsafe.neverNull + count: 3 + path: lib/Utils/Engines/DeepL.php - - message: '#^Method Model\\Segments\\ContextGroupDao\:\:getBySIDRange\(\) has parameter \$stop with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:allGlossaries\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/ContextGroupDao.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\ContextGroupDao\:\:getBySegmentID\(\) has parameter \$sid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:allGlossaries\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Segments/ContextGroupDao.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Property Model\\Segments\\ContextGroupDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:createGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/ContextGroupDao.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Property Model\\Segments\\ContextGroupDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:createGlossary\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/ContextGroupDao.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Class Model\\Segments\\ContextStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:createGlossary\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Segments/ContextStruct.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\ContextStruct\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:deleteGlossary\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/ContextStruct.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\ContextStruct\:\:__construct\(\) has parameter \$decode with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:deleteGlossary\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Segments/ContextStruct.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php + + - + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:getGlossary\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\ContextStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:getGlossary\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/Segments/ContextStruct.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\ContextStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:getGlossaryEntries\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/ContextStruct.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\ContextStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:getGlossaryEntries\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/Segments/ContextStruct.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, array\|string given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:parse\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/ContextStruct.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Property Model\\Segments\\ContextStruct\:\:\$context_json type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:send\(\) has parameter \$params with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/ContextStruct.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Cannot access property \$job_last_segment on Model\\Jobs\\JobStruct\|false\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:send\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr - count: 2 - path: lib/Model/Segments/SegmentDao.php + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:translate\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:countByFile\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:translate\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Model/Segments/SegmentDao.php + count: 1 + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getByChunkId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Segments/SegmentDao.php + message: '#^Parameter \#1 \$body of method Utils\\Engines\\DeepL\\DeepLApiClient\:\:parse\(\) expects string, bool\|string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getByChunkIdAndSegmentId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$tokenHash of method Utils\\Network\\MultiCurlHandler\:\:hasError\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Segments/SegmentDao.php + message: '#^Parameter \#3 \$previous of class Utils\\Engines\\DeepL\\DeepLApiException constructor expects Throwable\|null, string given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getContextAndSegmentByIDs\(\) has parameter \$id_list with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/DeepL/DeepLApiClient.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getNextSegment\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\EngineInterface\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Engines/EngineInterface.php + + - + message: '#^Method Utils\\Engines\\EngineInterface\:\:deleteMemory\(\) has parameter \$memoryKey with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getNextSegment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Segments/SegmentDao.php + message: '#^Method Utils\\Engines\\EngineInterface\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getPaginationSegments\(\) has parameter \$options with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\EngineInterface\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getPaginationSegments\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\EngineInterface\:\:getMemoryIfMine\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsDownload\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\EngineInterface\:\:memoryExists\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsDownload\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Segments/SegmentDao.php + message: '#^Method Utils\\Engines\\EngineInterface\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForAnalysisFromIdJobAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\EngineInterface\:\:syncMemories\(\) has parameter \$projectRow with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForAnalysisFromIdProjectAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\EngineInterface\:\:syncMemories\(\) has parameter \$segments with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForQr\(\) has parameter \$job_id with no type specified\.$#' + message: '#^Method Utils\\Engines\\EngineInterface\:\:update\(\) has parameter \$_config with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EngineInterface.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForQr\(\) has parameter \$job_password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to function is_numeric\(\) with int will always evaluate to true\.$#' + identifier: function.alreadyNarrowedType count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EnginesFactory.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForQr\(\) has parameter \$segments_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\EnginesFactory\:\:createTempInstance\(\) should return Utils\\Engines\\EngineInterface but returns object\.$#' + identifier: return.type count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EnginesFactory.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsForQr\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Segments/SegmentDao.php + message: '#^Method Utils\\Engines\\EnginesFactory\:\:getInstance\(\) should return T of Utils\\Engines\\AbstractEngine but returns object\.$#' + identifier: return.type + count: 1 + path: lib/Utils/Engines/EnginesFactory.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsIdForQR\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$engineRecord EngineStruct\)\: Unexpected token "\$engineRecord", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/EnginesFactory.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getSegmentsIdForQR\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$_className of static method Utils\\Engines\\EnginesFactory\:\:getFullyQualifiedClassName\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/Engines/EnginesFactory.php + + - + message: '#^Method Utils\\Engines\\GoogleTranslate\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^Method Model\\Segments\\SegmentDao\:\:getTranslationsMismatches\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\GoogleTranslate\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^PHPDoc tag @var has invalid value \(\$fetched SegmentStruct\[\]\)\: Unexpected token "\$fetched", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Engines\\GoogleTranslate\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^PHPDoc tag @var has invalid value \(\$res SegmentStruct\[\]\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Engines\\GoogleTranslate\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^Property Model\\Segments\\SegmentDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\GoogleTranslate\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:get\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\GoogleTranslate\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentMetadataDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:get\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\GoogleTranslate\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentMetadataDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:getAll\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\GoogleTranslate\:\:update\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentMetadataDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:getBySegmentIds\(\) has parameter \$ids with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Engines\\GoogleTranslate\:\:\$_config type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentMetadataDao.php + path: lib/Utils/Engines/GoogleTranslate.php - - message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:getBySegmentIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Intento\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentMetadataDao.php - - - - message: '#^Method Model\\Segments\\SegmentMetadataDao\:\:save\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Segments/SegmentMetadataDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:_buildResult\(\) has no return type specified\.$#' + message: '#^Method Utils\\Engines\\Intento\:\:_curl_async\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Model/Segments/SegmentNoteDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Intento\:\:_curl_async\(\) has parameter \$config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentNoteDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getAggregatedBySegmentIdInInterval\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Intento\:\:_curl_async\(\) has parameter \$function with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentNoteDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getAggregatedBySegmentIdInInterval\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Segments/SegmentNoteDao.php + message: '#^Method Utils\\Engines\\Intento\:\:_curl_async\(\) has parameter \$parameters with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getAllAggregatedBySegmentIdInInterval\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Intento\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentNoteDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getAllAggregatedBySegmentIdInInterval\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Segments/SegmentNoteDao.php + message: '#^Method Utils\\Engines\\Intento\:\:_setIntentoUserAgent\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getBySegmentId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Intento\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentNoteDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getBySegmentIds\(\) has parameter \$ids with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Intento\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentNoteDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getBySegmentIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Intento\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentNoteDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentNoteDao\:\:getJsonNotesByRange\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Intento\:\:getProviderList\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Segments/SegmentNoteDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentOriginalDataDao\:\:getBySegmentId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\Intento\:\:getProviderList\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/Segments/SegmentOriginalDataDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentOriginalDataDao\:\:getSegmentDataRefMap\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Intento\:\:getRoutingList\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentOriginalDataDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentOriginalDataDao\:\:insertRecord\(\) has parameter \$map with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Intento\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentOriginalDataDao.php - - - - message: '#^Method Model\\Segments\\SegmentOriginalDataDao\:\:insertRecord\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Segments/SegmentOriginalDataDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Intento\:\:update\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentOriginalDataDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|false given\.$#' - identifier: argument.type + message: '#^Offset ''context'' does not exist on null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/Segments/SegmentOriginalDataDao.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentOriginalDataStruct\:\:getMap\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/Segments/SegmentOriginalDataStruct.php + message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentOriginalDataStruct\:\:getMap\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#2 \$parameters \(null\) of method Utils\\Engines\\Intento\:\:_decode\(\) should be compatible with parameter \$parameters \(array\) of method Utils\\Engines\\AbstractEngine\:\:_decode\(\)$#' + identifier: method.childParameterType count: 1 - path: lib/Model/Segments/SegmentOriginalDataStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentOriginalDataStruct\:\:setMap\(\) has parameter \$map with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Engines\\Intento\:\:\$_config type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentOriginalDataStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentOriginalDataStruct\:\:setMap\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Intento\:\:\$apiKey has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Segments/SegmentOriginalDataStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Property Model\\Segments\\SegmentOriginalDataStruct\:\:\$decoded_map type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Intento\:\:\$provider has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Segments/SegmentOriginalDataStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Property Model\\Segments\\SegmentOriginalDataStruct\:\:\$map \(string\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Engines\\Intento\:\:\$provider is never read, only written\.$#' + identifier: property.onlyWritten count: 1 - path: lib/Model/Segments/SegmentOriginalDataStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Class Model\\Segments\\SegmentStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Property Utils\\Engines\\Intento\:\:\$providerCategory has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Segments/SegmentStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Intento\:\:\$providerCategory is never read, only written\.$#' + identifier: property.onlyWritten count: 1 - path: lib/Model/Segments/SegmentStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Intento\:\:\$providerKey has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Segments/SegmentStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Method Model\\Segments\\SegmentStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Intento\:\:\$providerKey is never read, only written\.$#' + identifier: property.onlyWritten count: 1 - path: lib/Model/Segments/SegmentStruct.php + path: lib/Utils/Engines/Intento.php - - message: '#^Class Model\\Segments\\SegmentUIStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Argument of an invalid type array\\|string supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Segments\\SegmentUIStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Segments\\SegmentUIStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + message: '#^Cannot access property \$uid on Model\\Users\\UserStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Segments\\SegmentUIStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method getJobs\(\) on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$data_ref_map type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method getText\(\) on Lara\\TextBlock\|string\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$metadata type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method isTranslatable\(\) on Lara\\TextBlock\|string\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$notes type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Lara\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$parsed_time_to_edit type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$source_chunk_lengths type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Segments\\SegmentUIStruct\:\:\$target_chunk_lengths type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:configureContribution\(\) has parameter \$config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Segments/SegmentUIStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getMTForTMXExport\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:configureContribution\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/TMSService/TMSServiceDao.php - - - - message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getMTForTMXExport\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/TMSService/TMSServiceDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getTMForTMXExport\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Lara\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/TMSService/TMSServiceDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getTMForTMXExport\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Lara\:\:delete\(\) should return bool but return statement is missing\.$#' + identifier: return.missing count: 1 - path: lib/Model/TMSService/TMSServiceDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getTranslationsForTMXExport\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:deleteMemory\(\) has parameter \$memoryKey with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/TMSService/TMSServiceDao.php - - - - message: '#^Method Model\\TMSService\\TMSServiceDao\:\:getTranslationsForTMXExport\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/TMSService/TMSServiceDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\InvitedUser\:\:completeTeamSignUp\(\) has parameter \$invitation with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/InvitedUser.php - - - - message: '#^Method Model\\Teams\\InvitedUser\:\:completeTeamSignUp\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Teams/InvitedUser.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\InvitedUser\:\:hasPendingInvitations\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Lara\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/InvitedUser.php + path: lib/Utils/Engines/Lara.php - - message: '#^Parameter \#1 \$struct of class Model\\Teams\\TeamModel constructor expects Model\\Teams\\TeamStruct, Model\\Teams\\TeamStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Lara\:\:get\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/InvitedUser.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Teams\\InvitedUser\:\:\$jwt type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:getAvailableLanguages\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/InvitedUser.php + path: lib/Utils/Engines/Lara.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr + message: '#^Method Utils\\Engines\\Lara\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\MembershipDao\:\:createList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:getMemoryIfMine\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\MembershipDao\:\:deleteUserFromTeam\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:getMemoryIfMine\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Model/Teams/MembershipDao.php - - - - message: '#^Method Model\\Teams\\MembershipDao\:\:findById\(\) has no return type specified\.$#' - identifier: missingType.return count: 1 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\MembershipDao\:\:findById\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\Lara\:\:memoryExists\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/MembershipDao.php - - - - message: '#^Method Model\\Teams\\MembershipDao\:\:findById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^PHPDoc tag @var has invalid value \(\$members MembershipStruct\[\]\)\: Unexpected token "\$members", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Engines\\Lara\:\:reMapKeyList\(\) has parameter \$_keys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Parameter \#1 \$user of method Model\\Teams\\MembershipDao\:\:destroyCacheUserTeams\(\) expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Lara\:\:reMapKeyList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Parameter \#2 \$user of method Model\\Teams\\MembershipDao\:\:destroyCacheTeamByIdAndUser\(\) expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Lara\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Teams\\MembershipDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:syncMemories\(\) has parameter \$projectRow with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Teams\\MembershipDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\:\:syncMemories\(\) has parameter \$segments with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/MembershipDao.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\MembershipStruct\:\:getTeam\(\) should return Model\\Teams\\TeamStruct but returns Model\\Teams\\TeamStruct\|null\.$#' - identifier: return.type + message: '#^Method Utils\\Engines\\Lara\:\:update\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Teams/MembershipStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\MembershipStruct\:\:getUser\(\) should return Model\\Users\\UserStruct but returns Model\\Users\\UserStruct\|null\.$#' - identifier: return.type + message: '#^Method Utils\\Engines\\Lara\:\:validateLaraStyle\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Teams/MembershipStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\MembershipStruct\:\:getUserMetadata\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$body of class Stomp\\Transport\\Message constructor expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Teams/MembershipStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\MembershipStruct\:\:setUserMetadata\(\) has parameter \$user_metadata with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$data of function unserialize expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Teams/MembershipStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Property Model\\Teams\\MembershipStruct\:\:\$user_metadata type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Teams/MembershipStruct.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\PendingInvitations\:\:hasPendingInvitation\(\) has parameter \$id_team with no type specified\.$#' - identifier: missingType.parameter + message: '#^Return type \(array\) of method Utils\\Engines\\Lara\:\:get\(\) should be compatible with return type \(Utils\\Engines\\Results\\TMSAbstractResponse\) of method Utils\\Engines\\EngineInterface\:\:get\(\)$#' + identifier: method.childReturnType + count: 2 + path: lib/Utils/Engines/Lara.php + + - + message: '#^Variable \$laraGlossariesArray in empty\(\) always exists and is always falsy\.$#' + identifier: empty.variable count: 1 - path: lib/Model/Teams/PendingInvitations.php + path: lib/Utils/Engines/Lara.php - - message: '#^Method Model\\Teams\\PendingInvitations\:\:hasPendingInvitation\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Lara\\HeaderField\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/PendingInvitations.php + path: lib/Utils/Engines/Lara/HeaderField.php - - message: '#^Property Model\\Teams\\PendingInvitations\:\:\$payload type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Class Utils\\Engines\\Lara\\Headers implements generic interface Iterator but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Model/Teams/PendingInvitations.php + path: lib/Utils/Engines/Lara/Headers.php - - message: '#^Method Model\\Teams\\TeamDao\:\:createPersonalTeam\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Lara\\Headers\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/Lara/Headers.php - - message: '#^Method Model\\Teams\\TeamDao\:\:createUserTeam\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Engines\\Lara\\Headers\:\:\$keys type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/Lara/Headers.php - - message: '#^Method Model\\Teams\\TeamDao\:\:createUserTeam\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Lara\\HttpClientInterface\:\:authenticate\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/Lara/HttpClientInterface.php - - message: '#^Method Model\\Teams\\TeamDao\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Teams/TeamDao.php + message: '#^Parameter \#1 \$baseUrl of method Lara\\Internal\\HttpClient\:\:__construct\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Engines/Lara/LaraClient.php - - message: '#^Method Model\\Teams\\TeamDao\:\:deleteTeam\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Teams/TeamDao.php + message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$value\.$#' + identifier: property.notFound + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamDao\:\:destroyCacheUserCreatedTeams\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 2 + path: lib/Utils/Engines/MMT.php + + - + message: '#^Cannot access offset ''secret_key'' on array\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamDao\:\:findById\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamDao\:\:updateTeamName\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 5 - path: lib/Model/Teams/TeamDao.php + message: '#^Cannot access property \$uid on Model\\Users\\UserStruct\|null\.$#' + identifier: property.nonObject + count: 2 + path: lib/Utils/Engines/MMT.php - - message: '#^PHPDoc tag @var has invalid value \(\$res TeamStruct\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Cannot call method getJobs\(\) on Model\\Projects\\ProjectStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#1 \$uid of method Model\\Teams\\TeamDao\:\:getPersonalByUid\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamStruct\:\:\$created_by \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\MMT\:\:_reMapKeyList\(\) has parameter \$_keys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamStruct\:\:\$id \(int\|null\) does not accept int\|false\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\MMT\:\:_reMapKeyList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$uid\.$#' - identifier: property.notFound + message: '#^Method Utils\\Engines\\MMT\:\:_reMapKeyStructsList\(\) has parameter \$keyList with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Call to an undefined method Model\\DataAccess\\IDaoStruct\:\:setAssignedProjects\(\)\.$#' - identifier: method.notFound + message: '#^Method Utils\\Engines\\MMT\:\:_reMapKeyStructsList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_checkAddMembersToPersonalTeam\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\:\:checkAccount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_checkPersonalUnique\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\:\:configureContribution\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_checkType\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\:\:configureContribution\(\) never returns null so it can be removed from the return type\.$#' + identifier: return.unusedType count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_createTeamWithMatecatUsers\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\:\:configureContribution\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_createTeamWithMatecatUsers\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Teams/TeamModel.php + message: '#^Method Utils\\Engines\\MMT\:\:connectKeys\(\) has parameter \$keyList with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_getInvitedEmails\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:connectKeys\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_getInvitedEmails\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\:\:createMemory\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_getRemovedMembersEmailList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\MMT\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:_setPendingStatuses\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:delete\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:addMemberEmails\(\) has parameter \$emails with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:deleteMemory\(\) has parameter \$memoryKey with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Teams\\TeamModel\:\:removeMemberUids\(\) has parameter \$uids with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#1 \$id_team of method Model\\Teams\\MembershipDao\:\:destroyCacheForListByTeamId\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\:\:deleteMemory\(\) should return array but returns array\|null\.$#' + identifier: return.type count: 1 - path: lib/Model/Teams/TeamModel.php - - - - message: '#^Parameter \#1 \$id_team of method Model\\Teams\\MembershipDao\:\:getMemberListByTeamId\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 3 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#1 \$list of method Model\\Teams\\TeamStruct\:\:setMembers\(\) expects array\, array\ given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#1 \$user of method Model\\Teams\\TeamDao\:\:getPersonalByUser\(\) expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\:\:get\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#2 \$payload of class Model\\Teams\\PendingInvitations constructor expects array\{team_id\?\: int, email\?\: string\}, array\{team_id\: int\|null, email\: mixed\} given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\:\:get\(\) should return array but returns array\|Utils\\Engines\\Results\\TMSAbstractResponse\.$#' + identifier: return.type count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#2 \$teamId of method Model\\Teams\\MembershipDao\:\:deleteUserFromTeam\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\:\:getAllMemories\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#2 \$user of method Model\\Projects\\ProjectDao\:\:massiveSelfAssignment\(\) expects Model\\Users\\UserStruct, Model\\Users\\UserStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\:\:getAvailableLanguages\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamModel\:\:\$all_memberships \(array\\) does not accept array\\.$#' - identifier: assign.propertyType - count: 2 - path: lib/Model/Teams/TeamModel.php + message: '#^Method Utils\\Engines\\MMT\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamModel\:\:\$all_memberships \(array\\) does not accept array\\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\MMT\:\:getContext\(\) has parameter \$targets with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamModel\:\:\$member_emails type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:getContext\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamModel\:\:\$new_memberships \(array\\) does not accept array\\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\MMT\:\:getG2FallbackSecretKey\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\Teams\\TeamModel\:\:\$uids_to_remove type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:getMemory\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Right side of && is always true\.$#' - identifier: booleanAnd.rightAlwaysTrue + message: '#^Method Utils\\Engines\\MMT\:\:getMemoryIfMine\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Teams/TeamModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Argument of an invalid type array\\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Utils\\Engines\\MMT\:\:getMemoryIfMine\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Teams/TeamStruct.php + path: lib/Utils/Engines/MMT.php - - message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$tm_key\.$#' - identifier: property.notFound + message: '#^Method Utils\\Engines\\MMT\:\:importGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php - - - - message: '#^Argument of an invalid type Model\\DataAccess\\ShapelessConcreteStruct supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable - count: 2 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Cannot access property \$glos on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + message: '#^Method Utils\\Engines\\MMT\:\:importGlossary\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject - count: 5 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + message: '#^Method Utils\\Engines\\MMT\:\:importJobStatus\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + message: '#^Method Utils\\Engines\\MMT\:\:importMemory\(\) with return type void returns null but should not return anything\.$#' + identifier: return.void + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^Cannot access property \$tm on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + message: '#^Method Utils\\Engines\\MMT\:\:memoryExists\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^If condition is always true\.$#' - identifier: if.alwaysTrue + message: '#^Method Utils\\Engines\\MMT\:\:set\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:syncMemories\(\) has parameter \$projectRow with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:createList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:syncMemories\(\) has parameter \$segments with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:sanitize\(\) should return Model\\TmKeyManagement\\MemoryKeyStruct but returns Model\\DataAccess\\IDaoStruct\.$#' - identifier: return.type + message: '#^Method Utils\\Engines\\MMT\:\:update\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:sanitizeArray\(\) has parameter \$input with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:updateGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\MemoryKeyDao\:\:sanitizeArray\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\:\:updateGlossary\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^PHPDoc tag @var has invalid value \(\$chunk MemoryKeyStruct\[\]\)\: Unexpected token "\$chunk", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Engines\\MMT\:\:updateMemory\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^PHPDoc tag @var has invalid value \(\$obj MemoryKeyStruct\)\: Unexpected token "\$obj", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError - count: 2 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + message: '#^Offset ''keys'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^PHPDoc tag @var with type Model\\DataAccess\\ShapelessConcreteStruct is not subtype of native type array\.$#' - identifier: varTag.nativeType + message: '#^Offset ''score'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#1 \$array_result of method Model\\TmKeyManagement\\MemoryKeyDao\:\:_buildResult\(\) expects array, Model\\DataAccess\\ShapelessConcreteStruct given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + message: '#^Offset ''segment'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound + count: 2 + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + message: '#^Offset ''source'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound + count: 3 + path: lib/Utils/Engines/MMT.php - - message: '#^Parameter \#2 \$length of function array_chunk expects int\<1, max\>, int given\.$#' - identifier: argument.type - count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + message: '#^Offset ''target'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound + count: 3 + path: lib/Utils/Engines/MMT.php - - message: '#^Template type T of method Model\\TmKeyManagement\\MemoryKeyDao\:\:sanitize\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Offset ''translation'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\MemoryKeyStruct\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Offset ''vectors'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyStruct.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\MemoryKeyStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Model/TmKeyManagement/MemoryKeyStruct.php + message: '#^Offset 0 might not exist on array\|null\.$#' + identifier: offsetAccess.notFound + count: 2 + path: lib/Utils/Engines/MMT.php - - message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^PHPDoc tag @property has invalid value \(int id\)\: Unexpected token "id", expected variable at offset 103 on line 7$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/TmKeyManagement/UserKeysModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Cannot call method isShared\(\) on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$_config of method Utils\\Engines\\AbstractEngine\:\:GoogleTranslateFallback\(\) expects array, array\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/TmKeyManagement/UserKeysModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\UserKeysModel\:\:getKeys\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$filename of function file_exists expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/TmKeyManagement/UserKeysModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\TmKeyManagement\\UserKeysModel\:\:getKeys\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/TmKeyManagement/UserKeysModel.php + message: '#^Parameter \#1 \$filename of function parse_ini_file expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Engines/MMT.php - - message: '#^PHPDoc tag @var has invalid value \(\$_client_tm_key TmKeyStruct\)\: Unexpected token "\$_client_tm_key", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:set\(\) expects int, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/TmKeyManagement/UserKeysModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^PHPDoc tag @var has invalid value \(\$keyList MemoryKeyStruct\[\]\)\: Unexpected token "\$keyList", expected type at offset 84 on line 4$#' - identifier: phpDoc.parseError + message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/TmKeyManagement/UserKeysModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^PHPDoc tag @var has invalid value \(\$keyList array\)\: Unexpected token "\$keyList", expected type at offset 159 on line 5$#' - identifier: phpDoc.parseError + message: '#^Parameter \#2 \$array of function array_key_exists expects array, array\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/TmKeyManagement/UserKeysModel.php + path: lib/Utils/Engines/MMT.php - - message: '#^Property Model\\TmKeyManagement\\UserKeysModel\:\:\$_user_keys type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Engines\\MMT\:\:\$_config type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/TmKeyManagement/UserKeysModel.php + path: lib/Utils/Engines/MMT.php + + - + message: '#^Return type \(array\) of method Utils\\Engines\\MMT\:\:get\(\) should be compatible with return type \(Utils\\Engines\\Results\\TMSAbstractResponse\) of method Utils\\Engines\\EngineInterface\:\:get\(\)$#' + identifier: method.childReturnType + count: 2 + path: lib/Utils/Engines/MMT.php - - message: '#^Call to function is_array\(\) with list\ will always evaluate to true\.$#' - identifier: function.alreadyNarrowedType + message: '#^Using nullsafe property access "\?\-\>value" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' + identifier: nullsafe.neverNull count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Loose comparison using \=\= between true and 1 will always evaluate to true\.$#' + identifier: equal.alwaysTrue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:addToMemoryContent\(\) has parameter \$id with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:addTranslation\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 5 - path: lib/Model/Translations/SegmentTranslationDao.php + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:addToMemoryContent\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:findBySegmentAndJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:connectMemories\(\) has parameter \$externalIds with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getAllSegmentsByIdListAndJobId\(\) has parameter \$id_list with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:connectMemories\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getAllSegmentsByIdListAndJobId\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:createMemory\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getAllSegmentsByIdListAndJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getByFile\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Translations/SegmentTranslationDao.php + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getAllMemories\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Translations/SegmentTranslationDao.php + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getAvailableLanguages\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getLast10TranslatedSegmentIDsInLastHour\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromFile\(\) has parameter \$hints with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getMaxSegmentIdsFromJob\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromFile\(\) has parameter \$targets with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getMaxSegmentIdsFromJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Translations/SegmentTranslationDao.php + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromFile\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getUnchangeableStatus\(\) has parameter \$segments_ids with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromText\(\) has parameter \$hints with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getUnchangeableStatus\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromText\(\) has parameter \$targets with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getWordsPerSecond\(\) has parameter \$estimation_seg_ids with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromText\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getWordsPerSecond\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getImportJob\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:getWordsPerSecond\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Translations/SegmentTranslationDao.php + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getMemory\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:propagateTranslation\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getMemoryById\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:rebuildFromReplaceEvents\(\) has parameter \$events with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:importGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:rebuildFromReplaceEvents\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Translations/SegmentTranslationDao.php + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:importGlossary\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:setAnalysisValue\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:importIntoMemoryContent\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:setAnalysisValue\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Translations/SegmentTranslationDao.php + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:importJobStatus\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateFirstTimeOpenedContribution\(\) has parameter \$data with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:me\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateFirstTimeOpenedContribution\(\) has parameter \$where with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:parse\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateLastTranslationDateByIdList\(\) has parameter \$segmentIdList with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:qualityEstimation\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateLastTranslationDateByIdList\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Translations/SegmentTranslationDao.php + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:send\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateSuggestionsArray\(\) has parameter \$id_segment with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:send\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateSuggestionsArray\(\) has parameter \$suggestions with no type specified\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:signup\(\) has parameter \$email with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php - - - - message: '#^Method Model\\Translations\\SegmentTranslationDao\:\:updateSuggestionsArray\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^PHPDoc tag @var has invalid value \(\$result SegmentTranslationStruct\[\]\)\: Unexpected token "\$result", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:signup\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^PHPDoc tag @var has invalid value \(\$result SegmentTranslationStruct\[\]\)\: Unexpected token "\$result", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:signup\(\) has parameter \$stripeToken with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Parameter \#1 \$string of function strlen expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:signup\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Parameter \#1 \$value of function count expects array\|Countable, array\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:translate\(\) has parameter \$hints with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Parameter \#2 \.\.\.\$arrays of function array_merge expects array, array\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:translate\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Property Model\\Translations\\SegmentTranslationDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:updateGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Class Model\\Translations\\SegmentTranslationStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:updateGlossary\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationStruct.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:updateMemory\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationStruct.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:updateMemoryContent\(\) has parameter \$memory_keys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/SegmentTranslationStruct.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\SegmentTranslationStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Model/Translations/SegmentTranslationStruct.php + message: '#^PHPDoc tag @param for parameter \$limit with type mixed is not subtype of native type int\|null\.$#' + identifier: parameter.phpDocType + count: 2 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^PHPDoc tag @return with type array\\|null is not subtype of native type Model\\Jobs\\JobStruct\|null\.$#' + message: '#^PHPDoc tag @return with type mixed is not subtype of native type array\|null\.$#' identifier: return.phpDocType count: 1 - path: lib/Model/Translations/SegmentTranslationStruct.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\WarningDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$body of method Utils\\Engines\\MMT\\MMTServiceApi\:\:parse\(\) expects string, bool\|string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\WarningDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$filename of class CURLFile constructor expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\WarningDao\:\:getErrorsByChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Translations/WarningDao.php + message: '#^Parameter \#1 \$string of function strlen expects string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByJobIdAndPassword\(\) has parameter \$jid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$tokenHash of method Utils\\Network\\MultiCurlHandler\:\:hasError\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByJobIdAndPassword\(\) has parameter \$jpassword with no type specified\.$#' - identifier: missingType.parameter + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MMT/MMTServiceApi.php - - message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByJobIdAndPassword\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MMT\\MMTServiceApiException\:\:fromJSONResponse\(\) has parameter \$json with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MMT/MMTServiceApiException.php - - message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByJobIdAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#2 \$code of method Exception\:\:__construct\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MMT/MMTServiceApiException.php - - message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByProjectIds\(\) has parameter \$projectIds with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Engines\\MMT\\MMTServiceApiException\:\:\$type has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MMT/MMTServiceApiException.php - - message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByProjectIds\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Engines\\MyMemory\:\:\$contribute_relative_url\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\Translations\\WarningDao\:\:getWarningsByProjectIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot access offset ''code'' on 0\|0\.0\|''''\|''0''\|array\{\}\|false\|null\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Model/Translations/WarningDao.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$source_chunk_lengths type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot assign offset ''tags_projection'' to array\|string\|null\.$#' + identifier: offsetAssign.dimType count: 1 - path: lib/Model/TranslationsSplit/SegmentSplitStruct.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$target_chunk_lengths type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method dispatchFilter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Model/TranslationsSplit/SegmentSplitStruct.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^If condition is always true\.$#' - identifier: if.alwaysTrue + message: '#^Method Utils\\Engines\\MyMemory\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/TranslationsSplit/SplitDAO.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\TranslationsSplit\\SplitDAO\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MyMemory\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/TranslationsSplit/SplitDAO.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\TranslationsSplit\\SplitDAO\:\:_validatePrimaryKey\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' - identifier: throws.unusedType + message: '#^Method Utils\\Engines\\MyMemory\:\:createMyMemoryKey\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/TranslationsSplit/SplitDAO.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$source_chunk_lengths \(array\|string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\MyMemory\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/TranslationsSplit/SplitDAO.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\TranslationsSplit\\SegmentSplitStruct\:\:\$target_chunk_lengths \(array\|string\) does not accept string\|false\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\MyMemory\:\:fastAnalysis\(\) has parameter \$segs_array with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/TranslationsSplit/SplitDAO.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\Translators\\JobsTranslatorsDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MyMemory\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/JobsTranslatorsDao.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\Translators\\JobsTranslatorsDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\MyMemory\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/JobsTranslatorsDao.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\Translators\\JobsTranslatorsStruct\:\:getUser\(\) should return Model\\Users\\UserStruct but returns Model\\Users\\UserStruct\|null\.$#' - identifier: return.type + message: '#^Method Utils\\Engines\\MyMemory\:\:getImportStatus\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Translators/JobsTranslatorsStruct.php - - - - message: '#^Cannot access property \$name on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject - count: 3 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Cannot access property \$uid on Model\\Users\\UserStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Engines\\MyMemory\:\:getImportStatus\(\) has parameter \$uuid with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\Translators\\TranslatorsModel\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\MyMemory\:\:getTagProjection\(\) has parameter \$config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\Translators\\TranslatorsModel\:\:getTranslator\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryCheck\(\) has parameter \$keys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\Translators\\TranslatorsModel\:\:saveProfile\(\) should return int but returns int\|null\.$#' - identifier: return.type + message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryDelete\(\) has parameter \$term with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\Translators\\TranslatorsModel\:\:saveProfile\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Translators/TranslatorsModel.php + message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryDomains\(\) has parameter \$keys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\Translators\\TranslatorsModel\:\:setDeliveryDate\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Translators/TranslatorsModel.php + message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryGet\(\) has parameter \$keys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MyMemory.php - - message: '#^Method Model\\Translators\\TranslatorsModel\:\:update\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 5 - path: lib/Model/Translators/TranslatorsModel.php + message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryKeys\(\) has parameter \$keys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Engines/MyMemory.php - - message: '#^PHPDoc tag @param for parameter \$job_password with type mixed is not subtype of native type string\.$#' - identifier: parameter.phpDocType + message: '#^Method Utils\\Engines\\MyMemory\:\:glossarySearch\(\) has parameter \$keys with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Parameter \#1 \$datetime of function strtotime expects string, int\|string given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MyMemory\:\:glossarySet\(\) has parameter \$term with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Parameter \#1 \$id_job of static method Model\\Projects\\ProjectDao\:\:findByJobId\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryUpdate\(\) has parameter \$term with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Parameter \#2 \$translator of class Utils\\Email\\SendToTranslatorForDeliveryChangeEmail constructor expects Model\\Translators\\JobsTranslatorsStruct, Model\\Translators\\JobsTranslatorsStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MyMemory\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Parameter \#2 \$translator of class Utils\\Email\\SendToTranslatorForJobSplitEmail constructor expects Model\\Translators\\JobsTranslatorsStruct, Model\\Translators\\JobsTranslatorsStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\MyMemory\:\:update\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Parameter \#2 \$translator of class Utils\\Email\\SendToTranslatorForNewJobEmail constructor expects Model\\Translators\\JobsTranslatorsStruct, Model\\Translators\\JobsTranslatorsStruct\|null given\.$#' - identifier: argument.type + message: '#^Offset ''tags_projection'' might not exist on array\|string\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\Translators\\JobsTranslatorsStruct\:\:\$added_by \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Model/Translators/TranslatorsModel.php + message: '#^Offset 0 on array\{non\-empty\-string, int\<\-1, max\>\} in isset\(\) always exists and is not nullable\.$#' + identifier: isset.offset + count: 2 + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\Translators\\JobsTranslatorsStruct\:\:\$id_job \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^PHPDoc tag @var has invalid value \(\$match Matches\)\: Unexpected token "\$match", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\Translators\\JobsTranslatorsStruct\:\:\$job_password \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$url of function parse_url expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\Translators\\TranslatorProfilesStruct\:\:\$id \(int\|null\) does not accept int\|false\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Engines\\MyMemory\:\:\$_config type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\Translators\\TranslatorProfilesStruct\:\:\$uid_translator \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Strict comparison using \!\=\= between non\-falsy\-string and '''' will always evaluate to true\.$#' + identifier: notIdentical.alwaysTrue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/MyMemory.php - - message: '#^Property Model\\Translators\\TranslatorsModel\:\:\$delivery_date \(int\) does not accept int\|false\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\NONE\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/NONE.php - - message: '#^Property Model\\Translators\\TranslatorsModel\:\:\$delivery_date \(int\) does not accept int\|string\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\NONE\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/NONE.php - - message: '#^Property Model\\Translators\\TranslatorsModel\:\:\$job_password \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\NONE\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/NONE.php - - message: '#^Property Model\\Translators\\TranslatorsModel\:\:\$mailsToBeSent type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\NONE\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsModel.php - - - - message: '#^Unsafe access to private property Model\\Translators\\TranslatorsModel\:\:\$__transactionStarted through static\:\:\.$#' - identifier: staticClassAccess.privateProperty - count: 5 - path: lib/Model/Translators/TranslatorsModel.php + path: lib/Utils/Engines/NONE.php - - message: '#^Property Model\\Translators\\TranslatorsProfilesDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\NONE\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Translators/TranslatorsProfilesDao.php + path: lib/Utils/Engines/NONE.php - - message: '#^Property Model\\Translators\\TranslatorsProfilesDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\NONE\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Translators/TranslatorsProfilesDao.php + path: lib/Utils/Engines/NONE.php - - message: '#^Method Model\\Users\\Authentication\\ChangePasswordModel\:\:changePassword\(\) has parameter \$new_password with no type specified\.$#' + message: '#^Method Utils\\Engines\\NONE\:\:update\(\) has parameter \$_config with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Users/Authentication/ChangePasswordModel.php + path: lib/Utils/Engines/NONE.php + + - + message: '#^Return type \(Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\) of method Utils\\Engines\\NONE\:\:delete\(\) should be compatible with return type \(bool\) of method Utils\\Engines\\EngineInterface\:\:delete\(\)$#' + identifier: method.childReturnType + count: 2 + path: lib/Utils/Engines/NONE.php - - message: '#^Method Model\\Users\\Authentication\\ChangePasswordModel\:\:changePassword\(\) has parameter \$old_password with no type specified\.$#' + message: '#^Method Utils\\Engines\\Results\\ErrorResponse\:\:__construct\(\) has parameter \$result with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Users/Authentication/ChangePasswordModel.php + path: lib/Utils/Engines/Results/ErrorResponse.php - - message: '#^Cannot call method encrypt\(\) on Model\\ConnectedServices\\Oauth\\OauthTokenEncryption\|null\.$#' - identifier: method.nonObject - count: 1 - path: lib/Model/Users/Authentication/OAuthSignInModel.php + message: '#^Method Utils\\Engines\\Results\\ErrorResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Utils/Engines/Results/ErrorResponse.php - - message: '#^Method Model\\Users\\Authentication\\OAuthSignInModel\:\:_createNewUser\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Results\\ErrorResponse\:\:get_as_array\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/Authentication/OAuthSignInModel.php + path: lib/Utils/Engines/Results/ErrorResponse.php - - message: '#^Parameter \#1 \$email of method Model\\Users\\UserDao\:\:getByEmail\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Results\\MTResponse\:\:__construct\(\) has parameter \$result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/Authentication/OAuthSignInModel.php + path: lib/Utils/Engines/Results/MTResponse.php - - message: '#^Parameter \#1 \$uid of method Model\\Users\\MetadataDao\:\:set\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Results\\MTResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Model/Users/Authentication/OAuthSignInModel.php + path: lib/Utils/Engines/Results/MTResponse.php - - message: '#^Parameter \#3 \$value of method Model\\Users\\MetadataDao\:\:set\(\) expects array\|string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Results\\MTResponse\:\:get_as_array\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/Authentication/OAuthSignInModel.php + path: lib/Utils/Engines/Results/MTResponse.php - - message: '#^Property Model\\Users\\UserStruct\:\:\$uid \(int\|null\) does not accept int\|false\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\Results\\MyMemory\\AnalyzeResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/Authentication/OAuthSignInModel.php + path: lib/Utils/Engines/Results/MyMemory/AnalyzeResponse.php - - message: '#^Method Model\\Users\\Authentication\\PasswordResetModel\:\:__construct\(\) has parameter \$session with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Results\\MyMemory\\AnalyzeResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Users/Authentication/PasswordResetModel.php + path: lib/Utils/Engines/Results/MyMemory/AnalyzeResponse.php - - message: '#^Method Model\\Users\\Authentication\\PasswordResetModel\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Results\\MyMemory\\AuthKeyResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/Authentication/PasswordResetModel.php + path: lib/Utils/Engines/Results/MyMemory/AuthKeyResponse.php - - message: '#^Parameter \#1 \$datetime of function strtotime expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Results\\MyMemory\\CheckGlossaryResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/Authentication/PasswordResetModel.php + path: lib/Utils/Engines/Results/MyMemory/CheckGlossaryResponse.php - - message: '#^Property Model\\Users\\Authentication\\PasswordResetModel\:\:\$session type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Results\\MyMemory\\CheckGlossaryResponse\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Users/Authentication/PasswordResetModel.php + path: lib/Utils/Engines/Results/MyMemory/CheckGlossaryResponse.php - - message: '#^Method Model\\Users\\Authentication\\SignupModel\:\:__construct\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\CheckGlossaryResponse\:\:\$matches has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/CheckGlossaryResponse.php - - message: '#^Method Model\\Users\\Authentication\\SignupModel\:\:__construct\(\) has parameter \$session with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php - - message: '#^Method Model\\Users\\Authentication\\SignupModel\:\:getParams\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php - - message: '#^Method Model\\Users\\Authentication\\SignupModel\:\:processSignup\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:\$id has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php - - message: '#^Parameter \#1 \$datetime of function strtotime expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:\$key has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php - - message: '#^Parameter \#1 \$email of method Model\\Users\\UserDao\:\:getByEmail\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Property Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:\$pass has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php - - message: '#^Parameter \#1 \$email of method Model\\Users\\UserDao\:\:getByEmail\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Results\\MyMemory\\DomainsResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/DomainsResponse.php - - message: '#^Property Model\\Users\\Authentication\\SignupModel\:\:\$params type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Results\\MyMemory\\DomainsResponse\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/DomainsResponse.php - - message: '#^Property Model\\Users\\Authentication\\SignupModel\:\:\$session type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\DomainsResponse\:\:\$entries has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/DomainsResponse.php - - message: '#^Property Model\\Users\\UserStruct\:\:\$uid \(int\|null\) does not accept int\|false\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\Results\\MyMemory\\ExportResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/Authentication/SignupModel.php + path: lib/Utils/Engines/Results/MyMemory/ExportResponse.php - - message: '#^Argument of an invalid type Model\\Users\\UserStruct supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Utils\\Engines\\Results\\MyMemory\\ExportResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Users/ClientUserFacade.php + path: lib/Utils/Engines/Results/MyMemory/ExportResponse.php - - message: '#^Method Model\\Users\\ClientUserFacade\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Property Utils\\Engines\\Results\\MyMemory\\ExportResponse\:\:\$id has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/ClientUserFacade.php + path: lib/Utils/Engines/Results/MyMemory/ExportResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:_buildResult\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Property Utils\\Engines\\Results\\MyMemory\\ExportResponse\:\:\$resourceLink has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/ExportResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Results\\MyMemory\\FileImportAndStatusResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/FileImportAndStatusResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\FileImportAndStatusResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Model/Users/MetadataDao.php + count: 1 + path: lib/Utils/Engines/Results/MyMemory/FileImportAndStatusResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:destroyCacheKey\(\) has parameter \$key with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Engines\\Results\\MyMemory\\FileImportAndStatusResponse\:\:\$id has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/FileImportAndStatusResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:destroyCacheKey\(\) has parameter \$uid with no type specified\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetGlossaryResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/GetGlossaryResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:get\(\) has parameter \$key with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Engines\\Results\\MyMemory\\GetGlossaryResponse\:\:\$matches has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/GetGlossaryResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:get\(\) has parameter \$uid with no type specified\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:__construct\(\) has parameter \$result with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUid\(\) has parameter \$uid with no type specified\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php + + - + message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:buildMyMemoryMatch\(\) has parameter \$match with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUid\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:get_matches_as_array\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/MetadataDao.php - - - - message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUid\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUidList\(\) has parameter \$UIDs with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:get_matches_as_array\(\) has parameter \$subfiltering_handlers with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:getAllByUidList\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:get_matches_as_array\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:set\(\) has parameter \$value with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Results\\MyMemory\\KeysGlossaryResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/KeysGlossaryResponse.php - - message: '#^Method Model\\Users\\MetadataDao\:\:set\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\KeysGlossaryResponse\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Model/Users/MetadataDao.php + count: 1 + path: lib/Utils/Engines/Results/MyMemory/KeysGlossaryResponse.php - - message: '#^PHPDoc tag @var has invalid value \(\$result MetadataStruct\)\: Unexpected token "\$result", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Property Utils\\Engines\\Results\\MyMemory\\KeysGlossaryResponse\:\:\$entries has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/KeysGlossaryResponse.php - - message: '#^PHPDoc tag @var has invalid value \(\$rs MetadataStruct\[\]\)\: Unexpected token "\$rs", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/MetadataDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\MetadataStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:featureSet\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Model/Users/MetadataStruct.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Property Model\\Users\\MetadataStruct\:\:\$value type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getLayer\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/MetadataStruct.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Cannot access property \$id on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getLayer\(\) has parameter \$layerNum with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Cannot access property \$id_assignee on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getLayer\(\) has parameter \$string with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Cannot access property \$id_customer on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getLayer\(\) has parameter \$subfiltering_handlers with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Cannot access property \$id_team on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getMatches\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Cannot access property \$name on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getMatches\(\) has parameter \$subfiltering_handlers with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Cannot access property \$password on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getMatches\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\RedeemableProject\:\:__construct\(\) has parameter \$session with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\RedeemableProject\:\:getProject\(\) should return Model\\Projects\\ProjectStruct but returns Model\\Projects\\ProjectStruct\|null\.$#' - identifier: return.type + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$ICE has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\RedeemableProject\:\:tryToRedeem\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$create_date has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Parameter \#1 \$project of method Model\\Jobs\\JobDao\:\:updateOwner\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$created_by has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Parameter \#1 \$struct of static method Model\\DataAccess\\AbstractDao\:\:updateStruct\(\) expects Model\\DataAccess\\AbstractDaoObjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$data has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Property Model\\Users\\RedeemableProject\:\:\$session type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$id has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/RedeemableProject.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:_buildReadQuery\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$id_project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$id_project is unused\.$#' + identifier: property.unused count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:createUser\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Users/UserDao.php + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$last_update_date has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Users/UserDao.php + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$last_updated_by has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:destroyCacheByEmail\(\) has parameter \$email with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$match has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:destroyCacheByEmail\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$memory_key has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:destroyCacheByUid\(\) has parameter \$uid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$penalty has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:getByConfirmationToken\(\) has parameter \$token with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$prop has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:getByConfirmationToken\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Users/UserDao.php + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$quality has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:getByEmails\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Model/Users/UserDao.php + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$raw_segment has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:getByUid\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$raw_translation has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:getByUids\(\) has parameter \$uids_array with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$reasoning is never read, only written\.$#' + identifier: property.onlyWritten count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:getProjectOwner\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$reference has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:updateUser\(\) should return Model\\Users\\UserStruct but returns Model\\Users\\UserStruct\|null\.$#' - identifier: return.type + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$score has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserDao\:\:updateUser\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Users/UserDao.php + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$segment has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^PHPDoc tag @var has invalid value \(\$__resultSet UserStruct\[\]\)\: Unexpected token "\$__resultSet", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$source has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^PHPDoc tag @var has invalid value \(\$res \?UserStruct\)\: Unexpected token "\$res", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError - count: 2 - path: lib/Model/Users/UserDao.php + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$source_note has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^PHPDoc tag @var has invalid value \(\$res UserStruct\)\: Unexpected token "\$res", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$style has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^PHPDoc tag @var has invalid value \(\$res UserStruct\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$subject has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Parameter \#1 \$input of method Model\\Users\\UserDao\:\:sanitize\(\) expects Model\\Users\\UserStruct, Model\\DataAccess\\IDaoStruct given\.$#' - identifier: argument.type + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$target has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Property Model\\Users\\UserDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$target_note has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Property Model\\Users\\UserDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$tm_properties has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserDao.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Argument of an invalid type array\\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$translation has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserStruct.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Cannot call method decrypt\(\) on Model\\ConnectedServices\\Oauth\\OauthTokenEncryption\|null\.$#' - identifier: method.nonObject + message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$usage_count has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserStruct.php + path: lib/Utils/Engines/Results/MyMemory/Matches.php - - message: '#^Method Model\\Users\\UserStruct\:\:belongsToTeam\(\) has parameter \$teamId with no type specified\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\SearchGlossaryResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Users/UserStruct.php + path: lib/Utils/Engines/Results/MyMemory/SearchGlossaryResponse.php - - message: '#^Method Model\\Users\\UserStruct\:\:getMetadataAsKeyValue\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\Results\\MyMemory\\SearchGlossaryResponse\:\:\$matches has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Users/UserStruct.php + path: lib/Utils/Engines/Results/MyMemory/SearchGlossaryResponse.php - - message: '#^Method Model\\Users\\UserStruct\:\:passwordMatch\(\) has parameter \$password with no type specified\.$#' + message: '#^Method Utils\\Engines\\Results\\MyMemory\\SetContributionResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Model/Users/UserStruct.php + path: lib/Utils/Engines/Results/MyMemory/SetContributionResponse.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Engines\\Results\\MyMemory\\SetContributionResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Model/Users/UserStruct.php - - - - message: '#^Parameter \#1 \$string of function mb_substr expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Users/UserStruct.php + path: lib/Utils/Engines/Results/MyMemory/SetContributionResponse.php - - message: '#^Class Model\\Warnings\\GlobalWarningStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer1ToLayer2\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Model/Warnings/GlobalWarningStruct.php + path: lib/Utils/Engines/Results/MyMemory/TagProjectionResponse.php - - message: '#^Method Model\\Warnings\\GlobalWarningStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Results\\MyMemory\\TagProjectionResponse\:\:__construct\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Warnings/GlobalWarningStruct.php + path: lib/Utils/Engines/Results/MyMemory/TagProjectionResponse.php - - message: '#^Method Model\\Warnings\\GlobalWarningStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Results\\MyMemory\\TagProjectionResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Warnings/GlobalWarningStruct.php + path: lib/Utils/Engines/Results/MyMemory/TagProjectionResponse.php - - message: '#^Method Model\\Warnings\\GlobalWarningStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\Results\\MyMemory\\UpdateContributionResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Warnings/GlobalWarningStruct.php + path: lib/Utils/Engines/Results/MyMemory/UpdateContributionResponse.php - - message: '#^Cannot call method getApproved2RawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Engines\\Results\\TMSAbstractResponse\:\:getInstance\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/Results/TMSAbstractResponse.php - - message: '#^Cannot call method getApproved2Words\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Engines\\Results\\TMSAbstractResponse\:\:getInstance\(\) has parameter \$result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/Results/TMSAbstractResponse.php - - message: '#^Cannot call method getApprovedRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Engines\\Results\\TMSAbstractResponse\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/Results/TMSAbstractResponse.php - - message: '#^Cannot call method getApprovedWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Engines\\Results\\TMSAbstractResponse\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/Results/TMSAbstractResponse.php - - message: '#^Cannot call method getDraftRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Property Utils\\Engines\\Results\\TMSAbstractResponse\:\:\$responseDetails type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/Results/TMSAbstractResponse.php - - message: '#^Cannot call method getDraftWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Template type T of method Utils\\Engines\\Results\\TMSAbstractResponse\:\:getInstance\(\) is not referenced in a parameter\.$#' + identifier: method.templateTypeNotInParameter count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/Results/TMSAbstractResponse.php - - message: '#^Cannot call method getIdJob\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/WordCount/CounterModel.php + message: '#^Access to an undefined property Utils\\Engines\\SmartMATE\:\:\$client_id\.$#' + identifier: property.notFound + count: 1 + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot call method getIdSegment\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/WordCount/CounterModel.php + message: '#^Access to an undefined property Utils\\Engines\\SmartMATE\:\:\$client_secret\.$#' + identifier: property.notFound + count: 1 + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot call method getJobPassword\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Model/WordCount/CounterModel.php + message: '#^Access to an undefined property Utils\\Engines\\SmartMATE\:\:\$oauth_url\.$#' + identifier: property.notFound + count: 1 + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot call method getNewRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject - count: 1 - path: lib/Model/WordCount/CounterModel.php + message: '#^Access to an undefined property Utils\\Engines\\SmartMATE\:\:\$token\.$#' + identifier: property.notFound + count: 4 + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot call method getNewWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Expression on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.expr count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot call method getRejectedRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Engines\\SmartMATE\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot call method getRejectedWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Engines\\SmartMATE\:\:_checkAuthFailure\(\) should return bool but returns int\.$#' + identifier: return.type count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot call method getTranslatedRawWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Engines\\SmartMATE\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot call method getTranslatedWords\(\) on Model\\WordCount\\WordCountStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Engines\\SmartMATE\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\CounterModel\:\:_verifyStatus\(\) throws checked exception BadMethodCallException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\SmartMATE\:\:_fillCallParameters\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\CounterModel\:\:getUpdatedValues\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\SmartMATE\:\:_fillCallParameters\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\CounterModel\:\:methodNameForStatusCall\(\) has parameter \$name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Engines\\SmartMATE\:\:_formatAuthenticateError\(\) has parameter \$objResponse with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Property Model\\WordCount\\CounterModel\:\:\$constCache type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\SmartMATE\:\:_formatAuthenticateError\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/CounterModel.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\WordCountStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\SmartMATE\:\:_formatRecursionError\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/WordCountStruct.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\WordCountStruct\:\:loadFromJob\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\SmartMATE\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/WordCount/WordCountStruct.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\WordCountStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\SmartMATE\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/WordCountStruct.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Property Model\\WordCount\\WordCountStruct\:\:\$job_password \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Engines\\SmartMATE\:\:get\(\) should return Utils\\Engines\\Results\\TMSAbstractResponse but returns array\.$#' + identifier: return.type count: 1 - path: lib/Model/WordCount/WordCountStruct.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\WordCounterDao\:\:getStatsForJob\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\SmartMATE\:\:getAuthParameters\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/WordCounterDao.php - - - - message: '#^Method Model\\WordCount\\WordCounterDao\:\:getStatsForJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 5 - path: lib/Model/WordCount/WordCounterDao.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\WordCounterDao\:\:initializeWordCount\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Engines\\SmartMATE\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/WordCount/WordCounterDao.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\WordCount\\WordCounterDao\:\:updateWordCount\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\SmartMATE\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/WordCount/WordCounterDao.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Cannot assign new offset to string\.$#' - identifier: offsetAssign.dimType - count: 2 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + message: '#^Method Utils\\Engines\\SmartMATE\:\:update\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:__construct\(\) has parameter \$states with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @property has invalid value \(string client_secret\)\: Unexpected token "client_secret", expected variable at offset 48 on line 3$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:asEquivalentWordCount\(\) has parameter \$payable_rates with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$json of function json_validate expects string, bool\|string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:asStandardWordCount\(\) has parameter \$payable_rates with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#3 \$function of method Utils\\Engines\\SmartMATE\:\:_decode\(\) expects null, string given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\Engines\\SmartMATE\:\:\$_auth_parameters has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:getStates\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Engines\\SmartMATE\:\:\$_config type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/SmartMATE.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:getStates\(\) should return array but returns array\\|string\.$#' - identifier: return.type + message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/AltLangEngineValidator.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access offset ''error'' on array\|Utils\\Engines\\Results\\TMSAbstractResponse\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/AltLangEngineValidator.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setAnalysis\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^PHPDoc tag @property has invalid value \(\?EngineStruct engineStruct\)\: Unexpected token "engineStruct", expected variable at offset 31 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setEditor\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + message: '#^PHPDoc tag @property has invalid value \(\?string deepl_engine_type\)\: Unexpected token "deepl_engine_type", expected variable at offset 65 on line 3$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setMatchCategory\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + message: '#^PHPDoc tag @property has invalid value \(\?string deepl_formality\)\: Unexpected token "deepl_formality", expected variable at offset 104 on line 4$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setStates\(\) has parameter \$states with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @property has invalid value \(\?string deepl_id_glossary\)\: Unexpected token "deepl_id_glossary", expected variable at offset 141 on line 5$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php - - message: '#^Method Model\\Xliff\\DTO\\AbstractXliffRule\:\:setStates\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^PHPDoc tag @property has invalid value \(\?string glossaryString\)\: Unexpected token "glossaryString", expected variable at offset 180 on line 6$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php - - message: '#^Parameter \#1 \.\.\.\$arrays of function array_merge expects array, string given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + message: '#^PHPDoc tag @property has invalid value \(\?string intento_provider\)\: Unexpected token "intento_provider", expected variable at offset 216 on line 7$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php - - message: '#^Parameter \#2 \.\.\.\$arrays of function array_merge expects array, string given\.$#' - identifier: argument.type - count: 2 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + message: '#^PHPDoc tag @property has invalid value \(\?string intento_routing\)\: Unexpected token "intento_routing", expected variable at offset 254 on line 8$#' + identifier: phpDoc.parseError + count: 1 + path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php - - message: '#^Property Model\\Xliff\\DTO\\AbstractXliffRule\:\:\$_STATES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Offset ''DeepL\-Auth\-Key'' might not exist on array\|string\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/DeepLEngineOptionsValidator.php - - message: '#^Property Model\\Xliff\\DTO\\AbstractXliffRule\:\:\$_STATE_QUALIFIERS type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/DeepLEngineValidator.php - - message: '#^Property Model\\Xliff\\DTO\\AbstractXliffRule\:\:\$states \(array\\) does not accept default value of type array\\.$#' - identifier: property.defaultValue + message: '#^Access to an undefined property Utils\\Validator\\Contracts\\ValidatorObject\:\:\$engineStruct\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/GoogleTranslateEngineValidator.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Cannot access offset ''error'' on Utils\\Engines\\Results\\TMSAbstractResponse\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Model/Xliff/DTO/AbstractXliffRule.php + path: lib/Utils/Engines/Validators/GoogleTranslateEngineValidator.php - - message: '#^Method Model\\Xliff\\DTO\\DefaultRule\:\:isTranslated\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Engines\\Validators\\IntentoEngineOptionsValidator\:\:validate\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Model/Xliff/DTO/DefaultRule.php + count: 3 + path: lib/Utils/Engines/Validators/IntentoEngineOptionsValidator.php - - message: '#^Method Model\\Xliff\\DTO\\DefaultRule\:\:setAnalysis\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Xliff/DTO/DefaultRule.php + path: lib/Utils/Engines/Validators/IntentoEngineValidator.php - - message: '#^Property Model\\Xliff\\DTO\\DefaultRule\:\:\$_STATES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access offset ''error'' on Utils\\Engines\\Results\\TMSAbstractResponse\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Model/Xliff/DTO/DefaultRule.php + path: lib/Utils/Engines/Validators/IntentoEngineValidator.php - - message: '#^Property Model\\Xliff\\DTO\\DefaultRule\:\:\$_STATE_QUALIFIERS type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Xliff/DTO/DefaultRule.php + path: lib/Utils/Engines/Validators/LaraEngineValidator.php - - message: '#^Property Model\\Xliff\\DTO\\Xliff12Rule\:\:\$_STATES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$newTestCreatedMT Lara\)\: Unexpected token "\$newTestCreatedMT", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Model/Xliff/DTO/Xliff12Rule.php + path: lib/Utils/Engines/Validators/LaraEngineValidator.php - - message: '#^Property Model\\Xliff\\DTO\\Xliff12Rule\:\:\$_STATE_QUALIFIERS type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$glossaryString\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Xliff/DTO/Xliff12Rule.php + path: lib/Utils/Engines/Validators/LaraGlossaryValidator.php - - message: '#^Property Model\\Xliff\\DTO\\Xliff20Rule\:\:\$_STATES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Xliff/DTO/Xliff20Rule.php + path: lib/Utils/Engines/Validators/MMTEngineValidator.php - - message: '#^Method Model\\Xliff\\DTO\\XliffRuleInterface\:\:asEquivalentWordCount\(\) has parameter \$payable_rates with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$glossaryString\.$#' + identifier: property.notFound count: 1 - path: lib/Model/Xliff/DTO/XliffRuleInterface.php + path: lib/Utils/Engines/Validators/MMTGlossaryValidator.php - - message: '#^Method Model\\Xliff\\DTO\\XliffRuleInterface\:\:asStandardWordCount\(\) has parameter \$payable_rates with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Engines\\YandexTranslate\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Xliff/DTO/XliffRuleInterface.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Method Model\\Xliff\\DTO\\XliffRulesModel\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Utils\\Engines\\YandexTranslate\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/DTO/XliffRulesModel.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Method Model\\Xliff\\DTO\\XliffRulesModel\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\YandexTranslate\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/DTO/XliffRulesModel.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Method Model\\Xliff\\DTO\\XliffRulesModel\:\:getRulesForVersion\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\YandexTranslate\:\:delete\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Xliff/DTO/XliffRulesModel.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Method Model\\Xliff\\DTO\\XliffRulesModel\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\YandexTranslate\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/DTO/XliffRulesModel.php - - - - message: '#^PHPDoc tag @var has invalid value \(\$rule AbstractXliffRule \*\)\: Unexpected token "\$rule", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError - count: 1 - path: lib/Model/Xliff/DTO/XliffRulesModel.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Property Model\\Xliff\\DTO\\XliffRulesModel\:\:\$ruleSets type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Engines\\YandexTranslate\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/DTO/XliffRulesModel.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Utils\\Engines\\YandexTranslate\:\:set\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Xliff/DTO/XliffRulesModel.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:destroyQueryByIdAndUidCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Engines\\YandexTranslate\:\:update\(\) has parameter \$_config with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:destroyQueryByIdCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Engines\\YandexTranslate\:\:\$_config type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Engines/YandexTranslate.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:destroyQueryByUidCache\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Files\\CSV\:\:extract\(\) throws checked exception PhpOffice\\PhpSpreadsheet\\Writer\\Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Files/CSV.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:getAllPaginated\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Files\\CSV\:\:headers\(\) has parameter \$filepath with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Files/CSV.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:getById\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Files\\CSV\:\:headers\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Files/CSV.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:getByUid\(\) should return array\ but returns list\\.$#' + message: '#^Method Utils\\Files\\CSV\:\:headers\(\) should return array but returns list\\|null\.$#' identifier: return.type count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Files/CSV.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:hydrateTemplateStruct\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Files\\CSV\:\:parseToArray\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php - - - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:hydrateTemplateStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Files/CSV.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:remove\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + message: '#^Method Utils\\Files\\CSV\:\:save\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Files/CSV.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateDao\:\:save\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$stream of function fclose expects resource, resource\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Files/CSV.php - - message: '#^Property Model\\Xliff\\XliffConfigTemplateStruct\:\:\$id \(int\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$stream of function fputcsv expects resource, resource\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Files/CSV.php - - message: '#^Unsafe access to private property Model\\Xliff\\XliffConfigTemplateDao\:\:\$instance through static\:\:\.$#' - identifier: staticClassAccess.privateProperty - count: 3 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + message: '#^Parameter \#2 \$array of function array_map expects array, list\\|false given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Files/CSV.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Utils\\Files\\File\:\:info\(\) has parameter \$filepath with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Model/Xliff/XliffConfigTemplateDao.php + path: lib/Utils/Files/File.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateStruct\:\:hydrateFromJSON\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Model/Xliff/XliffConfigTemplateStruct.php + message: '#^Method Utils\\LQA\\BxExG\\Element\:\:searchForNestedBxOrEx\(\) has parameter \$children with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/LQA/BxExG/Element.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateStruct\:\:hydrateRulesFromDataArray\(\) has parameter \$rules with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\LQA\\BxExG\\Element\:\:\$attributes type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Model/Xliff/XliffConfigTemplateStruct.php + path: lib/Utils/LQA/BxExG/Element.php - - message: '#^Method Model\\Xliff\\XliffConfigTemplateStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Argument of an invalid type DOMNamedNodeMap\\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Model/Xliff/XliffConfigTemplateStruct.php + path: lib/Utils/LQA/BxExG/Mapper.php - - message: '#^Parameter \#1 \$date of static method Utils\\Date\\DateTimeUtil\:\:formatIsoDate\(\) expects null, string\|null given\.$#' - identifier: argument.type + message: '#^Cannot access property \$childNodes on DOMNode\|null\.$#' + identifier: property.nonObject count: 2 - path: lib/Model/Xliff/XliffConfigTemplateStruct.php - - - - message: '#^Cannot call method isDeleted\(\) on Model\\Jobs\\JobStruct\|null\.$#' - identifier: method.nonObject - count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/BxExG/Mapper.php - - message: '#^Instanceof between class\-string\ and Plugins\\Features\\ReviewExtended will always evaluate to false\.$#' - identifier: instanceof.alwaysFalse + message: '#^Cannot access property \$nodeName on DOMNode\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/BxExG/Mapper.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:_validateUndoData\(\) has parameter \$undo_data with no type specified\.$#' + message: '#^Method Utils\\LQA\\BxExG\\Mapper\:\:extract\(\) has parameter \$string with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/BxExG/Mapper.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:alter_chunk_review_struct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$node of static method Utils\\LQA\\BxExG\\Mapper\:\:appendBxExGTagMapElement\(\) expects DOMNode, DOMNode\|null given\.$#' + identifier: argument.type count: 3 - path: lib/Plugins/Features/AbstractRevisionFeature.php - - - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:createQaChunkReviewRecords\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php - - - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:createQaChunkReviewRecords\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/BxExG/Mapper.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:filterCreateProjectFeatures\(\) has parameter \$projectFeatures with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\BxExG\\Validator\:\:doesAMapHaveOneBxOrEx\(\) has parameter \$map with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/BxExG/Validator.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:filterCreateProjectFeatures\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\BxExG\\Validator\:\:validate\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/BxExG/Validator.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:filterGetSegmentsResult\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\PostProcess\:\:getErrors\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:filterGetSegmentsResult\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\PostProcess\:\:getWarnings\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:filter_job_password_to_review_password\(\) should return string but returns string\|null\.$#' + message: '#^Method Utils\\LQA\\PostProcess\:\:nbspToSpace\(\) should return string but returns string\|null\.$#' identifier: return.type count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:postProjectCreate\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\LQA\\PostProcess\:\:normalizeHeadSpaces\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Method Plugins\\Features\\AbstractRevisionFeature\:\:project_completion_event_saved\(\) has parameter \$completion_event_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\LQA\\PostProcess\:\:normalizeTailSpaces\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php - - - - message: '#^Negated boolean expression is always false\.$#' - identifier: booleanNot.alwaysFalse - count: 2 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Parameter \#1 \$id_job of method Model\\LQA\\ChunkReviewDao\:\:updatePassword\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\PostProcess\:\:performTagCheckOnly\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Parameter \#1 \$id_job of method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventsInSegmentInterval\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$string of function mb_strlen expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php - - - - message: '#^Parameter \#1 \$id_job of static method Model\\Jobs\\JobDao\:\:getById\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Parameter \#1 \$id_job of static method Model\\LQA\\ChunkReviewDao\:\:deleteByJobId\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$string of function mb_substr expects string, string\|null given\.$#' identifier: argument.type count: 2 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Strict comparison using \!\=\= between int\<1, max\>\|false and 0 will always evaluate to true\.$#' + identifier: notIdentical.alwaysTrue count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/PostProcess.php - - message: '#^Parameter \#1 \$project of method Model\\Projects\\ProjectDao\:\:updateField\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' - identifier: argument.type + message: '#^Cannot access property \$documentElement on DOMDocument\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php - - - - message: '#^Parameter \#1 \$project of method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:recountAndUpdatePassFailResult\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Plugins/Features/AbstractRevisionFeature.php - - - - message: '#^Parameter \#2 \$project of method Plugins\\Features\\AbstractRevisionFeature\:\:createQaChunkReviewRecords\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' - identifier: argument.type - count: 3 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/QA.php - - message: '#^Parameter \#3 \$new_password of method Model\\LQA\\ChunkReviewDao\:\:updatePassword\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Cannot call method saveXML\(\) on DOMDocument\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/QA.php - - message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$create_2_pass_review \(bool\) in isset\(\) is not nullable\.$#' - identifier: isset.property + message: '#^Method Utils\\LQA\\QA\:\:JSONtoExceptionList\(\) should return array\{ERROR\: array\, WARNING\: array\, INFO\: array\\} but returns array\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/QA.php - - message: '#^Property Model\\ProjectCreation\\ProjectStructure\:\:\$features \(array\\) in isset\(\) is not nullable\.$#' - identifier: isset.property + message: '#^Method Utils\\LQA\\QA\:\:getExceptionList\(\) should return array\{ERROR\: array\, WARNING\: array\, INFO\: array\\} but returns array\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + path: lib/Utils/LQA/QA.php - - message: '#^Property Plugins\\Features\\AbstractRevisionFeature\:\:\$dependencies type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\QA\:\:getMalformedXmlStructs\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue - count: 1 - path: lib/Plugins/Features/AbstractRevisionFeature.php + count: 2 + path: lib/Utils/LQA/QA.php - - message: '#^Method Plugins\\Features\\BaseFeature\:\:getBuildFiles\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\LQA\\QA\:\:getMalformedXmlStructs\(\) should return array\{source\: array, target\: array\} but returns array\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA.php - - message: '#^Method Plugins\\Features\\BaseFeature\:\:getConfig\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\QA\:\:getTargetTagPositionError\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA.php - - message: '#^Method Plugins\\Features\\BaseFeature\:\:getConfig\(\) should return array but returns array\|false\.$#' - identifier: return.type + message: '#^Method Utils\\LQA\\QA\:\:prepareDOMStructures\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA.php - - message: '#^Method Plugins\\Features\\BaseFeature\:\:getConflictingDependencies\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$subject of function preg_match expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA.php - - message: '#^Method Plugins\\Features\\BaseFeature\:\:getDependencies\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\LQA\\QA\\ContentPreprocessor\:\:cleanOutputContent\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA/ContentPreprocessor.php - - message: '#^Method Plugins\\Features\\BaseFeature\:\:loadRoutes\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\LQA\\QA\\ContentPreprocessor\:\:replaceAscii\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA/ContentPreprocessor.php - - message: '#^PHPDoc tag @return with type array\|false is not subtype of native type array\|null\.$#' - identifier: return.phpDocType + message: '#^Method Utils\\LQA\\QA\\ContentPreprocessor\:\:replaceHexEntities\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA/ContentPreprocessor.php - - message: '#^Parameter \#1 \$filename of function file_exists expects string, string\|false given\.$#' + message: '#^Parameter \#1 \$seg of method Utils\\LQA\\QA\\ContentPreprocessor\:\:replaceAscii\(\) expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA/ContentPreprocessor.php - - message: '#^Parameter \#1 \$filename of function parse_ini_file expects string, string\|false given\.$#' + message: '#^Parameter \#3 \$from_encoding of function mb_convert_encoding expects array\|string\|null, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA/ContentPreprocessor.php - - message: '#^Parameter \#1 \$path of function dirname expects string, string\|false given\.$#' + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Plugins/Features/BaseFeature.php + count: 7 + path: lib/Utils/LQA/QA/ContentPreprocessor.php - - message: '#^Parameter \#1 \$path of function pathinfo expects string, string\|false given\.$#' + message: '#^Parameter \#3 \$subject of function preg_replace_callback expects array\\|string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Plugins/Features/BaseFeature.php - - - - message: '#^Property Plugins\\Features\\BaseFeature\:\:\$conflictingDependencies type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Plugins/Features/BaseFeature.php - - - - message: '#^Property Plugins\\Features\\BaseFeature\:\:\$dependencies type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Plugins/Features/BaseFeature.php + path: lib/Utils/LQA/QA/ContentPreprocessor.php - - message: '#^Method Plugins\\Features\\IBaseFeature\:\:getConflictingDependencies\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Static property Utils\\LQA\\QA\\ContentPreprocessor\:\:\$asciiPlaceHoldMap \(array\\) does not accept default value of type array\{''00''\: array\{symbol\: ''NULL'', placeHold\: ''\#\#\$_00\$\#\#'', numeral\: 0\}, ''01''\: array\{symbol\: ''SOH'', placeHold\: ''\#\#\$_01\$\#\#'', numeral\: 1\}, ''02''\: array\{symbol\: ''STX'', placeHold\: ''\#\#\$_02\$\#\#'', numeral\: 2\}, ''03''\: array\{symbol\: ''ETX'', placeHold\: ''\#\#\$_03\$\#\#'', numeral\: 3\}, ''04''\: array\{symbol\: ''EOT'', placeHold\: ''\#\#\$_04\$\#\#'', numeral\: 4\}, ''05''\: array\{symbol\: ''ENQ'', placeHold\: ''\#\#\$_05\$\#\#'', numeral\: 5\}, ''06''\: array\{symbol\: ''ACK'', placeHold\: ''\#\#\$_06\$\#\#'', numeral\: 6\}, ''07''\: array\{symbol\: ''BEL'', placeHold\: ''\#\#\$_07\$\#\#'', numeral\: 7\}, \.\.\.\}\.$#' + identifier: property.defaultValue count: 1 - path: lib/Plugins/Features/IBaseFeature.php + path: lib/Utils/LQA/QA/ContentPreprocessor.php - - message: '#^Method Plugins\\Features\\IBaseFeature\:\:getDependencies\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Plugins/Features/IBaseFeature.php + message: '#^Cannot access property \$childNodes on DOMElement\|null\.$#' + identifier: property.nonObject + count: 3 + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ProjectCompletion\:\:job_password_changed\(\) has parameter \$old_password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot access property \$length on DOMNodeList\\|false\.$#' + identifier: property.nonObject count: 1 - path: lib/Plugins/Features/ProjectCompletion.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ProjectCompletion\:\:postAddSegmentTranslation\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access property \$textContent on DOMNameSpaceNode\|DOMNode\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Plugins/Features/ProjectCompletion.php - - - - message: '#^Method Plugins\\Features\\ProjectCompletion\:\:postAddSegmentTranslation\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Plugins/Features/ProjectCompletion.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Parameter \#1 \$id_job of method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:updatePassword\(\) expects int, int\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Plugins/Features/ProjectCompletion.php + message: '#^Cannot call method getElementsByTagName\(\) on DOMDocument\|null\.$#' + identifier: method.nonObject + count: 2 + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Parameter \#2 \$password of method Model\\ChunksCompletion\\ChunkCompletionEventDao\:\:updatePassword\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Cannot call method saveXML\(\) on DOMDocument\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Plugins/Features/ProjectCompletion.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Property Model\\ChunksCompletion\\ChunkCompletionUpdateStruct\:\:\$id_job \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Cannot clone DOMDocument\|null\.$#' + identifier: clone.nonObject count: 1 - path: lib/Plugins/Features/ProjectCompletion.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$job_completion_current_phase\.$#' - identifier: property.notFound + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:checkUnclosedTag\(\) has parameter \$error with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$job_completion_last_event_id\.$#' - identifier: property.notFound + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:elementIsToBeExcludedFromChecks\(\) has parameter \$tagsToBeExcludedFromChecks with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php - - - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$job_marked_complete\.$#' - identifier: property.notFound - count: 2 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php - - - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$mark_as_complete_button_enabled\.$#' - identifier: property.notFound - count: 3 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$project_completion_feature_enabled\.$#' - identifier: property.notFound + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:getMalformedXmlStructs\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Cannot call method getJob\(\) on Controller\\Views\\TemplateDecorator\\Arguments\\CatDecoratorArguments\|null\.$#' - identifier: method.nonObject - count: 3 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:getSrcDomMap\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Cannot call method getWordCountStruct\(\) on Controller\\Views\\TemplateDecorator\\Arguments\\CatDecoratorArguments\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:getTrgDomMap\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Cannot call method isRevision\(\) on Controller\\Views\\TemplateDecorator\\Arguments\\CatDecoratorArguments\|null\.$#' - identifier: method.nonObject - count: 3 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapDom\(\) has parameter \$srcNodeList with generic class DOMNodeList but does not specify its types\: TNode$#' + identifier: missingType.generics + count: 1 + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Property Plugins\\Features\\ProjectCompletion\\Decorator\\CatDecorator\:\:\$stats type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapDom\(\) has parameter \$trgNodeList with generic class DOMNodeList but does not specify its types\: TNode$#' + identifier: missingType.generics count: 1 - path: lib/Plugins/Features/ProjectCompletion/Decorator/CatDecorator.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\EventModel\:\:save\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapDom\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/EventModel.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Parameter \#1 \$project of method Model\\FeaturesBase\\FeatureSet\:\:loadForProject\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapElements\(\) has parameter \$elementList with generic class DOMNodeList but does not specify its types\: TNode$#' + identifier: missingType.generics count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/EventModel.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Property Plugins\\Features\\ProjectCompletion\\Model\\EventModel\:\:\$chunkCompletionEventId \(int\|null\) does not accept string\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapElements\(\) has parameter \$srcDomElements with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/EventModel.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:dataForChunkStatus\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:prepareDOMStructures\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:getStatus\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:queryDOMElement\(\) has parameter \$TagReference with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:getStatus\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:queryDOMElement\(\) should return DOMNode but returns DOMNameSpaceNode\|DOMNode\|null\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:populateStatus\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$subject of function preg_match_all expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Property Plugins\\Features\\ProjectCompletion\\Model\\ProjectCompletionStatusModel\:\:\$cachedStatus type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\LQA\\QA\\DomHandler\:\:\$malformedXmlStructDiff type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue - count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/ProjectCompletionStatusModel.php + count: 2 + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ProjectCompletion\\Model\\UndoModel\:\:__construct\(\) has parameter \$event with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\LQA\\QA\\DomHandler\:\:\$normalizedTrgDOMNodeList with generic class DOMNodeList does not specify its types\: TNode$#' + identifier: missingType.generics count: 1 - path: lib/Plugins/Features/ProjectCompletion/Model/UndoModel.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:getOrCreateChunkReviews\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\LQA\\QA\\DomHandler\:\:\$srcDomMap type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:getOrCreateChunkReviews\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + message: '#^Property Utils\\LQA\\QA\\DomHandler\:\:\$trgDomMap type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/LQA/QA/DomHandler.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:setPreparedEvents\(\) has parameter \$prepared_events with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\QA\\ErrObject\:\:get\(\) has parameter \$errors with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrObject.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:updateJobWordCounter\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\LQA\\QA\\ErrObject\:\:get\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 6 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + count: 4 + path: lib/Utils/LQA/QA/ErrObject.php - - message: '#^PHPDoc tag @var for property Plugins\\Features\\ReviewExtended\\BatchReviewProcessor\:\:\$chunk with type mixed is not subtype of native type Model\\Jobs\\JobStruct\.$#' - identifier: property.phpDocType + message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:JSONtoExceptionList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Parameter \#1 \$penalty_points of method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:updateChunkReviewCountersAndPassFail\(\) expects float, float\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:addCustomError\(\) has parameter \$errorMap with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Property Model\\Jobs\\JobStruct\:\:\$approved2_raw_words \(int\) does not accept float\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:getErrorsJSON\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Property Model\\Jobs\\JobStruct\:\:\$approved_raw_words \(int\) does not accept float\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:getExceptionList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Property Model\\Jobs\\JobStruct\:\:\$draft_raw_words \(int\) does not accept float\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:getNoticesJSON\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Property Model\\Jobs\\JobStruct\:\:\$new_raw_words \(int\) does not accept float\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:getWarningsJSON\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Property Model\\Jobs\\JobStruct\:\:\$rejected_raw_words \(int\) does not accept float\.$#' - identifier: assign.propertyType + message: '#^Offset 1 on array\{non\-falsy\-string, numeric\-string\} on left side of \?\? always exists and is not nullable\.$#' + identifier: nullCoalesce.offset count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Property Model\\Jobs\\JobStruct\:\:\$translated_raw_words \(int\) does not accept float\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\LQA\\QA\\ErrorManager\:\:\$errorMap type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/BatchReviewProcessor.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:_updatePassFailResult\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\LQA\\QA\\ErrorManager\:\:\$exceptionList type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:addPenaltyPoints\(\) has parameter \$penalty_points with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\LQA\\QA\\ErrorManager\:\:\$tipMap type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php + path: lib/Utils/LQA/QA/ErrorManager.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:recountAndUpdatePassFailResult\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$haystack of function mb_substr_count expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/LQA/QA/SymbolChecker.php + + - + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkContentAndAddTagMismatchError\(\) has parameter \$originalTargetValues with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Parameter \#1 \$chunkReviewID of method Model\\LQA\\ChunkReviewDao\:\:passFailCountsAtomicUpdate\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkContentAndAddTagMismatchError\(\) has parameter \$src with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/ChunkReviewModel.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\BatchReviewProcessorAlertEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkContentAndAddTagMismatchError\(\) has parameter \$trg with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/BatchReviewProcessorAlertEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:__construct\(\) has parameter \$changeAuthor with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkDiff\(\) has parameter \$diff with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:__construct\(\) has parameter \$data with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkTagPositionsAndAddTagOrderError\(\) has parameter \$src with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:__construct\(\) has parameter \$segmentInfo with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkTagPositionsAndAddTagOrderError\(\) has parameter \$trg with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:__construct\(\) has parameter \$segmentUrl with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkWhiteSpaces\(\) has parameter \$source_tags with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkWhiteSpaces\(\) has parameter \$target_tags with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Parameter \#1 \$address of method Utils\\Email\\AbstractEmail\:\:sendTo\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:extractEquivTextAttributes\(\) has parameter \$tags with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Parameter \#1 \$email of method Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:isRecipientTheChangeAuthor\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:extractEquivTextAttributes\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Property Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:\$_segmentInfo has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:extractIdAttributes\(\) has parameter \$tags with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Property Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:\$data has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:extractIdAttributes\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Property Plugins\\Features\\ReviewExtended\\Email\\RevisionChangedNotificationEmail\:\:\$segmentUrl has no type specified\.$#' - identifier: missingType.property + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:getTagPositionError\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Ternary operator condition is always true\.$#' - identifier: ternary.alwaysTrue + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:normalizeTags\(\) has parameter \$_opening_toCheck with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/Email/RevisionChangedNotificationEmail.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\IChunkReviewModel\:\:addPenaltyPoints\(\) has parameter \$penalty_points with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:normalizeTags\(\) has parameter \$_selfClosing_toCheck with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/IChunkReviewModel.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Call to function is_array\(\) with array\ will always evaluate to true\.$#' - identifier: function.alreadyNarrowedType + message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:normalizeTags\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:filterLQAModelLimit\(\) should return int but returns int\|false\.$#' - identifier: return.type + message: '#^Parameter \#1 \$dom of method Utils\\LQA\\QA\\DomHandler\:\:setNormalizedTrgDOM\(\) expects DOMDocument, DOMDocument\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:sourcePageToTranslationStatus\(\) has parameter \$number with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$errorCode of class Model\\FeaturesBase\\Hook\\Event\\Filter\\CheckTagPositionsEvent constructor expects bool, int given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:validRevisionNumbers\(\) should return array\ but returns array\\.$#' - identifier: return.type + message: '#^Property Utils\\LQA\\QA\\TagChecker\:\:\$tagPositionError type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + path: lib/Utils/LQA/QA/TagChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:validRevisionNumbers\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + message: '#^Access to an undefined property DOMNameSpaceNode\|DOMNode\:\:\$textContent\.$#' + identifier: property.notFound + count: 2 + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Unreachable statement \- code above always terminates\.$#' - identifier: deadCode.unreachable - count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewUtils.php + message: '#^Cannot access offset 0 on list\\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Cannot access property \$id on Model\\Jobs\\JobStruct\|null\.$#' + message: '#^Cannot access property \$ownerDocument on DOMNameSpaceNode\|DOMNode\|null\.$#' identifier: property.nonObject - count: 3 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + count: 1 + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Cannot access property \$id on Model\\Segments\\SegmentStruct\|null\.$#' - identifier: property.nonObject - count: 3 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + message: '#^Cannot call method saveXML\(\) on DOMDocument\|null\.$#' + identifier: method.nonObject + count: 1 + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Cannot access property \$password on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\LQA\\QA\\WhitespaceChecker\:\:checkContentConsistency\(\) has parameter \$srcNodeList with generic class DOMNodeList but does not specify its types\: TNode$#' + identifier: missingType.generics count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Cannot access property \$raw_word_count on Model\\Segments\\SegmentStruct\|null\.$#' - identifier: property.nonObject - count: 3 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + message: '#^Method Utils\\LQA\\QA\\WhitespaceChecker\:\:checkContentConsistency\(\) has parameter \$trgNodeList with generic class DOMNodeList but does not specify its types\: TNode$#' + identifier: missingType.generics + count: 1 + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Cannot access property \$segment on Model\\Segments\\SegmentStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\LQA\\QA\\WhitespaceChecker\:\:nbspToSpace\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Cannot access property \$source on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$array of function end expects array\|object, list\\|false given\.$#' + identifier: argument.type count: 2 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Cannot access property \$target on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$domDoc of method Utils\\LQA\\QA\\DomHandler\:\:queryDOMElement\(\) expects DOMDocument, DOMDocument\|null given\.$#' + identifier: argument.type count: 2 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Cannot call method getProject\(\) on Model\\Jobs\\JobStruct\|null\.$#' - identifier: method.nonObject - count: 6 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + message: '#^Parameter \#1 \$value of function count expects array\|Countable, list\\|false given\.$#' + identifier: argument.type + count: 4 + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:__construct\(\) has parameter \$chunkReviews with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$subject of function preg_match expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/QA/WhitespaceChecker.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:_sendNotificationEmail\(\) has parameter \$chunkReviewsWithFinalRevisions with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\LQA\\SizeRestriction\\CJKLangUtils\:\:getMatches\(\) has parameter \$string with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/SizeRestriction/CJKLangUtils.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:_sendNotificationEmail\(\) has parameter \$finalRevisions with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\LQA\\SizeRestriction\\EmojiUtils\:\:getMatches\(\) has parameter \$string with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/SizeRestriction/EmojiUtils.php - - message: '#^Parameter \#1 \$id of method Model\\LQA\\EntryCommentStruct\:\:getEntriesById\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\SizeRestriction\\EmojiUtils\:\:isEmoji\(\) has parameter \$string with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/SizeRestriction/EmojiUtils.php - - message: '#^Parameter \#1 \$id_job of method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getAllFinalRevisionsForSegment\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\SizeRestriction\\SizeRestriction\:\:checkLimit\(\) has parameter \$limit with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php - - - - message: '#^Parameter \#1 \$string of static method Utils\\Tools\\Utils\:\:htmlentitiesToUft8WithoutDoubleEncoding\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/SizeRestriction/SizeRestriction.php - - message: '#^Parameter \#1 \$weighted_words_amount of method Model\\WordCount\\CounterModel\:\:setUpdatedValues\(\) expects float, float\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\LQA\\SizeRestriction\\SizeRestriction\:\:getCharactersRemaining\(\) has parameter \$limit with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/SizeRestriction/SizeRestriction.php - - message: '#^Parameter \#2 \$id_job of static method Model\\LQA\\EntryDao\:\:findByIdSegmentAndSourcePage\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$string of function html_entity_decode expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/LQA/SizeRestriction/SizeRestriction.php - - message: '#^Parameter \#2 \$id_job of static method Utils\\Url\\CanonicalRoutes\:\:translate\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + count: 11 + path: lib/Utils/LQA/SizeRestriction/SizeRestriction.php - - message: '#^Parameter \#3 \$password of static method Utils\\Url\\CanonicalRoutes\:\:translate\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Logger\\Handlers\\CloudWatchHandlerProvider\:\:getClient\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php - - message: '#^Property Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:\$_finalRevisions type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\Handlers\\CloudWatchHandlerProvider\:\:getHandlerParams\(\) has parameter \$configurationParams with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php - - message: '#^Property Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:\$_sourcePagesWithFinalRevisions type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\Handlers\\CloudWatchHandlerProvider\:\:getHandlerParams\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php - - - - message: '#^Unsafe access to private property Plugins\\Features\\ReviewExtended\\ReviewedWordCountModel\:\:\$__transactionStarted through static\:\:\.$#' - identifier: staticClassAccess.privateProperty - count: 5 - path: lib/Plugins/Features/ReviewExtended/ReviewedWordCountModel.php + path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php - - message: '#^Cannot call method getChunk\(\) on Model\\LQA\\ChunkReviewStruct\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#2 \$string of function explode expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:__construct\(\) has parameter \$id_job with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Logger\\Handlers\\ElasticSearchHandlerProvider\:\:getHandlerParams\(\) has parameter \$configurationParams with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/Handlers/ElasticSearchHandlerProvider.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:__construct\(\) has parameter \$password with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Logger\\Handlers\\ElasticSearchHandlerProvider\:\:getHandlerParams\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/Handlers/ElasticSearchHandlerProvider.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:__construct\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Logger\\Handlers\\ProviderInterface\:\:getHandlerParams\(\) has parameter \$configurationParams with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/Handlers/ProviderInterface.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:saveDiff\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + message: '#^Method Utils\\Logger\\Handlers\\ProviderInterface\:\:getHandlerParams\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Logger/Handlers/ProviderInterface.php - - message: '#^Method Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:setDiff\(\) has parameter \$diff with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\Handlers\\StreamHandlerProvider\:\:getHandlerParams\(\) has parameter \$configurationParams with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/Handlers/StreamHandlerProvider.php - - message: '#^Parameter \#1 \$chunk_review of class Plugins\\Features\\ReviewExtended\\ChunkReviewModel constructor expects Model\\LQA\\ChunkReviewStruct, Model\\LQA\\ChunkReviewStruct\|null given\.$#' - identifier: argument.type - count: 3 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + message: '#^Method Utils\\Logger\\Handlers\\StreamHandlerProvider\:\:getHandlerParams\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Logger/Handlers/StreamHandlerProvider.php - - message: '#^Parameter \#1 \$id_job of static method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Logger\\HandlersProviderFactory\:\:loadWithName\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/HandlersProviderFactory.php - - message: '#^Parameter \#1 \$penalty_points of method Plugins\\Features\\ReviewExtended\\ChunkReviewModel\:\:subtractPenaltyPoints\(\) expects float, float\|null given\.$#' + message: '#^Parameter \#1 \$handler of method Utils\\Logger\\Handlers\\ProviderInterface\:\:setFormatter\(\) expects Monolog\\Handler\\AbstractProcessingHandler, object given\.$#' identifier: argument.type count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/HandlersProviderFactory.php - - message: '#^Parameter \#2 \$password of static method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$hostname of function gethostbyname expects string, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/LogProcessor.php - - message: '#^Property Plugins\\Features\\ReviewExtended\\TranslationIssueModel\:\:\$diff type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\LoggerFactory\:\:hexDump\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php - - - - message: '#^Property Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionStruct\:\:\$raw_diff \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType - count: 2 - path: lib/Plugins/Features/ReviewExtended/TranslationIssueModel.php + path: lib/Utils/Logger/LoggerFactory.php - - message: '#^Method Plugins\\Features\\RevisionFactory\:\:initFromProject\(\) should return static\(Plugins\\Features\\RevisionFactory\) but returns Plugins\\Features\\RevisionFactory\.$#' - identifier: return.type - count: 2 - path: lib/Plugins/Features/RevisionFactory.php + message: '#^Method Utils\\Logger\\LoggerFactory\:\:setAliases\(\) has parameter \$names with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Logger/LoggerFactory.php - - message: '#^Parameter \#1 \$revisionFeature of class Plugins\\Features\\RevisionFactory constructor expects Plugins\\Features\\AbstractRevisionFeature, Plugins\\Features\\AbstractRevisionFeature\|null given\.$#' - identifier: argument.type + message: '#^PHPDoc tag @param for parameter \$data with type mixed is not subtype of native type array\|string\.$#' + identifier: parameter.phpDocType count: 1 - path: lib/Plugins/Features/RevisionFactory.php + path: lib/Utils/Logger/LoggerFactory.php - - message: '#^Property Plugins\\Features\\SecondPassReview\:\:\$dependencies type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$handlers of class Monolog\\Logger constructor expects list\, array given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/SecondPassReview.php + path: lib/Utils/Logger/LoggerFactory.php - - message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\FilterDefinition\:\:__construct\(\) has parameter \$filter_data with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:_formatMessage\(\) has parameter \$context with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/SegmentFilter/Model/FilterDefinition.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\FilterDefinition\:\:sampleData\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:_formatMessage\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/SegmentFilter/Model/FilterDefinition.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Property Plugins\\Features\\SegmentFilter\\Model\\FilterDefinition\:\:\$filter_data type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:alert\(\) has parameter \$context with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/SegmentFilter/Model/FilterDefinition.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Access to an undefined property object\:\:\$count\.$#' - identifier: property.notFound + message: '#^Method Utils\\Logger\\MatecatLogger\:\:alert\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Access to an undefined property object\:\:\$limit\.$#' - identifier: property.notFound - count: 3 - path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + message: '#^Method Utils\\Logger\\MatecatLogger\:\:critical\(\) has parameter \$context with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Access to an undefined property object\:\:\$sql\.$#' - identifier: property.notFound - count: 11 - path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + message: '#^Method Utils\\Logger\\MatecatLogger\:\:critical\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\SegmentFilterDao\:\:__getData\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:debug\(\) has parameter \$context with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\SegmentFilterDao\:\:__getLimit\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:debug\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + count: 1 + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\SegmentFilterDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:emergency\(\) has parameter \$context with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\SegmentFilter\\Model\\SegmentFilterDao\:\:getSqlForRegularIntervals\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:emergency\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Plugins/Features/SegmentFilter/Model/SegmentFilterDao.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEvent\:\:__construct\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Logger\\MatecatLogger\:\:error\(\) has parameter \$context with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Parameter \#1 \$id_job of method Model\\Segments\\SegmentDao\:\:getByChunkIdAndSegmentId\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Logger\\MatecatLogger\:\:error\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Parameter \#2 \$password of method Model\\Segments\\SegmentDao\:\:getByChunkIdAndSegmentId\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Logger\\MatecatLogger\:\:info\(\) has parameter \$context with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEvent\:\:\$chunk \(Model\\Jobs\\JobStruct\) does not accept Model\\Jobs\\JobStruct\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Logger\\MatecatLogger\:\:info\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEvent\:\:\$unsetFinalRevision type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:log\(\) has parameter \$context with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEvent.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr + message: '#^Method Utils\\Logger\\MatecatLogger\:\:notice\(\) has parameter \$context with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getAllFinalRevisionsForSegment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:notice\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + count: 1 + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventForSegment\(\) has parameter \$id_job with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Logger\\MatecatLogger\:\:warning\(\) has parameter \$context with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + path: lib/Utils/Logger/MatecatLogger.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventForSegment\(\) has parameter \$id_segment with no type specified\.$#' + message: '#^Method Utils\\Logger\\MatecatLogger\:\:warning\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Utils/Logger/MatecatLogger.php + + - + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:_callbackExecute\(\) has parameter \$record with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventForSegment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:createResource\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getLatestEventsInSegmentInterval\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getAllContents\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:getTteForSegments\(\) has parameter \$id_segment_list with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getAllHeaders\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:unsetFinalRevisionFlag\(\) has parameter \$id_segments with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getAllInfo\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:unsetFinalRevisionFlag\(\) has parameter \$source_pages with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getAllLogs\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:unsetFinalRevisionFlag\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getError\(\) has parameter \$tokenHash with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getError\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getErrors\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/Model/TranslationEventDao.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Cannot access property \$id on Model\\Segments\\SegmentStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getOptionRequest\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\TranslationEventsHandler\:\:prepareEventStruct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getOptionRequest\(\) has parameter \$tokenHash with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationEvents\\TranslationEventsHandler\:\:saveEvent\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleContent\(\) has parameter \$tokenHash with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventStruct\:\:\$final_revision \(int\) does not accept bool\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleInfo\(\) has parameter \$tokenHash with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventStruct\:\:\$id \(int\|null\) does not accept int\|false\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleInfo\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationEvents\\Model\\TranslationEventStruct\:\:\$uid \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleLog\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Unsafe access to private property Plugins\\Features\\TranslationEvents\\TranslationEventsHandler\:\:\$__transactionStarted through static\:\:\.$#' - identifier: staticClassAccess.privateProperty - count: 5 - path: lib/Plugins/Features/TranslationEvents/TranslationEventsHandler.php + message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleLog\(\) has parameter \$tokenHash with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\DummyTranslationVersionHandler\:\:propagateTranslation\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$multi_handle of function curl_multi_add_handle expects CurlMultiHandle, CurlMultiHandle\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/TranslationVersions/Handlers/DummyTranslationVersionHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\DummyTranslationVersionHandler\:\:storeTranslationEvent\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$multi_handle of function curl_multi_exec expects CurlMultiHandle, CurlMultiHandle\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/TranslationVersions/Handlers/DummyTranslationVersionHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + message: '#^Parameter \#1 \$multi_handle of function curl_multi_info_read expects CurlMultiHandle, CurlMultiHandle\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:propagateTranslation\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$multi_handle of function curl_multi_select expects CurlMultiHandle, CurlMultiHandle\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:saveVersion\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$string of function substr expects string, string\|null given\.$#' + identifier: argument.type count: 2 - path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:storeTranslationEvent\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Parameter \#2 \$options of function curl_setopt_array expects array, array\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php + + - + message: '#^Parameter \#3 \$value of function curl_setopt expects non\-empty\-string, string given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Network/MultiCurlHandler.php + + - + message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$curl_headers_requests type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:\$id_job \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$curl_options_requests type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:\$id_segment \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$multi_curl_info type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:\$uid \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$multi_curl_log type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Property Plugins\\Features\\TranslationVersions\\Handlers\\TranslationVersionsHandler\:\:\$uid is never read, only written\.$#' - identifier: property.onlyWritten + message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$multi_curl_results type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Handlers/TranslationVersionsHandler.php + path: lib/Utils/Network/MultiCurlHandler.php - - message: '#^Comparison operation "\>" between null and 1 is always false\.$#' - identifier: greater.alwaysFalse + message: '#^Method Utils\\OutsourceTo\\AbstractProvider\:\:getOutsourceConfirmUrl\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/AbstractProvider.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:_buildResult\(\) has parameter \$array_result with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\OutsourceTo\\AbstractProvider\:\:setJobList\(\) has parameter \$jobList with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/AbstractProvider.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getAllRelevantEvents\(\) has parameter \$segments_id with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\OutsourceTo\\AbstractProvider\:\:\$jobList type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/AbstractProvider.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getAllRelevantEvents\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + message: '#^Method Utils\\OutsourceTo\\OutsourceAvailable\:\:isOutsourceAvailable\(\) has parameter \$outsourceAvailableInfo with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/OutsourceTo/OutsourceAvailable.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getLastRevisionsBySegmentsAndSourcePage\(\) has parameter \$job_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Binary operation "/" between string and 1000 results in an error\.$#' + identifier: binaryOp.invalid count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getLastRevisionsBySegmentsAndSourcePage\(\) has parameter \$segments_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__addCartElementToCart\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getLastRevisionsBySegmentsAndSourcePage\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__getProjectData\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getLastRevisionsBySegmentsAndSourcePage\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__getProjectData\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + count: 2 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionNumberForTranslation\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__prepareOutsourcedJobCart\(\) has parameter \$apiCallResult with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForChunk\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__prepareOutsourcedJobCart\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForChunk\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__prepareQuotedJobCart\(\) has parameter \$apiCallResult with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForJob\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__prepareQuotedJobCart\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForJob\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__processNormalJobs\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForRevision\(\) has parameter \$id_job with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\OutsourceTo\\Translated\:\:__processOutsourcedJobs\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForRevision\(\) has parameter \$id_segment with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\OutsourceTo\\Translated\:\:getLangPairs\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForRevision\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\OutsourceTo\\Translated\:\:getLangPairs\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForRevision\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\OutsourceTo\\Translated\:\:getOutsourceConfirmUrl\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:getVersionsForTranslation\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\OutsourceTo\\Translated\:\:getTotalPayableWords\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/OutsourceTo/Translated.php + + - + message: '#^Method Utils\\OutsourceTo\\Translated\:\:performQuote\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + count: 1 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:insertVersionRecords\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Offset ''currency'' might not exist on Utils\\Shop\\AbstractItem\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:insertVersionRecords\(\) has parameter \$params with no type specified\.$#' - identifier: missingType.parameter + message: '#^Offset ''timezone'' might not exist on array\{currency\: mixed\}\|Utils\\Shop\\AbstractItem\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:insertVersionRecords\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Offset ''typeOfService'' might not exist on array\{currency\: mixed, timezone\: mixed\}\|Utils\\Shop\\AbstractItem\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:insertVersionRecords\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + message: '#^Parameter \#1 \$cartElem of method Utils\\OutsourceTo\\Translated\:\:__addCartElement\(\) expects Utils\\Shop\\ItemHTSQuoteJob, Utils\\Shop\\ItemHTSQuoteJob\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:saveVersion\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$cartElem of method Utils\\OutsourceTo\\Translated\:\:__addCartElement\(\) expects Utils\\Shop\\ItemHTSQuoteJob, array\\|Utils\\Shop\\AbstractItem given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:saveVersion\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$jid of method Utils\\OutsourceTo\\Translated\:\:getLangPairs\(\) expects int, string given\.$#' + identifier: argument.type count: 2 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:updateVersion\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:updateVersion\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + message: '#^Parameter \#2 \$features of class Model\\Analysis\\Status constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Parameter \$segmentsToUpdate of method Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:savePropagationVersions\(\) has invalid type Plugins\\Features\\TranslationVersions\\Model\\Propagation_PropagationTotalStruct\.$#' - identifier: class.notFound - count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + message: '#^Parameter \#2 \$numeric_prefix of function http_build_query expects string, int given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Property Plugins\\Features\\TranslationVersions\\Model\\TranslationVersionDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#3 \$length of function substr expects int\|null, int\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Plugins/Features/TranslationVersions/Model/TranslationVersionDao.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\VersionHandlerInterface\:\:propagateTranslation\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#3 \$newTimezone of method Utils\\OutsourceTo\\Translated\:\:__updateCartElements\(\) expects int, string given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/OutsourceTo/Translated.php + + - + message: '#^Property Utils\\OutsourceTo\\AbstractProvider\:\:\$_quote_result \(array\\) does not accept array\\|Utils\\Shop\\AbstractItem\>\.$#' + identifier: assign.propertyType count: 1 - path: lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Method Plugins\\Features\\TranslationVersions\\VersionHandlerInterface\:\:storeTranslationEvent\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\OutsourceTo\\Translated\:\:\$_curlOptions type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type bool\.$#' - identifier: return.phpDocType - count: 1 - path: lib/Plugins/Features/TranslationVersions/VersionHandlerInterface.php + message: '#^Unsafe access to private property Utils\\OutsourceTo\\Translated\:\:\$OUTSOURCE_URL_CONFIRM through static\:\:\.$#' + identifier: staticClassAccess.privateProperty + count: 2 + path: lib/Utils/OutsourceTo/Translated.php - - message: '#^Parameter \#3 \$callback of function route expects array\{class\-string\, string\}, array\{''Controller\\\\API\\\\App…'', ''update''\} given\.$#' - identifier: argument.type + message: '#^Call to function is_null\(\) with int will always evaluate to false\.$#' + identifier: function.impossibleType count: 1 - path: lib/Routes/app_routes.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Method Utils\\AIAssistant\\AIClientFactory\:\:create\(\) has parameter \$agent with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to function is_string\(\) with string will always evaluate to true\.$#' + identifier: function.alreadyNarrowedType count: 1 - path: lib/Utils/AIAssistant/AIClientFactory.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Method Utils\\AIAssistant\\GeminiClient\:\:manageAlternativeTranslations\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method del\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AIAssistant/GeminiClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type array\.$#' - identifier: return.phpDocType + message: '#^Cannot call method expire\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AIAssistant/GeminiClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Parameter \#2 \$callback of function preg_replace_callback expects callable\(array\\)\: string, Closure\(mixed\)\: \(int\|string\) given\.$#' - identifier: argument.type + message: '#^Cannot call method get\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AIAssistant/GeminiClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Method Utils\\AIAssistant\\OpenAIClient\:\:evaluateTranslation\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method getProperty\(\) on ReflectionClass\|false\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AIAssistant/OpenAIClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Method Utils\\AIAssistant\\OpenAIClient\:\:findContextForAWord\(\) has parameter \$phrase with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method setnx\(\) on Predis\\Client\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AIAssistant/OpenAIClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Method Utils\\AIAssistant\\OpenAIClient\:\:findContextForAWord\(\) has parameter \$target with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Redis\\RedisHandler\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AIAssistant/OpenAIClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Method Utils\\AIAssistant\\OpenAIClient\:\:findContextForAWord\(\) has parameter \$word with no type specified\.$#' + message: '#^Method Utils\\Redis\\RedisHandler\:\:formatDSN\(\) has parameter \$dsnString with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/AIAssistant/OpenAIClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string given\.$#' - identifier: argument.type + message: '#^Method Utils\\Redis\\RedisHandler\:\:unlock\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AIAssistant/OpenAIClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Parameter \#2 \$stream of method Orhanerday\\OpenAi\\OpenAi\:\:chat\(\) expects null, callable given\.$#' + message: '#^Parameter \#1 \$callback of function array_map expects \(callable\(never\)\: mixed\)\|null, array\{''Utils\\\\Redis\\\\RedisHandler'', ''formatDSN''\} given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AIAssistant/OpenAIClient.php + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Strict comparison using \!\=\= between non\-falsy\-string and '''' will always evaluate to true\.$#' - identifier: notIdentical.alwaysTrue - count: 4 - path: lib/Utils/AIAssistant/OpenAIClient.php + message: '#^Property Utils\\Redis\\RedisHandler\:\:\$instanceUUID \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Utils/Redis/RedisHandler.php - - message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:__construct\(\) has parameter \$brokerUri with no type specified\.$#' - identifier: missingType.parameter + message: '#^Expression on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.expr count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:__construct\(\) has parameter \$usePersistentConnection with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Registry\\AppConfig\:\:__construct\(\) has parameter \$configuration with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:callAmqJmx\(\) has parameter \$queue_interface_url with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Registry\\AppConfig\:\:__construct\(\) has parameter \$taskManagerConfiguration with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:getNewInstanceForDaemons\(\) throws checked exception Stomp\\Exception\\ConnectionException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Registry\\AppConfig\:\:__construct\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:getRedisClient\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Registry\\AppConfig\:\:init\(\) has parameter \$configuration with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\AMQHandler\:\:subscribe\(\) has parameter \$header with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Registry\\AppConfig\:\:init\(\) has parameter \$taskManagerConfiguration with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\Registry\\AppConfig\:\:\$AUTOLOAD_PLUGINS type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Unreachable statement \- code above always terminates\.$#' - identifier: deadCode.unreachable + message: '#^Property Utils\\Registry\\AppConfig\:\:\$MANDATORY_KEYS type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Variable \$qid in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Property Utils\\Registry\\AppConfig\:\:\$MIME_TYPES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/AMQHandler.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\ClientHelpers\\ProjectQueue\:\:getPublishedResults\(\) has parameter \$id_project with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Registry\\AppConfig\:\:\$MONOLOG_HANDLERS type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/ClientHelpers/ProjectQueue.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\ClientHelpers\\ProjectQueue\:\:getPublishedResults\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Registry\\AppConfig\:\:\$OAUTH_CONFIG type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/ClientHelpers/ProjectQueue.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\ClientHelpers\\ProjectQueue\:\:getPublishedResults\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Registry\\AppConfig\:\:\$SUPPORTED_FILE_TYPES type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/ClientHelpers/ProjectQueue.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\ClientHelpers\\ProjectQueue\:\:publishResults\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\Registry\\AppConfig\:\:\$TASK_RUNNER_CONFIG type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ActiveMQ/ClientHelpers/ProjectQueue.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueue\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Static property Utils\\Registry\\AppConfig\:\:\$AUTHSECRET \(string\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/ActiveMQ/WorkerClient.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueue\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Static property Utils\\Registry\\AppConfig\:\:\$OAUTH_CONFIG \(array\) does not accept array\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/ActiveMQ/WorkerClient.php + path: lib/Utils/Registry/AppConfig.php - - message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueueWithClient\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Search\\ReplaceHistory\:\:_moveToVersion\(\) has parameter \$versionToMove with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/ActiveMQ/WorkerClient.php + path: lib/Utils/Search/ReplaceHistory.php - - message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueueWithClient\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Search\\ReplaceHistory\:\:updateIndex\(\) has parameter \$versionToMove with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/ActiveMQ/WorkerClient.php + path: lib/Utils/Search/ReplaceHistory.php - - message: '#^Method Utils\\ActiveMQ\\WorkerClient\:\:enqueueWithClient\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:_checkDriver\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/ActiveMQ/WorkerClient.php + path: lib/Utils/Search/ReplaceHistoryFactory.php - - message: '#^Property Utils\\ActiveMQ\\WorkerClient\:\:\$_QUEUES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:create\(\) has parameter \$driver with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/ActiveMQ/WorkerClient.php + path: lib/Utils/Search/ReplaceHistoryFactory.php - - message: '#^Binary operation "/" between string and 2 results in an error\.$#' - identifier: binaryOp.invalid + message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:create\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/Search/ReplaceHistoryFactory.php - - message: '#^Call to an undefined method Utils\\AIAssistant\\AIClientInterface\:\:evaluateTranslation\(\)\.$#' - identifier: method.notFound + message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:create\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/Search/ReplaceHistoryFactory.php - - message: '#^Call to an undefined method Utils\\AIAssistant\\AIClientInterface\:\:findContextForAWord\(\)\.$#' - identifier: method.notFound - count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:create\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Utils/Search/ReplaceHistoryFactory.php - - message: '#^Call to an undefined method Utils\\AIAssistant\\AIClientInterface\:\:manageAlternativeTranslations\(\)\.$#' - identifier: method.notFound + message: '#^Method Utils\\ServerCheck\\ServerCheck\:\:getByteValue\(\) has parameter \$value with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/ServerCheck/ServerCheck.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:alternative_translations\(\) has parameter \$payload with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Offset 1 might not exist on array\{\}\|array\{0\: non\-empty\-string, 1\: numeric\-string, 2\?\: ''G''\|''M''\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/ServerCheck/ServerCheck.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:alternative_translations\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\ServerCheck\\UploadParams\:\:__clone\(\) with return type void returns Utils\\ServerCheck\\UploadParams but should not return anything\.$#' + identifier: return.void count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/ServerCheck/UploadParams.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:emitErrorMessage\(\) has parameter \$payload with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\ServerCheck\\UploadParams\:\:__set\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/ServerCheck/UploadParams.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:emitMessage\(\) has parameter \$message with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\ServerCheck\\UploadParams\:\:__set\(\) has parameter \$value with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/ServerCheck/UploadParams.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:explain_meaning\(\) has parameter \$payload with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\ServerCheck\\UploadParams\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/ServerCheck/UploadParams.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:feedback\(\) has parameter \$payload with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method object\:\:offsetSet\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\AIAssistantWorker\:\:getLockValue\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Class Utils\\Shop\\AbstractItem extends generic class ArrayObject but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Parameter \#2 \$max_words of static method Utils\\Tools\\Utils\:\:truncatePhrase\(\) expects int, float given\.$#' - identifier: argument.type + message: '#^Method Utils\\Shop\\AbstractItem\:\:getInflate\(\) has parameter \$storage with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/AIAssistantWorker.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Call to an undefined method Model\\DataAccess\\IDatabase\:\:ping\(\)\.$#' - identifier: method.notFound + message: '#^Method Utils\\Shop\\AbstractItem\:\:getInflate\(\) should return Utils\\Shop\\AbstractItem but returns object\.$#' + identifier: return.type count: 1 - path: lib/Utils/AsyncTasks/Workers/ActivityLogWorker.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' - identifier: argument.type + message: '#^Method Utils\\Shop\\AbstractItem\:\:getStorage\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/ActivityLogWorker.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Access to an undefined property object\:\:\$message\.$#' - identifier: property.notFound + message: '#^Method Utils\\Shop\\AbstractItem\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Call to an undefined method Model\\DataAccess\\IDatabase\:\:ping\(\)\.$#' - identifier: method.notFound + message: '#^Method Utils\\Shop\\AbstractItem\:\:offsetSet\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Call to an undefined method Utils\\Engines\\AbstractEngine\:\:fastAnalysis\(\)\.$#' - identifier: method.notFound + message: '#^PHPDoc tag @throws has invalid value \(LogicException/DomainException\)\: Unexpected token "/DomainException", expected TOKEN_HORIZONTAL_WS at offset 438 on line 15$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Call to function is_null\(\) with int will always evaluate to false\.$#' - identifier: function.impossibleType + message: '#^Property Utils\\Shop\\AbstractItem\:\:\$__storage type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/Shop/AbstractItem.php - - message: '#^Cannot access property \$persistent on Utils\\ActiveMQ\\AMQHandler\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\Shop\\Cart\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/Shop/Cart.php - - message: '#^Cannot access property \$queue_name on Utils\\TaskRunner\\Commons\\Context\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + message: '#^Property Utils\\Shop\\Cart\:\:\$cart type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Shop/Cart.php - - message: '#^Cannot call method format\(\) on DateTime\|false\.$#' - identifier: method.nonObject + message: '#^Property Utils\\Shop\\ItemHTSQuoteJob\:\:\$__storage type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/Shop/ItemHTSQuoteJob.php - - message: '#^Cannot call method getClient\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Shop\\ItemInterface\:\:getInflate\(\) has parameter \$storage with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Shop/ItemInterface.php + + - + message: '#^PHPDoc tag @return with type mixed is not subtype of native type Utils\\Shop\\AbstractItem\.$#' + identifier: return.phpDocType count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/Shop/ItemInterface.php - - message: '#^Cannot call method getQueueLength\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Subfiltering\\SubfilteringOptionsValidator\:\:validate\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/Subfiltering/SubfilteringOptionsValidator.php - - message: '#^Cannot call method getRedisClient\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' - identifier: method.nonObject - count: 9 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + message: '#^Parameter \#1 \$array of function array_diff expects array, array\\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Subfiltering/SubfilteringOptionsValidator.php - - message: '#^Cannot call method publishToQueues\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' - identifier: method.nonObject + message: '#^Cannot access property \$id on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_executeInsert\(\) has parameter \$bind_values with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot access property \$password on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_executeInsert\(\) has parameter \$tuple_list with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TMS\\TMSService\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_fetchMyMemoryFast\(\) has parameter \$pid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TMS\\TMSService\:\:_fileUploadStatus\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getLockProjectForVolumeAnalysis\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TMS\\TMSService\:\:addTmxInMyMemory\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getSegmentsForFastVolumeAnalysis\(\) has parameter \$pid with no type specified\.$#' + message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) has parameter \$jPassword with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getSegmentsForFastVolumeAnalysis\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) has parameter \$jid with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getWordCountForSegment\(\) has parameter \$equivalentWordMapping with no type specified\.$#' + message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) has parameter \$sourceLang with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getWordCountForSegment\(\) has parameter \$segmentArray with no type specified\.$#' + message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) has parameter \$targetLang with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_getWordCountForSegment\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Utils/TMS/TMSService.php + + - + message: '#^Method Utils\\TMS\\TMSService\:\:getUserAdaptiveMTEngines\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_insertFastAnalysis\(\) has parameter \$equivalentWordMapping with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TMS\\TMSService\:\:glossaryUploadStatus\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_insertFastAnalysis\(\) has parameter \$subfiltering_handlers with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TMS\\TMSService\:\:tmxUploadStatus\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_setTotal\(\) has parameter \$config with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TMS\\TMSService\:\:uploadFile\(\) has parameter \$files with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_updateProject\(\) has parameter \$pid with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @var has invalid value \(\$mymemory_engine MyMemory\)\: Unexpected token "\$mymemory_engine", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:_updateProject\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$id of static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\) expects int, array\|int\|object\|string given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:getProjectSegmentsTranslationSummary\(\) has parameter \$pid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:getProjectSegmentsTranslationSummary\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$message of class InvalidArgumentException constructor expects string, array\|string given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:getProjectSegmentsTranslationSummary\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$message of method Utils\\TMS\\TMSService\:\:formatErrorMessage\(\) expects string, array\|string given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:main\(\) has parameter \$args with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^PHPDoc tag @var has invalid value \(\$myMemory MyMemory\)\: Unexpected token "\$myMemory", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Part \$engineName \(Utils\\Engines\\AbstractEngine\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:get\(\) expects int, string given\.$#' - identifier: argument.type - count: 3 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$class_load \(string\|null\) does not accept Utils\\Engines\\AbstractEngine\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Utils/TMS/TMSService.php - - message: '#^Property Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:\$actual_project_row type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\TMS\\TMSService\:\:\$mymemory_engine \(Utils\\Engines\\MyMemory\) does not accept Utils\\Engines\\AbstractEngine\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TMS/TMSService.php - - message: '#^Property Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:\$segment_hashes type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 2 + path: lib/Utils/TMS/TMSService.php - - message: '#^Property Utils\\AsyncTasks\\Workers\\Analysis\\FastAnalysis\:\:\$segments type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Constructor of class Utils\\TaskRunner\\Commons\\AbstractDaemon has an unused parameter \$configFile\.$#' + identifier: constructor.unusedParameter count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType - count: 3 - path: lib/Utils/AsyncTasks/Workers/Analysis/FastAnalysis.php + message: '#^Constructor of class Utils\\TaskRunner\\Commons\\AbstractDaemon has an unused parameter \$contextIndex\.$#' + identifier: constructor.unusedParameter + count: 1 + path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\Health\:\:fastAnalysisIsRunning\(\) has parameter \$redisHandler with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractDaemon\:\:installHandler\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/Health.php + path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\Health\:\:tmAnalysisIsRunning\(\) has parameter \$redisHandler with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractDaemon\:\:main\(\) has parameter \$args with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/Health.php + path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php - - message: '#^PHPDoc tag @var has invalid value \(\$redisHandler Client\)\: Unexpected token "\$redisHandler", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError - count: 2 - path: lib/Utils/AsyncTasks/Workers/Analysis/Health.php + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static + count: 1 + path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php - - message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' + message: '#^Argument of an invalid type \$this\(Utils\\TaskRunner\\Commons\\AbstractElement\) supplied for foreach, only iterables are supported\.$#' identifier: foreach.nonIterable count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractElement.php - - message: '#^Binary operation "\-" between non\-falsy\-string and string\|null results in an error\.$#' - identifier: binaryOp.invalid + message: '#^Class Utils\\TaskRunner\\Commons\\AbstractElement implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractElement.php - - message: '#^Binary operation "/" between string\|null and 1000 results in an error\.$#' - identifier: binaryOp.invalid - count: 2 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractElement\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/TaskRunner/Commons/AbstractElement.php - - message: '#^Call to an undefined method Utils\\Engines\\Results\\TMSAbstractResponse\:\:get_matches_as_array\(\)\.$#' - identifier: method.notFound + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractElement\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractElement.php - - message: '#^Cannot access property \$analysis_ignore_100 on Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractElement\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractElement.php - - message: '#^Cannot access property \$analysis_ignore_101 on Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractElement\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractElement.php - - message: '#^Cannot access property \$qe_model_version on Model\\MTQE\\Templates\\DTO\\MTQEWorkflowParams\|null\.$#' - identifier: property.nonObject + message: '#^Call to an undefined method Model\\DataAccess\\IDatabase\:\:ping\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Cannot call method getChunks\(\) on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_doLog\(\) has parameter \$msg with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__compareScoreDesc\(\) has parameter \$a with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_endQueueCallback\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__compareScoreDesc\(\) has parameter \$b with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:getLogMsg\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__filterTMMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:publishToNodeJsClients\(\) has parameter \$_object with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__filterTMMatches\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$body of class Stomp\\Transport\\Message constructor expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_endQueueCallback\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$msg of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_doLog\(\) expects array\|string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getMT\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\TaskRunner\\Commons\\AbstractWorker\:\:\$_logMsg type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getMT\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 2 + path: lib/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getMatches\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TaskRunner\\Commons\\Configuration\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/Configuration.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getNewMatchTypeAndEquivalentWordDiscount\(\) has parameter \$bestMatch with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TaskRunner\\Commons\\Configuration\:\:getRaw\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/Configuration.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getNewMatchTypeAndEquivalentWordDiscount\(\) has parameter \$equivalentWordMapping with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\TaskRunner\\Commons\\Configuration\:\:\$__raw type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/Configuration.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getNewMatchTypeAndEquivalentWordDiscount\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TaskRunner\\Commons\\Context\:\:__construct\(\) has parameter \$queueElement with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/Context.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getTM\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + message: '#^Method Utils\\TaskRunner\\Commons\\Context\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Utils/TaskRunner/Commons/Context.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getTM\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TaskRunner\\Commons\\Context\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/Context.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_incrementAnalyzedCount\(\) has parameter \$eq_words with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TaskRunner\\Commons\\Context\:\:buildFromArray\(\) has parameter \$context with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/Context.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_incrementAnalyzedCount\(\) has parameter \$pid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/Context.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_incrementAnalyzedCount\(\) has parameter \$standard_words with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TaskRunner\\Commons\\ContextList\:\:__construct\(\) has parameter \$queue_info with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/ContextList.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_lockAndPreTranslateStatusCheck\(\) has parameter \$tm_data with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TaskRunner\\Commons\\ContextList\:\:get\(\) has parameter \$queue_info with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/ContextList.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_lockAndPreTranslateStatusCheck\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Commons/ContextList.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_sortMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method SplSubject\:\:getLogMsg\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_sortMatches\(\) has parameter \$mt_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method attach\(\) on Utils\\TaskRunner\\Commons\\AbstractWorker\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_sortMatches\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method process\(\) on Utils\\TaskRunner\\Commons\\AbstractWorker\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_tryToCloseProject\(\) has parameter \$_params with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method setContext\(\) on Utils\\TaskRunner\\Commons\\AbstractWorker\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_tryToCloseProject\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Cannot call method setPid\(\) on Utils\\TaskRunner\\Commons\\AbstractWorker\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:getProjectSegmentsTranslationSummary\(\) has parameter \$pid with no type specified\.$#' + message: '#^Method Utils\\TaskRunner\\Executor\:\:_myProcessExists\(\) has parameter \$pid with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:getProjectSegmentsTranslationSummary\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TaskRunner\\Executor\:\:_readAMQFrame\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:getProjectSegmentsTranslationSummary\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Utils\\TaskRunner\\Executor\:\:installHandler\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:initPostProcess\(\) has parameter \$source_lang with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @var has invalid value \(\$msgFrame Frame\)\: Unexpected token "\$msgFrame", expected type at offset 28 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:initPostProcess\(\) has parameter \$source_seg with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @var has invalid value \(\$msgFrame Frame\)\: Unexpected token "\$msgFrame", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:initPostProcess\(\) has parameter \$target_lang with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @var has invalid value \(\$queueElement QueueElement\)\: Unexpected token "\$queueElement", expected type at offset 72 on line 3$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:initPostProcess\(\) has parameter \$target_seg with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @var with type array is not subtype of native type non\-empty\-list\\.$#' + identifier: varTag.nativeType count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:isMtMatch\(\) has parameter \$match with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\TaskRunner\\Executor\:\:\$_worker \(Utils\\TaskRunner\\Commons\\AbstractWorker\|null\) does not accept object\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^Offset 0 might not exist on array\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/Executor.php - - message: '#^PHPDoc tag @var has invalid value \(\$tms_match GetMemoryResponse\)\: Unexpected token "\$tms_match", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Call to Utils\\TaskRunner\\TaskManager\:\:_balanceQueues\(\) on a separate line has no effect\.$#' + identifier: staticMethod.resultUnused count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/TaskManager.php - - message: '#^Parameter \#1 \$matches of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:__filterTMMatches\(\) expects array, array\|Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\|null given\.$#' - identifier: argument.type + message: '#^Cannot access property \$pid_set_name on Utils\\TaskRunner\\Commons\\Context\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/TaskManager.php - - message: '#^Parameter \#1 \$mt_penalty of method Utils\\Engines\\AbstractEngine\:\:setMTPenalty\(\) expects int\|null, float\|int\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + message: '#^Cannot call method getRedisClient\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' + identifier: method.nonObject + count: 22 + path: lib/Utils/TaskRunner/TaskManager.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_checkWordCount\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' - identifier: argument.type + message: '#^Method Utils\\TaskRunner\\TaskManager\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/TaskManager.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_getMatches\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' - identifier: argument.type + message: '#^Method Utils\\TaskRunner\\TaskManager\:\:_balanceQueues\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/TaskManager.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_initializeTMAnalysis\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' - identifier: argument.type + message: '#^Method Utils\\TaskRunner\\TaskManager\:\:main\(\) has parameter \$args with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/TaskManager.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:_updateRecord\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#1 \$process_id of function posix_kill expects int, string given\.$#' identifier: argument.type - count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + count: 4 + path: lib/Utils/TaskRunner/TaskManager.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#2 \$string of function explode expects string, array\|string given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/TaskRunner/TaskManager.php - - message: '#^Property Utils\\AsyncTasks\\Workers\\Analysis\\TMAnalysisWorker\:\:\$_matches type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\TaskRunner\\Commons\\AbstractDaemon\:\:\$_configFile \(string\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: lib/Utils/TaskRunner/TaskManager.php + + - + message: '#^Property Utils\\Templating\\PHPTALWithAppend\:\:\$internal_store type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/Templating/PHPTALWithAppend.php - - message: '#^Property Utils\\Engines\\Results\\TMSAbstractResponse\:\:\$responseStatus \(int\) in isset\(\) is not nullable\.$#' - identifier: isset.property + message: '#^Call to an undefined method Utils\\Templating\\PHPTalMap\:\:__get\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/Templating/PHPTalMap.php + + - + message: '#^Call to an undefined method Utils\\Templating\\PHPTalMap\:\:__set\(\)\.$#' + identifier: method.notFound + count: 2 + path: lib/Utils/Templating/PHPTalMap.php - - message: '#^Result of && is always false\.$#' - identifier: booleanAnd.alwaysFalse + message: '#^Class Utils\\Templating\\PHPTalMap implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/Templating/PHPTalMap.php - - message: '#^Strict comparison using \!\=\= between non\-empty\-string and '''' will always evaluate to true\.$#' - identifier: notIdentical.alwaysTrue + message: '#^Method Utils\\Templating\\PHPTalMap\:\:__construct\(\) has parameter \$values with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + path: lib/Utils/Templating/PHPTalMap.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType - count: 4 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + message: '#^Method Utils\\Templating\\PHPTalMap\:\:__toString\(\) should return string but returns string\|false\.$#' + identifier: return.type + count: 1 + path: lib/Utils/Templating/PHPTalMap.php - - message: '#^Variable \$tms_match in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable - count: 2 - path: lib/Utils/AsyncTasks/Workers/Analysis/TMAnalysisWorker.php + message: '#^Method Utils\\Templating\\PHPTalMap\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Templating/PHPTalMap.php - - message: '#^Access to an undefined property object\:\:\$status\.$#' - identifier: property.notFound + message: '#^Property Utils\\Templating\\PHPTalMap\:\:\$storage type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + path: lib/Utils/Templating/PHPTalMap.php - - message: '#^Access to an undefined property object\:\:\$translation_date\.$#' - identifier: property.notFound + message: '#^Method Utils\\TmKeyManagement\\Filter\:\:_hasRightGrants\(\) has parameter \$tm_key with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + path: lib/Utils/TmKeyManagement/Filter.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' - identifier: argument.type + message: '#^Method Utils\\TmKeyManagement\\Filter\:\:_isTheRightType\(\) has parameter \$tm_key with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + path: lib/Utils/TmKeyManagement/Filter.php - - message: '#^Parameter \#1 \$translation_struct of static method Model\\Translations\\SegmentTranslationDao\:\:updateTranslationAndStatusAndDateByList\(\) expects array\, list\ given\.$#' - identifier: argument.type + message: '#^Method Utils\\TmKeyManagement\\Filter\:\:byOwner\(\) has parameter \$tm_key with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + path: lib/Utils/TmKeyManagement/Filter.php - - message: '#^Parameter \#2 \$jobId of static method Model\\Translations\\SegmentTranslationDao\:\:getAllSegmentsByIdListAndJobId\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\TmKeyManagement\\Filter\:\:byRevisor\(\) has parameter \$tm_key with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + path: lib/Utils/TmKeyManagement/Filter.php - - message: '#^Parameter \#2 \$translation of class Plugins\\Features\\TranslationEvents\\Model\\TranslationEvent constructor expects Model\\Translations\\SegmentTranslationStruct, object given\.$#' - identifier: argument.type + message: '#^Method Utils\\TmKeyManagement\\Filter\:\:byTranslator\(\) has parameter \$tm_key with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/BulkSegmentStatusChangeWorker.php + path: lib/Utils/TmKeyManagement/Filter.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' - identifier: argument.type + message: '#^Property Utils\\TmKeyManagement\\Filter\:\:\$GRANTS_MAP type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/ErrMailWorker.php + path: lib/Utils/TmKeyManagement/Filter.php - - message: '#^Access to an undefined property object\:\:\$context_after\.$#' - identifier: property.notFound + message: '#^Property Utils\\TmKeyManagement\\Filter\:\:\$_accepted_types type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/Filter.php - - message: '#^Access to an undefined property object\:\:\$context_before\.$#' - identifier: property.notFound + message: '#^Property Utils\\TmKeyManagement\\Filter\:\:\$_type type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/Filter.php - - message: '#^Access to an undefined property object\:\:\$segment\.$#' - identifier: property.notFound - count: 3 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/Utils/TmKeyManagement/ShareKeyEmail.php - - message: '#^Cannot access property \$id on Model\\Jobs\\JobStruct\|null\.$#' + message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' identifier: property.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/ShareKeyEmail.php - - message: '#^Cannot access property \$id on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\TmKeyManagement\\ShareKeyEmail\:\:__construct\(\) has parameter \$userMail with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/ShareKeyEmail.php - - message: '#^Cannot access property \$password on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\TmKeyManagement\\ShareKeyEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/ShareKeyEmail.php - - message: '#^Cannot access property \$source on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Utils\\TmKeyManagement\\ShareKeyEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/ShareKeyEmail.php - - message: '#^Cannot access property \$status on Model\\Translations\\SegmentTranslationStruct\|null\.$#' - identifier: property.nonObject + message: '#^Property Utils\\TmKeyManagement\\ShareKeyEmail\:\:\$userMail type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/ShareKeyEmail.php - - message: '#^Cannot access property \$target on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject - count: 3 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + message: '#^Expression on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.expr + count: 1 + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Cannot access property \$tm_keys on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject - count: 3 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:filterOutByOwnership\(\) has parameter \$jobOwnerEmail with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Cannot access property \$uid on Model\\Users\\UserStruct\|null\.$#' - identifier: property.nonObject - count: 5 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:filterOutByOwnership\(\) has parameter \$userEmail with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Cannot call method isAnonymous\(\) on Model\\Users\\UserStruct\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:getClientTmKeyStructure\(\) has parameter \$tmKey_arr with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:__compareScoreDesc\(\) has parameter \$a with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:getOwnerKeys\(\) has parameter \$jsonTmKeys_array with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:__compareScoreDesc\(\) has parameter \$b with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:getPenaltyMap\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_extractAvailableKeysForUser\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:getTmKeyStructure\(\) has parameter \$tmKey_arr with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_formatConcordanceValues\(\) has parameter \$_source with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:isValidStructure\(\) has parameter \$arr with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_formatConcordanceValues\(\) has parameter \$_target with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:mergeJsonKeys\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_formatConcordanceValues\(\) has parameter \$regularExpressions with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:sanitize\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_formatConcordanceValues\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:sanitize\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: lib/Utils/TmKeyManagement/TmKeyManager.php + + - + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:shareKey\(\) has parameter \$emailList with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_getMatches\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:shareKey\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: lib/Utils/TmKeyManagement/TmKeyManager.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$_client_tm_key TmKeyStruct\)\: Unexpected token "\$_client_tm_key", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_matchRewrite\(\) has parameter \$match with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$_job_Key TmKeyStruct\)\: Unexpected token "\$_job_Key", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_matchRewrite\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$newClientKey TmKeyStruct\)\: Unexpected token "\$newClientKey", expected type at offset 28 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_publishPayload\(\) has parameter \$content with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$array of function array_map expects array, array\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_publishPayload\(\) has parameter \$targetLang with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortByLenDesc\(\) has parameter \$stringA with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$key \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortByLenDesc\(\) has parameter \$stringB with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$name \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$source \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortMatches\(\) has parameter \$mt_result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$target \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_sortMatches\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$uid_rev \(int\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:isMtMatch\(\) has parameter \$match with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$uid_transl \(int\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyManager.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:issetSourceAndTarget\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Argument of an invalid type array\|Utils\\TmKeyManagement\\TmKeyStruct supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:normalizeMTMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:__construct\(\) has parameter \$params with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:tokenizeSourceSearch\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:__set\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:updateAnalysisSuggestion\(\) has parameter \$matches with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:__set\(\) has parameter \$value with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php + + - + message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^PHPDoc tag @return has invalid value \(array\[string \=\> string\] \$regularExpressions Pattern is in the key and replacement in the value of the array\)\: Unexpected token "\[", expected TOKEN_HORIZONTAL_WS at offset 213 on line 7$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^PHPDoc tag @var has invalid value \(\$tm_key MemoryKeyStruct\)\: Unexpected token "\$tm_key", expected type at offset 32 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^Parameter \#1 \$pattern of function preg_replace expects array\\|string, list\ given\.$#' + message: '#^Parameter \#1 \$haystack of function strrpos expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^Parameter \#1 \$project of method Model\\FeaturesBase\\FeatureSet\:\:loadForProject\(\) expects Model\\Projects\\ProjectStruct, Model\\Projects\\ProjectStruct\|null given\.$#' + message: '#^Parameter \#1 \$string of function strlen expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#1 \$string of function substr expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^Parameter \#2 \$jobStruct of method Utils\\AsyncTasks\\Workers\\GetContributionWorker\:\:_getMatches\(\) expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$penalty \(int\) on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.property count: 2 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/TmKeyManagement/TmKeyStruct.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type + message: '#^Call to function is_numeric\(\) with int\<1, max\> will always evaluate to true\.$#' + identifier: function.alreadyNarrowedType count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type + message: '#^Cannot access offset ''path'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: lib/Utils/Tools/CatUtils.php + + - + message: '#^Cannot call method getChunk\(\) on Model\\LQA\\ChunkReviewStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Property Model\\Jobs\\JobStruct\:\:\$tm_keys \(string\) on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.property + message: '#^Method Utils\\Tools\\CatUtils\:\:_performanceEstimationTime\(\) has parameter \$job_stats with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$mt_quality_value_in_editor \(int\) on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.property + message: '#^Method Utils\\Tools\\CatUtils\:\:_performanceEstimationTime\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Variable \$queueElement on left side of \?\? is never defined\.$#' - identifier: nullCoalesce.variable + message: '#^Method Utils\\Tools\\CatUtils\:\:_performanceEstimationTime\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/AsyncTasks/Workers/GetContributionWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Match arm comparison between int\<300, max\> and 202 is always false\.$#' - identifier: match.alwaysFalse + message: '#^Method Utils\\Tools\\CatUtils\:\:clean_raw_string_4_word_count\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:formatGetGlossaryMatches\(\) has parameter \$matches with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:convertEncoding\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:formatGetGlossaryMatches\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:fetchStatus\(\) has parameter \$results with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:formatGetGlossaryMatches\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:getChunkReviewStructFromJobStruct\(\) has parameter \$chunkReviews with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:get\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:getFastStatsForJob\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:keys\(\) has parameter \$payload with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Tools\\CatUtils\:\:getJobFromIdAndAnyPassword\(\) has parameter \$jobId with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:search\(\) has parameter \$payload with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Tools\\CatUtils\:\:getJobFromIdAndAnyPassword\(\) has parameter \$jobPassword with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:set\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:getLastCharacter\(\) has parameter \$string with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Tools/CatUtils.php + + - + message: '#^Method Utils\\Tools\\CatUtils\:\:getQualityOverallFromJobStruct\(\) has parameter \$chunkReviews with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) has parameter \$id_client with no type specified\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:htmlentitiesFromUnicode\(\) has parameter \$str with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) has parameter \$jobData with no type specified\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:isCJK\(\) has parameter \$langCode with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) has parameter \$message with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Tools\\CatUtils\:\:parseSegmentSplit\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) has parameter \$type with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Tools\\CatUtils\:\:parse_time_to_edit\(\) should return array\ but returns array\\|string\>\.$#' + identifier: return.type count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:setResponsePayload\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:parse_time_to_edit\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/Utils/Tools/CatUtils.php + + - + message: '#^Method Utils\\Tools\\CatUtils\:\:reApplySegmentSplit\(\) has parameter \$chunk_positions with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\GlossaryWorker\:\:update\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\CatUtils\:\:sanitizeOrFallbackProjectName\(\) has parameter \$arrFiles with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^PHPDoc tag @var has invalid value \(\$queueElement QueueElement\)\: Unexpected token "\$queueElement", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Tools\\CatUtils\:\:sanitizeProjectName\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^PHPDoc tag @var with type Utils\\Engines\\Results\\MyMemory\\UpdateGlossaryResponse is not subtype of native type Utils\\Engines\\Results\\MyMemory\\DeleteGlossaryResponse\.$#' - identifier: varTag.nativeType + message: '#^Method Utils\\Tools\\CatUtils\:\:stripMaliciousContentFromAName\(\) has parameter \$string with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Parameter \#2 \$idJob of method Utils\\Engines\\MyMemory\:\:glossaryDelete\(\) expects string, int given\.$#' - identifier: argument.type + message: '#^Negated boolean expression is always false\.$#' + identifier: booleanNot.alwaysFalse count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Offset ''dirname'' might not exist on array\{dirname\?\: string, basename\: string, extension\?\: string, filename\: string\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/AsyncTasks/Workers/GlossaryWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\JobsWorker\:\:_recountAvgPee\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Offset 1 on array\{list\, list\\} in isset\(\) always exists and is not nullable\.$#' + identifier: isset.offset count: 1 - path: lib/Utils/AsyncTasks/Workers/JobsWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\JobsWorker\:\:process\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^PHPDoc tag @return has invalid value \(array\( \$charset, \$converted \)\)\: Unexpected token "\(", expected TOKEN_HORIZONTAL_WS at offset 339 on line 11$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/AsyncTasks/Workers/JobsWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\JobsWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#1 \$array of function array_filter expects array, list\\|false given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/JobsWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Property Model\\Jobs\\JobStruct\:\:\$avg_post_editing_effort \(int\) does not accept float\|int\.$#' - identifier: assign.propertyType + message: '#^Parameter \#1 \$id_job of static method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/JobsWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' - identifier: isset.property - count: 2 - path: lib/Utils/AsyncTasks/Workers/JobsWorker.php + message: '#^Parameter \#1 \$name of static method Utils\\Tools\\CatUtils\:\:sanitizeProjectName\(\) expects string, array\|string given\.$#' + identifier: argument.type + count: 1 + path: lib/Utils/Tools/CatUtils.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#1 \$o of static method Utils\\Tools\\CatUtils\:\:unicode2chr\(\) expects int, string given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/MailWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\ProjectCreationWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#1 \$segment of method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToLayer1\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/ProjectCreationWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\ProjectCreationWorker\:\:_createProject\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#1 \$string of function mb_substr expects string, array\\|string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/ProjectCreationWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' - identifier: isset.property - count: 2 - path: lib/Utils/AsyncTasks/Workers/ProjectCreationWorker.php + message: '#^Parameter \#1 \$string of function str_pad expects string, int\<\-59, 59\> given\.$#' + identifier: argument.type + count: 3 + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\PropagationWorker\:\:propagateTranslation\(\) has parameter \$structures with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$string of function substr expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\PropagationWorker\:\:rebuildObjects\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^PHPDoc tag @var has invalid value \(\$propagationTotalStruct \?PropagationTotalStruct\)\: Unexpected token "\$propagationTotalStruct", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Parameter \#1 \$string of static method Utils\\Tools\\CatUtils\:\:clean_raw_string_4_word_count\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^PHPDoc tag @var has invalid value \(\$propagatorSegment SegmentTranslationStruct\)\: Unexpected token "\$propagatorSegment", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Parameter \#2 \$length of function fread expects int\<1, max\>, int\<0, max\>\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#2 \$password of static method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/PropagationWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Cannot call method set\(\) on Utils\\Engines\\EngineInterface\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#2 \$string of function explode expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Cannot call method update\(\) on Utils\\Engines\\EngineInterface\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#2 \$string of function explode expects string, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionMTWorker\:\:_extractAvailableKeysForUser\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' + identifier: argument.type + count: 4 + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionMTWorker\:\:_set\(\) has parameter \$config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionMTWorker\:\:_update\(\) has parameter \$config with no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Tools\\CatUtils\:\:\$cj type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Property Utils\\Tools\\CatUtils\:\:\$cjk type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionMTWorker.php + path: lib/Utils/Tools/CatUtils.php - - message: '#^Cannot call method getConfigStruct\(\) on Utils\\Engines\\EngineInterface\|null\.$#' - identifier: method.nonObject - count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + message: '#^Cannot access offset int\<0, max\> on list\\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: lib/Utils/Tools/PostEditing.php - - message: '#^Cannot call method isAdaptiveMT\(\) on Utils\\Engines\\EngineInterface\|null\.$#' - identifier: method.nonObject + message: '#^Cannot access offset int\<1, max\> on list\\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Cannot call method isTMS\(\) on Utils\\Engines\\EngineInterface\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Tools\\PostEditing\:\:CJK_tokenizer\(\) has parameter \$text with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Cannot call method set\(\) on Utils\\Engines\\EngineInterface\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Tools\\PostEditing\:\:CJK_tokenizer\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Cannot call method update\(\) on Utils\\Engines\\EngineInterface\|null\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Tools\\PostEditing\:\:arrayDistance\(\) has parameter \$array1 with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_extractAvailableKeysForUser\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\PostEditing\:\:arrayDistance\(\) has parameter \$array2 with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseEndQueueException\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Tools\\PostEditing\:\:array_xor\(\) has parameter \$array_a with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseEndQueueException\(\) has parameter \$config with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\PostEditing\:\:array_xor\(\) has parameter \$array_b with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseReQueueException\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Tools\\PostEditing\:\:array_xor\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseReQueueException\(\) has parameter \$config with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\PostEditing\:\:compute_bigram\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_raiseReQueueException\(\) has parameter \$type with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Tools\\PostEditing\:\:compute_bigram\(\) should return array but returns array\, string\>\|false\.$#' + identifier: return.type count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_set\(\) has parameter \$config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$value of function count expects array\|Countable, list\\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/PostEditing.php - - message: '#^Method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:_update\(\) has parameter \$config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + message: '#^Parameter \#2 \$callback of function array_filter expects \(callable\(mixed\)\: bool\)\|null, ''trim'' given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/Tools/PostEditing.php - - message: '#^Parameter \#1 \$object of function get_class expects object, Utils\\Engines\\EngineInterface\|null given\.$#' + message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' identifier: argument.type - count: 3 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + count: 2 + path: lib/Utils/Tools/PostEditing.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\AsyncTasks\\Workers\\SetContributionWorker\:\:toSetContributionRequest\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#2 \$subject of function preg_match_all expects string, string\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + count: 4 + path: lib/Utils/Tools/PostEditing.php - - message: '#^Parameter \#1 \$queueElement of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + count: 6 + path: lib/Utils/Tools/PostEditing.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Class Utils\\Tools\\SimpleJWT implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Using nullsafe property access on non\-nullable type mixed\. Use \-\> instead\.$#' - identifier: nullsafe.neverNull - count: 4 - path: lib/Utils/AsyncTasks/Workers/SetContributionWorker.php + message: '#^Method Utils\\Tools\\SimpleJWT\:\:__construct\(\) has parameter \$hashMap with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Parameter \#1 \$id_segment of method Model\\Propagation\\PropagationTotalStruct\:\:addPropagatedId\(\) expects string, int given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Autopropagation/PropagationAnalyser.php + message: '#^Method Utils\\Tools\\SimpleJWT\:\:base64url_decode\(\) has parameter \$data with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Parameter \#1 \$id_segment of method Model\\Propagation\\PropagationTotalStruct\:\:addPropagatedIdToUpdateVersion\(\) expects string, int given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Autopropagation/PropagationAnalyser.php + message: '#^Method Utils\\Tools\\SimpleJWT\:\:base64url_decode\(\) never returns false so it can be removed from the return type\.$#' + identifier: return.unusedType + count: 1 + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Loose comparison using \=\= between non\-empty\-string and null will always evaluate to false\.$#' - identifier: equal.alwaysFalse + message: '#^Method Utils\\Tools\\SimpleJWT\:\:getInstanceFromString\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Constants/Constants.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\Constants\:\:\$allowed_seg_rules type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Tools\\SimpleJWT\:\:getInstanceFromString\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/Utils/Tools/SimpleJWT.php + + - + message: '#^Method Utils\\Tools\\SimpleJWT\:\:getInstanceFromString\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Constants/Constants.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\EngineConstants\:\:\$ENGINES_LIST type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\SimpleJWT\:\:getPayload\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Constants/EngineConstants.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\Ices\:\:\$iceLockDisabledForTargetLangs type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\SimpleJWT\:\:isValid\(\) has parameter \$_storage with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Constants/Ices.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\JobStatus\:\:\$ALLOWED_STATUSES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Tools\\SimpleJWT\:\:offsetSet\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Constants/JobStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\Mime2Extension\:\:getMimeTypes\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\SimpleJWT\:\:parseJWTString\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Constants/Mime2Extension.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\Mime2Extension\:\:\$reference type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\SimpleJWT\:\:sign\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Constants/Mime2Extension.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\ProjectStatus\:\:isAllowedStatus\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Tools\\SimpleJWT\:\:sign\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Constants/ProjectStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\ProjectStatus\:\:\$ALLOWED_STATUSES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @property has invalid value \(int exp\)\: Unexpected token "exp", expected variable at offset 216 on line 10$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Constants/ProjectStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\Teams\:\:isAllowedType\(\) has parameter \$type with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @property has invalid value \(int iat\)\: Unexpected token "iat", expected variable at offset 258 on line 12$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Constants/Teams.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\Teams\:\:\$TYPES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @property has invalid value \(int nbf\)\: Unexpected token "nbf", expected variable at offset 237 on line 11$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Constants/Teams.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\TmKeyPermissions\:\:\$_accepted_grants type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @property has invalid value \(mixed simple\.jwt\.claims\)\: Unexpected token "simple", expected variable at offset 305 on line 14$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Constants/TmKeyPermissions.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\TranslationStatus\:\:isNotInitialStatus\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @property has invalid value \(string aud\)\: Unexpected token "aud", expected variable at offset 195 on line 9$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Constants/TranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\TranslationStatus\:\:isReviewedStatus\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @property has invalid value \(string iss\)\: Unexpected token "iss", expected variable at offset 147 on line 7$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Constants/TranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$DB_STATUSES_MAP type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @property has invalid value \(string jti\)\: Unexpected token "jti", expected variable at offset 282 on line 13$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Constants/TranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$INITIAL_STATUSES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @property has invalid value \(string sub\)\: Unexpected token "sub", expected variable at offset 171 on line 8$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Constants/TranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$REVISION_STATUSES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Constants/TranslationStatus.php + message: '#^Parameter \#1 \$data of static method Utils\\Tools\\SimpleJWT\:\:base64url_encode\(\) expects string, string\|false given\.$#' + identifier: argument.type + count: 6 + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$STATUSES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Constants/TranslationStatus.php + message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Property Utils\\Constants\\TranslationStatus\:\:\$TRANSLATION_STATUSES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#3 \$key of function hash_hmac expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Constants/TranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isFinalState\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Tools\\SimpleJWT\:\:\$customClaimsNamespace on left side of \?\? is not nullable nor uninitialized\.$#' + identifier: nullCoalesce.initializedProperty count: 1 - path: lib/Utils/Constants/XliffTranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isR1\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Tools\\SimpleJWT\:\:\$privateClaims type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Constants/XliffTranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isRevision\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Tools\\SimpleJWT\:\:\$secretKey \(string\|null\) is never assigned null so it can be removed from the property type\.$#' + identifier: property.unusedType count: 1 - path: lib/Utils/Constants/XliffTranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isStateQualifierNew\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Utils\\Tools\\SimpleJWT\:\:\$storage type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Constants/XliffTranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isStatusNew\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Unsafe call to private method Utils\\Tools\\SimpleJWT\:\:parseJWTString\(\) through static\:\:\.$#' + identifier: staticClassAccess.privateMethod count: 1 - path: lib/Utils/Constants/XliffTranslationStatus.php + path: lib/Utils/Tools/SimpleJWT.php - - message: '#^Method Utils\\Constants\\XliffTranslationStatus\:\:isTranslated\(\) has parameter \$status with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Utils/Constants/XliffTranslationStatus.php + path: lib/Utils/Tools/Utils.php - - message: '#^Cannot access property \$id_mt_engine on Model\\Jobs\\JobStruct\|null\.$#' + message: '#^Cannot access property \$parentNode on DOMElement\|null\.$#' identifier: property.nonObject count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Cannot access property \$id_tms on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Cannot call method getAttribute\(\) on DOMElement\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Parameter \#1 \$array_params of class Model\\Jobs\\JobStruct constructor expects array, array\|null given\.$#' - identifier: argument.type + message: '#^Cannot call method replaceChild\(\) on DOMNode\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Parameter \#1 \$array_params of class Model\\Projects\\ProjectStruct constructor expects array, array\|null given\.$#' - identifier: argument.type + message: '#^Loose comparison using \=\= between non\-empty\-string and '''' will always evaluate to false\.$#' + identifier: equal.alwaysFalse count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Parameter \#1 \$array_params of class Model\\Users\\UserStruct constructor expects array, array\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Tools\\Utils\:\:api_timestamp\(\) has parameter \$date_string with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$context_list_after type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:changeMemorySuggestionSource\(\) has parameter \$match with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$context_list_before type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Tools\\Utils\:\:encryptPass\(\) has parameter \$clear_pass with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$contexts type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Tools\\Utils\:\:encryptPass\(\) has parameter \$salt with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$crossLangTargets type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:ensure_keys\(\) has parameter \$params with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$dataRefMap type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:ensure_keys\(\) has parameter \$required_keys with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$jobStruct type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:ensure_keys\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$mt_qe_workflow_parameters type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:getBrowser\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$projectStruct type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Tools\\Utils\:\:mysqlTimestamp\(\) has parameter \$time with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$subfiltering_handlers type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:removeEmptyStringFromTail\(\) has parameter \$array with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\GetContributionRequest\:\:\$user type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:removeEmptyStringFromTail\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/GetContributionRequest.php - - - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType - count: 2 - path: lib/Utils/Contribution/GetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Cannot call method toArray\(\) on string\.$#' - identifier: method.nonObject + message: '#^Method Utils\\Tools\\Utils\:\:returnSourcePageAsInt\(\) has parameter \$url with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/SetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Contribution\\SetContributionRequest\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Utils\\Tools\\Utils\:\:trimAndLowerCase\(\) has parameter \$string with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Contribution/SetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Contribution\\SetContributionRequest\:\:getProp\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\Tools\\Utils\:\:underscoreToCamelCase\(\) has parameter \$string with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Contribution/SetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^PHPDoc tag @var has invalid value \(\$props Params\)\: Unexpected token "\$props", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Utils\\Tools\\Utils\:\:upCountName\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Utils/Contribution/SetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$cached_results type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:upCountNameCallback\(\) has parameter \$matches with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/SetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Contribution\\SetContributionRequest\:\:\$props type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Tools\\Utils\:\:validateEmailList\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Contribution/SetContributionRequest.php + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Currency\\ChangeRatesFetcher\:\:fetchChangeRates\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Tools\\Utils\:\:verifyPass\(\) has parameter \$clear_pass with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Currency/ChangeRatesFetcher.php + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Currency\\TranslatedChangeRatesFetcher\:\:fetchChangeRates\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Tools\\Utils\:\:verifyPass\(\) has parameter \$db_hashed_pass with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Currency/TranslatedChangeRatesFetcher.php + path: lib/Utils/Tools/Utils.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string given\.$#' - identifier: argument.type + message: '#^Method Utils\\Tools\\Utils\:\:verifyPass\(\) has parameter \$salt with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Currency/TranslatedChangeRatesFetcher.php + path: lib/Utils/Tools/Utils.php - - message: '#^Property Utils\\Currency\\ChangeRatesFetcher\:\:\$changeRates \(string\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Offset ''browser'' might not exist on array\{\}\|array\{0\: list\, browser\: list\, 1\: list\, version\: list\, 2\: list\\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Currency/TranslatedChangeRatesFetcher.php + path: lib/Utils/Tools/Utils.php - - message: '#^Strict comparison using \!\=\= between null and null will always evaluate to false\.$#' - identifier: notIdentical.alwaysFalse + message: '#^Offset ''line'' might not exist on array\{function\: string, line\?\: int, file\?\: string, class\?\: class\-string, type\?\: ''\-\>''\|''\:\:'', args\?\: list\, object\?\: object\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Date/DateTimeUtil.php + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:_buildHTMLMessage\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Parameter \#1 \$number of static method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:revisionNumberToSourcePage\(\) expects int\|null, string given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:_buildMessageContent\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Parameter \#1 \$string of function strip_tags expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:_buildTxtMessage\(\) has parameter \$messageBody with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Email/AbstractEmail.php + message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:_buildTxtMessage\(\) should return string but returns string\|null\.$#' - identifier: return.type - count: 1 - path: lib/Utils/Email/AbstractEmail.php + message: '#^Parameter \#1 \$url of static method Utils\\Tools\\Utils\:\:returnSourcePageAsInt\(\) expects array, array\\|false given\.$#' + identifier: argument.type + count: 2 + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:_enqueueEmailDelivery\(\) has parameter \$mailConf with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \.\.\.\$arrays of function array_merge expects array, array\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Tools/Utils.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:analyze\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:analyze\(\) has parameter \$params with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:appRoot\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\AbstractEmail\:\:doSend\(\) has parameter \$address with no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:downloadOriginal\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Parameter \#1 \$string of function html_entity_decode expects string, array\\|string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:downloadTranslation\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:downloadXliff\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/AbstractEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, array\\|string\|null given\.$#' - identifier: argument.type - count: 3 - path: lib/Utils/Email/AbstractEmail.php + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:httpHost\(\) has parameter \$params with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\BaseCommentEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:inviteToTeamConfirm\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/BaseCommentEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:inviteToTeamConfirm\(\) has parameter \$requestInfo with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/BaseCommentEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\CommentEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:passwordReset\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/CommentEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\CommentMentionEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:pluginsBase\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/CommentMentionEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\CommentResolveEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:revise\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/CommentResolveEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\ForgotPasswordEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:signupConfirmation\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/ForgotPasswordEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\ForgotPasswordEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\CanonicalRoutes\:\:translate\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/ForgotPasswordEmail.php + path: lib/Utils/Url/CanonicalRoutes.php - - message: '#^Method Utils\\Email\\ForgotPasswordEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\JobUrlBuilder\:\:createFromJobStruct\(\) has parameter \$options with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/ForgotPasswordEmail.php + path: lib/Utils/Url/JobUrlBuilder.php - - message: '#^Parameter \#1 \$confirmation_token of static method Utils\\Url\\CanonicalRoutes\:\:passwordReset\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Url\\JobUrlBuilder\:\:createFromJobStructAndProjectName\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/ForgotPasswordEmail.php + path: lib/Utils/Url/JobUrlBuilder.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$jid of class Utils\\Url\\JobUrls constructor expects int, int\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/Email/ForgotPasswordEmail.php + path: lib/Utils/Url/JobUrlBuilder.php - - message: '#^Method Utils\\Email\\InvitedToTeamEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Url\\JobUrls\:\:__construct\(\) has parameter \$passwords with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/InvitedToTeamEmail.php + path: lib/Utils/Url/JobUrls.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Url\\JobUrls\:\:getUrls\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/InvitedToTeamEmail.php + path: lib/Utils/Url/JobUrls.php - - message: '#^Method Utils\\Email\\MembershipCreatedEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Url\\JobUrls\:\:\$passwords type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/MembershipCreatedEmail.php + path: lib/Utils/Url/JobUrls.php - - message: '#^Method Utils\\Email\\MembershipCreatedEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Url\\JobUrls\:\:\$urls type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/MembershipCreatedEmail.php + path: lib/Utils/Url/JobUrls.php - - message: '#^Method Utils\\Email\\MembershipCreatedEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Validator\\Contracts\\AbstractValidator\:\:\$errors type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/MembershipCreatedEmail.php + path: lib/Utils/Validator/Contracts/AbstractValidator.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Class Utils\\Validator\\Contracts\\ValidatorObject implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Utils/Email/MembershipCreatedEmail.php + path: lib/Utils/Validator/Contracts/ValidatorObject.php - - message: '#^Method Utils\\Email\\MembershipDeletedEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Validator\\Contracts\\ValidatorObject\:\:fromArray\(\) has parameter \$array with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/MembershipDeletedEmail.php + path: lib/Utils/Validator/Contracts/ValidatorObject.php - - message: '#^Method Utils\\Email\\MembershipDeletedEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\Validator\\Contracts\\ValidatorObject\:\:\$store type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/MembershipDeletedEmail.php + path: lib/Utils/Validator/Contracts/ValidatorObject.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static + count: 2 + path: lib/Utils/Validator/Contracts/ValidatorObject.php + + - + message: '#^Access to an undefined property Utils\\Validator\\Contracts\\ValidatorObject\:\:\$csv\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Email/MembershipDeletedEmail.php + path: lib/Utils/Validator/GlossaryCSVValidator.php - - message: '#^Method Utils\\Email\\ProjectAssignedEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Validator\\GlossaryCSVValidator\:\:getHeaders\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/ProjectAssignedEmail.php + path: lib/Utils/Validator/GlossaryCSVValidator.php - - message: '#^Method Utils\\Email\\ProjectAssignedEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Validator\\GlossaryCSVValidator\:\:validateLanguages\(\) has parameter \$headers with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/ProjectAssignedEmail.php + path: lib/Utils/Validator/GlossaryCSVValidator.php - - message: '#^Method Utils\\Email\\ProjectAssignedEmail\:\:_getTemplateVariables\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Utils\\Validator\\JSONSchema\\Errors\\JSONValidatorException\:\:getFormattedError\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/ProjectAssignedEmail.php + path: lib/Utils/Validator/JSONSchema/Errors/JSONValidatorException.php - - message: '#^Parameter \#1 \$id_job of method Model\\WordCount\\WordCountStruct\:\:setIdJob\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Utils\\Validator\\JSONSchema\\Errors\\JSONValidatorException\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/ProjectAssignedEmail.php + path: lib/Utils/Validator/JSONSchema/Errors/JSONValidatorException.php - - message: '#^Parameter \#1 \$job_password of method Model\\WordCount\\WordCountStruct\:\:setJobPassword\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Utils\\Validator\\JSONSchema\\Errors\\JSONValidatorException\:\:\$error on left side of \?\? is not nullable nor uninitialized\.$#' + identifier: nullCoalesce.initializedProperty count: 1 - path: lib/Utils/Email/ProjectAssignedEmail.php + path: lib/Utils/Validator/JSONSchema/Errors/JSONValidatorException.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$message of method Exception\:\:__construct\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/Email/ProjectAssignedEmail.php + path: lib/Utils/Validator/JSONSchema/Errors/JsonValidatorGenericException.php - - message: '#^Method Utils\\Email\\SendToTranslatorAbstract\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Swaggest\\JsonSchema\\RemoteRefProvider@anonymous/lib/Utils/Validator/JSONSchema/JSONValidator\.php\:49\:\:getSchemaData\(\) should return stdClass but returns object\.$#' + identifier: return.type count: 1 - path: lib/Utils/Email/SendToTranslatorAbstract.php + path: lib/Utils/Validator/JSONSchema/JSONValidator.php - - message: '#^Method Utils\\Email\\SendToTranslatorAbstract\:\:_offsetToTimeZone\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Utils\\Validator\\JSONSchema\\JSONValidator\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Email/SendToTranslatorAbstract.php + path: lib/Utils/Validator/JSONSchema/JSONValidator.php - - message: '#^Method Utils\\Email\\SendToTranslatorAbstract\:\:_offsetToTimeZone\(\) has parameter \$offset with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\Validator\\JSONSchema\\JSONValidator\:\:getValidJSONSchema\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Email/SendToTranslatorAbstract.php + path: lib/Utils/Validator/JSONSchema/JSONValidator.php - - message: '#^Parameter \#1 \$callback of function call_user_func expects callable\(\)\: mixed, array given\.$#' + message: '#^Parameter \#1 \$jsonSchema of static method Utils\\Validator\\JSONSchema\\JSONValidator\:\:getValidJSONSchema\(\) expects string, string\|false given\.$#' identifier: argument.type - count: 1 - path: lib/Utils/Email/SendToTranslatorAbstract.php + count: 2 + path: lib/Utils/Validator/JSONSchema/JSONValidator.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Argument of an invalid type object supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Utils/Email/SendToTranslatorAbstract.php + path: lib/Utils/Validator/JSONSchema/JSONValidatorObject.php - - message: '#^Property Utils\\Email\\SendToTranslatorAbstract\:\:\$_RoutesMethod type has no value type specified in iterable type array\.$#' + message: '#^Method Utils\\Validator\\JSONSchema\\JSONValidatorObject\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/SendToTranslatorAbstract.php + path: lib/Utils/Validator/JSONSchema/JSONValidatorObject.php - - message: '#^Method Utils\\Email\\SendToTranslatorForDeliveryChangeEmail\:\:__construct\(\) has parameter \$projectName with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\XliffReplacer\\SilentXliffReplacerCallback\:\:thereAreErrors\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' + identifier: throws.unusedType count: 1 - path: lib/Utils/Email/SendToTranslatorForDeliveryChangeEmail.php + path: lib/Utils/XliffReplacer/SilentXliffReplacerCallback.php - - message: '#^Method Utils\\Email\\SendToTranslatorForJobSplitEmail\:\:__construct\(\) has parameter \$projectName with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot access property \$target on Model\\Jobs\\JobStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Utils/Email/SendToTranslatorForJobSplitEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Method Utils\\Email\\SendToTranslatorForNewJobEmail\:\:__construct\(\) has parameter \$projectName with no type specified\.$#' - identifier: missingType.parameter + message: '#^Cannot call method getProject\(\) on Model\\Jobs\\JobStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/Email/SendToTranslatorForNewJobEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Method Utils\\Email\\SignupEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\XliffReplacer\\XliffReplacerCallback\:\:icuEnabled\(\) should return bool but returns string\|false\.$#' + identifier: return.type count: 1 - path: lib/Utils/Email/SignupEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Method Utils\\Email\\SignupEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Utils\\XliffReplacer\\XliffReplacerCallback\:\:icuEnabled\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Email/SignupEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Method Utils\\Email\\SignupEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Email/SignupEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Parameter \#1 \$confirmation_token of static method Utils\\Url\\CanonicalRoutes\:\:signupConfirmation\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$sourceValidator of static method Matecat\\ICU\\MessagePatternComparator\:\:fromValidators\(\) expects Matecat\\ICU\\MessagePatternValidator, Matecat\\ICU\\MessagePatternValidator\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/Email/SignupEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#2 \$chunk of method Utils\\XliffReplacer\\XliffReplacerCallback\:\:sourceContainsIcu\(\) expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/Email/SignupEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Method Utils\\Email\\WelcomeEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Email/WelcomeEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Method Utils\\Email\\WelcomeEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\XliffReplacer\\XliffReplacerCallback\:\:\$icuEnabled \(bool\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/Email/WelcomeEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Method Utils\\Email\\WelcomeEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Utils\\XliffReplacer\\XliffReplacerCallback\:\:\$jobStruct \(Model\\Jobs\\JobStruct\|null\) is never assigned null so it can be removed from the property type\.$#' + identifier: property.unusedType count: 1 - path: lib/Utils/Email/WelcomeEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Method Utils\\Email\\WelcomeEmail\:\:send\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Utils\\XliffReplacer\\XliffReplacerCallback\:\:\$subfilteringCustomHandlers type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Email/WelcomeEmail.php + path: lib/Utils/XliffReplacer/XliffReplacerCallback.php - - message: '#^Parameter \#2 \$subject of method Utils\\Email\\AbstractEmail\:\:doSend\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Utils/Email/WelcomeEmail.php + message: '#^Call to function is_numeric\(\) with int will always evaluate to true\.$#' + identifier: function.alreadyNarrowedType + count: 2 + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - message: '#^Cannot assign offset ''client_secret'' to array\|string\|null\.$#' - identifier: offsetAssign.dimType + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:__construct\(\) has parameter \$projectName with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:GoogleTranslateFallback\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:GoogleTranslateFallback\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:getEngines\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php - - - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:getMemoryKeys\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:getPassword\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:__get\(\) has parameter \$key with no type specified\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:hasFile\(\) has parameter \$id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:__set\(\) has parameter \$key with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:__set\(\) has parameter \$value with no type specified\.$#' + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType + count: 2 + path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + + - + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisFile.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Utils/Engines/AbstractEngine.php + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$id_file_part with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/View/API/App/Json/Analysis/AnalysisFile.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:_call\(\) has parameter \$curl_options with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$metadata with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisFile.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:_composeMTResponseAsMatch\(\) has parameter \$decoded with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisFile.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:_composeMTResponseAsMatch\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$original_name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisFile.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/AbstractEngine.php + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: lib/View/API/App/Json/Analysis/AnalysisFile.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisFile.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:_setAdditionalCurlParams\(\) has parameter \$curlOptParams with no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:\$metadata type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisFile.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:call\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFileMetadata\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisFileMetadata.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:deleteMemory\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' - identifier: throws.unusedType + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisJob\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisJob.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:deleteMemory\(\) has parameter \$memoryKey with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisJobSummary\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisJobSummary.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisMatch\:\:__construct\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisMatch.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:getConfigStruct\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisMatch\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisMatch.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Unsafe usage of new static\(\)\.$#' + identifier: new.static count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisMatch.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:getCurlFile\(\) has parameter \$file with no type specified\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProject\:\:getJob\(\) has parameter \$id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisProject.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:getMemoryIfMine\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProject\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisProject.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:getName\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProjectSummary\:\:getEstimatedWorkTime\(\) is unused\.$#' + identifier: method.unused count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisProjectSummary.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:memoryExists\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' - identifier: throws.unusedType + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProjectSummary\:\:getEstimatedWorkTime\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisProjectSummary.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:memoryExists\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProjectSummary\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/Analysis/AnalysisProjectSummary.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:syncMemories\(\) has parameter \$projectRow with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:__construct\(\) has parameter \$data with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/ConnectedService.php - - message: '#^Method Utils\\Engines\\AbstractEngine\:\:syncMemories\(\) has parameter \$segments with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/ConnectedService.php - - message: '#^PHPDoc tag @param for parameter \$bool with type bool\|null is not subtype of native type bool\.$#' - identifier: parameter.phpDocType + message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/ConnectedService.php - - message: '#^PHPDoc tag @var has invalid value \(\$gtEngine GoogleTranslate\)\: Unexpected token "\$gtEngine", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:render\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/ConnectedService.php - - message: '#^Parameter \#1 \$filename of class CURLFile constructor expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/ConnectedService.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string\|null given\.$#' - identifier: argument.type + message: '#^Method View\\API\\App\\Json\\OutsourceConfirmation\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/OutsourceConfirmation.php - - message: '#^Parameter \#1 \$tokenHash of method Utils\\Network\\MultiCurlHandler\:\:hasError\(\) expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Engines/AbstractEngine.php + message: '#^Method View\\API\\App\\Json\\Ping\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/View/API/App/Json/Ping.php - - message: '#^Parameter \#2 \$array of function array_key_exists expects array, array\|string\|null given\.$#' - identifier: argument.type - count: 4 - path: lib/Utils/Engines/AbstractEngine.php + message: '#^Method View\\API\\App\\Json\\UserProfile\:\:renderItem\(\) has parameter \$userMetadata with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/View/API/App/Json/UserProfile.php - - message: '#^Parameter \#3 \$function of method Utils\\Engines\\AbstractEngine\:\:_decode\(\) expects null, string given\.$#' - identifier: argument.type + message: '#^Method View\\API\\App\\Json\\UserProfile\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/UserProfile.php - - message: '#^Property Utils\\Engines\\AbstractEngine\:\:\$_config type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\App\\Json\\UserProfile\:\:renderItem\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/App/Json/UserProfile.php - - message: '#^Property Utils\\Engines\\AbstractEngine\:\:\$curl_additional_params type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\Commons\\Error\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/Commons/Error.php - - message: '#^Property Utils\\Engines\\AbstractEngine\:\:\$error type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\Commons\\Error\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/AbstractEngine.php + path: lib/View/API/Commons/Error.php - - message: '#^Method Utils\\Engines\\Altlang\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' - identifier: missingType.parameter + message: '#^Argument of an invalid type array\|View\\API\\Commons\\ZipContentObject supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Altlang\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:__construct\(\) has parameter \$_array_params with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Altlang\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:__set\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Altlang\:\:delete\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:__set\(\) has parameter \$value with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Altlang\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Altlang\:\:get\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:build\(\) has parameter \$_array_params with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Altlang\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:getContent\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Altlang\:\:set\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:setDocumentContentFromFileSystem\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Altlang\:\:update\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:setDocumentContentFromS3\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Property Utils\\Engines\\Altlang\:\:\$_config type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\Commons\\ZipContentObject\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php + + - + message: '#^Parameter \#1 \$filename of function file_get_contents expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType + message: '#^Parameter \#1 \$filename of function is_file expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Altlang.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Access to an undefined property Utils\\Engines\\Apertium\:\:\$client_secret\.$#' - identifier: property.notFound + message: '#^Property View\\API\\Commons\\ZipContentObject\:\:\$document_content \(string\|null\) does not accept string\|false\.$#' + identifier: assign.propertyType count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/Commons/ZipContentObject.php - - message: '#^Method Utils\\Engines\\Apertium\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method View\\API\\V2\\Json\\Activity\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Activity.php - - message: '#^Method Utils\\Engines\\Apertium\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Activity\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Activity.php - - message: '#^Method Utils\\Engines\\Apertium\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Chunk\:\:renderOne\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Chunk.php - - message: '#^Method Utils\\Engines\\Apertium\:\:delete\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method View\\API\\V2\\Json\\CreationStatus\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/CreationStatus.php - - message: '#^Method Utils\\Engines\\Apertium\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\CreationStatus\:\:\$data in isset\(\) is not nullable nor uninitialized\.$#' + identifier: isset.initializedProperty + count: 4 + path: lib/View/API/V2/Json/CreationStatus.php + + - + message: '#^Method View\\API\\V2\\Json\\Engine\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Engine.php - - message: '#^Method Utils\\Engines\\Apertium\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Engine\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Engine.php - - message: '#^Method Utils\\Engines\\Apertium\:\:set\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^PHPDoc tag @var has invalid value \(\$data EngineStruct\[\]\)\: Unexpected token "\$data", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Engine.php - - message: '#^Method Utils\\Engines\\Apertium\:\:update\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Access to an undefined property object\:\:\$warnings_count\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Job.php - - message: '#^PHPDoc tag @property has invalid value \(string client_secret\)\: Unexpected token "client_secret", expected variable at offset 48 on line 3$#' - identifier: phpDoc.parseError + message: '#^Method View\\API\\V2\\Json\\Job\:\:fillUrls\(\) has parameter \$result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Job.php - - message: '#^Property Utils\\Engines\\Apertium\:\:\$_config type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Job\:\:fillUrls\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Job.php - - message: '#^Variable \$original might not be defined\.$#' - identifier: variable.undefined + message: '#^Method View\\API\\V2\\Json\\Job\:\:getKeyList\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Apertium.php + path: lib/View/API/V2/Json/Job.php - - message: '#^Method Utils\\Engines\\DeepL\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Job\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Job.php - - message: '#^Method Utils\\Engines\\DeepL\:\:_getClient\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#1 \$datetime of function strtotime expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Job.php - - message: '#^Method Utils\\Engines\\DeepL\:\:createGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$pid of method Model\\Projects\\ProjectDao\:\:getProjectData\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Job.php - - message: '#^Method Utils\\Engines\\DeepL\:\:createGlossary\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\JobClientKeys\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/JobClientKeys.php - - message: '#^Method Utils\\Engines\\DeepL\:\:delete\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method View\\API\\V2\\Json\\JobClientKeys\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/JobClientKeys.php - - message: '#^Method Utils\\Engines\\DeepL\:\:deleteGlossary\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\JobTranslator\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/JobTranslator.php - - message: '#^Method Utils\\Engines\\DeepL\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/DeepL.php + message: '#^Call to function is_null\(\) with Model\\Users\\UserStruct will always evaluate to false\.$#' + identifier: function.impossibleType + count: 2 + path: lib/View/API/V2/Json/Membership.php - - message: '#^Method Utils\\Engines\\DeepL\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\V2\\Json\\Membership\:\:__construct\(\) has parameter \$data with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Membership.php - - message: '#^Method Utils\\Engines\\DeepL\:\:getGlossary\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\V2\\Json\\Membership\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Membership.php - - message: '#^Method Utils\\Engines\\DeepL\:\:getGlossaryEntries\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Membership\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Membership.php - - message: '#^Method Utils\\Engines\\DeepL\:\:glossaries\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Membership\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Membership.php - - message: '#^Method Utils\\Engines\\DeepL\:\:set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method View\\API\\V2\\Json\\Membership\:\:renderItemPublic\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Membership.php - - message: '#^Method Utils\\Engines\\DeepL\:\:update\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method View\\API\\V2\\Json\\Membership\:\:renderPublic\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL.php + path: lib/View/API/V2/Json/Membership.php - - message: '#^Using nullsafe property access "\?\-\>value" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' - identifier: nullsafe.neverNull - count: 3 - path: lib/Utils/Engines/DeepL.php + message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject + count: 1 + path: lib/View/API/V2/Json/MemoryKeys.php - - message: '#^Comparison operation "\>" between 2 and 0 is always true\.$#' - identifier: greater.alwaysTrue + message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/MemoryKeys.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:allGlossaries\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method isShared\(\) on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/MemoryKeys.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:allGlossaries\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method View\\API\\V2\\Json\\MemoryKeys\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/MemoryKeys.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:createGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\MemoryKeys\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/MemoryKeys.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:createGlossary\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Project\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/Project.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:createGlossary\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method View\\API\\V2\\Json\\Project\:\:render\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/Project.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:deleteGlossary\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Project\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/Project.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:deleteGlossary\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^PHPDoc tag @var has invalid value \(\$jobJSON Job\)\: Unexpected token "\$jobJSON", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/Project.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:getGlossary\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Parameter \#1 \$pid of static method Model\\Projects\\ProjectDao\:\:getProjectAndJobData\(\) expects int, int\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/View/API/V2/Json/Project.php + + - + message: '#^Method View\\API\\V2\\Json\\ProjectUrls\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:getGlossary\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method View\\API\\V2\\Json\\ProjectUrls\:\:getData\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:getGlossaryEntries\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\ProjectUrls\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:getGlossaryEntries\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#3 \$password of static method Utils\\Url\\CanonicalRoutes\:\:revise\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:parse\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$chunks type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:send\(\) has parameter \$params with no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$data type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:send\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$files type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:translate\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$formatted type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Method Utils\\Engines\\DeepL\\DeepLApiClient\:\:translate\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$jobs type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/ProjectUrls.php - - message: '#^Parameter \#1 \$body of method Utils\\Engines\\DeepL\\DeepLApiClient\:\:parse\(\) expects string, bool\|string\|null given\.$#' - identifier: argument.type + message: '#^Method View\\API\\V2\\Json\\Propagation\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/Propagation.php - - message: '#^Parameter \#1 \$tokenHash of method Utils\\Network\\MultiCurlHandler\:\:hasError\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method View\\API\\V2\\Json\\QAGlobalWarning\:\:__construct\(\) has parameter \$tagIssues with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/QAGlobalWarning.php - - message: '#^Parameter \#3 \$previous of class Utils\\Engines\\DeepL\\DeepLApiException constructor expects Throwable\|null, string given\.$#' - identifier: argument.type + message: '#^Method View\\API\\V2\\Json\\QAGlobalWarning\:\:__construct\(\) has parameter \$translationMismatches with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/QAGlobalWarning.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method View\\API\\V2\\Json\\QAGlobalWarning\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/DeepL/DeepLApiClient.php + path: lib/View/API/V2/Json/QAGlobalWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:delete\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property View\\API\\V2\\Json\\QAGlobalWarning\:\:\$structure type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/QAGlobalWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:deleteMemory\(\) has parameter \$memoryKey with no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\QAGlobalWarning\:\:\$tagIssues type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/QAGlobalWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\QAGlobalWarning\:\:\$translationMismatches type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/QAGlobalWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\QALocalWarning\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/QALocalWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:getMemoryIfMine\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\V2\\Json\\QAWarning\:\:pushErrorSegment\(\) has parameter \$content with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/QAWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:memoryExists\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method View\\API\\V2\\Json\\QAWarning\:\:pushErrorSegment\(\) has parameter \$error_category with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/QAWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:set\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method View\\API\\V2\\Json\\QAWarning\:\:pushErrorSegment\(\) has parameter \$error_type with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/QAWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:syncMemories\(\) has parameter \$projectRow with no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\QAWarning\:\:\$structure type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/QAWarning.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:syncMemories\(\) has parameter \$segments with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Interface Model\\DataAccess\\IDaoStruct referenced with incorrect case\: Model\\DataAccess\\IdaoStruct\.$#' + identifier: interface.nameCase count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/SegmentTranslationIssue.php - - message: '#^Method Utils\\Engines\\EngineInterface\:\:update\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:genCSVTmpFile\(\) has parameter \$data with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/EngineInterface.php + path: lib/View/API/V2/Json/SegmentTranslationIssue.php - - message: '#^Call to function is_numeric\(\) with int will always evaluate to true\.$#' - identifier: function.alreadyNarrowedType + message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:genCSVTmpFile\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/EnginesFactory.php + path: lib/View/API/V2/Json/SegmentTranslationIssue.php - - message: '#^Method Utils\\Engines\\EnginesFactory\:\:createTempInstance\(\) should return Utils\\Engines\\EngineInterface but returns object\.$#' - identifier: return.type + message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:genCSVTmpFile\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/EnginesFactory.php + path: lib/View/API/V2/Json/SegmentTranslationIssue.php - - message: '#^Method Utils\\Engines\\EnginesFactory\:\:getInstance\(\) should return T of Utils\\Engines\\AbstractEngine but returns object\.$#' - identifier: return.type + message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/EnginesFactory.php + path: lib/View/API/V2/Json/SegmentTranslationIssue.php - - message: '#^PHPDoc tag @var has invalid value \(\$engineRecord EngineStruct\)\: Unexpected token "\$engineRecord", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/EnginesFactory.php + path: lib/View/API/V2/Json/SegmentTranslationIssue.php - - message: '#^Parameter \#1 \$_className of static method Utils\\Engines\\EnginesFactory\:\:getFullyQualifiedClassName\(\) expects string, string\|null given\.$#' + message: '#^Parameter \#2 \$timestamp of function date expects int\|null, int\|false given\.$#' identifier: argument.type count: 2 - path: lib/Utils/Engines/EnginesFactory.php + path: lib/View/API/V2/Json/SegmentTranslationIssue.php - - message: '#^Method Utils\\Engines\\GoogleTranslate\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToLayer2\(\)\.$#' + identifier: method.notFound + count: 2 + path: lib/View/API/V2/Json/SegmentTranslationMismatches.php - - message: '#^Method Utils\\Engines\\GoogleTranslate\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\SegmentTranslationMismatches\:\:__construct\(\) has parameter \$Translation_mismatches with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + path: lib/View/API/V2/Json/SegmentTranslationMismatches.php - - message: '#^Method Utils\\Engines\\GoogleTranslate\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\SegmentTranslationMismatches\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: lib/View/API/V2/Json/SegmentTranslationMismatches.php + + - + message: '#^Method View\\API\\V2\\Json\\SegmentTranslationMismatches\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + path: lib/View/API/V2/Json/SegmentTranslationMismatches.php - - message: '#^Method Utils\\Engines\\GoogleTranslate\:\:delete\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + path: lib/View/API/V2/Json/SegmentTranslationMismatches.php - - message: '#^Method Utils\\Engines\\GoogleTranslate\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + path: lib/View/API/V2/Json/SegmentTranslationMismatches.php - - message: '#^Method Utils\\Engines\\GoogleTranslate\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\SegmentTranslationMismatches\:\:\$data type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + path: lib/View/API/V2/Json/SegmentTranslationMismatches.php - - message: '#^Method Utils\\Engines\\GoogleTranslate\:\:set\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToLayer2\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\GoogleTranslate\:\:update\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Property Utils\\Engines\\GoogleTranslate\:\:\$_config type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/GoogleTranslate.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:renderItem\(\) has parameter \$version with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:_curl_async\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:_curl_async\(\) has parameter \$config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:renderItemsNormal\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:_curl_async\(\) has parameter \$function with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:renderItemsWithIssues\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:_curl_async\(\) has parameter \$parameters with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:_setIntentoUserAgent\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Property View\\API\\V2\\Json\\SegmentVersion\:\:\$featureSet \(Model\\FeaturesBase\\FeatureSet\|null\) is never assigned null so it can be removed from the property type\.$#' + identifier: property.unusedType count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:delete\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Variable \$Filter in PHPDoc tag @var does not match assigned variable \$metadataDao\.$#' + identifier: varTag.differentVariable count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/SegmentVersion.php - - message: '#^Method Utils\\Engines\\Intento\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 1 + path: lib/View/API/V2/Json/Team.php + + - + message: '#^Method View\\API\\V2\\Json\\Team\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/Team.php - - message: '#^Method Utils\\Engines\\Intento\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\Team\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/Team.php - - message: '#^Method Utils\\Engines\\Intento\:\:getProviderList\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method View\\API\\V2\\Json\\Team\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/Team.php - - message: '#^Method Utils\\Engines\\Intento\:\:getProviderList\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^PHPDoc tag @var has invalid value \(\$data TeamStruct\[\]\)\: Unexpected token "\$data", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/Team.php - - message: '#^Method Utils\\Engines\\Intento\:\:getRoutingList\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property View\\API\\V2\\Json\\Team\:\:\$data type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/Team.php - - message: '#^Method Utils\\Engines\\Intento\:\:set\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method View\\API\\V2\\Json\\TranslationIssueComment\:\:render\(\) has parameter \$array with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/TranslationIssueComment.php - - message: '#^Method Utils\\Engines\\Intento\:\:update\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method View\\API\\V2\\Json\\TranslationIssueComment\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/View/API/V2/Json/TranslationIssueComment.php + + - + message: '#^Method View\\API\\V2\\Json\\TranslationIssueComment\:\:renderItem\(\) has parameter \$record with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/TranslationIssueComment.php - - message: '#^Offset ''context'' does not exist on null\.$#' - identifier: offsetAccess.notFound + message: '#^Method View\\API\\V2\\Json\\TranslationIssueComment\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/TranslationIssueComment.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Engines/Intento.php + message: '#^Property View\\API\\V2\\Json\\TranslationIssueComment\:\:\$data has no type specified\.$#' + identifier: missingType.property + count: 1 + path: lib/View/API/V2/Json/TranslationIssueComment.php - - message: '#^Parameter \#2 \$parameters \(null\) of method Utils\\Engines\\Intento\:\:_decode\(\) should be compatible with parameter \$parameters \(array\) of method Utils\\Engines\\AbstractEngine\:\:_decode\(\)$#' - identifier: method.childParameterType + message: '#^Property View\\API\\V2\\Json\\TranslationIssueComment\:\:\$data is unused\.$#' + identifier: property.unused count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/TranslationIssueComment.php - - message: '#^Property Utils\\Engines\\Intento\:\:\$_config type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V2\\Json\\User\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/User.php - - message: '#^Property Utils\\Engines\\Intento\:\:\$apiKey has no type specified\.$#' - identifier: missingType.property + message: '#^Method View\\API\\V2\\Json\\User\:\:renderItemPublic\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/User.php - - message: '#^Property Utils\\Engines\\Intento\:\:\$provider has no type specified\.$#' - identifier: missingType.property + message: '#^Method View\\API\\V2\\Json\\UserMetadata\:\:renderMetadataCollection\(\) has parameter \$collection with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/UserMetadata.php - - message: '#^Property Utils\\Engines\\Intento\:\:\$provider is never read, only written\.$#' - identifier: property.onlyWritten + message: '#^Method View\\API\\V2\\Json\\UserMetadata\:\:renderMetadataCollection\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/UserMetadata.php - - message: '#^Property Utils\\Engines\\Intento\:\:\$providerCategory has no type specified\.$#' - identifier: missingType.property + message: '#^Method View\\API\\V2\\Json\\WaitCreation\:\:render\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V2/Json/WaitCreation.php - - message: '#^Property Utils\\Engines\\Intento\:\:\$providerCategory is never read, only written\.$#' - identifier: property.onlyWritten + message: '#^Access to an undefined property object\:\:\$warnings_count\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Property Utils\\Engines\\Intento\:\:\$providerKey has no type specified\.$#' - identifier: missingType.property + message: '#^Method View\\API\\V3\\Json\\Chunk\:\:getChunkReviews\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Property Utils\\Engines\\Intento\:\:\$providerKey is never read, only written\.$#' - identifier: property.onlyWritten + message: '#^Method View\\API\\V3\\Json\\Chunk\:\:getTimeToEditArray\(\) has parameter \$chunk_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Intento.php + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Argument of an invalid type array\\|string supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method View\\API\\V3\\Json\\Chunk\:\:getTimeToEditArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method View\\API\\V3\\Json\\Chunk\:\:populateRevisePasswords\(\) has parameter \$result with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Cannot access property \$uid on Model\\Users\\UserStruct\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Utils/Engines/Lara.php + message: '#^Method View\\API\\V3\\Json\\Chunk\:\:populateRevisePasswords\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Cannot call method getJobs\(\) on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method View\\API\\V3\\Json\\Chunk\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Cannot call method getText\(\) on Lara\\TextBlock\|string\.$#' - identifier: method.nonObject + message: '#^Method View\\API\\V3\\Json\\Chunk\:\:renderOne\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Cannot call method isTranslatable\(\) on Lara\\TextBlock\|string\.$#' - identifier: method.nonObject + message: '#^Property View\\API\\V3\\Json\\Chunk\:\:\$chunk_reviews type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/Chunk.php - - message: '#^Method Utils\\Engines\\Lara\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + message: '#^Method View\\API\\V3\\Json\\FilesInfo\:\:render\(\) has parameter \$filesStructList with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/FilesInfo.php - - message: '#^Method Utils\\Engines\\Lara\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V3\\Json\\FilesInfo\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/FilesInfo.php - - message: '#^Method Utils\\Engines\\Lara\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:getDetails\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:configureContribution\(\) has parameter \$config with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) has parameter \$categories with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:configureContribution\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) has parameter \$passfail with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:delete\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) has parameter \$quality_overall with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:delete\(\) should return bool but return statement is missing\.$#' - identifier: return.missing + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) has parameter \$reviseIssues with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:deleteMemory\(\) has parameter \$memoryKey with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:render\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:get\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:revisionQualityVars\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:getAvailableLanguages\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$idJob of static method View\\API\\V3\\Json\\QualitySummary\:\:getDetails\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$job_id of method Model\\QualityReport\\QualityReportDao\:\:getReviseIssuesByChunk\(\) expects int, int\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:getMemoryIfMine\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$password of method Model\\QualityReport\\QualityReportDao\:\:getReviseIssuesByChunk\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:getMemoryIfMine\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Parameter \#2 \$password of static method View\\API\\V3\\Json\\QualitySummary\:\:getDetails\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/API/V3/Json/QualitySummary.php - - message: '#^Method Utils\\Engines\\Lara\:\:memoryExists\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method UploadHandler\:\:__construct\(\) has parameter \$files with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\:\:reMapKeyList\(\) has parameter \$_keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method UploadHandler\:\:_isRightExtension\(\) has parameter \$fileUp with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\:\:reMapKeyList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method UploadHandler\:\:_isRightMime\(\) has parameter \$fileUp with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\:\:set\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method UploadHandler\:\:getMimeContentType\(\) should return bool\|string but returns string\|null\.$#' + identifier: return.type + count: 1 + path: lib/View/fileupload/UploadHandler.php + + - + message: '#^Method UploadHandler\:\:get_file_object\(\) has parameter \$file_name with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\:\:syncMemories\(\) has parameter \$projectRow with no value type specified in iterable type array\.$#' + message: '#^Method UploadHandler\:\:get_file_objects\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\:\:syncMemories\(\) has parameter \$segments with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method UploadHandler\:\:normalFileDelete\(\) has parameter \$file_name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\:\:update\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method UploadHandler\:\:normalFileDelete\(\) has parameter \$segmentationRule with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\:\:validateLaraStyle\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method UploadHandler\:\:normalFileDelete\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/View/fileupload/UploadHandler.php + + - + message: '#^Method UploadHandler\:\:normalFileDelete\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: lib/View/fileupload/UploadHandler.php + + - + message: '#^Method UploadHandler\:\:normalFileDelete\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Parameter \#1 \$body of class Stomp\\Transport\\Message constructor expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method UploadHandler\:\:set_file_delete_url\(\) has parameter \$file with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Parameter \#1 \$data of function unserialize expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method UploadHandler\:\:up_count_name\(\) should return string but returns string\|null\.$#' + identifier: return.type count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method UploadHandler\:\:up_count_name_callback\(\) has parameter \$matches with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Return type \(array\) of method Utils\\Engines\\Lara\:\:get\(\) should be compatible with return type \(Utils\\Engines\\Results\\TMSAbstractResponse\) of method Utils\\Engines\\EngineInterface\:\:get\(\)$#' - identifier: method.childReturnType - count: 2 - path: lib/Utils/Engines/Lara.php + message: '#^Method UploadHandler\:\:zipFileDelete\(\) has parameter \$file_name with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/View/fileupload/UploadHandler.php - - message: '#^Variable \$glossaries in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable + message: '#^Method UploadHandler\:\:zipFileDelete\(\) has parameter \$segmentationRule with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Variable \$laraGlossariesArray in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Method UploadHandler\:\:zipFileDelete\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\\HeaderField\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method UploadHandler\:\:zipFileDelete\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara/HeaderField.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Class Utils\\Engines\\Lara\\Headers implements generic interface Iterator but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) has parameter \$file_name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara/Headers.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\\Headers\:\:getArrayCopy\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) has parameter \$segmentationRule with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: lib/View/fileupload/UploadHandler.php + + - + message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Lara/Headers.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Property Utils\\Engines\\Lara\\Headers\:\:\$keys type has no value type specified in iterable type array\.$#' + message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Lara/Headers.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\Lara\\HttpClientInterface\:\:authenticate\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Lara/HttpClientInterface.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Parameter \#1 \$baseUrl of method Lara\\Internal\\HttpClient\:\:__construct\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Offset ''extension'' might not exist on array\{dirname\?\: string, basename\: string, extension\?\: string, filename\: string\}\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Engines/Lara/LaraClient.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Access to an undefined property Model\\DataAccess\\IDaoStruct\:\:\$value\.$#' - identifier: property.notFound + message: '#^Offset ''extension'' might not exist on array\|string\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable - count: 2 - path: lib/Utils/Engines/MMT.php + message: '#^Parameter \#1 \$fileName of static method UploadHandler\:\:_validateFileName\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/View/fileupload/UploadHandler.php - - message: '#^Cannot access offset ''secret_key'' on array\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Parameter \#1 \$finfo of function finfo_close expects finfo, finfo\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$finfo of function finfo_file expects finfo, finfo\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Cannot access property \$uid on Model\\Users\\UserStruct\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Utils/Engines/MMT.php + message: '#^Parameter \#1 \$path of static method Model\\FilesStorage\\AbstractFilesStorage\:\:pathinfo_fix\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: lib/View/fileupload/UploadHandler.php - - message: '#^Cannot call method getJobs\(\) on Model\\Projects\\ProjectStruct\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$stream of function fclose expects resource, resource\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\MMT\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Engines/MMT.php + message: '#^Parameter \#1 \$stream of function fread expects resource, resource\|false given\.$#' + identifier: argument.type + count: 2 + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\MMT\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$string of function rawurlencode expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\MMT\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$value of function count expects array\|Countable, list\\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\MMT\:\:_reMapKeyList\(\) has parameter \$_keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT.php + message: '#^Parameter \#2 \$offset of function substr expects int, int\|false given\.$#' + identifier: argument.type + count: 3 + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\MMT\:\:_reMapKeyList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#2 \$subject of function preg_match expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\MMT\:\:_reMapKeyStructsList\(\) has parameter \$keyList with no value type specified in iterable type array\.$#' + message: '#^Property UploadHandler\:\:\$files type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\MMT\:\:_reMapKeyStructsList\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property UploadHandler\:\:\$options type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/MMT.php + path: lib/View/fileupload/UploadHandler.php - - message: '#^Method Utils\\Engines\\MMT\:\:checkAccount\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Utils/Engines/MMT.php + message: '#^Access to an undefined property object\:\:\$segment\.$#' + identifier: property.notFound + count: 2 + path: plugins/airbnb/lib/Features/Airbnb.php - - message: '#^Method Utils\\Engines\\MMT\:\:configureContribution\(\) has parameter \$config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT.php + message: '#^Method Features\\Airbnb\:\:filterContributionStructOnMTSet\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: plugins/airbnb/lib/Features/Airbnb.php - - message: '#^Method Utils\\Engines\\MMT\:\:configureContribution\(\) never returns null so it can be removed from the return type\.$#' - identifier: return.unusedType + message: '#^Call to an undefined method Controller\\Views\\TemplateDecorator\\Arguments\\ArgumentInterface\:\:getJob\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/airbnb/lib/Features/Airbnb/Decorator/CatDecorator.php - - message: '#^Method Utils\\Engines\\MMT\:\:configureContribution\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method Controller\\Views\\TemplateDecorator\\Arguments\\ArgumentInterface\:\:isRevision\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/airbnb/lib/Features/Airbnb/Decorator/CatDecorator.php - - message: '#^Method Utils\\Engines\\MMT\:\:connectKeys\(\) has parameter \$keyList with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT.php + message: '#^Method Features\\Airbnb\\Model\\SegmentDelivery\\SegmentDeliveryDao\:\:isAJobDeliverable\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/airbnb/lib/Features/Airbnb/Model/SegmentDelivery/SegmentDeliveryDao.php - - message: '#^Method Utils\\Engines\\MMT\:\:connectKeys\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\:\:getConfigs\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:createMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\:\:getConfigs\(\) has parameter \$app with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:delete\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method Features\\Aligner\:\:getConfigs\(\) has parameter \$request with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:delete\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\:\:getConfigs\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:deleteMemory\(\) has parameter \$memoryKey with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\:\:getConfigs\(\) has parameter \$service with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\:\:homeRoute\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:deleteMemory\(\) should return array but returns array\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\:\:homeRoute\(\) has parameter \$app with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\:\:homeRoute\(\) has parameter \$request with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:get\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\:\:homeRoute\(\) has parameter \$response with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:get\(\) should return array but returns array\|Utils\\Engines\\Results\\TMSAbstractResponse\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\:\:homeRoute\(\) has parameter \$service with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:getAllMemories\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\:\:loadRoutes\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner.php - - message: '#^Method Utils\\Engines\\MMT\:\:getAvailableLanguages\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Controller\\AlignerController\:\:\$dbHandler has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/AlignerController.php - - message: '#^Method Utils\\Engines\\MMT\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$template_base_path\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/HomeController.php - - message: '#^Method Utils\\Engines\\MMT\:\:getContext\(\) has parameter \$targets with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$x_nonce_unique_id\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/HomeController.php - - message: '#^Method Utils\\Engines\\MMT\:\:getContext\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Controller\\HomeController\:\:setView\(\) has parameter \$params with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/MMT.php - - - - message: '#^Method Utils\\Engines\\MMT\:\:getG2FallbackSecretKey\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/HomeController.php - - message: '#^Method Utils\\Engines\\MMT\:\:getMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Features\\Aligner\\Controller\\JobActionController\:\:\$project\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:getMemoryIfMine\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:getOperations\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:getMemoryIfMine\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:getResponse\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:importGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:getUndoActionsParams\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:importGlossary\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:pushOperation\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:importJobStatus\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:pushOperation\(\) has parameter \$operation with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:importMemory\(\) with return type void returns null but should not return anything\.$#' - identifier: return.void - count: 1 - path: lib/Utils/Engines/MMT.php + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:pushOperation\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:memoryExists\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:setUndoActionsParams\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:set\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:setUndoActionsParams\(\) has parameter \$params with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:syncMemories\(\) has parameter \$projectRow with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobActionController\:\:setUndoActionsParams\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:syncMemories\(\) has parameter \$segments with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Controller\\JobActionController\:\:\$job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:update\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Features\\Aligner\\Controller\\JobActionController\:\:\$operations has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:updateGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Controller\\JobActionController\:\:\$undo_actions_params has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobActionController.php - - message: '#^Method Utils\\Engines\\MMT\:\:updateGlossary\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot call method toArray\(\) on Features\\Aligner\\Model\\Projects_ProjectStruct\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\:\:updateMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:checkProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - - message: '#^Offset ''keys'' might not exist on array\|null\.$#' - identifier: offsetAccess.notFound - count: 1 - path: lib/Utils/Engines/MMT.php + - + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:checkProgress\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Offset ''score'' might not exist on array\|null\.$#' - identifier: offsetAccess.notFound - count: 1 - path: lib/Utils/Engines/MMT.php + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:checkProgress\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Offset ''segment'' might not exist on array\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:checkProgress\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Offset ''source'' might not exist on array\|null\.$#' - identifier: offsetAccess.notFound - count: 3 - path: lib/Utils/Engines/MMT.php + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:checkProgress\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Offset ''target'' might not exist on array\|null\.$#' - identifier: offsetAccess.notFound - count: 3 - path: lib/Utils/Engines/MMT.php + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getNumbersOfPreviousQueues\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Offset ''translation'' might not exist on array\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getNumbersOfPreviousQueues\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Offset ''vectors'' might not exist on array\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getNumbersOfPreviousQueues\(\) has parameter \$projects_in_queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Offset 0 might not exist on array\|null\.$#' - identifier: offsetAccess.notFound - count: 2 - path: lib/Utils/Engines/MMT.php + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getProgress\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^PHPDoc tag @property has invalid value \(int id\)\: Unexpected token "id", expected variable at offset 103 on line 7$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Parameter \#1 \$_config of method Utils\\Engines\\AbstractEngine\:\:GoogleTranslateFallback\(\) expects array, array\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getProjectsInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Parameter \#1 \$filename of function file_exists expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getProjectsInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Parameter \#1 \$filename of function parse_ini_file expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:set\(\) expects int, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getRedisClient\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Parameter \#2 \$array of function array_key_exists expects array, array\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Property Utils\\Engines\\MMT\:\:\$_config type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:getSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Return type \(array\) of method Utils\\Engines\\MMT\:\:get\(\) should be compatible with return type \(Utils\\Engines\\Results\\TMSAbstractResponse\) of method Utils\\Engines\\EngineInterface\:\:get\(\)$#' - identifier: method.childReturnType + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:information\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php + + - + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:information\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Using nullsafe property access "\?\-\>value" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' - identifier: nullsafe.neverNull + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:popProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Comparison operation "\>" between int\<2, 7\> and 0 is always true\.$#' - identifier: greater.alwaysTrue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:popProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Loose comparison using \=\= between true and 1 will always evaluate to true\.$#' - identifier: equal.alwaysTrue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:popProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:addToMemoryContent\(\) has parameter \$id with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:pushProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:addToMemoryContent\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:pushProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:connectMemories\(\) has parameter \$externalIds with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:pushProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:connectMemories\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:setRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:createMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:setRedisClient\(\) has parameter \$redisClient with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:deleteMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:updateProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getAllMemories\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:updateProgress\(\) has parameter \$progress with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getAvailableLanguages\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:updateProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromFile\(\) has parameter \$hints with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:updateSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromFile\(\) has parameter \$targets with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:updateSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromFile\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:updateSegmentsCount\(\) has parameter \$segment_count with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromText\(\) has parameter \$hints with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobController\:\:updateSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromText\(\) has parameter \$targets with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$job Jobs_JobStruct\)\: Unexpected token "\$job", expected type at offset 16 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getContextVectorFromText\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$redisClient ClientContextInterface\)\: Unexpected token "\$redisClient", expected type at offset 16 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getImportJob\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Controller\\JobController\:\:\$job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Controller\\JobController\:\:\$project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:getMemoryById\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Controller\\JobController\:\:\$redisClient has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:importGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Unreachable statement \- code above always terminates\.$#' + identifier: deadCode.unreachable + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:importGlossary\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Call to an undefined method object\:\:toArray\(\)\.$#' + identifier: method.notFound + count: 14 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:importIntoMemoryContent\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:addGap\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:importJobStatus\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:addGap\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:me\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:addGap\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:parse\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:addGap\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:qualityEstimation\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:delete\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:send\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:delete\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:send\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:delete\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:signup\(\) has parameter \$email with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:delete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:signup\(\) has parameter \$name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:hide\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:signup\(\) has parameter \$stripeToken with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:hide\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:signup\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:hide\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:translate\(\) has parameter \$hints with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:hide\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:translate\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:merge\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:updateGlossary\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:merge\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:updateGlossary\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:merge\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:updateMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:merge\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php + + - + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:mergeAndAlign\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php + + - + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:mergeAndAlign\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApi\:\:updateMemoryContent\(\) has parameter \$memory_keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:mergeAndAlign\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^PHPDoc tag @param for parameter \$limit with type mixed is not subtype of native type int\|null\.$#' - identifier: parameter.phpDocType + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:mergeAndAlign\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type array\|null\.$#' - identifier: return.phpDocType + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:move\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Parameter \#1 \$body of method Utils\\Engines\\MMT\\MMTServiceApi\:\:parse\(\) expects string, bool\|string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:move\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Parameter \#1 \$filename of class CURLFile constructor expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInEmpty\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Parameter \#1 \$string of function strlen expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInEmpty\(\) has parameter \$referenceMatch with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Parameter \#1 \$tokenHash of method Utils\\Network\\MultiCurlHandler\:\:hasError\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInEmpty\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInEmpty\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApi.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MMT\\MMTServiceApiException\:\:fromJSONResponse\(\) has parameter \$json with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApiException.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInEmpty\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Parameter \#2 \$code of method Exception\:\:__construct\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInFill\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApiException.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Property Utils\\Engines\\MMT\\MMTServiceApiException\:\:\$type has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInFill\(\) has parameter \$referenceMatch with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/MMT/MMTServiceApiException.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Access to an undefined property Utils\\Engines\\MyMemory\:\:\$contribute_relative_url\.$#' - identifier: property.notFound - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInFill\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Cannot access offset ''code'' on 0\|0\.0\|''''\|''0''\|array\{\}\|false\|null\.$#' - identifier: offsetAccess.nonOffsetAccessible - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInFill\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Cannot assign offset ''tags_projection'' to array\|string\|null\.$#' - identifier: offsetAssign.dimType - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:moveInFill\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Cannot call method filter\(\) on Model\\FeaturesBase\\FeatureSet\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:show\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:show\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:show\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:createMyMemoryKey\(\) has no return type specified\.$#' - identifier: missingType.return - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:show\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:delete\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:split\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:fastAnalysis\(\) has parameter \$segs_array with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:split\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:split\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:split\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:getImportStatus\(\) has no return type specified\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:switchAction\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:getImportStatus\(\) has parameter \$uuid with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:switchAction\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:getTagProjection\(\) has parameter \$config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:switchAction\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryCheck\(\) has parameter \$keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobDirectActionController\:\:switchAction\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryDelete\(\) has parameter \$term with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Variable \$new_inverse_order might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryDomains\(\) has parameter \$keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Variable \$new_match_destination might not be defined\.$#' + identifier: variable.undefined + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryGet\(\) has parameter \$keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Variable \$new_match_null might not be defined\.$#' + identifier: variable.undefined + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryKeys\(\) has parameter \$keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Variable \$new_match_order might not be defined\.$#' + identifier: variable.undefined + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:glossarySearch\(\) has parameter \$keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Variable \$referenceMatch might not be defined\.$#' + identifier: variable.undefined + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:glossarySet\(\) has parameter \$term with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Variable \$starting_match might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:glossaryUpdate\(\) has parameter \$term with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Variable \$undo_matches might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobDirectActionController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:set\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to an undefined method Utils\\Engines\\AbstractEngine\:\:createMyMemoryKey\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobTmxController.php - - message: '#^Method Utils\\Engines\\MyMemory\:\:update\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^If condition is always true\.$#' + identifier: if.alwaysTrue count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobTmxController.php - - message: '#^Offset ''tags_projection'' might not exist on array\|string\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Controller\\JobTmxController\:\:pushTMXInTM\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobTmxController.php - - message: '#^Offset 0 on array\{non\-empty\-string, int\<\-1, max\>\} in isset\(\) always exists and is not nullable\.$#' - identifier: isset.offset + message: '#^Method Features\\Aligner\\Controller\\JobTmxController\:\:pushTMXInTM\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobTmxController.php - - message: '#^PHPDoc tag @var has invalid value \(\$match Matches\)\: Unexpected token "\$match", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobTmxController\:\:pushTMXInTM\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobTmxController.php - - message: '#^Parameter \#1 \$url of function parse_url expects string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Utils/Engines/MyMemory.php + message: '#^Method Features\\Aligner\\Controller\\JobTmxController\:\:pushTMXInTM\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobTmxController.php - - message: '#^Property Utils\\Engines\\MyMemory\:\:\$_config type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Controller\\JobTmxController\:\:\$job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobTmxController.php - - message: '#^Strict comparison using \!\=\= between non\-falsy\-string and '''' will always evaluate to true\.$#' - identifier: notIdentical.alwaysTrue + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType count: 1 - path: lib/Utils/Engines/MyMemory.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobTmxController.php - - message: '#^Method Utils\\Engines\\NONE\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/NONE.php + message: '#^Call to an undefined method object\:\:toArray\(\)\.$#' + identifier: method.notFound + count: 13 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\NONE\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Controller\\sortByOrder\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/NONE.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\NONE\:\:delete\(\) has parameter \$_config with no type specified\.$#' + message: '#^Function Features\\Aligner\\Controller\\sortByOrder\(\) has parameter \$a with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/NONE.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\NONE\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Controller\\sortByOrder\(\) has parameter \$b with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/NONE.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\NONE\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Inner named functions are not supported by PHPStan\. Consider refactoring to an anonymous function, class method, or a top\-level\-defined function\. See issue \#165 \(https\://github\.com/phpstan/phpstan/issues/165\) for more details\.$#' + identifier: function.inner count: 1 - path: lib/Utils/Engines/NONE.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\NONE\:\:set\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoDelete\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/NONE.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\NONE\:\:update\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoDelete\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php + + - + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoDelete\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/NONE.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Return type \(Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\) of method Utils\\Engines\\NONE\:\:delete\(\) should be compatible with return type \(bool\) of method Utils\\Engines\\EngineInterface\:\:delete\(\)$#' - identifier: method.childReturnType + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoDelete\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/Engines/NONE.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\ErrorResponse\:\:__construct\(\) has parameter \$result with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHide\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/ErrorResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\ErrorResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHide\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Utils/Engines/Results/ErrorResponse.php - - - - message: '#^Method Utils\\Engines\\Results\\ErrorResponse\:\:get_as_array\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue count: 1 - path: lib/Utils/Engines/Results/ErrorResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MTResponse\:\:__construct\(\) has parameter \$result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHide\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MTResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MTResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHide\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 2 - path: lib/Utils/Engines/Results/MTResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php + + - + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHideBoth\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MTResponse\:\:get_as_array\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHideBoth\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MTResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\AnalyzeResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHideBoth\(\) has parameter \$match with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/AnalyzeResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\AnalyzeResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHideSingle\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/AnalyzeResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\AuthKeyResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHideSingle\(\) has parameter \$id_job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/AuthKeyResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\CheckGlossaryResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoHideSingle\(\) has parameter \$match with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/CheckGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\CheckGlossaryResponse\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMerge\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/CheckGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\CheckGlossaryResponse\:\:\$matches has no type specified\.$#' - identifier: missingType.property - count: 1 - path: lib/Utils/Engines/Results/MyMemory/CheckGlossaryResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMerge\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 7 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMerge\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMerge\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:\$id has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMergeAndAlign\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:\$key has no type specified\.$#' - identifier: missingType.property - count: 1 - path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMergeAndAlign\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 14 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\CreateUserResponse\:\:\$pass has no type specified\.$#' - identifier: missingType.property - count: 1 - path: lib/Utils/Engines/Results/MyMemory/CreateUserResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMergeAndAlign\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\DomainsResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMergeAndAlign\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php + + - + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMove\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/DomainsResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\DomainsResponse\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMove\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/DomainsResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\DomainsResponse\:\:\$entries has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMoveEmpty\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/DomainsResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\ExportResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Engines/Results/MyMemory/ExportResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMoveEmpty\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\ExportResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMoveEmpty\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/ExportResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\ExportResponse\:\:\$id has no type specified\.$#' - identifier: missingType.property - count: 1 - path: lib/Utils/Engines/Results/MyMemory/ExportResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMoveEmpty\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\ExportResponse\:\:\$resourceLink has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMoveFull\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/ExportResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\FileImportAndStatusResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Engines/Results/MyMemory/FileImportAndStatusResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMoveFull\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\FileImportAndStatusResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMoveFull\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Utils/Engines/Results/MyMemory/FileImportAndStatusResponse.php + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\FileImportAndStatusResponse\:\:\$id has no type specified\.$#' - identifier: missingType.property - count: 1 - path: lib/Utils/Engines/Results/MyMemory/FileImportAndStatusResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoMoveFull\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetGlossaryResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoShow\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/GetGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\GetGlossaryResponse\:\:\$matches has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoShow\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/GetGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:__construct\(\) has parameter \$result with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoShow\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoShow\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 2 - path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:buildMyMemoryMatch\(\) has parameter \$match with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoSplit\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:get_matches_as_array\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoSplit\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:get_matches_as_array\(\) has parameter \$subfiltering_handlers with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoSplit\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\GetMemoryResponse\:\:get_matches_as_array\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/Results/MyMemory/GetMemoryResponse.php + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoSplit\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\KeysGlossaryResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoSwitchAction\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/KeysGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\KeysGlossaryResponse\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoSwitchAction\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/KeysGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\KeysGlossaryResponse\:\:\$entries has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoSwitchAction\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php + + - + message: '#^Method Features\\Aligner\\Controller\\JobUndoActionController\:\:undoSwitchAction\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php + + - + message: '#^Offset ''content_clean'' might not exist on array\{order\: mixed, content_clean\: string\}\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Engines/Results/MyMemory/KeysGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^If condition is always false\.$#' - identifier: if.alwaysFalse + message: '#^Parameter \#1 \$string of static method Utils\\Tools\\CatUtils\:\:segment_raw_word_count\(\) expects string\|null, array\ given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Left side of and is always false\.$#' - identifier: logicalAnd.leftAlwaysFalse + message: '#^Parameter \#1 \$string of static method Utils\\Tools\\CatUtils\:\:segment_raw_word_count\(\) expects string\|null, array\\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Variable \$new_matches might not be defined\.$#' + identifier: variable.undefined + count: 4 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php + + - + message: '#^Variable \$updated_matches might not be defined\.$#' + identifier: variable.undefined + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/JobUndoActionController.php + + - + message: '#^Cannot call method format\(\) on DateTime\|false\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:featureSet\(\) has no return type specified\.$#' + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:_insertFile\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getLayer\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:_insertFile\(\) has parameter \$filename with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getLayer\(\) has parameter \$layerNum with no type specified\.$#' + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:_insertFile\(\) has parameter \$sha1 with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getLayer\(\) has parameter \$string with no type specified\.$#' + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:_insertFile\(\) has parameter \$source_lang with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getLayer\(\) has parameter \$subfiltering_handlers with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:_insertFile\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getMatches\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:create\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getMatches\(\) has parameter \$subfiltering_handlers with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:create\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:getMatches\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:create\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\Matches\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:create\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$ICE has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$create_date has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$created_by has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getProjectsInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$data has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getProjectsInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$id has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$id_project has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getRedisClient\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$id_project is unused\.$#' - identifier: property.unused + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$last_update_date has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$last_updated_by has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:getSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$match has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:popProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$memory_key has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:popProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$penalty has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:popProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$prop has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:pushProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$quality has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:pushProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php + + - + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:pushProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$raw_segment has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:setRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$raw_translation has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:setRedisClient\(\) has parameter \$redisClient with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$reasoning is never read, only written\.$#' - identifier: property.onlyWritten + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:updateProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$reference has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:updateProgress\(\) has parameter \$progress with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$score has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:updateProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$segment has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:updateSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$source has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:updateSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$source_note has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:updateSegmentsCount\(\) has parameter \$segment_count with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$style has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Controller\\ProjectController\:\:updateSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$subject has no type specified\.$#' - identifier: missingType.property + message: '#^PHPDoc tag @var has invalid value \(\$redisClient ClientContextInterface\)\: Unexpected token "\$redisClient", expected type at offset 16 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$target has no type specified\.$#' + message: '#^Property Features\\Aligner\\Controller\\ProjectController\:\:\$fileSourcePath has no type specified\.$#' identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$target_note has no type specified\.$#' + message: '#^Property Features\\Aligner\\Controller\\ProjectController\:\:\$fileTargetPath has no type specified\.$#' identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$tm_properties has no type specified\.$#' + message: '#^Property Features\\Aligner\\Controller\\ProjectController\:\:\$job has no type specified\.$#' identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$translation has no type specified\.$#' + message: '#^Property Features\\Aligner\\Controller\\ProjectController\:\:\$postInput has no type specified\.$#' identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\Matches\:\:\$usage_count has no type specified\.$#' + message: '#^Property Features\\Aligner\\Controller\\ProjectController\:\:\$project has no type specified\.$#' identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Right side of and is always false\.$#' - identifier: logicalAnd.rightAlwaysFalse + message: '#^Property Features\\Aligner\\Controller\\ProjectController\:\:\$redisClient has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/Matches.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\SearchGlossaryResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Features\\Aligner\\Controller\\ProjectController\:\:\$result has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/SearchGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Property Utils\\Engines\\Results\\MyMemory\\SearchGlossaryResponse\:\:\$matches has no type specified\.$#' + message: '#^Property Features\\Aligner\\Controller\\ProjectController\:\:\$uploadDir has no type specified\.$#' identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/SearchGlossaryResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\SetContributionResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter + message: '#^Variable \$user in empty\(\) always exists and is not falsy\.$#' + identifier: empty.variable count: 1 - path: lib/Utils/Engines/Results/MyMemory/SetContributionResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/ProjectController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\SetContributionResponse\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Controller\\SegmentsController\:\:get\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/MyMemory/SetContributionResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/SegmentsController.php - - message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer1ToLayer2\(\)\.$#' - identifier: method.notFound + message: '#^Property Features\\Aligner\\Controller\\SegmentsController\:\:\$job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Results/MyMemory/TagProjectionResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/SegmentsController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\TagProjectionResponse\:\:__construct\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Utils/Engines/Results/MyMemory/TagProjectionResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\TagProjectionResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to an undefined method Features\\Aligner\\Utils\\TMSService\:\:setTmKey\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/Engines/Results/MyMemory/TagProjectionResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\Results\\MyMemory\\UpdateContributionResponse\:\:__construct\(\) has parameter \$response with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to an undefined method Model\\TmKeyManagement\\MemoryKeyDao\:\:update\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/Engines/Results/MyMemory/UpdateContributionResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\Results\\TMSAbstractResponse\:\:getInstance\(\) has parameter \$dataRefMap with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method Utils\\Engines\\AbstractEngine\:\:createMyMemoryKey\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/Engines/Results/TMSAbstractResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\Results\\TMSAbstractResponse\:\:getInstance\(\) has parameter \$result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' + identifier: property.nonObject count: 1 - path: lib/Utils/Engines/Results/TMSAbstractResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\Results\\TMSAbstractResponse\:\:toArray\(\) has parameter \$mask with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:createTmData\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/TMSAbstractResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\Results\\TMSAbstractResponse\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/Results/TMSAbstractResponse.php + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:createTmData\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Property Utils\\Engines\\Results\\TMSAbstractResponse\:\:\$responseDetails type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:createTmKey\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Results/TMSAbstractResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Template type T of method Utils\\Engines\\Results\\TMSAbstractResponse\:\:getInstance\(\) is not referenced in a parameter\.$#' - identifier: method.templateTypeNotInParameter + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:createTmKey\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Results/TMSAbstractResponse.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Access to an undefined property Utils\\Engines\\SmartMATE\:\:\$client_id\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:getUserTM\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Access to an undefined property Utils\\Engines\\SmartMATE\:\:\$client_secret\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:getUserTM\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Access to an undefined property Utils\\Engines\\SmartMATE\:\:\$oauth_url\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:saveTm\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Access to an undefined property Utils\\Engines\\SmartMATE\:\:\$token\.$#' - identifier: property.notFound - count: 4 - path: lib/Utils/Engines/SmartMATE.php + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:saveTm\(\) throws checked exception Model\\Exceptions\\ValidationError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr + message: '#^Method Features\\Aligner\\Controller\\TmController\:\:updateTm\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Utils\\TMS\\TMSService\:\:tmxUploadStatus\(\) invoked with 0 parameters, 1 required\.$#' + identifier: arguments.count count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:_checkAuthFailure\(\) should return bool but returns int\.$#' - identifier: return.type + message: '#^Method Utils\\TMS\\TMSService\:\:uploadFile\(\) invoked with 0 parameters, 1\-2 required\.$#' + identifier: arguments.count count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/SmartMATE.php + message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' + identifier: assign.propertyType + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' + identifier: argument.templateType count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/TmController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:_fillCallParameters\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Argument of an invalid type Model\\Conversion\\UploadElement supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:_fillCallParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to static method setCookie\(\) on an unknown class Features\\Aligner\\Controller\\CookieManager\.$#' + identifier: class.notFound count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:_formatAuthenticateError\(\) has parameter \$objResponse with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:_sanitizeFileName\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:_formatAuthenticateError\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:_sanitizeFileName\(\) has parameter \$filename with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:_formatRecursionError\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Engines/SmartMATE.php + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:_sanitizeFileName\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:delete\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:convert\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:delete\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:get\(\) should return Utils\\Engines\\Results\\TMSAbstractResponse but returns array\.$#' - identifier: return.type - count: 1 - path: lib/Utils/Engines/SmartMATE.php + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:delete\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:getAuthParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:initUploadDir\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:initUploadDir\(\) is unused\.$#' + identifier: method.unused count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:set\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:setOrGetGuid\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Method Utils\\Engines\\SmartMATE\:\:update\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:setOrGetGuid\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^PHPDoc tag @property has invalid value \(string client_secret\)\: Unexpected token "client_secret", expected variable at offset 48 on line 3$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Controller\\UploadController\:\:upload\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Parameter \#1 \$json of function json_validate expects string, bool\|string\|null given\.$#' - identifier: argument.type + message: '#^Offset ''errors'' does not exist on list\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Parameter \#3 \$function of method Utils\\Engines\\SmartMATE\:\:_decode\(\) expects null, string given\.$#' + message: '#^Parameter \#1 \$code of method Matecat\\Locales\\Languages\:\:validateLanguage\(\) expects string\|null, string\|false\|null given\.$#' identifier: argument.type - count: 1 - path: lib/Utils/Engines/SmartMATE.php - - - - message: '#^Property Utils\\Engines\\SmartMATE\:\:\$_auth_parameters has no type specified\.$#' - identifier: missingType.property - count: 1 - path: lib/Utils/Engines/SmartMATE.php + count: 2 + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Property Utils\\Engines\\SmartMATE\:\:\$_config type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$fileName of static method Utils\\Tools\\Utils\:\:isValidFileName\(\) expects string, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/SmartMATE.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Trait Utils\\Engines\\Traits\\HotSwap is used zero times and is not analysed\.$#' - identifier: trait.unused + message: '#^Parameter \#1 \$segmentation_rule of static method Utils\\Constants\\Constants\:\:validateSegmentationRules\(\) expects string\|null, string\|false\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Traits/HotSwap.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' - identifier: property.notFound + message: '#^Parameter \#9 \$featureSet of class Model\\Conversion\\FilesConverter constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Validators/AltLangEngineValidator.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^Cannot access offset ''error'' on array\|Utils\\Engines\\Results\\TMSAbstractResponse\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Property Features\\Aligner\\Controller\\UploadController\:\:\$file_name has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Validators/AltLangEngineValidator.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^PHPDoc tag @property has invalid value \(\?EngineStruct engineStruct\)\: Unexpected token "engineStruct", expected variable at offset 31 on line 2$#' - identifier: phpDoc.parseError + message: '#^Property Features\\Aligner\\Controller\\UploadController\:\:\$guid has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^PHPDoc tag @property has invalid value \(\?string deepl_engine_type\)\: Unexpected token "deepl_engine_type", expected variable at offset 65 on line 3$#' - identifier: phpDoc.parseError + message: '#^Property Features\\Aligner\\Controller\\UploadController\:\:\$result has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^PHPDoc tag @property has invalid value \(\?string deepl_formality\)\: Unexpected token "deepl_formality", expected variable at offset 104 on line 4$#' - identifier: phpDoc.parseError + message: '#^Property Features\\Aligner\\Controller\\UploadController\:\:\$segmentation_rule has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^PHPDoc tag @property has invalid value \(\?string deepl_id_glossary\)\: Unexpected token "deepl_id_glossary", expected variable at offset 141 on line 5$#' - identifier: phpDoc.parseError + message: '#^Property Features\\Aligner\\Controller\\UploadController\:\:\$source_lang has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^PHPDoc tag @property has invalid value \(\?string glossaryString\)\: Unexpected token "glossaryString", expected variable at offset 180 on line 6$#' - identifier: phpDoc.parseError + message: '#^Property Features\\Aligner\\Controller\\UploadController\:\:\$target_lang has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Controller/UploadController.php - - message: '#^PHPDoc tag @property has invalid value \(\?string intento_provider\)\: Unexpected token "intento_provider", expected variable at offset 216 on line 7$#' - identifier: phpDoc.parseError + message: '#^PHPDoc tag @return with type mixed is not subtype of native type void\.$#' + identifier: return.phpDocType count: 1 - path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Controller/Validators/JobPasswordValidator.php - - message: '#^PHPDoc tag @property has invalid value \(\?string intento_routing\)\: Unexpected token "intento_routing", expected variable at offset 254 on line 8$#' - identifier: phpDoc.parseError + message: '#^Property Features\\Aligner\\Controller\\Validators\\JobPasswordValidator\:\:\$jStruct in empty\(\) is not falsy nor uninitialized\.$#' + identifier: empty.initializedProperty count: 1 - path: lib/Utils/Engines/Validators/Contracts/EngineValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Controller/Validators/JobPasswordValidator.php - - message: '#^Offset ''DeepL\-Auth\-Key'' might not exist on array\|string\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Access to an undefined property Utils\\Templating\\PHPTALWithAppend\:\:\$languages_array\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Engines/Validators/DeepLEngineOptionsValidator.php + path: plugins/aligner/lib/Features/Aligner/Decorator/HomeDecorator.php - - message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Decorator\\HomeDecorator\:\:decorate\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Validators/DeepLEngineValidator.php + path: plugins/aligner/lib/Features/Aligner/Decorator/HomeDecorator.php - - message: '#^Access to an undefined property Utils\\Validator\\Contracts\\ValidatorObject\:\:\$engineStruct\.$#' - identifier: property.notFound + message: '#^Parameter \#1 \$directory of function scandir expects string, string\|false given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Engines/Validators/GoogleTranslateEngineValidator.php + path: plugins/aligner/lib/Features/Aligner/Decorator/HomeDecorator.php - - message: '#^Cannot access offset ''error'' on Utils\\Engines\\Results\\TMSAbstractResponse\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:createFromStruct\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/Validators/GoogleTranslateEngineValidator.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\Validators\\IntentoEngineOptionsValidator\:\:validate\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:createFromStruct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Utils/Engines/Validators/IntentoEngineOptionsValidator.php + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' - identifier: property.notFound - count: 1 - path: lib/Utils/Engines/Validators/IntentoEngineValidator.php + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:createFromStruct\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Cannot access offset ''error'' on Utils\\Engines\\Results\\TMSAbstractResponse\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Validators/IntentoEngineValidator.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getById\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Validators/LaraEngineValidator.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$newTestCreatedMT Lara\)\: Unexpected token "\$newTestCreatedMT", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError - count: 1 - path: lib/Utils/Engines/Validators/LaraEngineValidator.php + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$glossaryString\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getByJobId\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Validators/LaraGlossaryValidator.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$engineStruct\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getByJobId\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/Validators/MMTEngineValidator.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Access to an undefined property Utils\\Engines\\Validators\\Contracts\\EngineValidatorObject\:\:\$glossaryString\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getByJobId\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/Validators/MMTGlossaryValidator.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Loose comparison using \!\= between non\-empty\-string and null will always evaluate to true\.$#' - identifier: notEqual.alwaysTrue + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\YandexTranslate\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getByProjectId\(\) has parameter \$id_project with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\YandexTranslate\:\:_decode\(\) has parameter \$parameters with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getByProjectId\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\YandexTranslate\:\:_decode\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getByProjectId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\YandexTranslate\:\:delete\(\) has parameter \$_config with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:getByProjectId\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\YandexTranslate\:\:get\(\) has parameter \$_config with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:updateField\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\YandexTranslate\:\:getConfigurationParameters\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:updateField\(\) has parameter \$field with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\YandexTranslate\:\:set\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:updateField\(\) has parameter \$file with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Engines\\YandexTranslate\:\:update\(\) has parameter \$_config with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:updateField\(\) has parameter \$value with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Property Utils\\Engines\\YandexTranslate\:\:\$_config type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:updateField\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Engines/YandexTranslate.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Files\\CSV\:\:extract\(\) throws checked exception PhpOffice\\PhpSpreadsheet\\Writer\\Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Files_FileDao\:\:updateField\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php + + - + message: '#^Property Features\\Aligner\\Model\\Files_FileDao\:\:\$auto_increment_fields has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileDao.php - - message: '#^Method Utils\\Files\\CSV\:\:headers\(\) has parameter \$filepath with no type specified\.$#' - identifier: missingType.parameter + message: '#^Call to an undefined method Features\\Aligner\\Model\\Segments_SegmentDao\:\:countByFile\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Method Utils\\Files\\CSV\:\:headers\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Files_FileStruct\:\:getSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Method Utils\\Files\\CSV\:\:headers\(\) should return array but returns list\\|null\.$#' - identifier: return.type + message: '#^Property Features\\Aligner\\Model\\Files_FileStruct\:\:\$extension has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Method Utils\\Files\\CSV\:\:parseToArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Files_FileStruct\:\:\$filename has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Method Utils\\Files\\CSV\:\:save\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Files_FileStruct\:\:\$id has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Parameter \#1 \$stream of function fclose expects resource, resource\|false given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Model\\Files_FileStruct\:\:\$id_job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Parameter \#1 \$stream of function fputcsv expects resource, resource\|false given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Model\\Files_FileStruct\:\:\$id_project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Parameter \#2 \$array of function array_map expects array, list\\|false given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Model\\Files_FileStruct\:\:\$sha1_original_file has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Files/CSV.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Method Utils\\Files\\File\:\:info\(\) has parameter \$filepath with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Features\\Aligner\\Model\\Files_FileStruct\:\:\$type has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Files/File.php + path: plugins/aligner/lib/Features/Aligner/Model/Files/FileStruct.php - - message: '#^Method Utils\\LQA\\BxExG\\Element\:\:searchForNestedBxOrEx\(\) has parameter \$children with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:changePassword\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/BxExG/Element.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Property Utils\\LQA\\BxExG\\Element\:\:\$attributes type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:changePassword\(\) has parameter \$new_password with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/BxExG/Element.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Argument of an invalid type DOMNamedNodeMap\\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:changePassword\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/BxExG/Mapper.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Cannot access property \$childNodes on DOMNode\|null\.$#' - identifier: property.nonObject - count: 2 - path: lib/Utils/LQA/BxExG/Mapper.php + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:changePassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Cannot access property \$nodeName on DOMNode\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:createFromStruct\(\) should return Features\\Aligner\\Model\\Jobs_JobStruct but returns Model\\DataAccess\\IDaoStruct\.$#' + identifier: return.type count: 1 - path: lib/Utils/LQA/BxExG/Mapper.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\BxExG\\Mapper\:\:extract\(\) has parameter \$string with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/LQA/BxExG/Mapper.php + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:createFromStruct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Parameter \#1 \$node of static method Utils\\LQA\\BxExG\\Mapper\:\:appendBxExGTagMapElement\(\) expects DOMNode, DOMNode\|null given\.$#' - identifier: argument.type - count: 3 - path: lib/Utils/LQA/BxExG/Mapper.php + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:createFromStruct\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\BxExG\\Validator\:\:doesAMapHaveOneBxOrEx\(\) has parameter \$map with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getById\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/BxExG/Validator.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\BxExG\\Validator\:\:validate\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/BxExG/Validator.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\PostProcess\:\:getErrors\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getById\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/PostProcess.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\PostProcess\:\:getWarnings\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByIdAndPassword\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/PostProcess.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\PostProcess\:\:nbspToSpace\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByIdAndPassword\(\) has parameter \$password with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/PostProcess.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\PostProcess\:\:normalizeHeadSpaces\(\) should return string but returns string\|null\.$#' + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByIdAndPassword\(\) should return Features\\Aligner\\Model\\Jobs_JobStruct but returns array\|Features\\Aligner\\Model\\Jobs_JobStruct\.$#' identifier: return.type count: 1 - path: lib/Utils/LQA/PostProcess.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\PostProcess\:\:normalizeTailSpaces\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByIdAndPassword\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/PostProcess.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\PostProcess\:\:performTagCheckOnly\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByIdAndPassword\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/PostProcess.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Parameter \#1 \$string of function mb_strlen expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByIdAndPassword\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/PostProcess.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Parameter \#1 \$string of function mb_substr expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/LQA/PostProcess.php + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByProjectId\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Strict comparison using \!\=\= between int\<1, max\>\|false and 0 will always evaluate to true\.$#' - identifier: notIdentical.alwaysTrue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByProjectId\(\) has parameter \$id_project with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/PostProcess.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Cannot access property \$documentElement on DOMDocument\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByProjectId\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Cannot call method saveXML\(\) on DOMDocument\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByProjectId\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\QA\:\:JSONtoExceptionList\(\) should return array\{ERROR\: array\, WARNING\: array\, INFO\: array\\} but returns array\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByProjectId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\QA\:\:getExceptionList\(\) should return array\{ERROR\: array\, WARNING\: array\, INFO\: array\\} but returns array\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:getByProjectId\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\QA\:\:getMalformedXmlStructs\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:updateFields\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue - count: 2 - path: lib/Utils/LQA/QA.php - - - - message: '#^Method Utils\\LQA\\QA\:\:getMalformedXmlStructs\(\) should return array\{source\: array, target\: array\} but returns array\.$#' - identifier: return.type count: 1 - path: lib/Utils/LQA/QA.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\QA\:\:getTargetTagPositionError\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:updateFields\(\) has parameter \$where with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/LQA/QA.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\QA\:\:prepareDOMStructures\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:updateFields\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Parameter \#2 \$subject of function preg_match expects string, string\|false given\.$#' + message: '#^Method Features\\Aligner\\Model\\Jobs_JobDao\:\:updateFields\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php + + - + message: '#^Parameter \#1 \$id_job of static method Features\\Aligner\\Model\\Jobs_JobDao\:\:getById\(\) expects int, string\|false given\.$#' identifier: argument.type count: 1 - path: lib/Utils/LQA/QA.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\QA\\ContentPreprocessor\:\:cleanOutputContent\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Property Features\\Aligner\\Model\\Jobs_JobDao\:\:\$_sql_get_jobs_by_project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/ContentPreprocessor.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\QA\\ContentPreprocessor\:\:replaceAscii\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Property Features\\Aligner\\Model\\Jobs_JobDao\:\:\$_sql_update_password has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/ContentPreprocessor.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Method Utils\\LQA\\QA\\ContentPreprocessor\:\:replaceHexEntities\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Property Features\\Aligner\\Model\\Jobs_JobDao\:\:\$auto_increment_field type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/LQA/QA/ContentPreprocessor.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Parameter \#1 \$seg of method Utils\\LQA\\QA\\ContentPreprocessor\:\:replaceAscii\(\) expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Model\\Jobs_JobDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/LQA/QA/ContentPreprocessor.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobDao.php - - message: '#^Parameter \#3 \$from_encoding of function mb_convert_encoding expects array\|string\|null, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Jobs_JobExportedDao\:\:createFromStruct\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/QA/ContentPreprocessor.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobExportedDao.php - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 7 - path: lib/Utils/LQA/QA/ContentPreprocessor.php + message: '#^Method Features\\Aligner\\Model\\Jobs_JobExportedDao\:\:createFromStruct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobExportedDao.php - - message: '#^Parameter \#3 \$subject of function preg_replace_callback expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Utils/LQA/QA/ContentPreprocessor.php + message: '#^Method Features\\Aligner\\Model\\Jobs_JobExportedDao\:\:createFromStruct\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobExportedDao.php - - message: '#^Static property Utils\\LQA\\QA\\ContentPreprocessor\:\:\$asciiPlaceHoldMap \(array\\) does not accept default value of type array\{''00''\: array\{symbol\: ''NULL'', placeHold\: ''\#\#\$_00\$\#\#'', numeral\: 0\}, ''01''\: array\{symbol\: ''SOH'', placeHold\: ''\#\#\$_01\$\#\#'', numeral\: 1\}, ''02''\: array\{symbol\: ''STX'', placeHold\: ''\#\#\$_02\$\#\#'', numeral\: 2\}, ''03''\: array\{symbol\: ''ETX'', placeHold\: ''\#\#\$_03\$\#\#'', numeral\: 3\}, ''04''\: array\{symbol\: ''EOT'', placeHold\: ''\#\#\$_04\$\#\#'', numeral\: 4\}, ''05''\: array\{symbol\: ''ENQ'', placeHold\: ''\#\#\$_05\$\#\#'', numeral\: 5\}, ''06''\: array\{symbol\: ''ACK'', placeHold\: ''\#\#\$_06\$\#\#'', numeral\: 6\}, ''07''\: array\{symbol\: ''BEL'', placeHold\: ''\#\#\$_07\$\#\#'', numeral\: 7\}, \.\.\.\}\.$#' - identifier: property.defaultValue + message: '#^Class Features\\Aligner\\Model\\Jobs_JobExportedStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 - path: lib/Utils/LQA/QA/ContentPreprocessor.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobExportedStruct.php - - message: '#^Cannot access property \$childNodes on DOMElement\|null\.$#' - identifier: property.nonObject - count: 3 - path: lib/Utils/LQA/QA/DomHandler.php + message: '#^Method Features\\Aligner\\Model\\Jobs_JobExportedStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobExportedStruct.php - - message: '#^Cannot access property \$length on DOMNodeList\\|false\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Model\\Jobs_JobExportedStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobExportedStruct.php - - message: '#^Cannot access property \$textContent on DOMNameSpaceNode\|DOMNode\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Model\\Jobs_JobExportedStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobExportedStruct.php - - message: '#^Cannot call method getElementsByTagName\(\) on DOMDocument\|null\.$#' - identifier: method.nonObject - count: 2 - path: lib/Utils/LQA/QA/DomHandler.php + message: '#^Class Features\\Aligner\\Model\\Jobs_JobStruct implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Cannot call method saveXML\(\) on DOMDocument\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Jobs_JobStruct\:\:getFiles\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Cannot clone DOMDocument\|null\.$#' - identifier: clone.nonObject + message: '#^Method Features\\Aligner\\Model\\Jobs_JobStruct\:\:isArchived\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Instanceof between DOMNodeList\ and DOMNodeList will always evaluate to true\.$#' - identifier: instanceof.alwaysTrue - count: 2 - path: lib/Utils/LQA/QA/DomHandler.php + message: '#^Method Features\\Aligner\\Model\\Jobs_JobStruct\:\:isCanceled\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:checkUnclosedTag\(\) has parameter \$error with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Jobs_JobStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:elementIsToBeExcludedFromChecks\(\) has parameter \$tagsToBeExcludedFromChecks with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:getMalformedXmlStructs\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Jobs_JobStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:getSrcDomMap\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$create_date has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:getTrgDomMap\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$exported has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapDom\(\) has parameter \$srcNodeList with generic class DOMNodeList but does not specify its types\: TNode$#' - identifier: missingType.generics + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$id has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapDom\(\) has parameter \$trgNodeList with generic class DOMNodeList but does not specify its types\: TNode$#' - identifier: missingType.generics + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$id_project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapDom\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$last_update has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapElements\(\) has parameter \$elementList with generic class DOMNodeList but does not specify its types\: TNode$#' - identifier: missingType.generics + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$password has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:mapElements\(\) has parameter \$srcDomElements with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$source has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:prepareDOMStructures\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$status has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:queryDOMElement\(\) has parameter \$TagReference with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$subject has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Method Utils\\LQA\\QA\\DomHandler\:\:queryDOMElement\(\) should return DOMNode but returns DOMNameSpaceNode\|DOMNode\|null\.$#' - identifier: return.type + message: '#^Property Features\\Aligner\\Model\\Jobs_JobStruct\:\:\$target has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Parameter \#2 \$subject of function preg_match_all expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Static method Features\\Aligner\\Model\\Files_FileDao\:\:getByJobId\(\) invoked with 1 parameter, 2\-3 required\.$#' + identifier: arguments.count count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Jobs/JobStruct.php - - message: '#^Property Utils\\LQA\\QA\\DomHandler\:\:\$malformedXmlStructDiff type has no value type specified in iterable type array\.$#' + message: '#^Property Features\\Aligner\\Model\\NewDatabase\:\:\$SEQUENCES type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue - count: 2 - path: lib/Utils/LQA/QA/DomHandler.php + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/NewDatabase.php - - message: '#^Property Utils\\LQA\\QA\\DomHandler\:\:\$normalizedTrgDOMNodeList with generic class DOMNodeList does not specify its types\: TNode$#' - identifier: missingType.generics + message: '#^Call to an undefined method Features\\Aligner\\Model\\Projects_ProjectDao\:\:destroyCacheById\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Property Utils\\LQA\\QA\\DomHandler\:\:\$srcDomMap type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:changePassword\(\) has parameter \$newPass with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Property Utils\\LQA\\QA\\DomHandler\:\:\$trgDomMap type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:createFromStruct\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Result of \|\| is always false\.$#' - identifier: booleanOr.alwaysFalse - count: 1 - path: lib/Utils/LQA/QA/DomHandler.php + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:createFromStruct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\ErrObject\:\:get\(\) has parameter \$errors with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/LQA/QA/ErrObject.php + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:createFromStruct\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 5 + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\ErrObject\:\:get\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:createFromStruct\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 4 - path: lib/Utils/LQA/QA/ErrObject.php + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:JSONtoExceptionList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:deleteFailedProject\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:addCustomError\(\) has parameter \$errorMap with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:deleteFailedProject\(\) has parameter \$idProject with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:getErrorsJSON\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:deleteFailedProject\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:getExceptionList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:deleteFailedProject\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:findById\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:getNoticesJSON\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:findById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\ErrorManager\:\:getWarningsJSON\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:updateField\(\) has parameter \$field with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Offset 1 on array\{non\-falsy\-string, numeric\-string\} on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.offset + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:updateField\(\) has parameter \$project with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Property Utils\\LQA\\QA\\ErrorManager\:\:\$errorMap type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:updateField\(\) has parameter \$value with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Property Utils\\LQA\\QA\\ErrorManager\:\:\$exceptionList type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:updateField\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Property Utils\\LQA\\QA\\ErrorManager\:\:\$tipMap type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectDao\:\:updateField\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php + + - + message: '#^PHPDoc tag @var has invalid value \(\$res Projects_ProjectStruct \*\)\: Unexpected token "\$res", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/LQA/QA/ErrorManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Parameter \#1 \$haystack of function mb_substr_count expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$id of static method Features\\Aligner\\Model\\Projects_ProjectDao\:\:findById\(\) expects int, string\|false given\.$#' identifier: argument.type - count: 2 - path: lib/Utils/LQA/QA/SymbolChecker.php + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkContentAndAddTagMismatchError\(\) has parameter \$originalTargetValues with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectDao\:\:\$auto_increment_fields has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkContentAndAddTagMismatchError\(\) has parameter \$src with no value type specified in iterable type array\.$#' + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectDao.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkContentAndAddTagMismatchError\(\) has parameter \$trg with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Call to an undefined method Features\\Aligner\\Model\\Projects_ProjectDao\:\:getRemoteFileServiceName\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkDiff\(\) has parameter \$diff with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectStruct\:\:getOriginalOwner\(\) should return Model\\Users\\UserStruct but returns Model\\Users\\UserStruct\|null\.$#' + identifier: return.type count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkTagPositionsAndAddTagOrderError\(\) has parameter \$src with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Projects_ProjectStruct\:\:getRemoteFileServiceName\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkTagPositionsAndAddTagOrderError\(\) has parameter \$trg with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectStruct\:\:\$create_date has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkWhiteSpaces\(\) has parameter \$source_tags with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectStruct\:\:\$id has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:checkWhiteSpaces\(\) has parameter \$target_tags with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectStruct\:\:\$id_customer has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:extractEquivTextAttributes\(\) has parameter \$tags with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectStruct\:\:\$name has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:extractEquivTextAttributes\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectStruct\:\:\$password has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:extractIdAttributes\(\) has parameter \$tags with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectStruct\:\:\$remote_ip_address has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:extractIdAttributes\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Projects_ProjectStruct\:\:\$status_analysis has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Projects/ProjectStruct.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:getTagPositionError\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Constant Segments_SegmentStruct not found\.$#' + identifier: constant.notFound count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:normalizeTags\(\) has parameter \$_opening_toCheck with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:countByJobId\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:normalizeTags\(\) has parameter \$_selfClosing_toCheck with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:countByJobId\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\QA\\TagChecker\:\:normalizeTags\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:countByJobId\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$dom of method Utils\\LQA\\QA\\DomHandler\:\:setNormalizedTrgDOM\(\) expects DOMDocument, DOMDocument\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:countByJobId\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\LQA\\QA\\TagChecker\:\:\$tagPositionError type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:countByJobId\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/TagChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Access to an undefined property DOMNameSpaceNode\|DOMNode\:\:\$textContent\.$#' - identifier: property.notFound - count: 2 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:countByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Cannot access offset 0 on list\\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible - count: 2 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:countByJobId\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Cannot access property \$ownerDocument on DOMNameSpaceNode\|DOMNode\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:createList\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Cannot call method saveXML\(\) on DOMDocument\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:createList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\QA\\WhitespaceChecker\:\:checkContentConsistency\(\) has parameter \$srcNodeList with generic class DOMNodeList but does not specify its types\: TNode$#' - identifier: missingType.generics + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:deleteSegmentsByIds\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\QA\\WhitespaceChecker\:\:checkContentConsistency\(\) has parameter \$trgNodeList with generic class DOMNodeList but does not specify its types\: TNode$#' - identifier: missingType.generics + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:deleteSegmentsByIds\(\) has parameter \$segments_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\QA\\WhitespaceChecker\:\:nbspToSpace\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:deleteSegmentsByIds\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$array of function end expects array\|object, list\\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:deleteSegmentsByIds\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$domDoc of method Utils\\LQA\\QA\\DomHandler\:\:queryDOMElement\(\) expects DOMDocument, DOMDocument\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:findById\(\) has parameter \$id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$value of function count expects array\|Countable, list\\|false given\.$#' - identifier: argument.type - count: 4 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:findById\(\) should return Features\\Aligner\\Model\\Segments_SegmentStruct but returns Model\\DataAccess\\IDaoStruct\|null\.$#' + identifier: return.type + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#2 \$subject of function preg_match expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:findById\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/QA/WhitespaceChecker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\SizeRestriction\\CJKLangUtils\:\:getMatches\(\) has parameter \$string with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:findById\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/SizeRestriction/CJKLangUtils.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\SizeRestriction\\EmojiUtils\:\:getMatches\(\) has parameter \$string with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:findById\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/LQA/SizeRestriction/EmojiUtils.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\SizeRestriction\\EmojiUtils\:\:isEmoji\(\) has parameter \$string with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getByJobIdAndType\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/LQA/SizeRestriction/EmojiUtils.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\SizeRestriction\\SizeRestriction\:\:checkLimit\(\) has parameter \$limit with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getByJobIdAndType\(\) has parameter \$id_job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/SizeRestriction/SizeRestriction.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\LQA\\SizeRestriction\\SizeRestriction\:\:getCharactersRemaining\(\) has parameter \$limit with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getByJobIdAndType\(\) has parameter \$ttl with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/SizeRestriction/SizeRestriction.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$string of function html_entity_decode expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getByJobIdAndType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/LQA/SizeRestriction/SizeRestriction.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 11 - path: lib/Utils/LQA/SizeRestriction/SizeRestriction.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getByJobIdAndType\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\CloudWatchHandlerProvider\:\:getClient\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getByJobIdAndType\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\CloudWatchHandlerProvider\:\:getHandlerParams\(\) has parameter \$configurationParams with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getByJobIdAndType\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\CloudWatchHandlerProvider\:\:getHandlerParams\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getDataForAlignment\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Offset 0 on non\-empty\-list\ on left side of \?\? always exists and is not nullable\.$#' - identifier: nullCoalesce.offset + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getDataForAlignment\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getDataForAlignment\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/Handlers/CloudWatchHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\ElasticSearchHandlerProvider\:\:getHandlerParams\(\) has parameter \$configurationParams with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getDataForAlignment\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/Handlers/ElasticSearchHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\ElasticSearchHandlerProvider\:\:getHandlerParams\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getDataForAlignment\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/Handlers/ElasticSearchHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\ProviderInterface\:\:getHandlerParams\(\) has parameter \$configurationParams with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getDataForAlignment\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderArrayJobIdAndType\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Logger/Handlers/ProviderInterface.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\ProviderInterface\:\:getHandlerParams\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderArrayJobIdAndType\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/Handlers/ProviderInterface.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\StreamHandlerProvider\:\:getHandlerParams\(\) has parameter \$configurationParams with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderArrayJobIdAndType\(\) has parameter \$orders with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Logger/Handlers/StreamHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\Handlers\\StreamHandlerProvider\:\:getHandlerParams\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderArrayJobIdAndType\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/Handlers/StreamHandlerProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\HandlersProviderFactory\:\:loadWithName\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderArrayJobIdAndType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/HandlersProviderFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$handler of method Utils\\Logger\\Handlers\\ProviderInterface\:\:setFormatter\(\) expects Monolog\\Handler\\AbstractProcessingHandler, object given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderArrayJobIdAndType\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/HandlersProviderFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$hostname of function gethostbyname expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderArrayJobIdAndType\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/LogProcessor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\LoggerFactory\:\:hexDump\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderArrayJobIdAndType\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/LoggerFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\LoggerFactory\:\:setAliases\(\) has parameter \$names with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Logger/LoggerFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^PHPDoc tag @param for parameter \$data with type mixed is not subtype of native type array\|string\.$#' - identifier: parameter.phpDocType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/LoggerFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#2 \$handlers of class Monolog\\Logger constructor expects list\, array given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) has parameter \$order_end with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/LoggerFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:_formatMessage\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) has parameter \$order_start with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:_formatMessage\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:alert\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:alert\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:critical\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:critical\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderInterval\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:debug\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderJobIdAndType\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:debug\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderJobIdAndType\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:emergency\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderJobIdAndType\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:emergency\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderJobIdAndType\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:error\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderJobIdAndType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:error\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderJobIdAndType\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:info\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderJobIdAndType\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:info\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getFromOrderJobIdAndType\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:log\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getNextFromNonExistentOrderJobIdAndType\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:notice\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getNextFromNonExistentOrderJobIdAndType\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:notice\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getNextFromNonExistentOrderJobIdAndType\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:warning\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getNextFromNonExistentOrderJobIdAndType\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Logger\\MatecatLogger\:\:warning\(\) throws checked exception Psr\\Log\\InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getNextFromNonExistentOrderJobIdAndType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Logger/MatecatLogger.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:_callbackExecute\(\) has parameter \$record with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getNextFromNonExistentOrderJobIdAndType\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:createResource\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getNextFromNonExistentOrderJobIdAndType\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getAllContents\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getNextFromNonExistentOrderJobIdAndType\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getAllHeaders\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getOrderedByJobId\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getAllInfo\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getOrderedByJobId\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getAllLogs\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getOrderedByJobId\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getError\(\) has parameter \$tokenHash with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getOrderedByJobId\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getError\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getOrderedByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getErrors\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getOrderedByJobId\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getOptionRequest\(\) has no return type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromNonExistentOrderJobIdAndType\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getOptionRequest\(\) has parameter \$tokenHash with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromNonExistentOrderJobIdAndType\(\) has parameter \$id_job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleContent\(\) has parameter \$tokenHash with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromNonExistentOrderJobIdAndType\(\) has parameter \$order with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleInfo\(\) has parameter \$tokenHash with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromNonExistentOrderJobIdAndType\(\) has parameter \$ttl with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleInfo\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromNonExistentOrderJobIdAndType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleLog\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromNonExistentOrderJobIdAndType\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Network\\MultiCurlHandler\:\:getSingleLog\(\) has parameter \$tokenHash with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromNonExistentOrderJobIdAndType\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$multi_handle of function curl_multi_add_handle expects CurlMultiHandle, CurlMultiHandle\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromNonExistentOrderJobIdAndType\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$multi_handle of function curl_multi_exec expects CurlMultiHandle, CurlMultiHandle\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromOrderJobIdAndType\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$multi_handle of function curl_multi_info_read expects CurlMultiHandle, CurlMultiHandle\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromOrderJobIdAndType\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$multi_handle of function curl_multi_select expects CurlMultiHandle, CurlMultiHandle\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromOrderJobIdAndType\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$string of function substr expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Network/MultiCurlHandler.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromOrderJobIdAndType\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#2 \$options of function curl_setopt_array expects array, array\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromOrderJobIdAndType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#3 \$value of function curl_setopt expects non\-empty\-string, string given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromOrderJobIdAndType\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$curl_headers_requests type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromOrderJobIdAndType\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$curl_options_requests type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getPreviousFromOrderJobIdAndType\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$multi_curl_info type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getSourceOrdered\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$multi_curl_log type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getSourceOrdered\(\) has parameter \$amount with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\Network\\MultiCurlHandler\:\:\$multi_curl_results type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getSourceOrdered\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Network/MultiCurlHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\AbstractProvider\:\:getOutsourceConfirmUrl\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getSourceOrdered\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/AbstractProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\AbstractProvider\:\:setJobList\(\) has parameter \$jobList with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getSourceOrdered\(\) has parameter \$where with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/AbstractProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\OutsourceTo\\AbstractProvider\:\:\$jobList type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTMForTMXExport\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/OutsourceTo/AbstractProvider.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\OutsourceAvailable\:\:isOutsourceAvailable\(\) has parameter \$outsourceAvailableInfo with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTMForTMXExport\(\) has parameter \$id_job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/OutsourceAvailable.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Binary operation "/" between string and 1000 results in an error\.$#' - identifier: binaryOp.invalid + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTMForTMXExport\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__addCartElementToCart\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTMForTMXExport\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Utils/OutsourceTo/Translated.php + count: 6 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__getProjectData\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTargetOrdered\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/OutsourceTo/Translated.php - - - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__getProjectData\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__prepareOutsourcedJobCart\(\) has parameter \$apiCallResult with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTargetOrdered\(\) has parameter \$amount with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__prepareOutsourcedJobCart\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTargetOrdered\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__prepareQuotedJobCart\(\) has parameter \$apiCallResult with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTargetOrdered\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__prepareQuotedJobCart\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTargetOrdered\(\) has parameter \$where with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__processNormalJobs\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTranslationsForTMXExport\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:__processOutsourcedJobs\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTranslationsForTMXExport\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:getLangPairs\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/OutsourceTo/Translated.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTranslationsForTMXExport\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:getLangPairs\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/OutsourceTo/Translated.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTranslationsForTMXExport\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 6 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:getOutsourceConfirmUrl\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobId\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:getTotalPayableWords\(\) has parameter \$volAnalysis with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobId\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\OutsourceTo\\Translated\:\:performQuote\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobId\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Offset ''currency'' might not exist on Utils\\Shop\\AbstractItem\|null\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobId\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Offset ''timezone'' might not exist on array\{currency\: mixed\}\|Utils\\Shop\\AbstractItem\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobId\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Offset ''typeOfService'' might not exist on array\{currency\: mixed, timezone\: mixed\}\|Utils\\Shop\\AbstractItem\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$cartElem of method Utils\\OutsourceTo\\Translated\:\:__addCartElement\(\) expects Utils\\Shop\\ItemHTSQuoteJob, Utils\\Shop\\ItemHTSQuoteJob\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobId\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$cartElem of method Utils\\OutsourceTo\\Translated\:\:__addCartElement\(\) expects Utils\\Shop\\ItemHTSQuoteJob, array\\|Utils\\Shop\\AbstractItem given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$jid of method Utils\\OutsourceTo\\Translated\:\:getLangPairs\(\) expects int, string given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/OutsourceTo/Translated.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#2 \$features of class Model\\Analysis\\Status constructor expects Model\\FeaturesBase\\FeatureSet, Model\\FeaturesBase\\FeatureSet\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) has parameter \$segmentAmount with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#2 \$numeric_prefix of function http_build_query expects string, int given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/OutsourceTo/Translated.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#3 \$length of function substr expects int\|null, int\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#3 \$newTimezone of method Utils\\OutsourceTo\\Translated\:\:__updateCartElements\(\) expects int, string given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/OutsourceTo/Translated.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) has parameter \$where with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\OutsourceTo\\AbstractProvider\:\:\$_quote_result \(array\\) does not accept array\\|Utils\\Shop\\AbstractItem\>\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\OutsourceTo\\Translated\:\:\$_curlOptions type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/OutsourceTo/Translated.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Unsafe access to private property Utils\\OutsourceTo\\Translated\:\:\$OUTSOURCE_URL_CONFIRM through static\:\:\.$#' - identifier: staticClassAccess.privateProperty - count: 2 - path: lib/Utils/OutsourceTo/Translated.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:getTypeOrderedByJobIdWithPagination\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Call to function is_null\(\) with int will always evaluate to false\.$#' - identifier: function.impossibleType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:mergeSegments\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Call to function is_string\(\) with string will always evaluate to true\.$#' - identifier: function.alreadyNarrowedType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:mergeSegments\(\) has parameter \$glue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Cannot call method del\(\) on Predis\\Client\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:mergeSegments\(\) has parameter \$segments with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Cannot call method expire\(\) on Predis\\Client\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateField\(\) has parameter \$field with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Cannot call method get\(\) on Predis\\Client\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateField\(\) has parameter \$project with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Cannot call method getProperty\(\) on ReflectionClass\|false\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateField\(\) has parameter \$value with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Cannot call method setnx\(\) on Predis\\Client\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateField\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Redis\\RedisHandler\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateField\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateSegmentContent\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Redis\\RedisHandler\:\:formatDSN\(\) has parameter \$dsnString with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateSegmentContent\(\) has parameter \$contents with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Redis\\RedisHandler\:\:unlock\(\) has parameter \$key with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateSegmentContent\(\) has parameter \$id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Parameter \#1 \$callback of function array_map expects \(callable\(never\)\: mixed\)\|null, array\{''Utils\\\\Redis\\\\RedisHandler'', ''formatDSN''\} given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateSegmentContent\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Property Utils\\Redis\\RedisHandler\:\:\$instanceUUID \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType - count: 1 - path: lib/Utils/Redis/RedisHandler.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentDao\:\:updateSegmentContent\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Unreachable statement \- code above always terminates\.$#' - identifier: deadCode.unreachable + message: '#^Part \$chunk \(non\-empty\-list\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString count: 1 - path: lib/Utils/Redis/RedisHandler.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentDao\:\:\$auto_increment_fields has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Registry\\AppConfig\:\:__construct\(\) has parameter \$configuration with no value type specified in iterable type array\.$#' + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentDao\:\:\$primary_keys type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Registry\\AppConfig\:\:__construct\(\) has parameter \$taskManagerConfiguration with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Unable to resolve the template type T in call to method Model\\DataAccess\\AbstractDao\:\:_fetchObjectMap\(\)$#' + identifier: argument.templateType count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Registry\\AppConfig\:\:__construct\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Variable \$queryParams might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Registry\\AppConfig\:\:init\(\) has parameter \$configuration with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Variable \$subquery might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentDao.php - - message: '#^Method Utils\\Registry\\AppConfig\:\:init\(\) has parameter \$taskManagerConfiguration with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:createList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Registry\\AppConfig\:\:\$AUTOLOAD_PLUGINS type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteByJobId\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Registry\\AppConfig\:\:\$MANDATORY_KEYS type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteByJobId\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Registry\\AppConfig\:\:\$MIME_TYPES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteByJobId\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Registry\\AppConfig\:\:\$MONOLOG_HANDLERS type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/Registry/AppConfig.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteByJobId\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Registry\\AppConfig\:\:\$OAUTH_CONFIG type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteMatch\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Registry\\AppConfig\:\:\$SUPPORTED_FILE_TYPES type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteMatch\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Registry\\AppConfig\:\:\$TASK_RUNNER_CONFIG type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteMatch\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Static property Utils\\Registry\\AppConfig\:\:\$AUTHSECRET \(string\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteMatch\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Static property Utils\\Registry\\AppConfig\:\:\$OAUTH_CONFIG \(array\) does not accept array\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteMatch\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Registry/AppConfig.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Search\\ReplaceHistory\:\:_moveToVersion\(\) has parameter \$versionToMove with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:deleteMatch\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getLastSegmentMatch\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Search/ReplaceHistory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Search\\ReplaceHistory\:\:updateIndex\(\) has parameter \$versionToMove with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getLastSegmentMatch\(\) has parameter \$id_job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Search/ReplaceHistory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:_checkDriver\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getLastSegmentMatch\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Search/ReplaceHistoryFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:create\(\) has parameter \$driver with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getLastSegmentMatch\(\) has parameter \$type with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Search/ReplaceHistoryFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:create\(\) has parameter \$id_job with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getLastSegmentMatch\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Search/ReplaceHistoryFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:create\(\) has parameter \$ttl with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getLastSegmentMatch\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Search/ReplaceHistoryFactory.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Search\\ReplaceHistoryFactory\:\:create\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getLastSegmentMatch\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Utils/Search/ReplaceHistoryFactory.php + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\ServerCheck\\ServerCheck\:\:getByteValue\(\) has parameter \$value with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMatchesFromOrderArray\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/ServerCheck/ServerCheck.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Offset 1 might not exist on array\{\}\|array\{0\: non\-empty\-string, 1\: numeric\-string, 2\?\: ''G''\|''M''\}\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMatchesFromOrderArray\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/ServerCheck/ServerCheck.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\ServerCheck\\UploadParams\:\:__clone\(\) with return type void returns Utils\\ServerCheck\\UploadParams but should not return anything\.$#' - identifier: return.void + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMatchesFromOrderArray\(\) has parameter \$orders with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/ServerCheck/UploadParams.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\ServerCheck\\UploadParams\:\:__set\(\) has parameter \$name with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMatchesFromOrderArray\(\) has parameter \$ttl with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/ServerCheck/UploadParams.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\ServerCheck\\UploadParams\:\:__set\(\) has parameter \$value with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMatchesFromOrderArray\(\) has parameter \$type with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/ServerCheck/UploadParams.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\ServerCheck\\UploadParams\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMatchesFromOrderArray\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/ServerCheck/UploadParams.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Call to an undefined method object\:\:offsetSet\(\)\.$#' - identifier: method.notFound + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMatchesFromOrderArray\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Class Utils\\Shop\\AbstractItem extends generic class ArrayObject but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMatchesFromOrderArray\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Shop\\AbstractItem\:\:getInflate\(\) has parameter \$storage with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignmentCount\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignmentCount\(\) has parameter \$id_job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Shop\\AbstractItem\:\:getInflate\(\) should return Utils\\Shop\\AbstractItem but returns object\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignmentCount\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Shop\\AbstractItem\:\:getStorage\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignmentCount\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Shop\\AbstractItem\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignmentCount\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Shop\\AbstractItem\:\:offsetSet\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignmentCount\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^PHPDoc tag @throws has invalid value \(LogicException/DomainException\)\: Unexpected token "/DomainException", expected TOKEN_HORIZONTAL_WS at offset 438 on line 15$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignmentCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Shop\\AbstractItem\:\:\$__storage type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignments\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Shop/AbstractItem.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Shop\\Cart\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignments\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignments\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignments\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Shop/Cart.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Shop\\Cart\:\:\$cart type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignments\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Shop/Cart.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\Shop\\ItemHTSQuoteJob\:\:\$__storage type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getMisalignments\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Shop/ItemHTSQuoteJob.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Shop\\ItemInterface\:\:getInflate\(\) has parameter \$storage with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getNextMatchOfNonExistent\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Shop/ItemInterface.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^PHPDoc tag @return with type mixed is not subtype of native type Utils\\Shop\\AbstractItem\.$#' - identifier: return.phpDocType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getNextMatchOfNonExistent\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Shop/ItemInterface.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\Subfiltering\\SubfilteringOptionsValidator\:\:validate\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getNextMatchOfNonExistent\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Subfiltering/SubfilteringOptionsValidator.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Parameter \#1 \$array of function array_diff expects array, array\\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getNextMatchOfNonExistent\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Subfiltering/SubfilteringOptionsValidator.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Cannot access property \$id on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getNextMatchOfNonExistent\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Cannot access property \$password on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getNextMatchOfNonExistent\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getNextMatchOfNonExistent\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:_fileUploadStatus\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getNextMatchOfNonExistent\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:addTmxInMyMemory\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousMatchOfNonExistent\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) has parameter \$jPassword with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousMatchOfNonExistent\(\) has parameter \$id_job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) has parameter \$jid with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousMatchOfNonExistent\(\) has parameter \$order with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) has parameter \$sourceLang with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousMatchOfNonExistent\(\) has parameter \$ttl with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) has parameter \$targetLang with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousMatchOfNonExistent\(\) has parameter \$type with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:exportJobAsCSV\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousMatchOfNonExistent\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Utils/TMS/TMSService.php + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:getUserAdaptiveMTEngines\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousMatchOfNonExistent\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:glossaryUploadStatus\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousMatchOfNonExistent\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TMS\\TMSService\:\:tmxUploadStatus\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousSegmentMatch\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$mymemory_engine MyMemory\)\: Unexpected token "\$mymemory_engine", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousSegmentMatch\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Parameter \#1 \$id of static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\) expects int, array\|int\|object\|string given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousSegmentMatch\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousSegmentMatch\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Parameter \#1 \$message of class InvalidArgumentException constructor expects string, array\|string given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousSegmentMatch\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Parameter \#1 \$message of method Utils\\TMS\\TMSService\:\:formatErrorMessage\(\) expects string, array\|string given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousSegmentMatch\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousSegmentMatch\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getPreviousSegmentMatch\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getSegmentMatch\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Part \$engineName \(Utils\\Engines\\AbstractEngine\) of encapsed string cannot be cast to string\.$#' - identifier: encapsedStringPart.nonString + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getSegmentMatch\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Model\\Engines\\Structs\\EngineStruct\:\:\$class_load \(string\|null\) does not accept Utils\\Engines\\AbstractEngine\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getSegmentMatch\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\TMS\\TMSService\:\:\$mymemory_engine \(Utils\\Engines\\MyMemory\) does not accept Utils\\Engines\\AbstractEngine\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getSegmentMatch\(\) has parameter \$ttl with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TMS/TMSService.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType - count: 2 - path: lib/Utils/TMS/TMSService.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getSegmentMatch\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Constructor of class Utils\\TaskRunner\\Commons\\AbstractDaemon has an unused parameter \$configFile\.$#' - identifier: constructor.unusedParameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getSegmentMatch\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Constructor of class Utils\\TaskRunner\\Commons\\AbstractDaemon has an unused parameter \$contextIndex\.$#' - identifier: constructor.unusedParameter + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getSegmentMatch\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractDaemon\:\:installHandler\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:getSegmentMatch\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractDaemon\:\:main\(\) has parameter \$args with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:hideByOrderAndType\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:hideByOrderAndType\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractDaemon.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Argument of an invalid type \$this\(Utils\\TaskRunner\\Commons\\AbstractElement\) supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:hideByOrderAndType\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractElement.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Class Utils\\TaskRunner\\Commons\\AbstractElement implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:hideByOrderAndType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractElement.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractElement\:\:__construct\(\) has parameter \$array_params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:hideByOrderAndType\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractElement.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractElement\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:hideByOrderAndType\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:nullifySegmentsInMatches\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractElement.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractElement\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:nullifySegmentsInMatches\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractElement.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractElement\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:nullifySegmentsInMatches\(\) has parameter \$orders with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractElement.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Call to an undefined method Model\\DataAccess\\IDatabase\:\:ping\(\)\.$#' - identifier: method.notFound + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:nullifySegmentsInMatches\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_doLog\(\) has parameter \$msg with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:nullifySegmentsInMatches\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_endQueueCallback\(\) has no return type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:nullifySegmentsInMatches\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php + + - + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:setSegmentInMatch\(\) has no return type specified\.$#' identifier: missingType.return count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:getLogMsg\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:setSegmentInMatch\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:publishToNodeJsClients\(\) has parameter \$_object with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:setSegmentInMatch\(\) has parameter \$order with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Parameter \#1 \$body of class Stomp\\Transport\\Message constructor expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:setSegmentInMatch\(\) has parameter \$segment_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Parameter \#1 \$msg of method Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_doLog\(\) expects array\|string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:setSegmentInMatch\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\TaskRunner\\Commons\\AbstractWorker\:\:\$_logMsg type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:setSegmentInMatch\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' - identifier: isset.property + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:setSegmentInMatch\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/TaskRunner/Commons/AbstractWorker.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\Configuration\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:showByOrderAndType\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TaskRunner/Commons/Configuration.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\Configuration\:\:getRaw\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:showByOrderAndType\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/Configuration.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\TaskRunner\\Commons\\Configuration\:\:\$__raw type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:showByOrderAndType\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/Configuration.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\Context\:\:__construct\(\) has parameter \$queueElement with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:showByOrderAndType\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Commons/Context.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\Context\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:showByOrderAndType\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 2 - path: lib/Utils/TaskRunner/Commons/Context.php - - - - message: '#^Method Utils\\TaskRunner\\Commons\\Context\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type - count: 1 - path: lib/Utils/TaskRunner/Commons/Context.php - - - - message: '#^Method Utils\\TaskRunner\\Commons\\Context\:\:buildFromArray\(\) has parameter \$context with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue count: 1 - path: lib/Utils/TaskRunner/Commons/Context.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static - count: 1 - path: lib/Utils/TaskRunner/Commons/Context.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:showByOrderAndType\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\ContextList\:\:__construct\(\) has parameter \$queue_info with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateFields\(\) has parameter \$data with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/TaskRunner/Commons/ContextList.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Commons\\ContextList\:\:get\(\) has parameter \$queue_info with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateFields\(\) has parameter \$where with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/TaskRunner/Commons/ContextList.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateFields\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Commons/ContextList.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Call to an undefined method SplSubject\:\:getLogMsg\(\)\.$#' - identifier: method.notFound - count: 1 - path: lib/Utils/TaskRunner/Executor.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateFields\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Cannot call method attach\(\) on Utils\\TaskRunner\\Commons\\AbstractWorker\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateList\(\) has parameter \$obj_arr with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Cannot call method process\(\) on Utils\\TaskRunner\\Commons\\AbstractWorker\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateMatchBeforeDeletion\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Cannot call method setContext\(\) on Utils\\TaskRunner\\Commons\\AbstractWorker\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateMatchBeforeDeletion\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Cannot call method setPid\(\) on Utils\\TaskRunner\\Commons\\AbstractWorker\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateMatchBeforeDeletion\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Executor\:\:_myProcessExists\(\) has parameter \$pid with no type specified\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateMatchBeforeDeletion\(\) has parameter \$type with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Executor\:\:_readAMQFrame\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateMatchBeforeDeletion\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Method Utils\\TaskRunner\\Executor\:\:installHandler\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateMatchBeforeDeletion\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Utils/TaskRunner/Executor.php + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$msgFrame Frame\)\: Unexpected token "\$msgFrame", expected type at offset 28 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateNextSegmentMatch\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$msgFrame Frame\)\: Unexpected token "\$msgFrame", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateNextSegmentMatch\(\) has parameter \$id_job with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^PHPDoc tag @var has invalid value \(\$queueElement QueueElement\)\: Unexpected token "\$queueElement", expected type at offset 72 on line 3$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateNextSegmentMatch\(\) has parameter \$new_order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^PHPDoc tag @var with type array is not subtype of native type non\-empty\-list\\.$#' - identifier: varTag.nativeType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateNextSegmentMatch\(\) has parameter \$order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Property Utils\\TaskRunner\\Executor\:\:\$_worker \(Utils\\TaskRunner\\Commons\\AbstractWorker\|null\) does not accept object\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateNextSegmentMatch\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateNextSegmentMatch\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/Executor.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Call to Utils\\TaskRunner\\TaskManager\:\:_balanceQueues\(\) on a separate line has no effect\.$#' - identifier: staticMethod.resultUnused - count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchDao\:\:updateNextSegmentMatch\(\) throws checked exception PDOException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Cannot access property \$pid_set_name on Utils\\TaskRunner\\Commons\\Context\|null\.$#' - identifier: property.nonObject - count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + message: '#^Part \$chunk \(non\-empty\-list\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 2 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchDao.php - - message: '#^Cannot call method getRedisClient\(\) on Utils\\ActiveMQ\\AMQHandler\|null\.$#' - identifier: method.nonObject - count: 22 - path: lib/Utils/TaskRunner/TaskManager.php + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentMatchStruct\:\:getSegment\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchStruct.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentMatchStruct\:\:\$id_job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchStruct.php - - message: '#^Method Utils\\TaskRunner\\TaskManager\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentMatchStruct\:\:\$next has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchStruct.php - - message: '#^Method Utils\\TaskRunner\\TaskManager\:\:_balanceQueues\(\) has no return type specified\.$#' - identifier: missingType.return + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentMatchStruct\:\:\$order has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchStruct.php - - message: '#^Method Utils\\TaskRunner\\TaskManager\:\:main\(\) has parameter \$args with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentMatchStruct\:\:\$score has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchStruct.php - - message: '#^Parameter \#1 \$process_id of function posix_kill expects int, string given\.$#' - identifier: argument.type - count: 4 - path: lib/Utils/TaskRunner/TaskManager.php + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentMatchStruct\:\:\$segment_id has no type specified\.$#' + identifier: missingType.property + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchStruct.php - - message: '#^Parameter \#2 \$string of function explode expects string, array\|string given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentMatchStruct\:\:\$type has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentMatchStruct.php - - message: '#^Property Utils\\TaskRunner\\Commons\\AbstractDaemon\:\:\$_configFile \(string\) does not accept string\|null\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentStruct\:\:offsetGet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Variable \$queueInfo in empty\(\) always exists and is always falsy\.$#' - identifier: empty.variable + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentStruct\:\:offsetSet\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/TaskRunner/TaskManager.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Property Utils\\Templating\\PHPTALWithAppend\:\:\$internal_store type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Model\\Segments_SegmentStruct\:\:offsetUnset\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Templating/PHPTALWithAppend.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Call to an undefined method Utils\\Templating\\PHPTalMap\:\:__get\(\)\.$#' - identifier: method.notFound + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$content_clean has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Templating/PHPTalMap.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Call to an undefined method Utils\\Templating\\PHPTalMap\:\:__set\(\)\.$#' - identifier: method.notFound - count: 2 - path: lib/Utils/Templating/PHPTalMap.php + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$content_hash has no type specified\.$#' + identifier: missingType.property + count: 1 + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Class Utils\\Templating\\PHPTalMap implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$content_raw has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Templating/PHPTalMap.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Method Utils\\Templating\\PHPTalMap\:\:__construct\(\) has parameter \$values with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$hidden has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Templating/PHPTalMap.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Method Utils\\Templating\\PHPTalMap\:\:__toString\(\) should return string but returns string\|false\.$#' - identifier: return.type + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$id has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Templating/PHPTalMap.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Method Utils\\Templating\\PHPTalMap\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$id_job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Templating/PHPTalMap.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Property Utils\\Templating\\PHPTalMap\:\:\$storage type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$next has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Templating/PHPTalMap.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Method Utils\\TmKeyManagement\\Filter\:\:_hasRightGrants\(\) has parameter \$tm_key with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$order has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TmKeyManagement/Filter.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Method Utils\\TmKeyManagement\\Filter\:\:_isTheRightType\(\) has parameter \$tm_key with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$raw_word_count has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TmKeyManagement/Filter.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Method Utils\\TmKeyManagement\\Filter\:\:byOwner\(\) has parameter \$tm_key with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$score has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TmKeyManagement/Filter.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Method Utils\\TmKeyManagement\\Filter\:\:byRevisor\(\) has parameter \$tm_key with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Model\\Segments_SegmentStruct\:\:\$type has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/TmKeyManagement/Filter.php + path: plugins/aligner/lib/Features/Aligner/Model/Segments/SegmentStruct.php - - message: '#^Method Utils\\TmKeyManagement\\Filter\:\:byTranslator\(\) has parameter \$tm_key with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/Utils/TmKeyManagement/Filter.php + message: '#^Cannot access offset 0 on array\{string, int\<\-1, max\>\}\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 3 + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\Filter\:\:\$GRANTS_MAP type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Cannot access offset 1 on array\{string, int\<\-1, max\>\}\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 - path: lib/Utils/TmKeyManagement/Filter.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\Filter\:\:\$_accepted_types type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:__decode_tag_attributes\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/Filter.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\Filter\:\:\$_type type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:__decode_tag_attributes\(\) has parameter \$segment with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/Filter.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_array_union\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/ShareKeyEmail.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_array_union\(\) has parameter \$x with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/ShareKeyEmail.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\ShareKeyEmail\:\:__construct\(\) has parameter \$userMail with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_array_union\(\) has parameter \$y with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/ShareKeyEmail.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\ShareKeyEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_cleanSegment\(\) has parameter \$lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/ShareKeyEmail.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\ShareKeyEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_cleanSegment\(\) has parameter \$segment with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/ShareKeyEmail.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\ShareKeyEmail\:\:\$userMail type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_getNewOrderValue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/ShareKeyEmail.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Expression on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.expr + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_getNewOrderValue\(\) has parameter \$first_order with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:filterOutByOwnership\(\) has parameter \$jobOwnerEmail with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_getNewOrderValue\(\) has parameter \$next_order with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:filterOutByOwnership\(\) has parameter \$userEmail with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_getObjectVariables\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:getClientTmKeyStructure\(\) has parameter \$tmKey_arr with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_getObjectVariables\(\) has parameter \$object with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:getOwnerKeys\(\) has parameter \$jsonTmKeys_array with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_mark_xliff_tags\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:getPenaltyMap\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_mark_xliff_tags\(\) has parameter \$segment with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:getTmKeyStructure\(\) has parameter \$tmKey_arr with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_mb_str_replace\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:isValidStructure\(\) has parameter \$arr with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_mb_str_replace\(\) has parameter \$replace with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:mergeJsonKeys\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_mb_str_replace\(\) has parameter \$search with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:sanitize\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_mb_str_replace\(\) has parameter \$subject with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:sanitize\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 6 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_parseArrayIntegers\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:shareKey\(\) has parameter \$emailList with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_parseArrayIntegers\(\) has parameter \$array with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyManager\:\:shareKey\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 2 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_restore_xliff_tags\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^PHPDoc tag @var has invalid value \(\$_client_tm_key TmKeyStruct\)\: Unexpected token "\$_client_tm_key", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:_restore_xliff_tags\(\) has parameter \$segment with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^PHPDoc tag @var has invalid value \(\$_job_Key TmKeyStruct\)\: Unexpected token "\$_job_Key", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:collectFlashMessages\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^PHPDoc tag @var has invalid value \(\$newClientKey TmKeyStruct\)\: Unexpected token "\$newClientKey", expected type at offset 28 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:endsWith\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Parameter \#2 \$array of function array_map expects array, array\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:endsWith\(\) has parameter \$haystack with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Model\\TmKeyManagement\\MemoryKeyStruct\:\:\$uid \(int\) does not accept int\|null\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:endsWith\(\) has parameter \$needle with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$key \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:getFileVersion\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$name \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:getFileVersion\(\) has parameter \$filename with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$source \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:getLatestVersionFileName\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$target \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:getLatestVersionFileName\(\) has parameter \$dir with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$uid_rev \(int\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:getLatestVersionFileName\(\) has parameter \$filename with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$uid_transl \(int\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:getNewVersionFileName\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyManager.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Argument of an invalid type array\|Utils\\TmKeyManagement\\TmKeyStruct supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:getNewVersionFileName\(\) has parameter \$dir with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:__construct\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:getNewVersionFileName\(\) has parameter \$filename with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:__set\(\) has parameter \$name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:removeVersionFromFileName\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:__set\(\) has parameter \$value with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:removeVersionFromFileName\(\) has parameter \$filename with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:startsWith\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:startsWith\(\) has parameter \$haystack with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Method Utils\\TmKeyManagement\\TmKeyStruct\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AlignUtils\:\:startsWith\(\) has parameter \$needle with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Parameter \#1 \$haystack of function strrpos expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$separator of function explode expects non\-empty\-string, string given\.$#' identifier: argument.type count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Parameter \#1 \$string of function strlen expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$string of function trim expects string, array\\|string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php - - message: '#^Parameter \#1 \$string of function substr expects string, string\|null given\.$#' + message: '#^Parameter \#2 \$array of function implode expects array, list\\|false given\.$#' identifier: argument.type + count: 3 + path: plugins/aligner/lib/Features/Aligner/Utils/AlignUtils.php + + - + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_Align\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Property Utils\\TmKeyManagement\\TmKeyStruct\:\:\$penalty \(int\) on left side of \?\? is not nullable\.$#' - identifier: nullCoalesce.property + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_Align\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/TmKeyManagement/TmKeyStruct.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_checkForReQueueEnd\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Call to function is_numeric\(\) with int\<1, max\> will always evaluate to true\.$#' - identifier: function.alreadyNarrowedType + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_getSegmentsFromJson\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Cannot access offset ''path'' on array\{scheme\?\: string, host\?\: string, port\?\: int\<0, 65535\>, user\?\: string, pass\?\: string, path\?\: string, query\?\: string, fragment\?\: string\}\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible - count: 2 - path: lib/Utils/Tools/CatUtils.php + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_getSegmentsFromJson\(\) has parameter \$dateHashPath with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Cannot call method getChunk\(\) on Model\\LQA\\ChunkReviewStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_getSegmentsFromJson\(\) has parameter \$idFile with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:_performanceEstimationTime\(\) has parameter \$job_stats with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_getSegmentsFromJson\(\) has parameter \$newFileName with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:_performanceEstimationTime\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_getSegmentsFromJson\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:_performanceEstimationTime\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_getSegmentsFromJson\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/Utils/Tools/CatUtils.php + count: 3 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:clean_raw_string_4_word_count\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_getSegmentsFromJson\(\) throws checked exception Predis\\Connection\\ConnectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:convertEncoding\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_getSegmentsFromJson\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:fetchStatus\(\) has parameter \$results with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:getChunkReviewStructFromJobStruct\(\) has parameter \$chunkReviews with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:getFastStatsForJob\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getProjectsInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:getJobFromIdAndAnyPassword\(\) has parameter \$jobId with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getProjectsInQueue\(\) has parameter \$queue with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:getJobFromIdAndAnyPassword\(\) has parameter \$jobPassword with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:getLastCharacter\(\) has parameter \$string with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getRedisClient\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:getQualityOverallFromJobStruct\(\) has parameter \$chunkReviews with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:htmlentitiesFromUnicode\(\) has parameter \$str with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:isCJK\(\) has parameter \$langCode with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:getSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:parseSegmentSplit\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:popProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:parse_time_to_edit\(\) should return array\ but returns array\\|string\>\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:popProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:reApplySegmentSplit\(\) has parameter \$chunk_positions with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:popProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:sanitizeOrFallbackProjectName\(\) has parameter \$arrFiles with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:process\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:sanitizeProjectName\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:pushProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Method Utils\\Tools\\CatUtils\:\:stripMaliciousContentFromAName\(\) has parameter \$string with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:pushProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Negated boolean expression is always false\.$#' - identifier: booleanNot.alwaysFalse + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:pushProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Offset ''dirname'' might not exist on array\{dirname\?\: string, basename\: string, extension\?\: string, filename\: string\}\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:setRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Offset 1 on array\{list\, list\\} in isset\(\) always exists and is not nullable\.$#' - identifier: isset.offset + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:setRedisClient\(\) has parameter \$redisClient with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^PHPDoc tag @return has invalid value \(array\( \$charset, \$converted \)\)\: Unexpected token "\(", expected TOKEN_HORIZONTAL_WS at offset 339 on line 11$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:updateProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$array of function array_filter expects array, list\\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:updateProgress\(\) has parameter \$progress with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$id_job of static method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:updateProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$name of static method Utils\\Tools\\CatUtils\:\:sanitizeProjectName\(\) expects string, array\|string given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:updateSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$o of static method Utils\\Tools\\CatUtils\:\:unicode2chr\(\) expects int, string given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:updateSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$segment of method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToLayer1\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:updateSegmentsCount\(\) has parameter \$segment_count with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$string of function mb_substr expects string, array\\|string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:updateSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$string of function str_pad expects string, int\<\-59, 59\> given\.$#' - identifier: argument.type - count: 3 - path: lib/Utils/Tools/CatUtils.php + message: '#^PHPDoc tag @var has invalid value \(\$redisClient ClientContextInterface\)\: Unexpected token "\$redisClient", expected type at offset 16 on line 2$#' + identifier: phpDoc.parseError + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$string of function substr expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$queueElement of method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_Align\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$queueElement of method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' identifier: argument.type count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#1 \$string of static method Utils\\Tools\\CatUtils\:\:clean_raw_string_4_word_count\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:\$id_job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#2 \$length of function fread expects int\<1, max\>, int\<0, max\>\|false given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:\$job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#2 \$password of static method Model\\LQA\\ChunkReviewDao\:\:findByIdJobAndPasswordAndSourcePage\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:\$project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Utils\\AsyncTasks\\Workers\\AlignJobWorker\:\:\$redisClient has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|false\|null given\.$#' - identifier: argument.type - count: 1 - path: lib/Utils/Tools/CatUtils.php + message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 2 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/AlignJobWorker.php - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 4 - path: lib/Utils/Tools/CatUtils.php + message: '#^Binary operation "\." between non\-falsy\-string and array\\|string\|null results in an error\.$#' + identifier: binaryOp.invalid + count: 2 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type + message: '#^Cannot call method decode\(\) on Matecat\\SimpleS3\\Components\\Encoders\\SafeNameEncoderInterface\|null\.$#' + identifier: method.nonObject count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Property Utils\\Tools\\CatUtils\:\:\$cj type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_checkForReQueueEnd\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Property Utils\\Tools\\CatUtils\:\:\$cjk type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_createSegments\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/CatUtils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Cannot access offset int\<0, max\> on list\\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_createSegments\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php + + - + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_createSegments\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Cannot access offset int\<1, max\> on list\\|false\.$#' - identifier: offsetAccess.nonOffsetAccessible + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_file2segments\(\) has parameter \$file with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\PostEditing\:\:CJK_tokenizer\(\) has parameter \$text with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_file2segments\(\) has parameter \$lang with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\PostEditing\:\:CJK_tokenizer\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_file2segments\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\PostEditing\:\:arrayDistance\(\) has parameter \$array1 with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_saveSegmentsAsJson\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\PostEditing\:\:arrayDistance\(\) has parameter \$array2 with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_saveSegmentsAsJson\(\) has parameter \$dateHashPath with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\PostEditing\:\:array_xor\(\) has parameter \$array_a with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_saveSegmentsAsJson\(\) has parameter \$idFile with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\PostEditing\:\:array_xor\(\) has parameter \$array_b with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_saveSegmentsAsJson\(\) has parameter \$newFileName with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\PostEditing\:\:array_xor\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_saveSegmentsAsJson\(\) has parameter \$segments with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\PostEditing\:\:compute_bigram\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_saveSegmentsAsJson\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#1 \$array of function array_pop expects array, array\, string\>\|false given\.$#' - identifier: argument.type - count: 1 - path: lib/Utils/Tools/PostEditing.php + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_saveSegmentsAsJson\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 3 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#1 \$value of function count expects array\|Countable, list\\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_storeSegments\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/PostEditing.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#2 \$callback of function array_filter expects \(callable\(mixed\)\: bool\)\|null, ''trim'' given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Tools/PostEditing.php + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_storeSegments\(\) has parameter \$segments with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#2 \$string of function explode expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Tools/PostEditing.php + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_storeSegments\(\) has parameter \$type with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#2 \$subject of function preg_match_all expects string, string\|null given\.$#' - identifier: argument.type - count: 4 - path: lib/Utils/Tools/PostEditing.php + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_storeSegments\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' - identifier: argument.type - count: 6 - path: lib/Utils/Tools/PostEditing.php + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getFileContent\(\) has parameter \$file_content with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Class Utils\\Tools\\SimpleJWT implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:__construct\(\) has parameter \$hashMap with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:base64url_decode\(\) has parameter \$data with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getProjectsInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:base64url_decode\(\) never returns false so it can be removed from the return type\.$#' - identifier: return.unusedType + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getProjectsInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:getInstanceFromString\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:getInstanceFromString\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getRedisClient\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 3 - path: lib/Utils/Tools/SimpleJWT.php + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:getInstanceFromString\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:getPayload\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:isValid\(\) has parameter \$_storage with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:getSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:offsetSet\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:popProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:parseJWTString\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:popProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:sign\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:popProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\SimpleJWT\:\:sign\(\) throws checked exception UnexpectedValueException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:process\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^PHPDoc tag @property has invalid value \(int exp\)\: Unexpected token "exp", expected variable at offset 216 on line 10$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:pushProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^PHPDoc tag @property has invalid value \(int iat\)\: Unexpected token "iat", expected variable at offset 258 on line 12$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:pushProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^PHPDoc tag @property has invalid value \(int nbf\)\: Unexpected token "nbf", expected variable at offset 237 on line 11$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:pushProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^PHPDoc tag @property has invalid value \(mixed simple\.jwt\.claims\)\: Unexpected token "simple", expected variable at offset 305 on line 14$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:sendInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^PHPDoc tag @property has invalid value \(string aud\)\: Unexpected token "aud", expected variable at offset 195 on line 9$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:sendInQueue\(\) has parameter \$attributes with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^PHPDoc tag @property has invalid value \(string iss\)\: Unexpected token "iss", expected variable at offset 147 on line 7$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:sendInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^PHPDoc tag @property has invalid value \(string jti\)\: Unexpected token "jti", expected variable at offset 282 on line 13$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:setRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^PHPDoc tag @property has invalid value \(string sub\)\: Unexpected token "sub", expected variable at offset 171 on line 8$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:setRedisClient\(\) has parameter \$redisClient with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#1 \$data of static method Utils\\Tools\\SimpleJWT\:\:base64url_encode\(\) expects string, string\|false given\.$#' - identifier: argument.type - count: 6 - path: lib/Utils/Tools/SimpleJWT.php + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:updateProgress\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#1 \$json of function json_decode expects string, string\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Tools/SimpleJWT.php + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:updateProgress\(\) has parameter \$progress with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Parameter \#3 \$key of function hash_hmac expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:updateProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Property Utils\\Tools\\SimpleJWT\:\:\$customClaimsNamespace on left side of \?\? is not nullable nor uninitialized\.$#' - identifier: nullCoalesce.initializedProperty + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:updateSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Property Utils\\Tools\\SimpleJWT\:\:\$privateClaims type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:updateSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Property Utils\\Tools\\SimpleJWT\:\:\$secretKey \(string\|null\) is never assigned null so it can be removed from the property type\.$#' - identifier: property.unusedType + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:updateSegmentsCount\(\) has parameter \$segment_count with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Property Utils\\Tools\\SimpleJWT\:\:\$storage type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:updateSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Unsafe call to private method Utils\\Tools\\SimpleJWT\:\:parseJWTString\(\) through static\:\:\.$#' - identifier: staticClassAccess.privateMethod + message: '#^PHPDoc tag @var has invalid value \(\$redisClient ClientContextInterface\)\: Unexpected token "\$redisClient", expected type at offset 16 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/Utils/Tools/SimpleJWT.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$queueElement of method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Cannot access property \$parentNode on DOMElement\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$queueElement of method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:_createSegments\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Cannot call method getAttribute\(\) on DOMElement\|null\.$#' - identifier: method.nonObject + message: '#^Parameter \#1 \$string of function mb_substr expects string, array\\|string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Cannot call method replaceChild\(\) on DOMNode\|null\.$#' - identifier: method.nonObject + message: '#^Property Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:\$id_job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Loose comparison using \=\= between non\-empty\-string and '''' will always evaluate to false\.$#' - identifier: equal.alwaysFalse + message: '#^Property Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:\$job has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:api_timestamp\(\) has parameter \$date_string with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:\$project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:changeMemorySuggestionSource\(\) has parameter \$match with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\AsyncTasks\\Workers\\SegmentWorker\:\:\$redisClient has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:encryptPass\(\) has parameter \$clear_pass with no type specified\.$#' - identifier: missingType.parameter - count: 1 - path: lib/Utils/Tools/Utils.php + message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 2 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/SegmentWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:encryptPass\(\) has parameter \$salt with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\TMXImportWorker\:\:_TMXImport\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:ensure_keys\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\TMXImportWorker\:\:_checkForReQueueEnd\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:ensure_keys\(\) has parameter \$required_keys with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Offset ''id'' does not exist on null\.$#' + identifier: offsetAccess.notFound + count: 2 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php + + - + message: '#^Offset ''password'' does not exist on null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:ensure_keys\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Offset ''source'' does not exist on null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:getBrowser\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Offset ''target'' does not exist on null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:mysqlTimestamp\(\) has parameter \$time with no type specified\.$#' - identifier: missingType.parameter + message: '#^Parameter \#1 \$queueElement of method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\TMXImportWorker\:\:_TMXImport\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:removeEmptyStringFromTail\(\) has parameter \$array with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#1 \$queueElement of method Features\\Aligner\\Utils\\AsyncTasks\\Workers\\TMXImportWorker\:\:_checkForReQueueEnd\(\) expects Utils\\TaskRunner\\Commons\\QueueElement, Utils\\TaskRunner\\Commons\\AbstractElement given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php - - message: '#^Method Utils\\Tools\\Utils\:\:removeEmptyStringFromTail\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Property Utils\\TaskRunner\\Commons\\QueueElement\:\:\$reQueueNum \(int\) in isset\(\) is not nullable\.$#' + identifier: isset.property + count: 2 + path: plugins/aligner/lib/Features/Aligner/Utils/AsyncTasks/Workers/TMXImportWorker.php + + - + message: '#^Method Features\\Aligner\\Utils\\Email\\AbstractEmail\:\:_getDefaultMailConf\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/AbstractEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:returnSourcePageAsInt\(\) has parameter \$url with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Utils\\Email\\AbstractEmail\:\:_getLayoutVariables\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/AbstractEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:trimAndLowerCase\(\) has parameter \$string with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\Email\\AbstractEmail\:\:doSend\(\) has parameter \$address with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/AbstractEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:underscoreToCamelCase\(\) has parameter \$string with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\Email\\AbstractEmail\:\:doSend\(\) has parameter \$altBody with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/AbstractEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:upCountName\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Utils\\Email\\AbstractEmail\:\:doSend\(\) has parameter \$htmlBody with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/AbstractEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:upCountNameCallback\(\) has parameter \$matches with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Email\\AbstractEmail\:\:doSend\(\) has parameter \$subject with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/AbstractEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:validateEmailList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Email\\AbstractEmail\:\:sendTo\(\) has parameter \$address with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/AbstractEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:verifyPass\(\) has parameter \$clear_pass with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\Email\\AbstractEmail\:\:sendTo\(\) has parameter \$name with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/AbstractEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:verifyPass\(\) has parameter \$db_hashed_pass with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:__construct\(\) has parameter \$email with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Method Utils\\Tools\\Utils\:\:verifyPass\(\) has parameter \$salt with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:__construct\(\) has parameter \$job with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Negated boolean expression is always false\.$#' - identifier: booleanNot.alwaysFalse + message: '#^Method Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:__construct\(\) has parameter \$project with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Offset ''browser'' might not exist on array\{\}\|array\{0\: list\, browser\: list\, 1\: list\, version\: list\, 2\: list\\}\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:__construct\(\) has parameter \$user with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Offset ''line'' might not exist on array\{function\: string, line\?\: int, file\?\: string, class\?\: class\-string, type\?\: ''\-\>''\|''\:\:'', args\?\: list\, object\?\: object\}\.$#' - identifier: offsetAccess.notFound + message: '#^Method Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Parameter \#1 \$number of static method Plugins\\Features\\ReviewExtended\\ReviewUtils\:\:revisionNumberToSourcePage\(\) expects int\|null, string given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:_getTemplateVariables\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Parameter \#1 \$string of function strip_tags expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:\$email has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Parameter \#1 \$string of function trim expects string, string\|null given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Tools/Utils.php + message: '#^Property Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:\$job has no type specified\.$#' + identifier: missingType.property + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Parameter \#1 \$url of static method Utils\\Tools\\Utils\:\:returnSourcePageAsInt\(\) expects array, array\\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Tools/Utils.php + message: '#^Property Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:\$project has no type specified\.$#' + identifier: missingType.property + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Parameter \#2 \.\.\.\$arrays of function array_merge expects array, array\|false given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:\$url has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Tools/Utils.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:analyze\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\Email\\SendTMXEmail\:\:\$user has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Email/SendTMXEmail.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:analyze\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Features\\Aligner\\Utils\\GoogleTranslate\:\:\$client_secret\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:appRoot\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Features\\Aligner\\Utils\\GoogleTranslate\:\:\$doLog\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:downloadOriginal\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:_callMulti\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:downloadTranslation\(\) has parameter \$options with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:_callMulti\(\) has parameter \$curl_options_array with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:downloadXliff\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:_callMulti\(\) has parameter \$url with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:httpHost\(\) has parameter \$params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:_decodeMulti\(\) has parameter \$rawValues with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:inviteToTeamConfirm\(\) has parameter \$options with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:_decodeMulti\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:inviteToTeamConfirm\(\) has parameter \$requestInfo with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:callMulti\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:passwordReset\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + - + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:callMulti\(\) has parameter \$function with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:pluginsBase\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:callMulti\(\) has parameter \$isJsonRequest with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:revise\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:callMulti\(\) has parameter \$isPostRequest with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:signupConfirmation\(\) has parameter \$options with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:callMulti\(\) has parameter \$segments with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\CanonicalRoutes\:\:translate\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:callMulti\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/Utils/Url/CanonicalRoutes.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\JobUrlBuilder\:\:createFromJobStruct\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:getMulti\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Url/JobUrlBuilder.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\JobUrlBuilder\:\:createFromJobStructAndProjectName\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\GoogleTranslate\:\:getMulti\(\) has parameter \$_configs with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Url/JobUrlBuilder.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Parameter \#1 \$jid of class Utils\\Url\\JobUrls constructor expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$tokenHash of method Utils\\Network\\MultiCurlHandler\:\:hasError\(\) expects string, string\|null given\.$#' identifier: argument.type count: 1 - path: lib/Utils/Url/JobUrlBuilder.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\JobUrls\:\:__construct\(\) has parameter \$passwords with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Variable \$uniq_uid might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/Url/JobUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Method Utils\\Url\\JobUrls\:\:getUrls\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Variable \$url might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/Url/JobUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/GoogleTranslate.php - - message: '#^Property Utils\\Url\\JobUrls\:\:\$passwords type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Features\\Aligner\\Utils\\Engines_MyMemory\:\:\$client_secret\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Url/JobUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Property Utils\\Url\\JobUrls\:\:\$urls type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to an undefined property Features\\Aligner\\Utils\\Engines_MyMemory\:\:\$doLog\.$#' + identifier: property.notFound count: 1 - path: lib/Utils/Url/JobUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Property Utils\\Validator\\Contracts\\AbstractValidator\:\:\$errors type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:__construct\(\) has parameter \$engineRecord with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/Contracts/AbstractValidator.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Class Utils\\Validator\\Contracts\\ValidatorObject implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' - identifier: missingType.generics + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:_callMulti\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Validator/Contracts/ValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\Validator\\Contracts\\ValidatorObject\:\:fromArray\(\) has parameter \$array with no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:_callMulti\(\) has parameter \$curl_options_array with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Validator/Contracts/ValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Property Utils\\Validator\\Contracts\\ValidatorObject\:\:\$store type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:_callMulti\(\) has parameter \$url with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/Contracts/ValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static - count: 2 - path: lib/Utils/Validator/Contracts/ValidatorObject.php + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:_decodeMulti\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Access to an undefined property Utils\\Validator\\Contracts\\ValidatorObject\:\:\$csv\.$#' - identifier: property.notFound + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:_decodeMulti\(\) has parameter \$rawValues with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/GlossaryCSVValidator.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\Validator\\GlossaryCSVValidator\:\:getHeaders\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:callMulti\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Validator/GlossaryCSVValidator.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\Validator\\GlossaryCSVValidator\:\:validateLanguages\(\) has parameter \$headers with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:callMulti\(\) has parameter \$function with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/GlossaryCSVValidator.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Variable \$data in empty\(\) always exists and is not falsy\.$#' - identifier: empty.variable + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:callMulti\(\) has parameter \$isJsonRequest with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/IsJobRevisionValidator.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\Validator\\JSONSchema\\Errors\\JSONValidatorException\:\:getFormattedError\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:callMulti\(\) has parameter \$isPostRequest with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/JSONSchema/Errors/JSONValidatorException.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\Validator\\JSONSchema\\Errors\\JSONValidatorException\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:callMulti\(\) has parameter \$segments with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: lib/Utils/Validator/JSONSchema/Errors/JSONValidatorException.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Property Utils\\Validator\\JSONSchema\\Errors\\JSONValidatorException\:\:\$error on left side of \?\? is not nullable nor uninitialized\.$#' - identifier: nullCoalesce.initializedProperty + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:emailExportAligner\(\) has parameter \$id_tmx with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/JSONSchema/Errors/JSONValidatorException.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Parameter \#1 \$message of method Exception\:\:__construct\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:emailExportAligner\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/JSONSchema/Errors/JsonValidatorGenericException.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Swaggest\\JsonSchema\\RemoteRefProvider@anonymous/Utils/Validator/JSONSchema/JSONValidator\.php\:49\:\:getSchemaData\(\) should return stdClass but returns object\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:emailExportAligner\(\) has parameter \$name with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/JSONSchema/JSONValidator.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\Validator\\JSONSchema\\JSONValidator\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:emailExportAligner\(\) has parameter \$userEmail with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/JSONSchema/JSONValidator.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\Validator\\JSONSchema\\JSONValidator\:\:getValidJSONSchema\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:emailExportAligner\(\) has parameter \$userName with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/JSONSchema/JSONValidator.php - - - - message: '#^Parameter \#1 \$jsonSchema of static method Utils\\Validator\\JSONSchema\\JSONValidator\:\:getValidJSONSchema\(\) expects string, string\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/Utils/Validator/JSONSchema/JSONValidator.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Argument of an invalid type object supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:emailExportAligner\(\) has parameter \$userSurname with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/Validator/JSONSchema/JSONValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\Validator\\JSONSchema\\JSONValidatorObject\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:getMulti\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/Validator/JSONSchema/JSONValidatorObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\XliffReplacer\\SilentXliffReplacerCallback\:\:thereAreErrors\(\) has Exception in PHPDoc @throws tag but it''s not thrown\.$#' - identifier: throws.unusedType + message: '#^Method Features\\Aligner\\Utils\\Engines_MyMemory\:\:getMulti\(\) has parameter \$_configs with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/XliffReplacer/SilentXliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Cannot access property \$target on Model\\Jobs\\JobStruct\|null\.$#' - identifier: property.nonObject + message: '#^Parameter \#1 \$tokenHash of method Utils\\Network\\MultiCurlHandler\:\:hasError\(\) expects string, string\|null given\.$#' + identifier: argument.type count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Cannot call method getProject\(\) on Model\\Jobs\\JobStruct\|null\.$#' - identifier: method.nonObject + message: '#^Property Features\\Aligner\\Utils\\Engines_MyMemory\:\:\$config has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\XliffReplacer\\XliffReplacerCallback\:\:icuEnabled\(\) should return bool but returns string\|false\.$#' - identifier: return.type + message: '#^Variable \$uniq_uid might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Method Utils\\XliffReplacer\\XliffReplacerCallback\:\:icuEnabled\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Variable \$url might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/Engines/MyMemory.php - - message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCacheFolder\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Parameter \#1 \$sourceValidator of static method Matecat\\ICU\\MessagePatternComparator\:\:fromValidators\(\) expects Matecat\\ICU\\MessagePatternValidator, Matecat\\ICU\\MessagePatternValidator\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCacheFolder\(\) has parameter \$idFile with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Parameter \#2 \$chunk of method Utils\\XliffReplacer\\XliffReplacerCallback\:\:sourceContainsIcu\(\) expects Model\\Jobs\\JobStruct, Model\\Jobs\\JobStruct\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCacheFolder\(\) has parameter \$lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCacheFolder\(\) has parameter \$prefix with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Property Utils\\XliffReplacer\\XliffReplacerCallback\:\:\$icuEnabled \(bool\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCachePackage\(\) has parameter \$idFile with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Property Utils\\XliffReplacer\\XliffReplacerCallback\:\:\$jobStruct \(Model\\Jobs\\JobStruct\|null\) is never assigned null so it can be removed from the property type\.$#' - identifier: property.unusedType + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCachePackage\(\) has parameter \$lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Property Utils\\XliffReplacer\\XliffReplacerCallback\:\:\$subfilteringCustomHandlers type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCachePackage\(\) has parameter \$prefix with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/Utils/XliffReplacer/XliffReplacerCallback.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Call to function is_numeric\(\) with int will always evaluate to true\.$#' - identifier: function.alreadyNarrowedType - count: 2 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCachePath\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:__construct\(\) has parameter \$projectName with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCachePath\(\) has parameter \$idFile with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCachePath\(\) has parameter \$jsonPath with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:getEngines\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCachePath\(\) has parameter \$lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:getMemoryKeys\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:getJsonCachePath\(\) has parameter \$prefix with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:getPassword\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:makeJsonCachePackage\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:hasFile\(\) has parameter \$id with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:makeJsonCachePackage\(\) has parameter \$idFile with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisChunk\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:makeJsonCachePackage\(\) has parameter \$jsonPath with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Result of \|\| is always false\.$#' - identifier: booleanOr.alwaysFalse + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:makeJsonCachePackage\(\) has parameter \$lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php - - - - message: '#^Unable to resolve the template type T in call to static method Utils\\Engines\\EnginesFactory\:\:getInstance\(\)$#' - identifier: argument.templateType - count: 2 - path: lib/View/API/App/Json/Analysis/AnalysisChunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$id with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:makeJsonCachePackage\(\) has parameter \$originalPath with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisFile.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$id_file_part with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\FilesStorage\\S3AlignerFilesStorage\:\:makeJsonCachePackage\(\) has parameter \$prefix with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisFile.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$metadata with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Variable \$content might not be defined\.$#' + identifier: variable.undefined count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisFile.php + path: plugins/aligner/lib/Features/Aligner/Utils/FilesStorage/S3AlignerFilesStorage.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:alignSegments\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisFile.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) has parameter \$original_name with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:alignSegments\(\) has parameter \$project with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisFile.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException - count: 3 - path: lib/View/API/App/Json/Analysis/AnalysisFile.php + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:alignSegments\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:alignSegments\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisFile.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Property View\\API\\App\\Json\\Analysis\\AnalysisFile\:\:\$metadata type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:extractPhrasesArray\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisFile.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisFileMetadata\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:extractPhrasesArray\(\) has parameter \$segments with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisFileMetadata.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisJob\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getAlignment\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisJob.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisJobSummary\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getAlignment\(\) has parameter \$json_data with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisJobSummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisMatch\:\:__construct\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getAlignment\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException - count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisMatch.php + count: 3 + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisMatch\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisMatch.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Unsafe usage of new static\(\)\.$#' - identifier: new.static + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisMatch.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProject\:\:getJob\(\) has parameter \$id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getProjectsInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisProject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProject\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getProjectsInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisProject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProjectSummary\:\:getEstimatedWorkTime\(\) is unused\.$#' - identifier: method.unused + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisProjectSummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProjectSummary\:\:getEstimatedWorkTime\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getRedisClient\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisProjectSummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Analysis\\AnalysisProjectSummary\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/Analysis/AnalysisProjectSummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:__construct\(\) has parameter \$data with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/ConnectedService.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:getSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/View/API/App/Json/ConnectedService.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:mapNewAlignment\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/ConnectedService.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:render\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:mapNewAlignment\(\) has parameter \$indexes with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/ConnectedService.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\ConnectedService\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:mapNewAlignment\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/ConnectedService.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\OutsourceConfirmation\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:mapNewAlignment\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/OutsourceConfirmation.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\Ping\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:mapNewAlignment\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/API/App/Json/Ping.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\UserProfile\:\:renderItem\(\) has parameter \$userMetadata with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:mapNewAlignment\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php + + - + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:popProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/App/Json/UserProfile.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\UserProfile\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:popProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/UserProfile.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\App\\Json\\UserProfile\:\:renderItem\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:popProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/App/Json/UserProfile.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\Error\:\:jsonSerialize\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:pushProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/Commons/Error.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\Error\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:pushProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/Commons/Error.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Argument of an invalid type array\|View\\API\\Commons\\ZipContentObject supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:pushProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:__construct\(\) has parameter \$_array_params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:setRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:__set\(\) has parameter \$name with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:setRedisClient\(\) has parameter \$redisClient with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:__set\(\) has parameter \$value with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:updateProgress\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php + + - + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:updateProgress\(\) has parameter \$progress with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:__set\(\) throws checked exception DomainException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:updateProgress\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:build\(\) has parameter \$_array_params with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:updateSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:getContent\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:updateSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:setDocumentContentFromFileSystem\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:updateSegmentsCount\(\) has parameter \$segment_count with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:setDocumentContentFromS3\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + message: '#^Method Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:updateSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' identifier: missingType.checkedException count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\Commons\\ZipContentObject\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$redisClient ClientContextInterface\)\: Unexpected token "\$redisClient", expected type at offset 16 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Parameter \#1 \$filename of function file_get_contents expects string, string\|null given\.$#' + message: '#^Parameter \#1 \$json of function json_decode expects string, bool\|string given\.$#' identifier: argument.type count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Parameter \#1 \$filename of function is_file expects string, string\|null given\.$#' + message: '#^Parameter \#3 \$value of function curl_setopt expects bool, int given\.$#' identifier: argument.type count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Property View\\API\\Commons\\ZipContentObject\:\:\$document_content \(string\|null\) does not accept string\|false\.$#' - identifier: assign.propertyType + message: '#^Property Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:\$approximated has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/Commons/ZipContentObject.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Activity\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:\$lessCommon has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/Activity.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Activity\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:\$long has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/Activity.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^PHPDoc tag @var has invalid value \(\$record ActivityLogStruct\)\: Unexpected token "\$record", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Property Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:\$native has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/Activity.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Chunk\:\:renderOne\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:\$project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\CreationStatus\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:\$redisClient has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/CreationStatus.php - - - - message: '#^Property View\\API\\V2\\Json\\CreationStatus\:\:\$data in isset\(\) is not nullable nor uninitialized\.$#' - identifier: isset.initializedProperty - count: 4 - path: lib/View/API/V2/Json/CreationStatus.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Engine\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\NewAlignmentAlgorithm\:\:\$zero has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/Engine.php + path: plugins/aligner/lib/Features/Aligner/Utils/NewAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Engine\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Access to constant MT on an unknown class Features\\Aligner\\Utils\\Constants_Engines\.$#' + identifier: class.notFound count: 1 - path: lib/View/API/V2/Json/Engine.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^PHPDoc tag @var has invalid value \(\$data EngineStruct\[\]\)\: Unexpected token "\$data", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Cannot assign offset ''client_secret'' to array\|string\|null\.$#' + identifier: offsetAssign.dimType count: 1 - path: lib/View/API/V2/Json/Engine.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Access to an undefined property object\:\:\$warnings_count\.$#' - identifier: property.notFound + message: '#^Cannot use array destructuring on list\|null\.$#' + identifier: offsetAccess.nonArray count: 1 - path: lib/View/API/V2/Json/Job.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Job\:\:fillUrls\(\) has parameter \$result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Utils\\array_diff_opt\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/Job.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Job\:\:fillUrls\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Utils\\array_diff_opt\(\) has parameter \$commonWords with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Job.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Job\:\:getKeyList\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Utils\\array_diff_opt\(\) has parameter \$words with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Job.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Job\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Utils\\array_intersect_opt\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/Job.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^PHPDoc tag @var has invalid value \(\$formatted ProjectUrls\)\: Unexpected token "\$formatted", expected type at offset 9 on line 1$#' - identifier: phpDoc.parseError + message: '#^Function Features\\Aligner\\Utils\\array_intersect_opt\(\) has parameter \$a with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Job.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#1 \$datetime of function strtotime expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Function Features\\Aligner\\Utils\\array_intersect_opt\(\) has parameter \$b with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Job.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#1 \$pid of method Model\\Projects\\ProjectDao\:\:getProjectData\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Function Features\\Aligner\\Utils\\levenshtein_opt\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/Job.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\JobClientKeys\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Utils\\levenshtein_opt\(\) has parameter \$costDel with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/JobClientKeys.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\JobClientKeys\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Utils\\levenshtein_opt\(\) has parameter \$costIns with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/JobClientKeys.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\JobTranslator\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Utils\\levenshtein_opt\(\) has parameter \$costRep with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/JobTranslator.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Call to function is_null\(\) with Model\\Users\\UserStruct will always evaluate to false\.$#' - identifier: function.impossibleType - count: 2 - path: lib/View/API/V2/Json/Membership.php + message: '#^Function Features\\Aligner\\Utils\\levenshtein_opt\(\) has parameter \$str1 with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Membership\:\:__construct\(\) has parameter \$data with no type specified\.$#' + message: '#^Function Features\\Aligner\\Utils\\levenshtein_opt\(\) has parameter \$str2 with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Membership.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Membership\:\:__construct\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Function Features\\Aligner\\Utils\\segments_merge\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/Membership.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Membership\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Function Features\\Aligner\\Utils\\segments_merge\(\) has parameter \$segments with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Membership.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Membership\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:align\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/Membership.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Membership\:\:renderItemPublic\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:align\(\) has parameter \$original with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Membership.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Membership\:\:renderPublic\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:align\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Membership.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Cannot access property \$key on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:align\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/MemoryKeys.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Cannot access property \$name on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: property.nonObject + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:align\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/API/V2/Json/MemoryKeys.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Cannot call method isShared\(\) on Utils\\TmKeyManagement\\TmKeyStruct\|null\.$#' - identifier: method.nonObject + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:align\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php + + - + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignPart\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/MemoryKeys.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\MemoryKeys\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignPart\(\) has parameter \$offset with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/MemoryKeys.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\MemoryKeys\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignPart\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/MemoryKeys.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Project\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignPart\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Project.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Project\:\:render\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignSegments\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/Project.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Project\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignSegments\(\) has parameter \$project with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Project.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^PHPDoc tag @var has invalid value \(\$jobJSON Job\)\: Unexpected token "\$jobJSON", expected type at offset 24 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignSegments\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Project.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#1 \$pid of static method Model\\Projects\\ProjectDao\:\:getProjectAndJobData\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignSegments\(\) has parameter \$source_lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Project.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\ProjectUrls\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignSegments\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\ProjectUrls\:\:getData\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignSegments\(\) has parameter \$target_lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\ProjectUrls\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignWindow\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#3 \$password of static method Utils\\Url\\CanonicalRoutes\:\:revise\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignWindow\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$chunks type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:alignWindow\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$data type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:buildScores\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$files type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:buildScores\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$formatted type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:buildScores\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\ProjectUrls\:\:\$jobs type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:cleanSegments\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/ProjectUrls.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Propagation\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:cleanSegments\(\) has parameter \$segments with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Propagation.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\QAGlobalWarning\:\:__construct\(\) has parameter \$tagIssues with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:evalSentences\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/QAGlobalWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\QAGlobalWarning\:\:__construct\(\) has parameter \$translationMismatches with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:evalSentences\(\) has parameter \$sources with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/QAGlobalWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\QAGlobalWarning\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:evalSentences\(\) has parameter \$targets with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/QAGlobalWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\QAGlobalWarning\:\:\$structure type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:evalSentences\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/API/V2/Json/QAGlobalWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\QAGlobalWarning\:\:\$tagIssues type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:extractPath\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/QAGlobalWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\QAGlobalWarning\:\:\$translationMismatches type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:extractPath\(\) has parameter \$scores with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/QAGlobalWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\QALocalWarning\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:extractPath\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/QALocalWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\QAWarning\:\:pushErrorSegment\(\) has parameter \$content with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:extractPath\(\) has parameter \$target with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/QAWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\QAWarning\:\:pushErrorSegment\(\) has parameter \$error_category with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:find100x100Matches\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php + + - + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:find100x100Matches\(\) has parameter \$original with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/QAWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\QAWarning\:\:pushErrorSegment\(\) has parameter \$error_type with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:find100x100Matches\(\) has parameter \$source with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/QAWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\QAWarning\:\:\$structure type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:find100x100Matches\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/QAWarning.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Interface Model\\DataAccess\\IDaoStruct referenced with incorrect case\: Model\\DataAccess\\IdaoStruct\.$#' - identifier: interface.nameCase + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/SegmentTranslationIssue.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:genCSVTmpFile\(\) has parameter \$data with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getProgress\(\) has parameter \$project_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentTranslationIssue.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:genCSVTmpFile\(\) throws checked exception LogicException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getProjectsInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/SegmentTranslationIssue.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:genCSVTmpFile\(\) throws checked exception RuntimeException but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getProjectsInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentTranslationIssue.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/SegmentTranslationIssue.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentTranslationIssue\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getRedisClient\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/API/V2/Json/SegmentTranslationIssue.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#2 \$timestamp of function date expects int\|null, int\|false given\.$#' - identifier: argument.type - count: 2 - path: lib/View/API/V2/Json/SegmentTranslationIssue.php + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToLayer2\(\)\.$#' - identifier: method.notFound - count: 2 - path: lib/View/API/V2/Json/SegmentTranslationMismatches.php + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentTranslationMismatches\:\:__construct\(\) has parameter \$Translation_mismatches with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:getSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/API/V2/Json/SegmentTranslationMismatches.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentTranslationMismatches\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:mapAlignment\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/SegmentTranslationMismatches.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentTranslationMismatches\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:mapAlignment\(\) has parameter \$indexes with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentTranslationMismatches.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:mapAlignment\(\) has parameter \$source with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentTranslationMismatches.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:mapAlignment\(\) has parameter \$target with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentTranslationMismatches.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\SegmentTranslationMismatches\:\:\$data type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:popProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/SegmentTranslationMismatches.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToLayer2\(\)\.$#' - identifier: method.notFound + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:popProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:popProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:pushProjectInQueue\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:renderItem\(\) has parameter \$version with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:pushProjectInQueue\(\) has parameter \$project_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:pushProjectInQueue\(\) has parameter \$queue with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:renderItemsNormal\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:setRedisClient\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\SegmentVersion\:\:renderItemsWithIssues\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:setRedisClient\(\) has parameter \$redisClient with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#1 \$id_job of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:translateSegments\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Parameter \#2 \$password of method Model\\Jobs\\MetadataDao\:\:getSubfilteringCustomHandlers\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:translateSegments\(\) has parameter \$segments with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\SegmentVersion\:\:\$featureSet \(Model\\FeaturesBase\\FeatureSet\|null\) is never assigned null so it can be removed from the property type\.$#' - identifier: property.unusedType + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:translateSegments\(\) has parameter \$source_lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Variable \$Filter in PHPDoc tag @var does not match assigned variable \$metadataDao\.$#' - identifier: varTag.differentVariable + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:translateSegments\(\) has parameter \$target_lang with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/SegmentVersion.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Argument of an invalid type array\|null supplied for foreach, only iterables are supported\.$#' - identifier: foreach.nonIterable + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:translateSegments\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/API/V2/Json/Team.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Team\:\:__construct\(\) has parameter \$data with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/View/API/V2/Json/Team.php + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:translateSegments\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 4 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Team\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: lib/View/API/V2/Json/Team.php + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:translateSegments\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException + count: 2 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\Team\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:translateSegments\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/API/V2/Json/Team.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^PHPDoc tag @var has invalid value \(\$data TeamStruct\[\]\)\: Unexpected token "\$data", expected type at offset 20 on line 2$#' - identifier: phpDoc.parseError + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:updateProgress\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/Team.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\Team\:\:\$data type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:updateProgress\(\) has parameter \$progress with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/Team.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\TranslationIssueComment\:\:render\(\) has parameter \$array with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:updateProgress\(\) has parameter \$project_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/TranslationIssueComment.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\TranslationIssueComment\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:updateSegmentsCount\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V2/Json/TranslationIssueComment.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\TranslationIssueComment\:\:renderItem\(\) has parameter \$record with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:updateSegmentsCount\(\) has parameter \$project_id with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/TranslationIssueComment.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\TranslationIssueComment\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:updateSegmentsCount\(\) has parameter \$segment_count with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V2/Json/TranslationIssueComment.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\TranslationIssueComment\:\:\$data has no type specified\.$#' - identifier: missingType.property + message: '#^Method Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:updateSegmentsCount\(\) throws checked exception ReflectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/API/V2/Json/TranslationIssueComment.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Property View\\API\\V2\\Json\\TranslationIssueComment\:\:\$data is unused\.$#' - identifier: property.unused + message: '#^Offset 0 might not exist on array\{\(float\|int\), 0\|1\|2, 0\|1\|2, mixed\}\|null\.$#' + identifier: offsetAccess.notFound count: 1 - path: lib/View/API/V2/Json/TranslationIssueComment.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\User\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$engineRecord EnginesModel_EngineStruct\)\: Unexpected token "\$engineRecord", expected type at offset 24 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/View/API/V2/Json/User.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\User\:\:renderItemPublic\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$redisClient ClientContextInterface\)\: Unexpected token "\$redisClient", expected type at offset 16 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/View/API/V2/Json/User.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\UserMetadata\:\:renderMetadataCollection\(\) has parameter \$collection with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Parameter \#3 \$limit of function preg_split expects int, null given\.$#' + identifier: argument.type + count: 3 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php + + - + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$approximated has no type specified\.$#' + identifier: missingType.property + count: 1 + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php + + - + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$is_hindi has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/UserMetadata.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\UserMetadata\:\:renderMetadataCollection\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$lessCommon has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/UserMetadata.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V2\\Json\\WaitCreation\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$long has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V2/Json/WaitCreation.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Access to an undefined property object\:\:\$warnings_count\.$#' - identifier: property.notFound + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$min_score has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V3\\Json\\Chunk\:\:getChunkReviews\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$native has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V3\\Json\\Chunk\:\:getTimeToEditArray\(\) has parameter \$chunk_id with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$project has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V3\\Json\\Chunk\:\:getTimeToEditArray\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$redisClient has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V3\\Json\\Chunk\:\:populateRevisePasswords\(\) has parameter \$result with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$swapped_langs has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V3\\Json\\Chunk\:\:populateRevisePasswords\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property Features\\Aligner\\Utils\\OldAlignmentAlgorithm\:\:\$zero has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/OldAlignmentAlgorithm.php - - message: '#^Method View\\API\\V3\\Json\\Chunk\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Routes\:\:downloadTMX\(\) has parameter \$job_id with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/Routes.php - - message: '#^Method View\\API\\V3\\Json\\Chunk\:\:renderOne\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Routes\:\:downloadTMX\(\) has parameter \$job_password with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/Routes.php - - message: '#^Property View\\API\\V3\\Json\\Chunk\:\:\$chunk_reviews type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Routes\:\:downloadTMX\(\) has parameter \$options with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/Chunk.php + path: plugins/aligner/lib/Features/Aligner/Utils/Routes.php - - message: '#^Method View\\API\\V3\\Json\\FilesInfo\:\:render\(\) has parameter \$filesStructList with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\Routes\:\:staticBuild\(\) has parameter \$file with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/FilesInfo.php + path: plugins/aligner/lib/Features/Aligner/Utils/Routes.php - - message: '#^Method View\\API\\V3\\Json\\FilesInfo\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\Routes\:\:staticBuild\(\) has parameter \$options with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/FilesInfo.php + path: plugins/aligner/lib/Features/Aligner/Utils/Routes.php - - message: '#^Ternary operator condition is always false\.$#' - identifier: ternary.alwaysFalse + message: '#^Call to an undefined method Matecat\\SubFiltering\\AbstractFilter\:\:fromLayer0ToRawXliff\(\)\.$#' + identifier: method.notFound count: 2 - path: lib/View/API/V3/Json/FilesInfo.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:getDetails\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\TMSService\:\:importTMXInTM\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) has parameter \$categories with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\TMSService\:\:importTMXInTM\(\) has parameter \$tm_key with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) has parameter \$passfail with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\TMSService\:\:requestChunkTMXEmailDownload\(\) has parameter \$id_tmx with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) has parameter \$quality_overall with no type specified\.$#' + message: '#^Method Features\\Aligner\\Utils\\TMSService\:\:requestChunkTMXEmailDownload\(\) has parameter \$tm_key with no type specified\.$#' identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) has parameter \$reviseIssues with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\TMSService\:\:requestChunkTMXEmailDownload\(\) has parameter \$userMail with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:populateQualitySummarySection\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\TMSService\:\:requestChunkTMXEmailDownload\(\) has parameter \$userName with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:render\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Aligner\\Utils\\TMSService\:\:requestChunkTMXEmailDownload\(\) has parameter \$userSurname with no type specified\.$#' + identifier: missingType.parameter count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:renderItem\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$Filter MateCatFilter\)\: Unexpected token "\$Filter", expected type at offset 9 on line 1$#' + identifier: phpDoc.parseError count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Method View\\API\\V3\\Json\\QualitySummary\:\:revisionQualityVars\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^PHPDoc tag @var has invalid value \(\$engineRecord \\Model\\Engines\\Structs\\EngineStruct\)\: Unexpected token "\$engineRecord", expected type at offset 20 on line 2$#' + identifier: phpDoc.parseError count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Parameter \#1 \$idJob of static method View\\API\\V3\\Json\\QualitySummary\:\:getDetails\(\) expects int, int\|null given\.$#' - identifier: argument.type + message: '#^PHPDoc tag @var with type Utils\\Engines\\MyMemory is not subtype of native type Utils\\Engines\\Results\\MyMemory\\FileImportAndStatusResponse\.$#' + identifier: varTag.nativeType count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Parameter \#1 \$job_id of method Model\\QualityReport\\QualityReportDao\:\:getReviseIssuesByChunk\(\) expects int, int\|null given\.$#' + message: '#^Parameter \#1 \$featureSet of static method Matecat\\SubFiltering\\AbstractFilter\:\:getInstance\(\) expects Matecat\\SubFiltering\\Contracts\\FeatureSetInterface, Model\\FeaturesBase\\FeatureSet\|null given\.$#' identifier: argument.type count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Parameter \#2 \$password of method Model\\QualityReport\\QualityReportDao\:\:getReviseIssuesByChunk\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property Features\\Aligner\\Utils\\TMSService\:\:\$tmxFilePath has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TMSService.php - - message: '#^Parameter \#2 \$password of static method View\\API\\V3\\Json\\QualitySummary\:\:getDetails\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Call to an undefined method Model\\DataAccess\\IDatabase\:\:ping\(\)\.$#' + identifier: method.notFound count: 1 - path: lib/View/API/V3/Json/QualitySummary.php + path: plugins/aligner/lib/Features/Aligner/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method UploadHandler\:\:_isRightExtension\(\) has parameter \$fileUp with no type specified\.$#' - identifier: missingType.parameter + message: '#^Method Features\\Aligner\\Utils\\TaskRunner\\Commons\\AbstractWorker\:\:_checkDatabaseConnection\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/lib/Features/Aligner/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method UploadHandler\:\:_isRightMime\(\) has parameter \$fileUp with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property Features\\Aligner\\Utils\\TaskRunner\\Commons\\AbstractWorker\:\:\$dbHandler has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/lib/Features/Aligner/Utils/TaskRunner/Commons/AbstractWorker.php - - message: '#^Method UploadHandler\:\:getMimeContentType\(\) should return bool\|string but returns string\|null\.$#' - identifier: return.type + message: '#^Property ChangeMimeToExtension\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308102522_change_mime_to_extension.php - - message: '#^Method UploadHandler\:\:get_file_object\(\) has parameter \$file_name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property ChangeMimeToExtension\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308102522_change_mime_to_extension.php - - message: '#^Method UploadHandler\:\:get_file_objects\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property RemoveLanguageCodeFromFiles\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308104110_remove_language_code_from_files.php - - message: '#^Method UploadHandler\:\:normalFileDelete\(\) has parameter \$file_name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property RemoveLanguageCodeFromFiles\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308104110_remove_language_code_from_files.php - - message: '#^Method UploadHandler\:\:normalFileDelete\(\) has parameter \$segmentationRule with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property RemoveLanguageCodeFromSegments\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308111234_remove_language_code_from_segments.php - - message: '#^Method UploadHandler\:\:normalFileDelete\(\) has parameter \$source with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property RemoveLanguageCodeFromSegments\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308111234_remove_language_code_from_segments.php - - message: '#^Method UploadHandler\:\:normalFileDelete\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property MoveStatusAnalysisFromJobToProject\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308113315_move_status_analysis_from_job_to_project.php - - message: '#^Method UploadHandler\:\:normalFileDelete\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property MoveStatusAnalysisFromJobToProject\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308113315_move_status_analysis_from_job_to_project.php - - message: '#^Method UploadHandler\:\:set_file_delete_url\(\) has parameter \$file with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property RemoveProgressFromJob\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308130607_remove_progress_from_job.php - - message: '#^Method UploadHandler\:\:up_count_name\(\) should return string but returns string\|null\.$#' - identifier: return.type + message: '#^Property RemoveProgressFromJob\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190308130607_remove_progress_from_job.php - - message: '#^Method UploadHandler\:\:up_count_name_callback\(\) has parameter \$matches with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property RemoveDueDateProject\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190311100656_remove_due_date_project.php - - message: '#^Method UploadHandler\:\:zipFileDelete\(\) has parameter \$file_name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property RemoveDueDateProject\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190311100656_remove_due_date_project.php - - message: '#^Method UploadHandler\:\:zipFileDelete\(\) has parameter \$segmentationRule with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property MoveSubjectFromJobToProject\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190311102656_move_subject_from_job_to_project.php - - message: '#^Method UploadHandler\:\:zipFileDelete\(\) has parameter \$source with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property MoveSubjectFromJobToProject\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190311102656_move_subject_from_job_to_project.php - - message: '#^Method UploadHandler\:\:zipFileDelete\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property RemoveUnusefulKeys\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190311112108_remove_unuseful_keys.php - - message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) has parameter \$file_name with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property RemoveUnusefulKeys\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190311112108_remove_unuseful_keys.php - - message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) has parameter \$segmentationRule with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property AddIndexOnSegmentMatch\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190311141338_add_index_on_segment_match.php - - message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) has parameter \$source with no type specified\.$#' - identifier: missingType.parameter + message: '#^Property AddIndexOnSegmentMatch\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190311141338_add_index_on_segment_match.php - - message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Property RemoveRawContentAndContentHash\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190612124659_remove_raw_content_and_content_hash.php - - message: '#^Method UploadHandler\:\:zipInternalFileDelete\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' - identifier: missingType.checkedException + message: '#^Property RemoveRawContentAndContentHash\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20190612124659_remove_raw_content_and_content_hash.php - - message: '#^Offset ''extension'' might not exist on array\{dirname\?\: string, basename\: string, extension\?\: string, filename\: string\}\.$#' - identifier: offsetAccess.notFound + message: '#^Property AddJobExported\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20200121174927_add_job_exported.php - - message: '#^Offset ''extension'' might not exist on array\|string\.$#' - identifier: offsetAccess.notFound + message: '#^Property AddJobExported\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20200121174927_add_job_exported.php - - message: '#^Parameter \#1 \$fileName of static method UploadHandler\:\:_validateFileName\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Property AddJobExportedTable\:\:\$sql_down has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20210313183027_add_jobs_exported_table.php - - message: '#^Parameter \#1 \$finfo of function finfo_close expects finfo, finfo\|false given\.$#' - identifier: argument.type + message: '#^Property AddJobExportedTable\:\:\$sql_up has no type specified\.$#' + identifier: missingType.property count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/aligner/migrations/20210313183027_add_jobs_exported_table.php - - message: '#^Parameter \#1 \$finfo of function finfo_file expects finfo, finfo\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Translated\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/translated/lib/Features/Translated.php - - message: '#^Parameter \#1 \$path of static method Model\\FilesStorage\\AbstractFilesStorage\:\:pathinfo_fix\(\) expects string, string\|null given\.$#' - identifier: argument.type + message: '#^Method Features\\Translated\:\:__construct\(\) throws checked exception Stomp\\Exception\\ConnectionException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/translated/lib/Features/Translated.php - - message: '#^Parameter \#1 \$stream of function fclose expects resource, resource\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Translated\:\:checkForRealData\(\) throws checked exception DivisionByZeroError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/translated/lib/Features/Translated.php - - message: '#^Parameter \#1 \$stream of function fread expects resource, resource\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Translated\:\:swapOff\(\) throws checked exception TypeError but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 2 - path: lib/View/fileupload/UploadHandler.php + path: plugins/translated/lib/Features/Translated.php - - message: '#^Parameter \#1 \$string of function rawurlencode expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Translated\:\:tmAnalysisDisabled\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/translated/lib/Features/Translated.php - - message: '#^Parameter \#1 \$value of function count expects array\|Countable, list\\|false given\.$#' - identifier: argument.type + message: '#^Property Model\\Jobs\\JobStruct\:\:\$id_mt_engine \(int\) does not accept string\|null\.$#' + identifier: assign.propertyType count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/translated/lib/Features/Translated.php - - message: '#^Parameter \#2 \$offset of function substr expects int, int\|false given\.$#' - identifier: argument.type - count: 3 - path: lib/View/fileupload/UploadHandler.php + message: '#^Property Model\\Jobs\\JobStruct\:\:\$id_tms \(int\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: plugins/translated/lib/Features/Translated.php - - message: '#^Parameter \#2 \$subject of function preg_match expects string, string\|false given\.$#' - identifier: argument.type + message: '#^Method Features\\Translated\\Http\\TOSApiClient\:\:send\(\) throws checked exception InvalidArgumentException but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/translated/lib/Features/Translated/Http/TOSApiClient.php - - message: '#^Property UploadHandler\:\:\$options type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue + message: '#^Method Features\\Translated\\Utils\\SupportedLanguages\:\:__construct\(\) throws checked exception Exception but it''s missing from the PHPDoc @throws tag\.$#' + identifier: missingType.checkedException count: 1 - path: lib/View/fileupload/UploadHandler.php + path: plugins/translated/lib/Features/Translated/Utils/SupportedLanguages.php + + - + message: '#^Access to an undefined property object\:\:\$segment\.$#' + identifier: property.notFound + count: 1 + path: plugins/uber/lib/Features/Uber.php + + - + message: '#^Offset ''Additional Info''\|''AdditionalInfo''\|''Component''\|''Content Type''\|''Description''\|''DynamicValueExample''\|''KeyName''\|''MobileUsages''\|''Preview Link''\|''ReferenceLinks''\|''Repo''\|''Target Audience'' might not exist on array\{\}\|array\{Repo\?\: non\-falsy\-string, KeyName\?\: non\-falsy\-string, Description\?\: non\-falsy\-string, ''Content Type''\?\: non\-falsy\-string, ''Preview Link''\?\: non\-falsy\-string, ''Additional Info''\?\: non\-falsy\-string, DynamicValueExample\?\: non\-falsy\-string, Component\?\: non\-falsy\-string, \.\.\.\}\.$#' + identifier: offsetAccess.notFound + count: 2 + path: plugins/uber/lib/Features/Uber/Utils/NoteExtractor.php diff --git a/phpstan.neon b/phpstan.neon index f202c4d96d..74dc78df1e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -5,11 +5,15 @@ parameters: level: 8 paths: - lib + - plugins scanFiles: - router.php excludePaths: - lib/View/APIDoc.php (?) - lib/View/templates/_APIDoc.php + - vendor + - plugins/translated/tests + - plugins/uber/tests universalObjectCratesClasses: - Model\DataAccess\ShapelessConcreteStruct # Flag @throws \Exception on public/protected methods when only @@ -23,3 +27,4 @@ parameters: # Report when @throws declares a broader type than # what is actually thrown (applies to all methods) tooWideThrowType: true + treatPhpDocTypesAsCertain: false diff --git a/plugins/airbnb b/plugins/airbnb index 0d6152c9c4..a8bd3ab107 160000 --- a/plugins/airbnb +++ b/plugins/airbnb @@ -1 +1 @@ -Subproject commit 0d6152c9c48bff972f5b7a591b507389d0a830e0 +Subproject commit a8bd3ab107ba3d2bfde780c3a15a95937f5760cb diff --git a/plugins/translated b/plugins/translated index c957a29a76..84b9f02a87 160000 --- a/plugins/translated +++ b/plugins/translated @@ -1 +1 @@ -Subproject commit c957a29a768561735bdec0276d7fce45aeedcecd +Subproject commit 84b9f02a8760ed83a53ab6f7202dd22597d2b783 diff --git a/plugins/uber b/plugins/uber index cc5299817e..bc412163b3 160000 --- a/plugins/uber +++ b/plugins/uber @@ -1 +1 @@ -Subproject commit cc5299817e346708c072bb2643362d0b69f466b6 +Subproject commit bc412163b37764d26793de6c84ea697ce938173e diff --git a/public/Equipment.html b/public/Equipment.html new file mode 100644 index 0000000000..a177338c89 --- /dev/null +++ b/public/Equipment.html @@ -0,0 +1,2055 @@ + + + + + Equipment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ +
+ + + +
+ + +
+ + + + + + + + +
+ + + +
+
+ +
+
+
+

+ Equipment + + +
+
+
+ + + +
+
+ + +
+ +
+
+

Welcome our finest equipment (8:17 AM)

+
+ + + + + +
+
+
+ +
+
+ + + + Hiker on the trek in Himalayas, Anapurna valley, Nepal + + + + + +
+ + + +
+ +
+ + + + + + + +
+ + Hiking + +
+ +
+
+ + + + + +
+
+
+ +
+
+ + + + Trail running man exercising outdoors for fitness + + + + + +
+ + + +
+ +
+ + + + + + + +
+ + Running + +
+ +
+
+ + + + + +
+
+
+ +
+
+ + + + Enduro mountain biking in the forest + + + + + +
+ + + +
+ +
+ + + + + + + +
+ + Biking + +
+ +
+
+ + + + + +
+
+
+ +
+
+ + + + Surfing in Nicaragua + + + + + +
+ + + +
+ +
+ + + + + + + +
+ + Surfing + +
+ +
+
+ + + + + +
+
+
+ +
+
+ + + + Steep skiing above valley + + + + + +
+ + + +
+ +
+ + + + + + + +
+ + Snow Sports + +
+ +
+
+ + + + + +
+
+
+

Featured products (8:17 AM)

+
+ + + + + +
+
+
+
    + +
  • + +
    +
    +
    Marin
    + + + + + + + +
    + +

    Marin Mountain Bike Shoes

    + footwear + + + $110.00 + + + + + + + +
    + +
    +
  • + + + +
  • + +
    +
    +
    Fleet Shoe
    + + + + + + + +
    + +

    Fleet Cross-Training Shoe

    + footwear + + + $65.00 + + + + + + + +
    + +
    +
  • + + + +
  • + +
    +
    +
    Sequoia
    + + + + + + + +
    + +

    Sequoia Bike Helmet

    + helmet + + + $75.00 + + + + + + + +
    + +
    +
  • + + + +
  • + +
    +
    +
    Rios
    + + + + + + + +
    + +

    Rios T Shirt

    + shirt + + + $39.00 + + + + + + + +
    + +
    +
  • + + + +
  • + +
    +
    +
    stretch_side
    + + + + + + + +
    + +

    The Stretch Longboard

    + equipment + + + $900.00 + + + + + + + +
    + +
    +
  • + + + +
  • + +
    +
    +
    116138647
    + + + + + + + +
    + +

    Faba Running Pants

    + pants + + + $39.99 + + + + + + + +
    + +
    +
  • + +
+
+ + + + + +
+ +
+
+

Winter is coming, get ready

+
+ + + + + +
+
+
+ +
+
+ + + + Aggressive powder skiing + + + + + +
+ + + +
+ +
+ + + + + + + +
+ + Snow Sports + + + + Skiing + + + + Snowboarding + +
+ +
+
+ + + + + +
+
+ + + + + + + + + +
+ + + +
+ +
+
+

Test Translation Section

+
+ + + +
+
+
+

This is a test Experience Fragment. It should appear on every page where it is added.

+

Special Characters: !@#$%^&*()_+-=;':",./<>?`~

+ +
+ + + +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/Equipment.html (1).xlf b/public/Equipment.html (1).xlf new file mode 100644 index 0000000000..26dcdd4c5c --- /dev/null +++ b/public/Equipment.html (1).xlf @@ -0,0 +1,3712 @@ + + + + +Equipment +Equipment +Equipment + + +English +English +English + + + en + en + en + + +Account +Account +Account + + +Profile +Profile +Profile + + + + + + + + + + + + + Wishlist {{smartlistEntriesSize}} + + + + + + Wishlist {{smartlistEntriesSize}} + + + + + + Wishlist {{smartlistEntriesSize}} + + + + + + + + + + + + + + + + + + + + + + + + {{smartlistEntriesSize}} items in your wish list + + + {{smartlistEntriesSize}} items in your wish list + + + {{smartlistEntriesSize}} items in your wish list + + + +{{smartlist.name}} +{{smartlist.name}} +{{smartlist.name}} + + +{{ smartlistEntry.title }} +{{ smartlistEntry.title }} +{{ smartlistEntry.title }} + + + + + + + + + + + + + + + + + + + + + + {{ smartlistEntry.title }} + + + + + + {{ smartlistEntry.title }} + + + + + + {{ smartlistEntry.title }} + + + + + + + + + + + + + Add to cart + + + + + + + + + + Add to cart + + + + + + + + + + Add to cart + + + + + + + {{ smartlistEntry.description }} + + + + + {{ smartlistEntry.description }} + + + + + {{ smartlistEntry.description }} + + + + + + {{ key }}: {{ val }} + + + {{ key }}: {{ val }} + + + {{ key }}: {{ val }} + + + + + Qty: + {{smartlistEntry.quantity}} + + + Qty: + {{smartlistEntry.quantity}} + + + Qty: + {{smartlistEntry.quantity}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ smartlistEntry.priceFormatted }} + + + {{ smartlistEntry.priceFormatted }} + + + {{ smartlistEntry.priceFormatted }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Add all products to cart + + + + + + + + + Add all products to cart + + + + + + + + + Add all products to cart + + + + + + You do not have any products on your wish list. + + + You do not have any products on your wish list. + + + You do not have any products on your wish list. + + + + Messages + 0 + Messages + 0 + Messages + 0 + + + Notifications + 0 + Notifications + 0 + Notifications + 0 + + + + + + + + + + + + + + My cart {{cartEntriesSize}} + + + + + + + My cart {{cartEntriesSize}} + + + + + + + My cart {{cartEntriesSize}} + + + + + + + + + + + + + + + + + + + + + + + + {{cartEntriesSize}} items in cart + + + {{cartEntriesSize}} items in cart + + + {{cartEntriesSize}} items in cart + + + +The cart is empty. +The cart is empty. +The cart is empty. + + +{{ cartEntry.title }} +{{ cartEntry.title }} +{{ cartEntry.title }} + + + + + + + + + + + + + + + + + + + + + + {{ cartEntry.title }} + + + + + {{ cartEntry.title }} + + + + + {{ cartEntry.title }} + + + + + + + + + + {{ cartEntry.description }} + + + + + + + + {{ cartEntry.description }} + + + + + + + + {{ cartEntry.description }} + + + + + + {{ key }}: {{ val }} + + + {{ key }}: {{ val }} + + + {{ key }}: {{ val }} + + + + + Qty: + + + + {{ cartEntry.quantity }} + + + + Qty: + + + + {{ cartEntry.quantity }} + + + + Qty: + + + + {{ cartEntry.quantity }} + + + + + + + + + + + + + + + + + + + + + + + {{ cartEntry.priceFormatted }} + + + {{ cartEntry.priceFormatted }} + + + {{ cartEntry.priceFormatted }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sub-total: {{cartTotalPrice}} + + + sub-total: {{cartTotalPrice}} + + + sub-total: {{cartTotalPrice}} + + + + + Checkout + + + Checkout + + + Checkout + + + +Moderation +Moderation +Moderation + + +Log out +Log out +Log out + + + + + Toggle navigation + + + + + Toggle navigation + + + + we.Retail + + + + Toggle navigation + + + + + Toggle navigation + + + + we.Retail + + + + Toggle navigation + + + + + Toggle navigation + + + + we.Retail + + + + + + {{cartEntriesSize}} + + + + + {{cartEntriesSize}} + + + + + {{cartEntriesSize}} + + + + +we.Retail +we.Retail +we.Retail + + +Experience +Experience +Experience + + + + + Experience + + + + + + Experience + + + + + + Experience + + + + + +Arctic Surfing In Lofoten +Arctic Surfing In Lofoten +Arctic Surfing In Lofoten + + + + + Arctic Surfing In Lofoten + + + + + + Arctic Surfing In Lofoten + + + + + + Arctic Surfing In Lofoten + + + + + +48 hours of Wilderness +48 hours of Wilderness +48 hours of Wilderness + + + + + 48 hours of Wilderness + + + + + + 48 hours of Wilderness + + + + + + 48 hours of Wilderness + + + + + +Fly-fishing the Amazon +Fly-fishing the Amazon +Fly-fishing the Amazon + + + + + Fly-fishing the Amazon + + + + + + Fly-fishing the Amazon + + + + + + Fly-fishing the Amazon + + + + + +Skitouring +Skitouring +Skitouring + + + + + Skitouring + + + + + + Skitouring + + + + + + Skitouring + + + + + +Steelhead and Spines in Alaska +Steelhead and Spines in Alaska +Steelhead and Spines in Alaska + + + + + Steelhead and Spines in Alaska + + + + + + Steelhead and Spines in Alaska + + + + + + Steelhead and Spines in Alaska + + + + + +Camping in Western Australia +Camping in Western Australia +Camping in Western Australia + + + + + Camping in Western Australia + + + + + + Camping in Western Australia + + + + + + Camping in Western Australia + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +About Us +About Us +About Us + + + + + About Us + + + + + + About Us + + + + + + About Us + + + + + +Products +Products +Products + + + + + Products + + + + + + Products + + + + + + Products + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +About Us 2.0 +About Us 2.0 +About Us 2.0 + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + +About Us & Others +About Us & Others +About Us & Others + + + + + About Us & Others + + + + + + About Us & Others + + + + + + About Us & Others + + + + + +Men & Women +Men & Women +Men & Women + + + + + Men & Women + + + + + + Men & Women + + + + + + Men & Women + + + + + +Products & Items +Products & Items +Products & Items + + + + + Products & Items + + + + + + Products & Items + + + + + + Products & Items + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +About Us +About Us +About Us + + + + + About Us + + + + + + About Us + + + + + + About Us + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + +About Us 2.0 +About Us 2.0 +About Us 2.0 + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + + + + +Log out +Log out +Log out + + +Profile +Profile +Profile + + + + Messages + 0 + + + + Messages + 0 + + + + Messages + 0 + + + + + + Notifications + 0 + + + + Notifications + 0 + + + + Notifications + 0 + + + + + + + Wishlist {{smartlistEntriesSize}} + + + + + Wishlist {{smartlistEntriesSize}} + + + + + Wishlist {{smartlistEntriesSize}} + + + + + en + en + en + + + + + Search + + + + + Search + + + + + Search + + + + + + + + + + + + + + + + + + + + Search anything + Close search + + + + Search anything + Close search + + + + Search anything + Close search + + + + +Search +Search +Search + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CHOOSE YOUR COUNTRY +CHOOSE YOUR COUNTRY +CHOOSE YOUR COUNTRY + + +United States +United States +United States + + + + + + + + + + + + + + + + + + + + + + + + + +English +English +English + + + + + + English + + + + + + + English + + + + + + + English + + + + + +Español +Español +Español + + + + + + Español + + + + + + + Español + + + + + + + Español + + + + + +French +French +French + + + + + + French + + + + + + + French + + + + + + + French + + + + + +Italian +Italian +Italian + + + + + + Italian + + + + + + + Italian + + + + + + + Italian + + + + + +German +German +German + + + + + + German + + + + + + + German + + + + + + + German + + + + + +Canada +Canada +Canada + + + + + + + + + + + + + + + + + + + + + + + + + +English +English +English + + + + + + English + + + + + + + English + + + + + + + English + + + + + +Français +Français +Français + + + + + + Français + + + + + + + Français + + + + + + + Français + + + + + +Switzerland +Switzerland +Switzerland + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch +Deutsch +Deutsch + + + + + + Deutsch + + + + + + + Deutsch + + + + + + + Deutsch + + + + + +Français +Français +Français + + + + + + Français + + + + + + + Français + + + + + + + Français + + + + + +Italiano +Italiano +Italiano + + + + + + Italiano + + + + + + + Italiano + + + + + + + Italiano + + + + + +Germany +Germany +Germany + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch +Deutsch +Deutsch + + + + + + Deutsch + + + + + + + Deutsch + + + + + + + Deutsch + + + + + +France +France +France + + + + + + + + + + + + + + + + + + + + + + + + + +Français +Français +Français + + + + + + Français + + + + + + + Français + + + + + + + Français + + + + + +Spain +Spain +Spain + + + + + + + + + + + + + + + + + + + + + + + + + +Español +Español +Español + + + + + + Español + + + + + + + Español + + + + + + + Español + + + + + +Italy +Italy +Italy + + + + + + + + + + + + + + + + + + + + + + + + + +Italiano +Italiano +Italiano + + + + + + Italiano + + + + + + + Italiano + + + + + + + Italiano + + + + + +[Page] Navigation Title & +[Page] Navigation Title & +[Page] Navigation Title & + + +[Page] Navigation Title & +[Page] Navigation Title & +[Page] Navigation Title & + + + + + + [Page] Navigation Title & + + + + + + + [Page] Navigation Title & + + + + + + + [Page] Navigation Title & + + + + + + + Close + + + Close + + + Close + + + + + + + + + Equipment + + + + + Equipment + + + + + Equipment + + + + + +Welcome our finest equipment (8:17 AM) +Welcome our finest equipment (8:17 AM) +Welcome our finest equipment (8:17 AM) + + +Hiker on the trek in Himalayas, Anapurna valley, Nepal +Hiker on the trek in Himalayas, Anapurna valley, Nepal +Hiker on the trek in Himalayas, Anapurna valley, Nepal + + +Hiker Anapurna +Hiker Anapurna +Hiker Anapurna + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hiking + + + + + Hiking + + + + + Hiking + + + + +Trail running man exercising outdoors for fitness +Trail running man exercising outdoors for fitness +Trail running man exercising outdoors for fitness + + +Running Trail Man +Running Trail Man +Running Trail Man + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Running + + + + + Running + + + + + Running + + + + +Enduro mountain biking in the forest +Enduro mountain biking in the forest +Enduro mountain biking in the forest + + +Enduro Trail Jump +Enduro Trail Jump +Enduro Trail Jump + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Biking + + + + + Biking + + + + + Biking + + + + +Surfing in Nicaragua +Surfing in Nicaragua +Surfing in Nicaragua + + +Wave Nicaragua +Wave Nicaragua +Wave Nicaragua + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Surfing + + + + + Surfing + + + + + Surfing + + + + +Steep skiing above valley +Steep skiing above valley +Steep skiing above valley + + +Freeride Steep +Freeride Steep +Freeride Steep + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Snow Sports + + + + + Snow Sports + + + + + Snow Sports + + + + +Featured products (8:17 AM) +Featured products (8:17 AM) +Featured products (8:17 AM) + + + + + + + + + + +Marin +Marin +Marin + + +Marin +Marin +Marin + + + + + + + +Marin Mountain Bike Shoes +Marin Mountain Bike Shoes +Marin Mountain Bike Shoes + + + + footwear + + + $110.00 + + + + + off + + + + + footwear + + + $110.00 + + + + + off + + + + + footwear + + + $110.00 + + + + + off + + + + + + + + + + + + + +Fleet Shoe +Fleet Shoe +Fleet Shoe + + +Fleet Shoe +Fleet Shoe +Fleet Shoe + + + + + + + +Fleet Cross-Training Shoe +Fleet Cross-Training Shoe +Fleet Cross-Training Shoe + + + + footwear + + + $65.00 + + + + + off + + + + + footwear + + + $65.00 + + + + + off + + + + + footwear + + + $65.00 + + + + + off + + + + + + + + + + + + + +Sequoia +Sequoia +Sequoia + + +Sequoia +Sequoia +Sequoia + + + + + + + +Sequoia Bike Helmet +Sequoia Bike Helmet +Sequoia Bike Helmet + + + + helmet + + + $75.00 + + + + + off + + + + + helmet + + + $75.00 + + + + + off + + + + + helmet + + + $75.00 + + + + + off + + + + + + + + + + + + + +Rios +Rios +Rios + + +Rios +Rios +Rios + + + + + + + +Rios T Shirt +Rios T Shirt +Rios T Shirt + + + + shirt + + + $39.00 + + + + + off + + + + + shirt + + + $39.00 + + + + + off + + + + + shirt + + + $39.00 + + + + + off + + + + + + + + + + + + + +stretch_side +stretch_side +stretch_side + + +stretch_side +stretch_side +stretch_side + + + + + + + +The Stretch Longboard +The Stretch Longboard +The Stretch Longboard + + + + equipment + + + $900.00 + + + + + off + + + + + equipment + + + $900.00 + + + + + off + + + + + equipment + + + $900.00 + + + + + off + + + + + + + + + + + + + +116138647 +116138647 +116138647 + + +116138647 +116138647 +116138647 + + + + + + + +Faba Running Pants +Faba Running Pants +Faba Running Pants + + + + pants + + + $39.99 + + + + + off + + + + + pants + + + $39.99 + + + + + off + + + + + pants + + + $39.99 + + + + + off + + + + + + +All equipment + + + +All equipment + + + +All equipment + + + + +Winter is coming, get ready +Winter is coming, get ready +Winter is coming, get ready + + +Aggressive powder skiing +Aggressive powder skiing +Aggressive powder skiing + + +Freeride Extreme +Freeride Extreme +Freeride Extreme + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Snow Sports + + + + Skiing + + + + Snowboarding + + + + + Snow Sports + + + + Skiing + + + + Snowboarding + + + + + Snow Sports + + + + Skiing + + + + Snowboarding + + + + +Test Translation Section +Test Translation Section +Test Translation Section + + +This is a test Experience Fragment. It should appear on every page where it is added. +This is a test Experience Fragment. It should appear on every page where it is added. +This is a test Experience Fragment. It should appear on every page where it is added. + + +Special Characters: !@#$%^&*()_+-=;':",./<>?`~ +Special Characters: !@#$%^&*()_+-=;':",./<>?`~ +Special Characters: !@#$%^&*()_+-=;':",./<>?`~ + + + + we.Retail + + + we.Retail + + + we.Retail + + + +Experience +Experience +Experience + + + + + Experience + + + + + + Experience + + + + + + Experience + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +About Us +About Us +About Us + + + + + About Us + + + + + + About Us + + + + + + About Us + + + + + +Products +Products +Products + + + + + Products + + + + + + Products + + + + + + Products + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +About Us 2.0 +About Us 2.0 +About Us 2.0 + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + +About Us & Others +About Us & Others +About Us & Others + + + + + About Us & Others + + + + + + About Us & Others + + + + + + About Us & Others + + + + + +Men & Women +Men & Women +Men & Women + + + + + Men & Women + + + + + + Men & Women + + + + + + Men & Women + + + + + +Products & Items +Products & Items +Products & Items + + + + + Products & Items + + + + + + Products & Items + + + + + + Products & Items + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +About Us +About Us +About Us + + + + + About Us + + + + + + About Us + + + + + + About Us + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + +About Us 2.0 +About Us 2.0 +About Us 2.0 + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + + © 2025 All rights reserved + + + © 2025 All rights reserved + + + © 2025 All rights reserved + + + + + Terms of use & privacy policy + + + Terms of use & privacy policy + + + Terms of use & privacy policy + + + + + Ride to the top + + + Ride to the top + + + Ride to the top + + + + + \ No newline at end of file diff --git a/public/Equipment.html.xlf b/public/Equipment.html.xlf new file mode 100644 index 0000000000..9828933cc9 --- /dev/null +++ b/public/Equipment.html.xlf @@ -0,0 +1,5668 @@ + +
PCFET0NUWVBFIGh0bWw+CjwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAxNDYpaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvbGF1bmNoZXMvMjAyNS8wNC8w +NC9sYXVuY2hfY29weV9vZl9kZW1vL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50Lmh0bWwgLS0+CjxodG1sIGxhbmc9ImVuIiBjbGFzcz0id2YtcHJveGltYW5v +dmEtbjktYWN0aXZlIHdmLXByb3hpbWFub3ZhLW43LWFjdGl2ZSB3Zi1wcm94aW1hbm92YS1uNC1hY3RpdmUgd2YtcHJveGltYW5vdmEtaTQtYWN0aXZlIHdmLWFjdGl2ZSI+PGhlYWQ+PG1ldGEgaHR0 +cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgogICAgCiAgICA8dGl0bGU+RXF1aXBtZW50PC90aXRsZT4KICAgIAogICAgCiAgICA8bWV0YSBu +YW1lPSJ0ZW1wbGF0ZSIgY29udGVudD0iaGVyby1wYWdlIj4KICAgIAoKICAgIAoKICAgIAogICAgCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi9FcXVpcG1lbnRfZmlsZXMvY2xpZW50bGli +LWRlcGVuZGVuY2llcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvY2xpZW50bGliLWRlcGVuZGVuY2llcy5q +cyI+PC9zY3JpcHQ+CgoKCiAgICAKICAgIAo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4vRXF1aXBtZW50X2ZpbGVzL2pxdWVyeS11aS5jc3MiIHR5cGU9InRleHQvY3NzIj4KPGxpbmsgcmVs +PSJzdHlsZXNoZWV0IiBocmVmPSIuL0VxdWlwbWVudF9maWxlcy9zaXRlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4vRXF1aXBtZW50X2ZpbGVzL2Ns +aWVudGxpYi1iYXNlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4vRXF1aXBtZW50X2ZpbGVzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+CgoK +CgoKCjxzY3JpcHQgc3JjPSIuL0VxdWlwbWVudF9maWxlcy9kamU0YXlkLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4udGstcHJveGltYS1ub3Zhe2ZvbnQtZmFtaWx5OiJwcm94 +aW1hLW5vdmEiLHNhbnMtc2VyaWY7fTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj5AZm9udC1mYWNle2ZvbnQtZmFtaWx5OnRrLXByb3hpbWEtbm92YS1uOTtzcmM6dXJsKGh0dHBzOi8vdXNl +LnR5cGVraXQubmV0L2FmLzQwYTVkMC8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYWYvMjcvbD9wcmltZXI9N2NkY2I0NGJlNGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgzODMxZmUyZWExNzdm +NjIyNTdhOTE5MSZmdmQ9bjkmdj0zKSBmb3JtYXQoIndvZmYyIiksdXJsKGh0dHBzOi8vdXNlLnR5cGVraXQubmV0L2FmLzQwYTVkMC8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYWYvMjcvZD9wcmltZXI9 +N2NkY2I0NGJlNGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgzODMxZmUyZWExNzdmNjIyNTdhOTE5MSZmdmQ9bjkmdj0zKSBmb3JtYXQoIndvZmYiKSx1cmwoaHR0cHM6Ly91c2UudHlwZWtp +dC5uZXQvYWYvNDBhNWQwLzAwMDAwMDAwMDAwMDAwMDAzYjlhZDFhZi8yNy9hP3ByaW1lcj03Y2RjYjQ0YmU0YTdkYjg4NzdmZmE1YzAwMDdiOGRkODY1YjNiYmMzODM4MzFmZTJlYTE3N2Y2MjI1N2E5 +MTkxJmZ2ZD1uOSZ2PTMpIGZvcm1hdCgib3BlbnR5cGUiKTtmb250LXdlaWdodDo5MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LWRpc3BsYXk6YXV0bzt9QGZvbnQt +ZmFjZXtmb250LWZhbWlseTp0ay1wcm94aW1hLW5vdmEtbjc7c3JjOnVybChodHRwczovL3VzZS50eXBla2l0Lm5ldC9hZi83ZDQ4NWIvMDAwMDAwMDAwMDAwMDAwMDNiOWFkMWIxLzI3L2w/cHJpbWVy +PTdjZGNiNDRiZTRhN2RiODg3N2ZmYTVjMDAwN2I4ZGQ4NjViM2JiYzM4MzgzMWZlMmVhMTc3ZjYyMjU3YTkxOTEmZnZkPW43JnY9MykgZm9ybWF0KCJ3b2ZmMiIpLHVybChodHRwczovL3VzZS50eXBl +a2l0Lm5ldC9hZi83ZDQ4NWIvMDAwMDAwMDAwMDAwMDAwMDNiOWFkMWIxLzI3L2Q/cHJpbWVyPTdjZGNiNDRiZTRhN2RiODg3N2ZmYTVjMDAwN2I4ZGQ4NjViM2JiYzM4MzgzMWZlMmVhMTc3ZjYyMjU3 +YTkxOTEmZnZkPW43JnY9MykgZm9ybWF0KCJ3b2ZmIiksdXJsKGh0dHBzOi8vdXNlLnR5cGVraXQubmV0L2FmLzdkNDg1Yi8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYjEvMjcvYT9wcmltZXI9N2NkY2I0 +NGJlNGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgzODMxZmUyZWExNzdmNjIyNTdhOTE5MSZmdmQ9bjcmdj0zKSBmb3JtYXQoIm9wZW50eXBlIik7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc3R5 +bGU6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1kaXNwbGF5OmF1dG87fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6dGstcHJveGltYS1ub3ZhLW40O3NyYzp1cmwoaHR0cHM6Ly91c2UudHlw +ZWtpdC5uZXQvYWYvYzljZGU4LzAwMDAwMDAwMDAwMDAwMDAzYjlhZDFiOS8yNy9sP3ByaW1lcj03Y2RjYjQ0YmU0YTdkYjg4NzdmZmE1YzAwMDdiOGRkODY1YjNiYmMzODM4MzFmZTJlYTE3N2Y2MjI1 +N2E5MTkxJmZ2ZD1uNCZ2PTMpIGZvcm1hdCgid29mZjIiKSx1cmwoaHR0cHM6Ly91c2UudHlwZWtpdC5uZXQvYWYvYzljZGU4LzAwMDAwMDAwMDAwMDAwMDAzYjlhZDFiOS8yNy9kP3ByaW1lcj03Y2Rj +YjQ0YmU0YTdkYjg4NzdmZmE1YzAwMDdiOGRkODY1YjNiYmMzODM4MzFmZTJlYTE3N2Y2MjI1N2E5MTkxJmZ2ZD1uNCZ2PTMpIGZvcm1hdCgid29mZiIpLHVybChodHRwczovL3VzZS50eXBla2l0Lm5l +dC9hZi9jOWNkZTgvMDAwMDAwMDAwMDAwMDAwMDNiOWFkMWI5LzI3L2E/cHJpbWVyPTdjZGNiNDRiZTRhN2RiODg3N2ZmYTVjMDAwN2I4ZGQ4NjViM2JiYzM4MzgzMWZlMmVhMTc3ZjYyMjU3YTkxOTEm +ZnZkPW40JnY9MykgZm9ybWF0KCJvcGVudHlwZSIpO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtZGlzcGxheTphdXRvO31AZm9udC1mYWNl +e2ZvbnQtZmFtaWx5OnRrLXByb3hpbWEtbm92YS1pNDtzcmM6dXJsKGh0dHBzOi8vdXNlLnR5cGVraXQubmV0L2FmLzRiYTY0Zi8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYmEvMjcvbD9wcmltZXI9N2Nk +Y2I0NGJlNGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgzODMxZmUyZWExNzdmNjIyNTdhOTE5MSZmdmQ9aTQmdj0zKSBmb3JtYXQoIndvZmYyIiksdXJsKGh0dHBzOi8vdXNlLnR5cGVraXQu +bmV0L2FmLzRiYTY0Zi8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYmEvMjcvZD9wcmltZXI9N2NkY2I0NGJlNGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgzODMxZmUyZWExNzdmNjIyNTdhOTE5 +MSZmdmQ9aTQmdj0zKSBmb3JtYXQoIndvZmYiKSx1cmwoaHR0cHM6Ly91c2UudHlwZWtpdC5uZXQvYWYvNGJhNjRmLzAwMDAwMDAwMDAwMDAwMDAzYjlhZDFiYS8yNy9hP3ByaW1lcj03Y2RjYjQ0YmU0 +YTdkYjg4NzdmZmE1YzAwMDdiOGRkODY1YjNiYmMzODM4MzFmZTJlYTE3N2Y2MjI1N2E5MTkxJmZ2ZD1pNCZ2PTMpIGZvcm1hdCgib3BlbnR5cGUiKTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpp +dGFsaWM7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LWRpc3BsYXk6YXV0bzt9PC9zdHlsZT48c2NyaXB0PnRyeSB7CiAgICBUeXBla2l0LmxvYWQoe2FzeW5jOiB0cnVlfSk7Cn0gY2F0Y2ggKGUpIHsK +fTwvc2NyaXB0PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LkNvbnRleHRIdWIgPSB3aW5kb3cu +Q29udGV4dEh1YiB8fCB7fTsKCiAgICAgICAgICAgICAgICAvKiBzZXR0aW5nIHBhdGhzICovCiAgICAgICAgICAgICAgICBDb250ZXh0SHViLlBhdGhzID0gQ29udGV4dEh1Yi5QYXRocyB8fCB7fTsK +ICAgICAgICAgICAgICAgIENvbnRleHRIdWIuUGF0aHMuQ09OVEVYVEhVQl9QQVRIID0gIi9saWJzL3NldHRpbmdzL2Nsb3Vkc2V0dGluZ3MvbGVnYWN5L2NvbnRleHRodWIiOwogICAgICAgICAgICAg +ICAgQ29udGV4dEh1Yi5QYXRocy5SRVNPVVJDRV9QQVRIID0gIlwvY29udGVudFwvd2VcdTAwMkRyZXRhaWxcL2xhbmd1YWdlXHUwMDJEbWFzdGVyc1wvZW5cL2VxdWlwbWVudFwvX2pjcl9jb250ZW50 +XC9jb250ZXh0aHViIjsKICAgICAgICAgICAgICAgIENvbnRleHRIdWIuUGF0aHMuU0VHTUVOVEFUSU9OX1BBVEggPSAiXC9jb25mXC93ZVx1MDAyRHJldGFpbFwvc2V0dGluZ3NcL3djbVwvc2VnbWVu +dHMiOwogICAgICAgICAgICAgICAgQ29udGV4dEh1Yi5QYXRocy5DUV9DT05URVhUX1BBVEggPSAiIjsKCiAgICAgICAgICAgICAgICAvKiBzZXR0aW5nIGluaXRpYWwgY29uc3RhbnRzICovCiAgICAg +ICAgICAgICAgICBDb250ZXh0SHViLkNvbnN0YW50cyA9IENvbnRleHRIdWIuQ29uc3RhbnRzIHx8IHt9OwogICAgICAgICAgICAgICAgQ29udGV4dEh1Yi5Db25zdGFudHMuQU5PTllNT1VTX0hPTUUg +PSAiL2hvbWUvdXNlcnMvNi82RGt5QTBFaFlFc3A5dWZDUXNlSCI7CiAgICAgICAgICAgICAgICBDb250ZXh0SHViLkNvbnN0YW50cy5NT0RFID0gInVpIjsKICAgICAgICAgICAgfSgpKTsKICAgICAg +ICA8L3NjcmlwdD48c2NyaXB0IHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvY29udGV4dGh1YiIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlw +dCI+CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24oJCkgewogICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKCiAgICAgICAgICAgICAgICAgICAgLyogb3B0aW9ucyAqLwogICAgICAgICAg +ICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAqIEB0eXBlIEluamVjdENvbnRleHRIdWJPcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdmFy +IG9wdGlvbnMgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gaW5jbHVkZSBDb250ZXh0SHViJ3MgVUkgKi8KICAgICAgICAgICAgICAgICAgICB2YXIgaW5qZWN0V2luZG93ID0g +d2luZG93LnRvcDsKCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgd2luZG93LnRvcCBjb250YWlucyAnQ29udGV4dEh1YkVtYmVkZGluZycgZmxh +ZywgdXNlIGN1cnJlbnQgd2luZG93IGluc3RlYWQgb2Ygd2luZG93LnRvcCAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LnRvcC5oYXNPd25Qcm9wZXJ0eSgnQ29udGV4dEh1YkVt +YmVkZGluZycpID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RXaW5kb3cgPSB3aW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg +ICAgICB9IGNhdGNoKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdpbmRvdy50b3AgaXMgbm90IHJlYWNoYWJsZSBmb3Igc2VjdXJpdHkgcmVhc29ucyAobGlrZSBwYWdlIGVt +YmVkZGVkIGludG8gYW4gaWZyYW1lIG9uIGEgZGlmZmVyZW50IGRvbWFpbiksIHVzZSBjdXJyZW50IHdpbmRvdy4KICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0V2luZG93ID0gd2luZG93Owog +ICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLyogaXMgQ29udGV4dEh1YiBVSSBsb2FkZWQgZnJvbSBhbm90aGVyIGlmcmFtZT8gdGhlbiBoaWRlIGl0IGJ5IGRlZmF1bHQg +KGV2ZW50IGxpc3RlbmVycyB3aWxsIGRpc3BsYXkgaXQgd2hlbiByZXF1ZXN0ZWQpICovCiAgICAgICAgICAgICAgICAgICAgdmFyIGlzRW1iZWRkZWQgPSBpbmplY3RXaW5kb3cgIT09IHdpbmRvdzsK +ICAgICAgICAgICAgICAgICAgICB2YXIgdmlzaWJpbGl0eSA9IGlzRW1iZWRkZWQgPyAnbm9uZScgOiAnYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICAvKiBkaXNwbGF5IENvbnRleHRIdWIgaW1t +ZWRpYXRlbHkgaWYgaXQncyBlbWJlZGRlZCBvbiBzYW1lIHBhZ2UgYXMgQ29udGVudEZpbmRlciAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpc0VtYmVkZGVkICYmICQoJyNjcS1jZi13cmFwcGVy +JywgaW5qZWN0V2luZG93LmRvY3VtZW50KS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5qZWN0IGNvbnRhaW5lciB0byBhIHBhZ2Ugd2hpY2ggaW5jbHVkZXMgQ29udGV4dEh1 +YiBhbmQgbm90IHRvIHRvcCB3aW5kb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0V2luZG93ID0gd2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5ID0gJ2Js +b2NrJzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1snekluZGV4J10gPSAxMDAwMDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAg +ICAgICAgICAgICogY29yYWx1aTMgcmVsYXRlZCBpbmNsdWRlczoKICAgICAgICAgICAgICAgICAgICAgKiBodHRwOi8vbG9jYWxob3N0OjQ1MDIvbGlicy9ncmFuaXRlL3VpL2NvbnRlbnQvZHVtcGxp +YnMudGVzdC5odG1sP2NhdGVnb3JpZXM9Y29yYWx1aTMKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0cyA9IFsKICAgICAgICAgICAgICAgICAgICAg +ICAgIi9ldGMvY2xvdWRzZXR0aW5ncy51aS5qcy9saWJzL3NldHRpbmdzL2Nsb3Vkc2V0dGluZ3MvbGVnYWN5L2NvbnRleHRodWIiLAogICAgICAgICAgICAgICAgICAgICAgICAiLi4vLi4vLi4vLi4v +Li4vLi4vLi4vLi4vLi4vLi4vY29udGVudC9yZXNvdXJjZXMvdHlwZWtpdC5qcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jl +c291cmNlcy91dGlscy5qcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9ncmFuaXRlLmpzIiwKICAgICAgICAg +ICAgICAgICAgICAgICAgIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvcmVzb3VyY2VzL21vbWVudC5qcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi8uLi8u +Li8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9jb3JhbHVpMy5qcyIKICAgICAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVzID0gWwogICAgICAg +ICAgICAgICAgICAgICAgICAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC9yZXNvdXJjZXMvY29yYWx1aTMuY3NzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIi9ldGMvY2xv +dWRzZXR0aW5ncy5zdHlsZXMuY3NzL2xpYnMvc2V0dGluZ3MvY2xvdWRzZXR0aW5ncy9sZWdhY3kvY29udGV4dGh1YiIKICAgICAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgICAgICAk +LmV4dGVuZChvcHRpb25zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICIvZXRjL2Nsb3Vkc2V0dGluZ3MudWkuaHRtbC8vbGlicy9zZXR0aW5ncy9jbG91ZHNldHRpbmdzL2xlZ2Fj +eS9jb250ZXh0aHViIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdmlzaWJpbGl0eQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaW5q +ZWN0Q29udGV4dEh1YlVJKGluamVjdFdpbmRvdy5kb2N1bWVudCwgQ29udGV4dEh1Yiwgc2NyaXB0cywgc3R5bGVzLCBvcHRpb25zLCBmdW5jdGlvbihVSSwgb3B0aW9ucykgewogICAgICAgICAgICAg +ICAgICAgICAgICAvKiBjYWxsIGl0IG9uIHBhcmVudCByZWFkeSwgb3RoZXJ3aXNlIHJhcmVseSB3aW5kb3cuZG9jdW1lbnQuYm9keSB3b24ndCBiZSByZWFkeSBkdWUgdG8gcmFjZSBjb25kaXRpb24h +ICovCiAgICAgICAgICAgICAgICAgICAgICAgICQod2luZG93LmRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlQ29udGFpbmVyID0g +VUkuUHJvcGVydGllcy5nZXQoJ1BBR0VfQ09OVEFJTkVSJykgfHwgJCh3aW5kb3cuZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgekluZGV4ID0gb3B0aW9ucy56 +SW5kZXggfHwgVUkuUHJvcGVydGllcy5nZXQoJ0NPTlRBSU5FUl9VSV9aX0lOREVYJykgfHwgODkwOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJLlByb3BlcnRpZXMuc2V0KCdDT05UQUlO +RVJfVUlfWl9JTkRFWCcsIHpJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSS5Qcm9wZXJ0aWVzLnNldCgnUEFHRV9DT05UQUlORVInLCBwYWdlQ29udGFpbmVyKTsKCiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAvKiBpZiBkb2N1bWVudCB3YXMgbm90IHlldCByZWFkeSwgc2V0IHRoZSBwYWdlIGNvbnRhaW5lciBvbmNlIGFnYWluIGxhdGVyICovCiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICBpZiAocGFnZUNvbnRhaW5lci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICBVSS5Qcm9wZXJ0aWVzLnNldCgnUEFHRV9DT05UQUlORVInLCAkKHdpbmRvdy5kb2N1bWVudC5ib2R5KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1iZWRkZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaWRl +IENvbnRleHRIdWIgY29udGFpbmVyIG9uIGlmcmFtZSB1bmxvYWQgLSB0byBnZXQgcmlkIG9mIHdoaXRlIGdhcCB0aGF0IGlzIHZpc2libGUgZHVyaW5nIHBhZ2UgcmVsb2FkICovCiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhdGNoIHRoZSBlcnJvcnMg +aW4gY2FzZSBvYmplY3RzIHdpbGwgZ2V0IGRlc3Ryb3llZCBiZWZvcmUgY29kZSB3aWxsIGJlIGV4ZWN1dGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKENvbnRleHRIdWIuVUlGcmFtZSkuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VD +b250YWluZXIgPSBVSS5Qcm9wZXJ0aWVzLmdldCgnUEFHRV9DT05UQUlORVInKSB8fCAkKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VDb250YWluZXIuY3Nz +KCd0cmFuc2l0aW9uJywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUNvbnRhaW5lci5jc3MoJ3RvcCcsIFVJLlByb3BlcnRpZXMuZ2V0KCdJRlJBTUVfVE9Q +X01BUkdJTicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUu +ZXJyb3IoIkVycm9yIHdoaWxlIHVubG9hZGluZyB0aGUgcGFnZTogIiwgZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfShDb250 +ZXh0SHViSlEpKTsKICAgICAgICAgICAgPC9zY3JpcHQ+CjwhLS1jcXsiZGVjb3JhdGVkIjpmYWxzZSwidHlwZSI6ImdyYW5pdGUvY29udGV4dGh1Yi9jb21wb25lbnRzL2NvbnRleHRodWIiLCJwYXRo +IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC9yZXNvdXJjZXMvY29udGV4dGh1Yi5qc3AiLCJ0b3RhbFRpbWUiOjMsInNlbGZUaW1lIjozfS0tPgoKCiAgICAKPHNjcmlwdCB0 +eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvY2xpZW50bGlicmFyeW1hbmFnZXIuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ckdy +YW5pdGVDbGllbnRMaWJyYXJ5TWFuYWdlci53cml0ZShbeyJwIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC9yZXNvdXJjZXMvZGVmYXVsdC5jc3MiLCJjIjpbImV4dGpzIiwi +aWU2Il19XSxmYWxzZSk7Cjwvc2NyaXB0PjxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4vRXF1aXBtZW50X2ZpbGVzL2RlZmF1bHQoMSkuY3NzIj4KCgoKCiAgICAK +ICAgIAogICAgCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi9FcXVpcG1lbnRfZmlsZXMvcGFnZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQi +IHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvbWVzc2FnaW5nLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvdXRpbHMuanMiPjwv +c2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuL0VxdWlwbWVudF9maWxlcy9jbGllbnRsaWJzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3Jp +cHQiIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvcGFnZS5qcyI+PC9zY3JpcHQ+CgoKCiAgICAKCiAgICAKPCEtLWNxeyJkZWNvcmF0ZWQiOmZhbHNlLCJ0eXBlIjoiY3EvY2xvdWRjb25maWcvY29tcG9u +ZW50cy9zY3JpcHR0YWdzL2hlYWRlciIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6 +Y29udGVudC9jbG91ZGNvbmZpZy1oZWFkZXIiLCJzdHJ1Y3R1cmVQYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9l +cXVpcG1lbnQvamNyOmNvbnRlbnQvY2xvdWRjb25maWctaGVhZGVyIiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9saWJzL2NxL2Nsb3VkY29uZmlnL2NvbXBvbmVudHMvc2NyaXB0 +dGFncy9oZWFkZXIvaGVhZGVyLmh0bWwiLCJ0b3RhbFRpbWUiOjEsInNlbGZUaW1lIjoxfS0tPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGZvbnQtZmFjZXtmb250LWZhbWlseTpwcm94aW1hLW5vdmE7 +c3JjOnVybChodHRwczovL3VzZS50eXBla2l0Lm5ldC9hZi80MGE1ZDAvMDAwMDAwMDAwMDAwMDAwMDNiOWFkMWFmLzI3L2w/cHJpbWVyPTdjZGNiNDRiZTRhN2RiODg3N2ZmYTVjMDAwN2I4ZGQ4NjVi +M2JiYzM4MzgzMWZlMmVhMTc3ZjYyMjU3YTkxOTEmZnZkPW45JnY9MykgZm9ybWF0KCJ3b2ZmMiIpLHVybChodHRwczovL3VzZS50eXBla2l0Lm5ldC9hZi80MGE1ZDAvMDAwMDAwMDAwMDAwMDAwMDNi +OWFkMWFmLzI3L2Q/cHJpbWVyPTdjZGNiNDRiZTRhN2RiODg3N2ZmYTVjMDAwN2I4ZGQ4NjViM2JiYzM4MzgzMWZlMmVhMTc3ZjYyMjU3YTkxOTEmZnZkPW45JnY9MykgZm9ybWF0KCJ3b2ZmIiksdXJs +KGh0dHBzOi8vdXNlLnR5cGVraXQubmV0L2FmLzQwYTVkMC8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYWYvMjcvYT9wcmltZXI9N2NkY2I0NGJlNGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgz +ODMxZmUyZWExNzdmNjIyNTdhOTE5MSZmdmQ9bjkmdj0zKSBmb3JtYXQoIm9wZW50eXBlIik7Zm9udC13ZWlnaHQ6OTAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1k +aXNwbGF5OmF1dG87fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6cHJveGltYS1ub3ZhO3NyYzp1cmwoaHR0cHM6Ly91c2UudHlwZWtpdC5uZXQvYWYvN2Q0ODViLzAwMDAwMDAwMDAwMDAwMDAzYjlhZDFi +MS8yNy9sP3ByaW1lcj03Y2RjYjQ0YmU0YTdkYjg4NzdmZmE1YzAwMDdiOGRkODY1YjNiYmMzODM4MzFmZTJlYTE3N2Y2MjI1N2E5MTkxJmZ2ZD1uNyZ2PTMpIGZvcm1hdCgid29mZjIiKSx1cmwoaHR0 +cHM6Ly91c2UudHlwZWtpdC5uZXQvYWYvN2Q0ODViLzAwMDAwMDAwMDAwMDAwMDAzYjlhZDFiMS8yNy9kP3ByaW1lcj03Y2RjYjQ0YmU0YTdkYjg4NzdmZmE1YzAwMDdiOGRkODY1YjNiYmMzODM4MzFm +ZTJlYTE3N2Y2MjI1N2E5MTkxJmZ2ZD1uNyZ2PTMpIGZvcm1hdCgid29mZiIpLHVybChodHRwczovL3VzZS50eXBla2l0Lm5ldC9hZi83ZDQ4NWIvMDAwMDAwMDAwMDAwMDAwMDNiOWFkMWIxLzI3L2E/ +cHJpbWVyPTdjZGNiNDRiZTRhN2RiODg3N2ZmYTVjMDAwN2I4ZGQ4NjViM2JiYzM4MzgzMWZlMmVhMTc3ZjYyMjU3YTkxOTEmZnZkPW43JnY9MykgZm9ybWF0KCJvcGVudHlwZSIpO2ZvbnQtd2VpZ2h0 +OjcwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtZGlzcGxheTphdXRvO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OnByb3hpbWEtbm92YTtzcmM6dXJsKGh0dHBzOi8v +dXNlLnR5cGVraXQubmV0L2FmL2M5Y2RlOC8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYjkvMjcvbD9wcmltZXI9N2NkY2I0NGJlNGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgzODMxZmUyZWEx +NzdmNjIyNTdhOTE5MSZmdmQ9bjQmdj0zKSBmb3JtYXQoIndvZmYyIiksdXJsKGh0dHBzOi8vdXNlLnR5cGVraXQubmV0L2FmL2M5Y2RlOC8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYjkvMjcvZD9wcmlt +ZXI9N2NkY2I0NGJlNGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgzODMxZmUyZWExNzdmNjIyNTdhOTE5MSZmdmQ9bjQmdj0zKSBmb3JtYXQoIndvZmYiKSx1cmwoaHR0cHM6Ly91c2UudHlw +ZWtpdC5uZXQvYWYvYzljZGU4LzAwMDAwMDAwMDAwMDAwMDAzYjlhZDFiOS8yNy9hP3ByaW1lcj03Y2RjYjQ0YmU0YTdkYjg4NzdmZmE1YzAwMDdiOGRkODY1YjNiYmMzODM4MzFmZTJlYTE3N2Y2MjI1 +N2E5MTkxJmZ2ZD1uNCZ2PTMpIGZvcm1hdCgib3BlbnR5cGUiKTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LWRpc3BsYXk6YXV0bzt9QGZv +bnQtZmFjZXtmb250LWZhbWlseTpwcm94aW1hLW5vdmE7c3JjOnVybChodHRwczovL3VzZS50eXBla2l0Lm5ldC9hZi80YmE2NGYvMDAwMDAwMDAwMDAwMDAwMDNiOWFkMWJhLzI3L2w/cHJpbWVyPTdj +ZGNiNDRiZTRhN2RiODg3N2ZmYTVjMDAwN2I4ZGQ4NjViM2JiYzM4MzgzMWZlMmVhMTc3ZjYyMjU3YTkxOTEmZnZkPWk0JnY9MykgZm9ybWF0KCJ3b2ZmMiIpLHVybChodHRwczovL3VzZS50eXBla2l0 +Lm5ldC9hZi80YmE2NGYvMDAwMDAwMDAwMDAwMDAwMDNiOWFkMWJhLzI3L2Q/cHJpbWVyPTdjZGNiNDRiZTRhN2RiODg3N2ZmYTVjMDAwN2I4ZGQ4NjViM2JiYzM4MzgzMWZlMmVhMTc3ZjYyMjU3YTkx +OTEmZnZkPWk0JnY9MykgZm9ybWF0KCJ3b2ZmIiksdXJsKGh0dHBzOi8vdXNlLnR5cGVraXQubmV0L2FmLzRiYTY0Zi8wMDAwMDAwMDAwMDAwMDAwM2I5YWQxYmEvMjcvYT9wcmltZXI9N2NkY2I0NGJl +NGE3ZGI4ODc3ZmZhNWMwMDA3YjhkZDg2NWIzYmJjMzgzODMxZmUyZWExNzdmNjIyNTdhOTE5MSZmdmQ9aTQmdj0zKSBmb3JtYXQoIm9wZW50eXBlIik7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6 +aXRhbGljO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1kaXNwbGF5OmF1dG87fTwvc3R5bGU+CgogICAgCiAgICAKICAgIAoKICAgIAo8L2hlYWQ+CiAgICA8Ym9keSBjbGFzcz0icGFnZSBiYXNpY3Bh +Z2UiIGN6LXNob3J0Y3V0LWxpc3Rlbj0idHJ1ZSI+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKCgogICAgICAgICAgICAKPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgIDxkaXYgY2xh +c3M9InJvb3QgcmVzcG9uc2l2ZWdyaWQiPgoKCjxkaXYgY2xhc3M9ImFlbS1HcmlkIGFlbS1HcmlkLS0xMiBhZW0tR3JpZC0tZGVmYXVsdC0tMTIgIj4KICAgIAogICAgPGRpdiBjbGFzcz0iaGVhZGVy +IGFlbS1HcmlkQ29sdW1uIGFlbS1HcmlkQ29sdW1uLS1kZWZhdWx0LS0xMiI+CgogICAgPGRpdiBpZD0idG9wIiBjbGFzcz0id2UtcmV0YWlsLWhlYWRlciI+CiAgICAgICAgCjxkaXYgY2xhc3M9Im5h +dmJhciBuYXZiYXItaW52ZXJzZSBuYXZiYXItZml4ZWQtdG9wIGhpZGRlbi14cyBoaWRkZW4tc20iPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIj4KICAgICAgICA8dWwgY2xhc3M9Im5h +diBuYXZiYXItbmF2IG5hdmJhci1sZWZ0Ij4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9wcm92ZXR0YS9jb250ZW50L2xhdW5jaGVz +LzIwMjUvMDQvMDQvbGF1bmNoX2NvcHlfb2ZfZGVtby9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2RlL2VxdWlwbWVudC5odG1sIyIgZGF0YS10b2dnbGU9Im1vZGFsIiBkYXRhLXRh +cmdldD0iLndlLUxhbmd1YWdlTW9kYWwiIHRpdGxlPSJFbmdsaXNoIj48aSBjbGFzcz0id2UtbGFuZy1pY29uIHdlLWxhbmctaWNvbi1MQU5HVUFHRS1NQVNURVJTIj48L2k+IGVuPC9hPjwvbGk+CiAg +ICAgICAgPC91bD4KICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItbmF2IG5hdmJhci1yaWdodCI+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5z +YW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL3VzL2VuL3VzZXIvYWNjb3VudC5odG1sIj5BY2NvdW50PC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczov +L2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvdXMvZW4vY29tbXVuaXR5L3Byb2ZpbGUuaHRtbCI+UHJvZmlsZTwvYT48L2xpPgogICAgICAgICAgICA8bGk+Cjxk +aXYgY2xhc3M9IndlLVNtYXJ0bGlzdCI+CiAgICA8YSBjbGFzcz0id2UtU21hcnRsaXN0LWJ1dHRvbiIgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2Nv +bnRlbnQvbGF1bmNoZXMvMjAyNS8wNC8wNC9sYXVuY2hfY29weV9vZl9kZW1vL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50Lmh0bWwjIiB2LW9uOmNsaWNrPSJ0 +b2dnbGUiPgogICAgICAgIDxpIGNsYXNzPSJmYSBmYS1oZWFydC1vIj48L2k+IFdpc2hsaXN0IDxzcGFuIGNsYXNzPSJiYWRnZSBhY3RpdmUiIHYtY2xvYWs9IiIgdi1pZj0ic21hcnRsaXN0RW50cmll +c1NpemUgJmd0OyAwIj57e3NtYXJ0bGlzdEVudHJpZXNTaXplfX08L3NwYW4+CiAgICA8L2E+CgogICAgPHNtYXJ0bGlzdC1jb250ZW50IGlubGluZS10ZW1wbGF0ZT0iIj4KICAgICAgICA8ZGl2IGNs +YXNzPSJ3ZS1TbWFydGxpc3QtY29udGVudCIgaXRlbXR5cGU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hcHBzL3B1YmxpYy93ZXJldGFpbC9oYXBpX3R5cGVzL3dpc2hsaXN0Lmh0bWwiIGl0ZW1zY29w +ZT0iaXRlbXNjb3BlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtU21hcnRsaXN0LWhlYWRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1TbWFydGxpc3QtaGVhZGVyTGVmdCI+ +CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvbGF1bmNoZXMvMjAyNS8wNC8wNC9sYXVuY2hfY29w +eV9vZl9kZW1vL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50Lmh0bWwjIiB2LW9uOmNsaWNrPSIkcGFyZW50LnRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAg +ICAgIDxpIGNsYXNzPSJ3ZS1JY29uIHdlLUljb24tLWNsb3NlIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNs +YXNzPSJ3ZS1TbWFydGxpc3QtaGVhZGVyUmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGl0ZW1wcm9wPSJ0b3RhbEVudHJpZXMiIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAv +bGlicy9zbGluZy9oYXBpL3R5cGVzL251bWJlci5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+e3tzbWFydGxpc3RFbnRyaWVzU2l6ZX19PC9zcGFuPiBpdGVtcyBpbiB5b3VyIHdpc2ggbGlzdAog +ICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtU21hcnRsaXN0LWRhdGEiPgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9 +IndlLVNtYXJ0bGlzdC10aXRsZSIgdi1pZj0ic21hcnRsaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8aDQgaXRlbXByb3A9Im5hbWUiIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbGli +cy9zbGluZy9oYXBpL3R5cGVzL3RleHQuaHRtbCIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiPnt7c21hcnRsaXN0Lm5hbWV9fTwvaDQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgIAogICAgICAgICAg +ICAgICAgPGRpdiBjbGFzcz0id2UtU21hcnRsaXN0LWVudHJpZXMiIHYtaWY9InNtYXJ0bGlzdCAmYW1wOyZhbXA7IHNtYXJ0bGlzdEVudHJpZXNTaXplICZndDsgMCI+CiAgICAgICAgICAgICAgICAg +ICAgPGRpdiBjbGFzcz0id2UtU21hcnRsaXN0LWVudHJ5IiB2LWZvcj0iKGluZGV4LCBzbWFydGxpc3RFbnRyeSkgaW4gc21hcnRsaXN0LmVudHJpZXMiIGl0ZW1wcm9wPSJlbnRyaWVzIiBpdGVtdHlw +ZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2FwcHMvcHVibGljL3dlcmV0YWlsL2hhcGlfdHlwZXMvd2lzaGxpc3RlbnRyeS5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAgICAKICAgICAgICAg +ICAgICAgICAgICAgICAgPGltZyBjbGFzcz0id2UtU21hcnRsaXN0LWltYWdlIiB2LWJpbmQ6c3JjPSJzbWFydGxpc3RFbnRyeS5pbWFnZSIgYWx0PSJ7eyBzbWFydGxpc3RFbnRyeS50aXRsZSB9fSIg +aXRlbXByb3A9ImFzc2V0IiBpdGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xpYnMvc2xpbmcvaGFwaS90eXBlcy90ZXh0Lmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KICAgIAogICAg +ICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1TbWFydGxpc3QtZW50cnlDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9InByb2R1Y3QiIGl0 +ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXBwcy9wdWJsaWMvd2VyZXRhaWwvaGFwaV90eXBlcy9wcm9kdWN0Lmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICA8bWV0YSBjb250ZW50PSJ7eyBzbWFydGxpc3RFbnRyeS50aXRsZSB9fSIgaXRlbXByb3A9Im5hbWUiIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbGlicy9z +bGluZy9oYXBpL3R5cGVzL3RleHQuaHRtbCIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50 +cmFuc2xhdGVkLmNvbS9wcm92ZXR0YS9jb250ZW50L2xhdW5jaGVzLzIwMjUvMDQvMDQvbGF1bmNoX2NvcHlfb2ZfZGVtby9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2RlL2VxdWlw +bWVudC5odG1sIyIgdi1iaW5kOmhyZWY9InNtYXJ0bGlzdEVudHJ5LnBhZ2UiIGl0ZW1wcm9wPSJwYXRoIiBpdGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xpYnMvc2xpbmcvaGFwaS90eXBl +cy90ZXh0Lmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBzbWFydGxpc3RFbnRyeS50aXRsZSB9fTwvc3Ryb25n +PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJ3ZS1TbWFydGxpc3QtYWRkVG9DYXJ0LWZv +cm0iIG1ldGhvZD0icG9zdCIgdi1vbjpzdWJtaXQucHJldmVudD0ib25BZGRUb0NhcnRTdWJtaXQiIGFjdGlvbj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2Nv +bnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50LmNvbW1lcmNlLnNtYXJ0bGlzdC5tYW5hZ2VtZW50Lmh0bWwiIGRhdGEtcmVsPSJhZGRDYXJ0RW50cnlGb3JtIiBpdGVt +dHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2FwcHMvcHVibGljL3dlcmV0YWlsL2hhcGlfdHlwZXMvYWRkY2FydGVudHJ5Zm9ybS5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlZGlyZWN0IiB2YWx1ZT0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1y +ZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi91c2VyL2NhcnQuaHRtbCIgaXRlbXByb3A9InJlZGlyZWN0UGF0aCIgaXRlbXR5cGU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9saWJzL3NsaW5nL2hhcGkv +dHlwZXMvdGV4dC5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjpvcGVyYXRpb24i +IHZhbHVlPSJhZGRUb0NhcnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzbWFydGxpc3QtcGF0aCIgdi1tb2RlbD0ic21hcnRs +aXN0LnBhdGgiIGl0ZW1wcm9wPSJzbWFydGxpc3RQYXRoIiBpdGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xpYnMvc2xpbmcvaGFwaS90eXBlcy90ZXh0Lmh0bWwiIGl0ZW1zY29wZT0iaXRl +bXNjb3BlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icHJvZHVjdC1wYXRoIiB2LW1vZGVsPSJzbWFydGxpc3RFbnRyeS5wYXRo +IiBpdGVtcHJvcD0icHJvZHVjdFBhdGgiIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbGlicy9zbGluZy9oYXBpL3R5cGVzL3RleHQuaHRtbCIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiPgog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJfY2hhcnNldF8iIHZhbHVlPSJ1dGYtOCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1hZGR0b2NhcnQgYm9sZCIgaXRlbXByb3A9ImFkZFRvQ2FydEJ1dHRvbiIgaXRlbXR5cGU9Imh0dHA6Ly9sb2NhbGhv +c3Q6ODA4MC9saWJzL3NsaW5nL2hhcGkvdHlwZXMvdGV4dC5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0i +ZmEgZmEtc2hvcHBpbmctY2FydCI+PC9pPiBBZGQgdG8gY2FydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dC1tdXRlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBpdGVt +cHJvcD0iZGVzY3JpcHRpb24iIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbGlicy9zbGluZy9oYXBpL3R5cGVzL3RleHQuaHRtbCIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiPgogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc21hcnRsaXN0RW50cnkuZGVzY3JpcHRpb24gfX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD4KICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIHYtaWY9InNtYXJ0bGlzdEVudHJ5LnZhcmlhbnQiIGNsYXNzPSJzbWFsbCB3ZS1TbWFydGxpc3QtZW50cnlWYXJpYW50cyI+CiAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgdi1mb3I9IihrZXksIHZhbCkgaW4gc21hcnRsaXN0RW50cnkudmFyaWFudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgPHNwYW4+e3sga2V5IH19PC9zcGFuPjoge3sgdmFsIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1TbWFydGxpc3QtZW50cnlRdWFudGl0eSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJ0ZXh0LW11dGVkIj5RdHk6 +PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPSJzbWFydGxpc3QucHJpdmFjeSAhPSAmIzM5O1BFUlNPTkFMJiMzOTsiIGl0ZW1wcm9wPSJxdWFudGl0eSIg +aXRlbXR5cGU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9saWJzL3NsaW5nL2hhcGkvdHlwZXMvbnVtYmVyLmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj57e3NtYXJ0bGlzdEVudHJ5LnF1YW50aXR5 +fX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gdi1pZj0ic21hcnRsaXN0LnByaXZhY3kgPT0gJiMzOTtQRVJTT05BTCYjMzk7IiBtZXRob2Q9IlBPU1QiIGFjdGlv +bj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50LmNvbW1lcmNlLnNtYXJ0bGlz +dC5tYW5hZ2VtZW50Lmh0bWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBuYW1lPSJxdWFudGl0eSIgdi1tb2RlbD0ic21hcnRsaXN0RW50 +cnkucXVhbnRpdHkiIG1pbj0iMCIgc3RlcD0iMSIgdi1vbjpjaGFuZ2UucHJldmVudD0idXBkYXRlU21hcnRsaXN0IiBpdGVtcHJvcD0icXVhbnRpdHkiIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0 +OjgwODAvbGlicy9zbGluZy9oYXBpL3R5cGVzL251bWJlci5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJo +aWRkZW4iIG5hbWU9IjpvcGVyYXRpb24iIHZhbHVlPSJtb2RpZnlRdWFudGl0eVNtYXJ0TGlzdEVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Imhp +ZGRlbiIgbmFtZT0iX2NoYXJzZXRfIiB2YWx1ZT0idXRmLTgiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzbWFydGxpc3QtcGF0 +aCIgdi1tb2RlbD0ic21hcnRsaXN0LnBhdGgiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwcm9kdWN0LXBhdGgiIHYtbW9kZWw9 +InNtYXJ0bGlzdEVudHJ5LnBhdGgiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZWRpcmVjdCIgdmFsdWU9Ii4uLy4uLy4uLy4u +Ly4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50Lmh0bWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4K +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtU21hcnRsaXN0LWVudHJ5UHJpY2UiIGl0ZW1wcm9wPSJwcmlj +ZSIgaXRlbXR5cGU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9saWJzL3NsaW5nL2hhcGkvdHlwZXMvdGV4dC5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgPHN0cm9uZz57eyBzbWFydGxpc3RFbnRyeS5wcmljZUZvcm1hdHRlZCB9fTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAg +ICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9InNtYXJ0bGlzdC5wcml2YWN5ID09ICYjMzk7UEVSU09OQUwmIzM5OyIgY2xhc3M9IndlLVNtYXJ0bGlzdC1yZW1v +dmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIiB2LW9uOmNsaWNrLnByZXZlbnQ9InVwZGF0ZVNtYXJ0bGlzdCIgYWN0aW9uPSJodHRwczovL2ZpbGVzLnNh +bmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQuY29tbWVyY2Uuc21hcnRsaXN0Lm1hbmFnZW1lbnQuaHRtbCI+ +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVkaXJlY3QiIHZhbHVlPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50 +L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC5odG1sIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI6b3BlcmF0 +aW9uIiB2YWx1ZT0iZGVsZXRlU21hcnRMaXN0RW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Il9jaGFyc2V0XyIgdmFsdWU9InV0 +Zi04Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzbWFydGxpc3QtcGF0aCIgdi1tb2RlbD0ic21hcnRsaXN0LnBhdGgiPgogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InByb2R1Y3QtcGF0aCIgdi1tb2RlbD0ic21hcnRsaXN0RW50cnkucGF0aCI+CiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLWljb24iIGl0ZW1wcm9wPSJyZW1vdmVCdXR0b24iIGl0ZW10eXBlPSJodHRwOi8vbG9j +YWxob3N0OjgwODAvbGlicy9zbGluZy9oYXBpL3R5cGVzL3RleHQuaHRtbCIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0i +dGV4dC1tdXRlZCBmYSBmYS10aW1lcy1jaXJjbGUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3Jt +PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNz +PSJ3ZS1TbWFydGxpc3QtZm9vdGVyIiB2LWlmPSJzbWFydGxpc3QgJmFtcDsmYW1wOyBzbWFydGxpc3RFbnRyaWVzU2l6ZSAmZ3Q7IDAiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Indl +LVNtYXJ0bGlzdC1mb290ZXItYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiB2LW9uOnN1Ym1pdC5wcmV2ZW50PSJvbkFkZFRvQ2FydFN1Ym1pdCIgYWN0aW9u +PSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQuY29tbWVyY2Uuc21hcnRsaXN0 +Lm1hbmFnZW1lbnQuaHRtbCIgZGF0YS1yZWw9ImFkZENhcnRFbnRyeUZvcm0iIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXBwcy9wdWJsaWMvd2VyZXRhaWwvaGFwaV90eXBlcy9hZGRj +YXJ0ZW50cnlmb3JtLmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlZGlyZWN0IiB2YWx1ZT0i +Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi91c2VyL2NhcnQuaHRtbCIgaXRlbXByb3A9InJlZGlyZWN0UGF0aCIgaXRlbXR5 +cGU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9saWJzL3NsaW5nL2hhcGkvdHlwZXMvdGV4dC5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5w +dXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI6b3BlcmF0aW9uIiB2YWx1ZT0iYWRkVG9DYXJ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNtYXJ0 +bGlzdC1wYXRoIiB2LW1vZGVsPSJzbWFydGxpc3QucGF0aCIgaXRlbXByb3A9InNtYXJ0bGlzdFBhdGgiIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbGlicy9zbGluZy9oYXBpL3R5cGVz +L3RleHQuaHRtbCIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iX2NoYXJzZXRfIiB2YWx1ZT0idXRmLTgi +PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWFkZHRvY2FydCBib2xkIiBpdGVtcHJvcD0iYWRkQWxsVG9DYXJ0QnV0dG9uIiBp +dGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xpYnMvc2xpbmcvaGFwaS90eXBlcy90ZXh0Lmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICA8aSBjbGFzcz0iZmEgZmEtc2hvcHBpbmctY2FydCI+PC9pPiBBZGQgYWxsIHByb2R1Y3RzIHRvIGNhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAg +ICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgIAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtU21hcnRs +aXN0LWVtcHR5IiB2LWlmPSJzbWFydGxpc3RFbnRyaWVzU2l6ZSA9PSAwIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Zb3UgZG8gbm90IGhhdmUgYW55IHByb2R1Y3RzIG9uIHlvdXIgd2lzaCBs +aXN0Ljwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L3NtYXJ0bGlzdC1jb250ZW50Pgo8L2Rpdj4K +PCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJ3ZXJldGFpbC9jb21wb25lbnRzL3N0cnVjdHVyZS9uYXZ3aXNobGlzdCIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9j +b250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L2hlYWRlci9ub19yZXNvdXJjZV8wIiwic3RydWN0dXJlUGF0aCI6Ii9jb25mL3dlLXJl +dGFpbC9zZXR0aW5ncy93Y20vdGVtcGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1cmUvamNyOmNvbnRlbnQvcm9vdC9oZWFkZXIvbm9fcmVzb3VyY2VfMCIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6 +IlNjcmlwdCAvYXBwcy93ZXJldGFpbC9jb21wb25lbnRzL3N0cnVjdHVyZS9uYXZ3aXNobGlzdC9uYXZ3aXNobGlzdC5odG1sIiwidG90YWxUaW1lIjoxLCJzZWxmVGltZSI6MX0tLT4KPC9saT4KICAg +ICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9wcm92ZXR0YS9jb250ZW50L3dlLXJldGFpbC91cy9lbi9jb21tdW5pdHkvbWVzc2FnaW5nLmh0 +bWwiPjxpIGNsYXNzPSJmYSBmYS1lbnZlbG9wZS1vIj48L2k+IE1lc3NhZ2VzCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UiIGlkPSJ3ZS1yZXRhaWwtbWVzc2FnZS1jb3VudCIgZGF0 +YS1zaXRldXJsPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC91cy9lbi9jb21tdW5pdHkiPjA8L3NwYW4+PC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBo +cmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC93ZS1yZXRhaWwvdXMvZW4vY29tbXVuaXR5L25vdGlmaWNhdGlvbnMuaHRtbCI+PGkgY2xhc3M9 +ImZhIGZhLWZsYWctbyI+PC9pPiBOb3RpZmljYXRpb25zCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UiIGlkPSJ3ZS1yZXRhaWwtbm90aWZpY2F0aW9uLWNvdW50IiBkYXRhLXNpdGV1 +cmw9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL3VzL2VuL2NvbW11bml0eSI+MDwvc3Bhbj48L2E+PC9saT4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxs +aT4KPGRpdiBjbGFzcz0id2UtQ2FydCI+CgogICAgPGEgY2xhc3M9IndlLUNhcnQtYnV0dG9uIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVu +dC9sYXVuY2hlcy8yMDI1LzA0LzA0L2xhdW5jaF9jb3B5X29mX2RlbW8vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9kZS9lcXVpcG1lbnQuaHRtbCMiIHYtb246Y2xpY2s9InRvZ2ds +ZSI+CiAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXNob3BwaW5nLWNhcnQiPjwvaT4gTXkgY2FydCA8c3BhbiBjbGFzcz0iYmFkZ2UgYWN0aXZlIiB2LWNsb2FrPSIiIHYtaWY9ImNhcnRFbnRyaWVzU2l6 +ZSAmZ3Q7IDAiPnt7Y2FydEVudHJpZXNTaXplfX08L3NwYW4+CiAgICA8L2E+CgogICAgPGNhcnQtY29udGVudCBpbmxpbmUtdGVtcGxhdGU9IiI+CiAgICAgICAgPGRpdiBjbGFzcz0id2UtQ2FydC1j +b250ZW50IiBpdGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2FwcHMvcHVibGljL3dlcmV0YWlsL2hhcGlfdHlwZXMvY2FydC5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAgICAgICAg +ICAgIDxkaXYgY2xhc3M9IndlLUNhcnQtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndlLUNhcnQtaGVhZGVyTGVmdCI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0 +cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvbGF1bmNoZXMvMjAyNS8wNC8wNC9sYXVuY2hfY29weV9vZl9kZW1vL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1 +YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50Lmh0bWwjIiB2LW9uOmNsaWNrPSIkcGFyZW50LnRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJ3ZS1JY29uIHdlLUljb24tLWNs +b3NlIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1DYXJ0LWhlYWRlclJpZ2h0Ij4KICAgICAg +ICAgICAgICAgICAgICA8c3BhbiBpdGVtcHJvcD0idG90YWxFbnRyaWVzIiBpdGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xpYnMvc2xpbmcvaGFwaS90eXBlcy9udW1iZXIuaHRtbCIgaXRl +bXNjb3BlPSJpdGVtc2NvcGUiPnt7Y2FydEVudHJpZXNTaXplfX08L3NwYW4+IGl0ZW1zIGluIGNhcnQKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAg +IDxkaXYgY2xhc3M9IndlLUNhcnQtZW1wdHkiIHYtaWY9ImNhcnRFbnRyaWVzU2l6ZSA9PSAwIj5UaGUgY2FydCBpcyBlbXB0eS48L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IndlLUNhcnQt +ZGF0YSI+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtQ2FydC1lbnRyaWVzIiB2LWlmPSJjYXJ0RW50cmllc1NpemUgJmd0OyAwIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNz +PSJ3ZS1DYXJ0LWVudHJ5IiB2LWZvcj0iKGluZGV4LCBjYXJ0RW50cnkpIGluIGNhcnRFbnRyaWVzIiBpdGVtcHJvcD0iZW50cmllcyIgaXRlbXR5cGU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hcHBz +L3B1YmxpYy93ZXJldGFpbC9oYXBpX3R5cGVzL2NhcnRlbnRyeS5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJ3ZS1DYXJ0LWlt +YWdlIiB2LWJpbmQ6c3JjPSJjYXJ0RW50cnkudGh1bWJuYWlsIiBhbHQ9Int7IGNhcnRFbnRyeS50aXRsZSB9fSIgaXRlbXByb3A9ImFzc2V0IiBpdGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgw +L2xpYnMvc2xpbmcvaGFwaS90eXBlcy90ZXh0Lmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndlLUNhcnQtZW50cnlDb250ZW50 +Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9InByb2R1Y3QiIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXBwcy9wdWJsaWMvd2VyZXRhaWwvaGFwaV90 +eXBlcy9wcm9kdWN0Lmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YSBjb250ZW50PSJ7eyBjYXJ0RW50cnkudGl0bGUgfX0iIGl0 +ZW1wcm9wPSJuYW1lIiBpdGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xpYnMvc2xpbmcvaGFwaS90eXBlcy90ZXh0Lmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC9sYXVuY2hlcy8yMDI1LzA0LzA0L2xhdW5jaF9jb3B5 +X29mX2RlbW8vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9kZS9lcXVpcG1lbnQuaHRtbCMiIHYtYmluZDpocmVmPSJjYXJ0RW50cnkucGFnZSIgaXRlbXByb3A9InBhdGgiIGl0ZW10 +eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbGlicy9zbGluZy9oYXBpL3R5cGVzL3RleHQuaHRtbCIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICA8c3Ryb25nPnt7IGNhcnRFbnRyeS50aXRsZSB9fTwvc3Ryb25nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8 +ZGl2IGNsYXNzPSJ0ZXh0LW11dGVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHYtaWY9ImNhcnRFbnRyeVByb21vdGlvbnMoaW5kZXgpICZhbXA7JmFtcDsgY2Fy +dEVudHJ5UHJvbW90aW9ucyhpbmRleCkubGVuZ3RoICZndDsgMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dC1pbmZvIiB2LWZvcj0icHJv +bW90aW9uIGluIGNhcnRFbnRyeVByb21vdGlvbnMoaW5kZXgpIiB2LWh0bWw9InByb21vdGlvbi5tZXNzYWdlIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21h +bGw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBpdGVtcHJvcD0iZGVzY3JpcHRpb24iIGl0ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbGlicy9zbGluZy9o +YXBpL3R5cGVzL3RleHQuaHRtbCIgaXRlbXNjb3BlPSJpdGVtc2NvcGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2FydEVudHJ5LmRlc2NyaXB0aW9uIH19CiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCB2LWlmPSJjYXJ0RW50cnkudmFyaWFudCIgY2xhc3M9 +InNtYWxsIHdlLUNhcnQtZW50cnlWYXJpYW50cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgdi1mb3I9IihrZXksIHZhbCkgaW4gY2FydEVudHJ5LnZhcmlhbnQi +PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGtleSB9fTwvc3Bhbj46IHt7IHZhbCB9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtQ2FydC1lbnRyeVF1YW50aXR5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFi +ZWwgY2xhc3M9InRleHQtbXV0ZWQiPlF0eTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9ImNhcnRFbnRyeS5yZWFkb25seSA9PSB0cnVlIiBpdGVtcHJvcD0icXVhbnRpdHkiIGl0 +ZW10eXBlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbGlicy9zbGluZy9oYXBpL3R5cGVzL251bWJlci5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+e3sgY2FydEVudHJ5LnF1YW50aXR5IH19PC9z +cGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSJodHRwczovL2ZpbGVzLnNh +bmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQud2VyZXRhaWwubW9kaWZ5Y2FydGVudHJ5Lmh0bWwiIHYtaWY9 +ImNhcnRFbnRyeS5yZWFkb25seSAhPSB0cnVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZW50cnlOdW1iZXIiIHZhbHVlPSJ7 +e2luZGV4fX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZWRpcmVjdCIgdmFsdWU9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4u +Ly4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50Lmh0bWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVt +YmVyIiBuYW1lPSJxdWFudGl0eSIgdi1tb2RlbD0iY2FydEVudHJ5LnF1YW50aXR5IiBtaW49IjAiIHN0ZXA9IjEiIHYtb246Y2hhbmdlLnByZXZlbnQ9InVwZGF0ZUNhcnQiIGl0ZW1wcm9wPSJxdWFu +dGl0eSIgaXRlbXR5cGU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9saWJzL3NsaW5nL2hhcGkvdHlwZXMvbnVtYmVyLmh0bWwiIGl0ZW1zY29wZT0iaXRlbXNjb3BlIj4KICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndlLUNhcnQtZW50cnlQcmlj +ZSIgaXRlbXByb3A9Iml0ZW1QcmljZSIgaXRlbXR5cGU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9saWJzL3NsaW5nL2hhcGkvdHlwZXMvdGV4dC5odG1sIiBpdGVtc2NvcGU9Iml0ZW1zY29wZSI+CiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBjYXJ0RW50cnkucHJpY2VGb3JtYXR0ZWQgfX08L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgog +ICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndlLUNhcnQtcmVtb3ZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxm +b3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVp +cG1lbnQud2VyZXRhaWwuZGVsZXRlY2FydGVudHJ5Lmh0bWwiIHYtb246Y2xpY2sucHJldmVudD0idXBkYXRlQ2FydCIgdi1pZj0iY2FydEVudHJ5LnJlYWRvbmx5ICE9IHRydWUiPgogICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImVudHJ5TnVtYmVyIiB2YWx1ZT0ie3tpbmRleH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8 +aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZWRpcmVjdCIgdmFsdWU9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1 +aXBtZW50Lmh0bWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1pY29uIj48aSBjbGFzcz0idGV4 +dC1tdXRlZCBmYSBmYS10aW1lcy1jaXJjbGUtbyI+PC9pPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAg +ICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1DYXJ0LXByb21vdGlvbnMiIHYtaWY9Im9yZGVyUHJvbW90 +aW9ucyAmYW1wOyZhbXA7IG9yZGVyUHJvbW90aW9ucy5sZW5ndGggJmd0OyAwIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWZvcj0icHJvbW90aW9uIGluIG9yZGVyUHJvbW90aW9ucyIgY2xh +c3M9IndlLUNhcnQtcHJvbW90aW9uIiB2LWh0bWw9InByb21vdGlvbi5tZXNzYWdlIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1D +YXJ0LWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtQ2FydC1zdWJ0b3RhbCIgdi1pZj0iY2FydEVudHJpZXNTaXplICZndDsgMCI+CiAgICAgICAgICAgICAgICAgICAg +ICAgIHN1Yi10b3RhbDogPHNwYW4gaXRlbXByb3A9InRvdGFsIiBpdGVtdHlwZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xpYnMvc2xpbmcvaGFwaS90eXBlcy90ZXh0Lmh0bWwiIGl0ZW1zY29wZT0i +aXRlbXNjb3BlIj57e2NhcnRUb3RhbFByaWNlfX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGEgdi1pZj0iY2FydEVudHJpZXNTaXplICZndDsg +MCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBidG4tYWN0aW9uIHB1bGwtcmlnaHQiIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9wcm92ZXR0YS9jb250ZW50L3dlLXJl +dGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3VzZXIvY2FydC5odG1sIj5DaGVja291dDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAg +ICA8L2NhcnQtY29udGVudD4KPC9kaXY+CjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2VyZXRhaWwvY29tcG9uZW50cy9zdHJ1Y3R1cmUvbmF2Y2FydCIsInBhdGgiOiIuLi8uLi8uLi8u +Li8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L2hlYWRlci9ub19yZXNvdXJjZV8xIiwic3RydWN0 +dXJlUGF0aCI6Ii9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vdGVtcGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1cmUvamNyOmNvbnRlbnQvcm9vdC9oZWFkZXIvbm9fcmVzb3VyY2VfMSIsInNlbGVj +dG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy93ZXJldGFpbC9jb21wb25lbnRzL3N0cnVjdHVyZS9uYXZjYXJ0L25hdmNhcnQuaHRtbCIsInRvdGFsVGltZSI6MCwic2VsZlRpbWUiOjB9 +LS0+CjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvdXMvZW4vY29tbXVuaXR5L21vZGVyYXRp +b24uaHRtbCI+TW9kZXJhdGlvbjwvYT48L2xpPgogICAgICAgICAgICAKICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9zeXN0ZW0vc2xp +bmcvbG9nb3V0Lmh0bWw/cmVzb3VyY2U9L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50Lmh0bWwiPkxvZyBvdXQ8L2E+PC9saT4KICAgICAgICA8L3VsPgogICAg +PC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgIDxuYXYgY2xhc3M9Im5hdmJhciBuYXZiYXItaW52ZXJzZSBuYXZiYXItYWJzb2x1dGUtdG9wIj4KICAgICAgICA8ZGl2IGNs +YXNzPSJuYXZiYXItaGVhZGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJuYXZiYXItdG9nZ2xlIGNvbGxhcHNlZCIgZGF0YS10b2dnbGU9ImNvbGxhcHNlIiBkYXRh +LXRhcmdldD0iI3dlLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLWludmVyc2UiIGFyaWEtZXhwYW5kZWQ9ImZhbHNlIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzci1vbmx5Ij5Ub2dnbGUg +bmF2aWdhdGlvbjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWJhciI+PC9zcGFuPiA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgICAgICAgPC9idXR0 +b24+CgogICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUgbmF2YmFyLXRvZ2dsZS1jbG9zZSBjb2xsYXBzZWQiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIg +ZGF0YS10YXJnZXQ9IiN3ZS1leGFtcGxlLW5hdmJhci1jb2xsYXBzZS1pbnZlcnNlIiBhcmlhLWV4cGFuZGVkPSJmYWxzZSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9n +Z2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgICAgICAgICAgICA8aSBjbGFzcz0id2UtSWNvbiB3ZS1JY29uLS1jbG9zZSI+PC9pPgogICAgICAgICAgICA8L2J1dHRvbj4KCiAgICAgICAgICAgIDxh +IGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuLmh0bWwiPndlLjxz +dHJvbmc+UmV0YWlsPC9zdHJvbmc+PC9hPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwdWxsLXJpZ2h0IHZpc2libGUteHMgdmlzaWJsZS1zbSI+CjxkaXYgY2xhc3M9IndlLUNhcnQiPgogICAgPGEg +Y2xhc3M9IndlLUNhcnQtYnV0dG9uIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC9sYXVuY2hlcy8yMDI1LzA0LzA0L2xhdW5jaF9jb3B5 +X29mX2RlbW8vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9kZS9lcXVpcG1lbnQuaHRtbCMiIHYtb246Y2xpY2s9InRvZ2dsZSI+CiAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXNob3Bw +aW5nLWNhcnQiPjwvaT4gPHNwYW4gY2xhc3M9ImJhZGdlIGFjdGl2ZSIgdi1jbG9haz0iIiB2LWlmPSJjYXJ0RW50cmllc1NpemUgJmd0OyAwIj57e2NhcnRFbnRyaWVzU2l6ZX19PC9zcGFuPgogICAg +PC9hPgo8L2Rpdj48IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndlcmV0YWlsL2NvbXBvbmVudHMvc3RydWN0dXJlL25hdmNhcnQiLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4v +Li4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9oZWFkZXIvbm9fcmVzb3VyY2VfMiIsInN0cnVjdHVyZVBhdGgiOiIvY29u +Zi93ZS1yZXRhaWwvc2V0dGluZ3Mvd2NtL3RlbXBsYXRlcy9oZXJvLXBhZ2Uvc3RydWN0dXJlL2pjcjpjb250ZW50L3Jvb3QvaGVhZGVyL25vX3Jlc291cmNlXzIiLCJzZWxlY3RvcnMiOiJtb2JpbGVi +dXR0b24iLCJzZXJ2bGV0IjoiU2NyaXB0IC9hcHBzL3dlcmV0YWlsL2NvbXBvbmVudHMvc3RydWN0dXJlL25hdmNhcnQvbW9iaWxlYnV0dG9uLmh0bWwiLCJ0b3RhbFRpbWUiOjEsInNlbGZUaW1lIjox +fS0tPgo8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSAvLm5hdmJhci1oZWFkZXIgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIHdpZHRoIiBp +ZD0id2UtZXhhbXBsZS1uYXZiYXItY29sbGFwc2UtaW52ZXJzZSI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdmJhci1uYXYgbmF2YmFyLWNlbnRlciI+CiAgICAgICAgICAgICAgICA8bGkg +Y2xhc3M9InZpc2libGUteHMgdmlzaWJsZS1zbSI+PGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4u +aHRtbCI+d2UuPHN0cm9uZyBjbGFzcz0idGV4dC1wcmltYXJ5Ij5SZXRhaWw8L3N0cm9uZz48L2E+PC9saT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndlLW5hdmlnYXRpb24iPgo8bmF2IGNs +YXNzPSJjbXAtbmF2aWdhdGlvbiIgaXRlbXNjb3BlPSIiIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgogICAgPHVsIGNsYXNzPSJjbXAtbmF2aWdhdGlv +bl9fZ3JvdXAiPgogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRw +czovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9leHBlcmllbmNlLmh0bWwiIHRpdGxlPSJFeHBlcmllbmNlIiBjbGFzcz0i +Y21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+RXhwZXJpZW5jZTwvYT4KCiAgICAgICAgCiAgICA8dWwgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19ncm91cCI+CiAgICAgICAgCiAgICA8bGkgY2xhc3M9 +ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0xIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9j +b250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2V4cGVyaWVuY2UvYXJjdGljLXN1cmZpbmctaW4tbG9mb3Rlbi5odG1sIiB0aXRsZT0iQXJjdGljIFN1cmZpbmcgSW4gTG9mb3RlbiIg +Y2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkFyY3RpYyBTdXJmaW5nIEluIExvZm90ZW48L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0i +Y21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTEiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2Nv +bnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXhwZXJpZW5jZS9ob3Vycy1vZi13aWxkZXJuZXNzLmh0bWwiIHRpdGxlPSI0OCBob3VycyBvZiBXaWxkZXJuZXNzIiBjbGFzcz0iY21w +LW5hdmlnYXRpb25fX2l0ZW0tbGluayI+NDggaG91cnMgb2YgV2lsZGVybmVzczwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlv +bl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMSI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRh +aWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9leHBlcmllbmNlL2ZseS1maXNoaW5nLXRoZS1hbWF6b24uaHRtbCIgdGl0bGU9IkZseS1maXNoaW5nIHRoZSBBbWF6b24iIGNsYXNzPSJjbXAtbmF2aWdhdGlv +bl9faXRlbS1saW5rIj5GbHktZmlzaGluZyB0aGUgQW1hem9uPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNt +cC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0xIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFn +ZS1tYXN0ZXJzL2VuL2V4cGVyaWVuY2Uvc2tpdG91cmluZy5odG1sIiB0aXRsZT0iU2tpdG91cmluZyIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPlNraXRvdXJpbmc8L2E+CgogICAg +ICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTEiPgogICAgICAgIAogICAgPGEg +aHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXhwZXJpZW5jZS9zdGVlbGhlYWQtYW5kLXNwaW5lcy1p +bi1hbGFza2EuaHRtbCIgdGl0bGU9IlN0ZWVsaGVhZCBhbmQgU3BpbmVzIGluIEFsYXNrYSIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPlN0ZWVsaGVhZCBhbmQgU3BpbmVzIGluIEFs +YXNrYTwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMSI+CiAg +ICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9leHBlcmllbmNlL3dlc3Rlci1h +dXN0cmFsaWEtYnktY2FtcGVyLXZhbi5odG1sIiB0aXRsZT0iQ2FtcGluZyBpbiBXZXN0ZXJuIEF1c3RyYWxpYSIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkNhbXBpbmcgaW4gV2Vz +dGVybiBBdXN0cmFsaWE8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICA8L3VsPgoKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNt +cC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFn +ZS1tYXN0ZXJzL2VuL21lbi5odG1sIiB0aXRsZT0iTWVuIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+TWVuPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAg +ICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFu +c2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3dvbWVuLmh0bWwiIHRpdGxlPSJXb21lbiIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPldvbWVu +PC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIGNtcC1uYXZp +Z2F0aW9uX19pdGVtLS1hY3RpdmUiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3Rl +cnMvZW4vZXF1aXBtZW50Lmh0bWwiIHRpdGxlPSJFcXVpcG1lbnQiIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5FcXVpcG1lbnQ8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAK +ICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5z +YW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vYWJvdXQtdXMuaHRtbCIgdGl0bGU9IkFib3V0IFVzIiBjbGFzcz0iY21wLW5hdmlnYXRpb25f +X2l0ZW0tbGluayI+QWJvdXQgVXM8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0 +ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJv +ZHVjdHMuaHRtbCIgdGl0bGU9IlByb2R1Y3RzIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+UHJvZHVjdHM8L2E+CgogICAgICAgIAogICAgPHVsIGNsYXNzPSJjbXAtbmF2aWdhdGlv +bl9fZ3JvdXAiPgogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMSI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRw +czovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy93b21lbi5odG1sIiB0aXRsZT0iV29tZW4iIGNsYXNzPSJj +bXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5Xb21lbjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2 +aWdhdGlvbl9faXRlbS0tbGV2ZWwtMSI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFz +dGVycy9lbi9wcm9kdWN0cy9tZW4uaHRtbCIgdGl0bGU9Ik1lbiIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPk1lbjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAg +IAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMSI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gu +dHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQuaHRtbCIgdGl0bGU9IkVxdWlwbWVudCIgY2xhc3M9ImNtcC1uYXZpZ2F0 +aW9uX19pdGVtLWxpbmsiPkVxdWlwbWVudDwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIDwvdWw+CgogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRp +b25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0 +YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vbWVuMS5odG1sIiB0aXRsZT0iTWVuIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+TWVuPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAg +CiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMu +c2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Rlc3QtdGl0bGUtY2hhcmFjdGVycy0uaHRtbCIgdGl0bGU9Ik5TWCBEaXN0cmlidXRlZCBJ +RFMvSVBTIHwgSW50cnVzaW9uIERldGVjdGlvbiAmYW1wOyBQcmV2ZW50aW9uIFN5c3RlbSB8IFZNd2FyZSIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPk5TWCBEaXN0cmlidXRlZCBJ +RFMvSVBTIHwgSW50cnVzaW9uIERldGVjdGlvbiAmYW1wOyBQcmV2ZW50aW9uIFN5c3RlbSB8IFZNd2FyZTwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNz +PSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20v +Y29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9hYm91dC11czEuaHRtbCIgdGl0bGU9IkFib3V0IFVzIDIuMCIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkFib3V0 +IFVzIDIuMDwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+ +CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9hYm91dC11czIuaHRtbCIg +dGl0bGU9IkFib3V0IFVzICZhbXA7IE90aGVycyIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkFib3V0IFVzICZhbXA7IE90aGVyczwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAg +IAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVz +LnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi93b21lbjEuaHRtbCIgdGl0bGU9Ik1lbiAmYW1wOyBXb21lbiIgY2xhc3M9ImNtcC1uYXZp +Z2F0aW9uX19pdGVtLWxpbmsiPk1lbiAmYW1wOyBXb21lbjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAt +bmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2Ut +bWFzdGVycy9lbi9tZW4yLmh0bWwiIHRpdGxlPSJQcm9kdWN0cyAmYW1wOyBJdGVtcyIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPlByb2R1Y3RzICZhbXA7IEl0ZW1zPC9hPgoKICAg +ICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxh +IGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3dvbWVuMi5odG1sIiB0aXRsZT0iV29tZW4iIGNsYXNz +PSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5Xb21lbjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAt +bmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2Ut +bWFzdGVycy9lbi9tZW4zLmh0bWwiIHRpdGxlPSJNZW4iIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5NZW48L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAg +IDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5z +bGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vYWJvdXQtdXMzLmh0bWwiIHRpdGxlPSJBYm91dCBVcyIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsi +PkFib3V0IFVzPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0w +Ij4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudDEuaHRt +bCIgdGl0bGU9IkVxdWlwbWVudCIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkVxdWlwbWVudDwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNs +YXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5j +b20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi90ZXN0LXRpdGxlLWNoYXJhY3RlcnMtMS5odG1sIiB0aXRsZT0iTlNYIERpc3RyaWJ1dGVkIElEUy9JUFMgfCBJbnRydXNpb24g +RGV0ZWN0aW9uICZhbXA7IFByZXZlbnRpb24gU3lzdGVtIHwgVk13YXJlIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+TlNYIERpc3RyaWJ1dGVkIElEUy9JUFMgfCBJbnRydXNpb24g +RGV0ZWN0aW9uICZhbXA7IFByZXZlbnRpb24gU3lzdGVtIHwgVk13YXJlPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19p +dGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9s +YW5ndWFnZS1tYXN0ZXJzL2VuL3Rlc3QtdGl0bGUtY2hhcmFjdGVycy0yLmh0bWwiIHRpdGxlPSJOU1ggRGlzdHJpYnV0ZWQgSURTL0lQUyB8IEludHJ1c2lvbiBEZXRlY3Rpb24gJmFtcDsgUHJldmVu +dGlvbiBTeXN0ZW0gfCBWTXdhcmUiIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5OU1ggRGlzdHJpYnV0ZWQgSURTL0lQUyB8IEludHJ1c2lvbiBEZXRlY3Rpb24gJmFtcDsgUHJldmVu +dGlvbiBTeXN0ZW0gfCBWTXdhcmU8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0 +ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1 +aXBtZW50Mi5odG1sIiB0aXRsZT0iRXF1aXBtZW50LTIiIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5FcXVpcG1lbnQtMjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAg +ICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRi +b3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9hYm91dC11czExLmh0bWwiIHRpdGxlPSJBYm91dCBVcyAyLjAiIGNsYXNzPSJjbXAtbmF2aWdhdGlv +bl9faXRlbS1saW5rIj5BYm91dCBVcyAyLjA8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRp +b25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMv +ZW4vZXF1aXBtZW50MjEuaHRtbCIgdGl0bGU9IkVxdWlwbWVudC0yIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+RXF1aXBtZW50LTI8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAg +ICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxl +cy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vbWVuMzEuaHRtbCIgdGl0bGU9Ik1lbiIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVt +LWxpbmsiPk1lbjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwt +MCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQyMTEu +aHRtbCIgdGl0bGU9IkVxdWlwbWVudC0yIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+RXF1aXBtZW50LTI8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICA8L3VsPgo8L25hdj4K +CiAgICAKCjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2VyZXRhaWwvY29tcG9uZW50cy9zdHJ1Y3R1cmUvbmF2aWdhdGlvbiIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8u +Li8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L2hlYWRlci9uYXZpZ2F0aW9uIiwic3RydWN0dXJlUGF0aCI6Ii9jb25mL3dl +LXJldGFpbC9zZXR0aW5ncy93Y20vdGVtcGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1cmUvamNyOmNvbnRlbnQvcm9vdC9oZWFkZXIvbmF2aWdhdGlvbiIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6 +IlNjcmlwdCAvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL25hdmlnYXRpb24vdjEvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLmh0bWwiLCJ0b3RhbFRpbWUiOjEzLCJzZWxmVGltZSI6MTN9LS0+CjwvZGl2 +PgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ2aXNpYmxlLXhzIHZpc2libGUtc20gZGl2aWRlciIgcm9sZT0ic2VwYXJhdG9yIj48L2xpPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg +ICA8bGkgY2xhc3M9InZpc2libGUteHMgdmlzaWJsZS1zbSI+PGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3N5c3RlbS9zbGluZy9sb2dvdXQuaHRtbD9yZXNvdXJj +ZT0vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQuaHRtbCI+TG9nIG91dDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ2aXNpYmxlLXhzIHZp +c2libGUtc20iPjxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC91cy9lbi9jb21tdW5pdHkvcHJvZmlsZS5odG1sIj5Qcm9maWxlPC9h +PjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InZpc2libGUteHMgdmlzaWJsZS1zbSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5z +bGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvd2UtcmV0YWlsL3VzL2VuL2NvbW11bml0eS9tZXNzYWdpbmcuaHRtbCIgY2xhc3M9InZpc2libGUteHMgdmlzaWJsZS1zbSI+TWVzc2FnZXMKICAgICAg +ICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIHB1bGwtcmlnaHQiPjA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAg +ICAgICAgIDxsaSBjbGFzcz0idmlzaWJsZS14cyB2aXNpYmxlLXNtIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0 +dGEvY29udGVudC93ZS1yZXRhaWwvdXMvZW4vY29tbXVuaXR5L25vdGlmaWNhdGlvbnMuaHRtbCIgY2xhc3M9InZpc2libGUteHMgdmlzaWJsZS1zbSI+Tm90aWZpY2F0aW9ucwogICAgICAgICAgICAg +ICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgcHVsbC1yaWdodCI+MDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAg +PGxpIGNsYXNzPSJ2aXNpYmxlLXhzIHZpc2libGUtc20iPgo8YSBjbGFzcz0idmlzaWJsZS14cyB2aXNpYmxlLXNtIHdlLVNtYXJ0bGlzdCIgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5z +bGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvbGF1bmNoZXMvMjAyNS8wNC8wNC9sYXVuY2hfY29weV9vZl9kZW1vL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50 +Lmh0bWwjIiB2LW9uOmNsaWNrPSJ0b2dnbGUiPgogICAgV2lzaGxpc3QgPHNwYW4gY2xhc3M9ImJhZGdlIGFjdGl2ZSBwdWxsLXJpZ2h0IiB2LWNsb2FrPSIiIHYtaWY9InNtYXJ0bGlzdEVudHJpZXNT +aXplICZndDsgMCI+e3tzbWFydGxpc3RFbnRyaWVzU2l6ZX19PC9zcGFuPgo8L2E+PCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJ3ZXJldGFpbC9jb21wb25lbnRzL3N0cnVjdHVyZS9uYXZ3 +aXNobGlzdCIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L2hl +YWRlci9ub19yZXNvdXJjZV8zIiwic3RydWN0dXJlUGF0aCI6Ii9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vdGVtcGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1cmUvamNyOmNvbnRlbnQvcm9vdC9o +ZWFkZXIvbm9fcmVzb3VyY2VfMyIsInNlbGVjdG9ycyI6Im1vYmlsZWxpbmsiLCJzZXJ2bGV0IjoiU2NyaXB0IC9hcHBzL3dlcmV0YWlsL2NvbXBvbmVudHMvc3RydWN0dXJlL25hdndpc2hsaXN0L21v +YmlsZWxpbmsuaHRtbCIsInRvdGFsVGltZSI6MCwic2VsZlRpbWUiOjB9LS0+CjwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InZpc2libGUteHMgdmlzaWJsZS1zbSI+PGEgaHJlZj0iaHR0 +cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvbGF1bmNoZXMvMjAyNS8wNC8wNC9sYXVuY2hfY29weV9vZl9kZW1vL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1 +YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50Lmh0bWwjIiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIud2UtTGFuZ3VhZ2VNb2RhbCI+PGkgY2xhc3M9IndlLWxhbmctaWNvbiB3ZS1sYW5n +LWljb24tTEFOR1VBR0UtTUFTVEVSUyI+PC9pPiBlbjwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIC8ubmF2YmFyLWNvbGxhcHNlIC0tPgogICAg +ICAgIDxkaXYgY2xhc3M9Im5hdmJhci1yaWdodC1vdXRzaWRlIj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQv +bGF1bmNoZXMvMjAyNS8wNC8wNC9sYXVuY2hfY29weV9vZl9kZW1vL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50Lmh0bWwjIiBjbGFzcz0iYnRuIGJ0bi1wcmlt +YXJ5IiBkYXRhLXRvZ2dsZT0ibW9kYWwiIGRhdGEtdGFyZ2V0PSIjbmF2YmFyLXNlYXJjaCI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+U2VhcmNoPC9zcGFuPjxpIGNsYXNz +PSJ3ZS1JY29uIHdlLUljb24tLXNlYXJjaCIgYXJpYS1oaWRkZW49InRydWUiPjwvaT4KICAgICAgICAgICAgPC9hPgogICAgICAgIDwvZGl2PgogICAgICAgIDwhLS0gLy5uYXZiYXItcmlnaHQtb3V0 +c2lkZSAtLT4KCiAgICAgICAgPHNwYW4gY2xhc3M9Im5hdmJhci1zaHV0dGVyIj48L3NwYW4+CiAgICA8L25hdj4KICAgIDwhLS0gLy5uYXZiYXIgLS0+CjwvZGl2PgoKICAgICAgICAKCjxkaXYgY2xh +c3M9IndlLVNlYXJjaE1vZGFsIG1vZGFsIGZhZGUgIiBpZD0ibmF2YmFyLXNlYXJjaCIgcm9sZT0iZGlhbG9nIiBkYXRhLWNvbG9yPSJwcmltYXJ5Ij4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxv +ZyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0id2Ut +SWNvbiB3ZS1JY29uLS1zZWFyY2giPjwvaT5TZWFyY2ggYW55dGhpbmc8L3NwYW4+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9 +Im1vZGFsIj48c3Bhbj5DbG9zZSBzZWFyY2g8L3NwYW4+PGkgY2xhc3M9IndlLUljb24gd2UtSWNvbi0tY2xvc2UtYWx0Ij48L2k+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAg +PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wt +bWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2Utc2VhcmNoIj4KPHNlY3Rpb24gY2xhc3M9ImNtcC1zZWFyY2giIHJvbGU9 +InNlYXJjaCIgZGF0YS1jbXAtbWluLWxlbmd0aD0iMyIgZGF0YS1jbXAtcmVzdWx0cy1zaXplPSIxMCI+CiAgICA8Zm9ybSBjbGFzcz0iY21wLXNlYXJjaF9fZm9ybSIgZGF0YS1jbXAtaG9vay1zZWFy +Y2g9ImZvcm0iIG1ldGhvZD0iZ2V0IiBhY3Rpb249Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9wcm92ZXR0YS9jb250ZW50L3Jlc291cmNlcy9lcXVpcG1lbnQuc2VhcmNocmVz +dWx0cy5qc29uL19qY3JfY29udGVudC9yb290L2hlYWRlci9zZWFyY2giIGF1dG9jb21wbGV0ZT0ib2ZmIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbXAtc2VhcmNoX19maWVsZCI+CiAgICAgICAgICAg +IDxpIGNsYXNzPSJjbXAtc2VhcmNoX19pY29uIiBkYXRhLWNtcC1ob29rLXNlYXJjaD0iaWNvbiI+PC9pPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY21wLXNlYXJjaF9fbG9hZGluZy1pbmRpY2F0 +b3IiIGRhdGEtY21wLWhvb2stc2VhcmNoPSJsb2FkaW5nSW5kaWNhdG9yIj48L3NwYW4+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21wLXNlYXJjaF9faW5wdXQiIGRhdGEtY21wLWhvb2stc2Vh +cmNoPSJpbnB1dCIgdHlwZT0idGV4dCIgbmFtZT0iZnVsbHRleHQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIHJvbGU9ImNvbWJvYm94IiBhcmlhLWF1dG9jb21wbGV0ZT0ibGlzdCIgYXJpYS1oYXNwb3B1 +cD0idHJ1ZSIgYXJpYS1pbnZhbGlkPSJmYWxzZSIgYXJpYS1vd25zPSJjbXAtc2VhcmNoLXJlc3VsdHMtMCI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNtcC1zZWFyY2hfX2NsZWFyIiBkYXRh +LWNtcC1ob29rLXNlYXJjaD0iY2xlYXIiPgogICAgICAgICAgICAgICAgPGkgY2xhc3M9ImNtcC1zZWFyY2hfX2NsZWFyLWljb24iPjwvaT4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9k +aXY+CiAgICA8L2Zvcm0+CiAgICA8ZGl2IGNsYXNzPSJjbXAtc2VhcmNoX19yZXN1bHRzIiBkYXRhLWNtcC1ob29rLXNlYXJjaD0icmVzdWx0cyIgcm9sZT0ibGlzdGJveCIgYXJpYS1tdWx0aXNlbGVj +dGFibGU9ImZhbHNlIiBpZD0iY21wLXNlYXJjaC1yZXN1bHRzLTAiIGFyaWEtaGlkZGVuPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjwvZGl2PgogICAgCjxzY3JpcHQgZGF0YS1jbXAtaG9v +ay1zZWFyY2g9Iml0ZW1UZW1wbGF0ZSIgdHlwZT0ieC10ZW1wbGF0ZSI+CiAgICA8YSBjbGFzcz0iY21wLXNlYXJjaF9faXRlbSIgZGF0YS1jbXAtaG9vay1zZWFyY2g9Iml0ZW0iPgogICAgICAgIDxz +cGFuIGNsYXNzPSJjbXAtc2VhcmNoX19pdGVtLXRpdGxlIiBkYXRhLWNtcC1ob29rLXNlYXJjaD0iaXRlbVRpdGxlIj48L3NwYW4+CiAgICA8L2E+Cjwvc2NyaXB0Pgo8L3NlY3Rpb24+PCEtLWNxeyJk +ZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJ3ZXJldGFpbC9jb21wb25lbnRzL3N0cnVjdHVyZS9zZWFyY2giLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRh +aWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9oZWFkZXIvc2VhcmNoIiwic3RydWN0dXJlUGF0aCI6Ii9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vdGVt +cGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1cmUvamNyOmNvbnRlbnQvcm9vdC9oZWFkZXIvc2VhcmNoIiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9hcHBzL2NvcmUvd2NtL2NvbXBv +bmVudHMvc2VhcmNoL3YxL3NlYXJjaC9zZWFyY2guaHRtbCIsInRvdGFsVGltZSI6MCwic2VsZlRpbWUiOjB9LS0+CjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAg +ICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KPCEtLSAvLndlLVNlYXJjaE1vZGFsIC0tPgoKPGRpdiBjbGFzcz0id2UtTGFuZ3VhZ2VN +b2RhbCBtb2RhbCBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgZGF0YS1jb2xvcj0icHJpbWFyeSI+CiAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2cgbW9kYWwtY2VudGVyIG1vZGFs +LXNtIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ibW9kYWwt +dGl0bGUgdGV4dC1jZW50ZXIiPkNIT09TRSBZT1VSIENPVU5UUlk8L2gzPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAgICAg +ICA8ZGl2IGNsYXNzPSJ3ZS1sYW5ndWFnZW5hdmlnYXRpb24iPgo8bmF2IGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uIj4KICAgIDx1bCBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9f +Z3JvdXAiPgogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWNvdW50cnljb2RlLVVTIGNtcC1sYW5n +dWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxhbmdjb2RlLWVuLVVTIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGkgY2xhc3M9IndlLWxhbmctaWNvbiB3 +ZS1sYW5nLWljb24tVVMiIHRpdGxlPSJVbml0ZWQgU3RhdGVzIj48L2k+CiAgICAKCiAgICAgICAgCiAgICA8dWwgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2dyb3VwIj4KICAgICAgICAK +ICAgIDxsaSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1jb3VudHJ5Y29kZS1VUyBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19p +dGVtLS1sYW5nY29kZS1lbi1VUyBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0xIj4KICAgICAgICAKICAgIAogICAgPGEgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0 +ZW0tbGluayIgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL3VzL2VuL2VxdWlwbWVudC5odG1sIiBocmVmbGFuZz0iZW4tVVMiIGxhbmc9 +ImVuLVVTIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IkVuZ2xpc2giPkVuZ2xpc2g8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLWxhbmd1YWdl +bmF2aWdhdGlvbl9faXRlbSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1jb3VudHJ5Y29kZS1VUyBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sYW5nY29kZS1lcy1VUyBjbXAtbGFu +Z3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0xIj4KICAgICAgICAKICAgIAogICAgPGEgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tbGluayIgaHJlZj0iaHR0cHM6Ly9maWxl +cy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL3VzL2VzLmh0bWwiIGhyZWZsYW5nPSJlcy1VUyIgbGFuZz0iZXMtVVMiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iRXNwYcOx +b2wiPkVzcGHDsW9sPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0gY21wLWxhbmd1YWdlbmF2aWdh +dGlvbl9faXRlbS0tbGFuZ2NvZGUtZnIgY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMSI+CiAgICAgICAgCiAgICAKICAgIDxhIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9u +X19pdGVtLWxpbmsiIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC91cy9mci9lcXVpcG1lbnQuaHRtbCIgaHJlZmxhbmc9ImZyIiBsYW5n +PSJmciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmVuY2giPkZyZW5jaDwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZp +Z2F0aW9uX19pdGVtIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxhbmdjb2RlLWl0IGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTEiPgogICAgICAgIAogICAgCiAgICA8 +YSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvdXMvaXQuaHRt +bCIgaHJlZmxhbmc9Iml0IiBsYW5nPSJpdCIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJJdGFsaWFuIj5JdGFsaWFuPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkg +Y2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0gY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tbGFuZ2NvZGUtZGUgY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwt +MSI+CiAgICAgICAgCiAgICAKICAgIDxhIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLWxpbmsiIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250 +ZW50L3dlLXJldGFpbC91cy9kZS9lcXVpcG1lbnQuaHRtbCIgaHJlZmxhbmc9ImRlIiBsYW5nPSJkZSIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJHZXJtYW4iPkdlcm1hbjwvYT4KCiAgICAgICAgCiAg +ICA8L2xpPgoKICAgIDwvdWw+CgogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19p +dGVtLS1jb3VudHJ5Y29kZS1DQSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sYW5nY29kZS1lbi1DQSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAK +ICAgIDxpIGNsYXNzPSJ3ZS1sYW5nLWljb24gd2UtbGFuZy1pY29uLUNBIiB0aXRsZT0iQ2FuYWRhIj48L2k+CiAgICAKCiAgICAgICAgCiAgICA8dWwgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRp +b25fX2dyb3VwIj4KICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1jb3VudHJ5Y29kZS1DQSBjbXAt +bGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sYW5nY29kZS1lbi1DQSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0xIj4KICAgICAgICAKICAgIAogICAgPGEgY2xhc3M9ImNtcC1s +YW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tbGluayIgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2NhL2VuL2VxdWlwbWVudC5odG1sIiBo +cmVmbGFuZz0iZW4tQ0EiIGxhbmc9ImVuLUNBIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IkVuZ2xpc2giPkVuZ2xpc2g8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxs +aSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1jb3VudHJ5Y29kZS1DQSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1s +YW5nY29kZS1mci1DQSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0xIj4KICAgICAgICAKICAgIAogICAgPGEgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tbGlu +ayIgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2NhL2ZyLmh0bWwiIGhyZWZsYW5nPSJmci1DQSIgbGFuZz0iZnItQ0EiIHJlbD0iYWx0 +ZXJuYXRlIiB0aXRsZT0iRnJhbsOnYWlzIj5GcmFuw6dhaXM8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICA8L3VsPgoKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNt +cC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0gY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tY291bnRyeWNvZGUtQ0ggY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tbGFuZ2NvZGUtZGUt +Q0ggY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8aSBjbGFzcz0id2UtbGFuZy1pY29uIHdlLWxhbmctaWNvbi1DSCIgdGl0bGU9IlN3aXR6ZXJsYW5k +Ij48L2k+CiAgICAKCiAgICAgICAgCiAgICA8dWwgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2dyb3VwIj4KICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlv +bl9faXRlbSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1jb3VudHJ5Y29kZS1DSCBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sYW5nY29kZS1kZS1DSCBjbXAtbGFuZ3VhZ2VuYXZp +Z2F0aW9uX19pdGVtLS1sZXZlbC0xIj4KICAgICAgICAKICAgIAogICAgPGEgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tbGluayIgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94 +LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2NoL2RlLmh0bWwiIGhyZWZsYW5nPSJkZS1DSCIgbGFuZz0iZGUtQ0giIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iRGV1dHNjaCI+RGV1dHNj +aDwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0t +LWNvdW50cnljb2RlLUNIIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxhbmdjb2RlLWZyLUNIIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTEiPgogICAgICAgIAogICAg +CiAgICA8YSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvY2gv +ZnIuaHRtbCIgaHJlZmxhbmc9ImZyLUNIIiBsYW5nPSJmci1DSCIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmFuw6dhaXMiPkZyYW7Dp2FpczwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAog +ICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWNvdW50cnljb2RlLUNIIGNtcC1sYW5ndWFnZW5hdmln +YXRpb25fX2l0ZW0tLWxhbmdjb2RlLWl0LUNIIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTEiPgogICAgICAgIAogICAgCiAgICA8YSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdh +dGlvbl9faXRlbS1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvY2gvaXQuaHRtbCIgaHJlZmxhbmc9Iml0LUNIIiBsYW5nPSJp +dC1DSCIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJJdGFsaWFubyI+SXRhbGlhbm88L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICA8L3VsPgoKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8 +bGkgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0gY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tY291bnRyeWNvZGUtREUgY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0t +bGFuZ2NvZGUtZGUtREUgY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8aSBjbGFzcz0id2UtbGFuZy1pY29uIHdlLWxhbmctaWNvbi1ERSIgdGl0bGU9 +Ikdlcm1hbnkiPjwvaT4KICAgIAoKICAgICAgICAKICAgIDx1bCBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9fZ3JvdXAiPgogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2Vu +YXZpZ2F0aW9uX19pdGVtIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWNvdW50cnljb2RlLURFIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxhbmdjb2RlLWRlLURFIGNtcC1sYW5n +dWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTEiPgogICAgICAgIAogICAgCiAgICA8YSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS1saW5rIiBocmVmPSJodHRwczovL2ZpbGVz +LnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvZGUvZGUuaHRtbCIgaHJlZmxhbmc9ImRlLURFIiBsYW5nPSJkZS1ERSIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJEZXV0c2No +Ij5EZXV0c2NoPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgPC91bD4KCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVt +IGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWNvdW50cnljb2RlLUZSIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxhbmdjb2RlLWZyLUZSIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25f +X2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGkgY2xhc3M9IndlLWxhbmctaWNvbiB3ZS1sYW5nLWljb24tRlIiIHRpdGxlPSJGcmFuY2UiPjwvaT4KICAgIAoKICAgICAgICAKICAgIDx1bCBj +bGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9fZ3JvdXAiPgogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25f +X2l0ZW0tLWNvdW50cnljb2RlLUZSIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxhbmdjb2RlLWZyLUZSIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTEiPgogICAgICAg +IAogICAgCiAgICA8YSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRh +aWwvZnIvZnIuaHRtbCIgaHJlZmxhbmc9ImZyLUZSIiBsYW5nPSJmci1GUiIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmFuw6dhaXMiPkZyYW7Dp2FpczwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoK +ICAgIDwvdWw+CgogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1jb3Vu +dHJ5Y29kZS1FUyBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sYW5nY29kZS1lcy1FUyBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxpIGNs +YXNzPSJ3ZS1sYW5nLWljb24gd2UtbGFuZy1pY29uLUVTIiB0aXRsZT0iU3BhaW4iPjwvaT4KICAgIAoKICAgICAgICAKICAgIDx1bCBjbGFzcz0iY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9fZ3JvdXAi +PgogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWNvdW50cnljb2RlLUVTIGNtcC1sYW5ndWFnZW5h +dmlnYXRpb25fX2l0ZW0tLWxhbmdjb2RlLWVzLUVTIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTEiPgogICAgICAgIAogICAgCiAgICA8YSBjbGFzcz0iY21wLWxhbmd1YWdlbmF2 +aWdhdGlvbl9faXRlbS1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvZXMvZXMuaHRtbCIgaHJlZmxhbmc9ImVzLUVTIiBsYW5n +PSJlcy1FUyIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJFc3Bhw7FvbCI+RXNwYcOxb2w8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICA8L3VsPgoKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAg +ICA8bGkgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0gY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tY291bnRyeWNvZGUtSVQgY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRl +bS0tbGFuZ2NvZGUtaXQtSVQgY21wLWxhbmd1YWdlbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8aSBjbGFzcz0id2UtbGFuZy1pY29uIHdlLWxhbmctaWNvbi1JVCIgdGl0 +bGU9Ikl0YWx5Ij48L2k+CiAgICAKCiAgICAgICAgCiAgICA8dWwgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2dyb3VwIj4KICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLWxhbmd1YWdl +bmF2aWdhdGlvbl9faXRlbSBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1jb3VudHJ5Y29kZS1JVCBjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sYW5nY29kZS1pdC1JVCBjbXAtbGFu +Z3VhZ2VuYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0xIj4KICAgICAgICAKICAgIAogICAgPGEgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tbGluayIgaHJlZj0iaHR0cHM6Ly9maWxl +cy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2l0L2l0Lmh0bWwiIGhyZWZsYW5nPSJpdC1JVCIgbGFuZz0iaXQtSVQiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iSXRhbGlh +bm8iPkl0YWxpYW5vPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgPC91bD4KCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbGFuZ3VhZ2VuYXZpZ2F0aW9uX19p +dGVtIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWNvdW50cnljb2RlLVVTIGNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tLWxhbmdjb2RlLWVuLVVTIGNtcC1sYW5ndWFnZW5hdmlnYXRp +b25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGkgY2xhc3M9IndlLWxhbmctaWNvbiB3ZS1sYW5nLWljb24tVVMiIHRpdGxlPSJbUGFnZV0gTmF2aWdhdGlvbiBUaXRsZSAmYW1wOyI+PC9p +PgogICAgPGEgY2xhc3M9ImNtcC1sYW5ndWFnZW5hdmlnYXRpb25fX2l0ZW0tbGluayIgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL3Rl +c3QuaHRtbCIgaHJlZmxhbmc9ImVuLVVTIiBsYW5nPSJlbi1VUyIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJbUGFnZV0gTmF2aWdhdGlvbiBUaXRsZSAmYW1wOyI+W1BhZ2VdIE5hdmlnYXRpb24gVGl0 +bGUgJmFtcDs8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICA8L3VsPgo8L25hdj4KCiAgICAKCjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2VyZXRhaWwvY29tcG9uZW50cy9zdHJ1 +Y3R1cmUvbGFuZ3VhZ2VuYXZpZ2F0aW9uIiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pj +cjpjb250ZW50L3Jvb3QvaGVhZGVyL2xhbmd1YWdlbmF2aWdhdGlvbiIsInN0cnVjdHVyZVBhdGgiOiIvY29uZi93ZS1yZXRhaWwvc2V0dGluZ3Mvd2NtL3RlbXBsYXRlcy9oZXJvLXBhZ2Uvc3RydWN0 +dXJlL2pjcjpjb250ZW50L3Jvb3QvaGVhZGVyL2xhbmd1YWdlbmF2aWdhdGlvbiIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL2xhbmd1 +YWdlbmF2aWdhdGlvbi92MS9sYW5ndWFnZW5hdmlnYXRpb24vbGFuZ3VhZ2VuYXZpZ2F0aW9uLmh0bWwiLCJ0b3RhbFRpbWUiOjMsInNlbGZUaW1lIjozfS0tPgo8L2Rpdj4KCiAgICAgICAgICAgIDwv +ZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWFmdGVyIj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3By +b3ZldHRhL2NvbnRlbnQvbGF1bmNoZXMvMjAyNS8wNC8wNC9sYXVuY2hfY29weV9vZl9kZW1vL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50Lmh0bWwjIiBkYXRh +LWRpc21pc3M9Im1vZGFsIj48aSBjbGFzcz0id2UtSWNvbiB3ZS1JY29uLS1jbG9zZS1hbHQiPjwvaT4gQ2xvc2U8L2E+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+PCEtLSAvLndlLUxh +bmd1YWdlTW9kYWwgLS0+CgogICAgPC9kaXY+CiAgICAKCjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2VyZXRhaWwvY29tcG9uZW50cy9zdHJ1Y3R1cmUvaGVhZGVyIiwicGF0aCI6Ii4u +Ly4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvaGVhZGVyIiwic3RydWN0dXJlUGF0 +aCI6Ii9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vdGVtcGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1cmUvamNyOmNvbnRlbnQvcm9vdC9oZWFkZXIiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQi +OiJTY3JpcHQgL2FwcHMvd2VyZXRhaWwvY29tcG9uZW50cy9zdHJ1Y3R1cmUvaGVhZGVyL2hlYWRlci5odG1sIiwidG90YWxUaW1lIjoyMywic2VsZlRpbWUiOjV9LS0+CjwvZGl2Pgo8ZGl2IGNsYXNz +PSJoZXJvaW1hZ2UgY21wLWltYWdlIGFlbS1HcmlkQ29sdW1uIGFlbS1HcmlkQ29sdW1uLS1kZWZhdWx0LS0xMiI+CgogICAgPGRpdiBjbGFzcz0id2UtSGVyb0ltYWdlIHdpZHRoLWZ1bGwganVtYm90 +cm9uIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTogdXJsKCYjMzk7Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC9yZXNvdXJjZXMvZm9yZXN0LXRyYWlsLmpwZWcmIzM5Oyk7Ij4K +ICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgY3EtZGQtaW1hZ2UiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1IZXJvSW1hZ2Utd3JhcHBlciI+CiAgICAgICAgICAgICAgICA8cCBjbGFz +cz0iaDMiPjwvcD4KICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9IndlLUhlcm9JbWFnZS10aXRsZSBoMSI+RXF1aXBtZW50PC9zdHJvbmc+CgogICAgICAgICAgICAgICAgCiAgICAgICAgICAg +IDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9oZXJvaW1hZ2UiLCJwYXRoIjoi +Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9oZXJvX2ltYWdlIiwic2VsZWN0 +b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9hcHBzL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9oZXJvaW1hZ2UvaGVyb2ltYWdlLmh0bWwiLCJ0b3RhbFRpbWUiOjEsInNlbGZUaW1lIjox +fS0tPgo8Y3EgZGF0YS1wYXRoPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290 +L2hlcm9faW1hZ2UiIGRhdGEtY29uZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9v +dC9oZXJvX2ltYWdlJnF1b3Q7LCZxdW90O3NsaW5nUGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9o +ZXJvX2ltYWdlLmh0bWwmcXVvdDssJnF1b3Q7ZGlhbG9nJnF1b3Q7OiZxdW90Oy9hcHBzL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9oZXJvaW1hZ2UvY3E6ZGlhbG9nJnF1b3Q7LCZxdW90O2Rp +YWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQv +b3ZlcnJpZGUvYXBwcy93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvaGVyb2ltYWdlL19jcV9kaWFsb2cuaHRtbC9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVu +dC9qY3I6Y29udGVudC9yb290L2hlcm9faW1hZ2UmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvaW1hZ2UvdjIvaW1hZ2UvY3E6ZGVz +aWduX2RpYWxvZyZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7ZnVsbHNjcmVlbiZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dMb2FkaW5nTW9kZSZxdW90OzomcXVvdDth +dXRvJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ1NyYyZxdW90OzomcXVvdDsvbW50L292ZXJyaWRlL2FwcHMvY29yZS93Y20vY29tcG9uZW50cy9pbWFnZS92Mi9pbWFnZS9fY3FfZGVzaWduX2RpYWxv +Zy5wb2xpY3lkZXNpZ24uZWRpdGFibGV0ZW1wbGF0ZS5odG1sL2NvbmYvd2UtcmV0YWlsL3NldHRpbmdzL3djbS9wb2xpY2llcy93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvaGVyb2ltYWdlL3Bv +bGljeV8xNjQ3MzA1NjYxMjk2OTM5MTQ/ZGlhbG9nPSUyRmFwcHMlMkZjb3JlJTJGd2NtJTJGY29tcG9uZW50cyUyRmltYWdlJTJGdjIlMkZpbWFnZSUyRmNxJTNBZGVzaWduX2RpYWxvZyZhbXA7cmVm +ZXJyZXI9JTJGY29udGVudCUyRndlLXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUyRmVxdWlwbWVudCZhbXA7cG9saWN5Q29udGVudFBhdGg9JTJGY29udGVudCUyRndlLXJldGFpbCUyRmxh +bmd1YWdlLW1hc3RlcnMlMkZlbiUyRmVxdWlwbWVudCUyRmpjciUzQWNvbnRlbnQlMkZyb290JTJGaGVyb19pbWFnZSZhbXA7cG9saWN5Q29udGVudFJlc291cmNlVHlwZT13ZXJldGFpbCUyRmNvbXBv +bmVudHMlMkZjb250ZW50JTJGaGVyb2ltYWdlJmFtcDtwb2xpY3lEaXJlY3RvcnlQYXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnBvbGljaWVzJTJGd2VyZXRhaWwlMkZj +b21wb25lbnRzJTJGY29udGVudCUyRmhlcm9pbWFnZSUyRiZhbXA7cG9saWN5TWFwcGluZ1BhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGdGVtcGxhdGVzJTJGaGVyby1w +YWdlJTJGcG9saWNpZXMlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRmhlcm9faW1hZ2UmYW1wO3BvbGljeU1hcHBpbmdSZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY2ll +cyUyRm1hcHBpbmcmYW1wO3BvbGljeU5hbWU9cG9saWN5XzE2NDczMDU2NjEyOTY5MzkxNCZhbXA7cG9saWN5UmVsYXRpdmVQYXRoPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZoZXJv +aW1hZ2UlMkZwb2xpY3lfMTY0NzMwNTY2MTI5NjkzOTE0JmFtcDtyZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY3klMkZwb2xpY3kmcXVvdDssJnF1b3Q7ZGVzaWduRGlh +bG9nQ2xhc3NpYyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL2ltYWdlL3YyL2ltYWdlL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7dHlwZSZxdW90OzomcXVvdDt3ZXJl +dGFpbC9jb21wb25lbnRzL2NvbnRlbnQvaGVyb2ltYWdlJnF1b3Q7LCZxdW90O2lzUmVzcG9uc2l2ZUdyaWQmcXVvdDs6ZmFsc2UsJnF1b3Q7cG9saWN5UGF0aCZxdW90OzomcXVvdDtyb290L2hlcm9f +aW1hZ2UmcXVvdDssJnF1b3Q7Y3NwJnF1b3Q7OiZxdW90O3BhZ2V8YmFzaWNwYWdlL3Jvb3R8cmVzcG9uc2l2ZWdyaWQvaGVyb2ltYWdlfGltYWdlJnF1b3Q7LCZxdW90O2VkaXRDb25maWcmcXVvdDs6 +eyZxdW90O2Ryb3BUYXJnZXQmcXVvdDs6W3smcXVvdDtpZCZxdW90OzomcXVvdDtpbWFnZSZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90Oy4vZmlsZVJlZmVyZW5jZSZxdW90OywmcXVvdDthY2Nl +cHQmcXVvdDs6WyZxdW90O2ltYWdlLy4qJnF1b3Q7XSwmcXVvdDtncm91cHMmcXVvdDs6WyZxdW90O21lZGlhJnF1b3Q7XSwmcXVvdDtwYXJhbXMmcXVvdDs6eyZxdW90Oy4vc2xpbmc6cmVzb3VyY2VU +eXBlJnF1b3Q7OiZxdW90O3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9oZXJvaW1hZ2UmcXVvdDt9fV0sJnF1b3Q7c3RydWN0dXJlJnF1b3Q7OnRydWV9fSI+PC9jcT4KPC9kaXY+CjxkaXYgY2xh +c3M9InJlc3BvbnNpdmVncmlkIGFlbS1HcmlkQ29sdW1uIGFlbS1HcmlkQ29sdW1uLS1kZWZhdWx0LS0xMiI+CgoKPGRpdiBjbGFzcz0iYWVtLUdyaWQgYWVtLUdyaWQtLTEyIGFlbS1HcmlkLS1kZWZh +dWx0LS0xMiAiPgogICAgCiAgICA8ZGl2IGNsYXNzPSJ0aXRsZSBhZW0tR3JpZENvbHVtbiBhZW0tR3JpZENvbHVtbi0tZGVmYXVsdC0tMTIiPgo8ZGl2IGNsYXNzPSJjbXAtdGl0bGUiPgogICAgPGgy +IGNsYXNzPSJjbXAtdGl0bGVfX3RleHQiPldlbGNvbWUgb3VyIGZpbmVzdCBlcXVpcG1lbnQgKDg6MTcgQU0pPC9oMj4KPC9kaXY+CgogICAgCgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6 +IndlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90aXRsZSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2Vx +dWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RpdGxlIiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGl0bGUv +djIvdGl0bGUvdGl0bGUuaHRtbCIsInRvdGFsVGltZSI6MSwic2VsZlRpbWUiOjF9LS0+CjxjcSBkYXRhLXBhdGg9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWls +L2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGl0bGUiIGRhdGEtY29uZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVu +dC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90aXRsZSZxdW90OywmcXVvdDtzbGluZ1BhdGgmcXVvdDs6JnF1b3Q7 +L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGl0bGUuaHRtbCZxdW90OywmcXVvdDtkaWFsb2cmcXVv +dDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90aXRsZS92Mi90aXRsZS9jcTpkaWFsb2cmcXVvdDssJnF1b3Q7ZGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90Oywm +cXVvdDtkaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGl0bGUv +djIvdGl0bGUvX2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGl0bGUmcXVv +dDssJnF1b3Q7ZGVzaWduRGlhbG9nJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGl0bGUvdjIvdGl0bGUvY3E6ZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDtkZXNpZ25EaWFs +b2dMYXlvdXQmcXVvdDs6JnF1b3Q7ZnVsbHNjcmVlbiZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dMb2FkaW5nTW9kZSZxdW90OzomcXVvdDthdXRvJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ1NyYyZx +dW90OzomcXVvdDsvbW50L292ZXJyaWRlL2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90aXRsZS92Mi90aXRsZS9fY3FfZGVzaWduX2RpYWxvZy5wb2xpY3lkZXNpZ24uZWRpdGFibGV0ZW1wbGF0ZS5o +dG1sL2NvbmYvd2UtcmV0YWlsL3NldHRpbmdzL3djbS9wb2xpY2llcy93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvdGl0bGUvd2UtcmV0YWlsLWhlcm8tcGFnZT9kaWFsb2c9JTJGYXBwcyUyRmNv +cmUlMkZ3Y20lMkZjb21wb25lbnRzJTJGdGl0bGUlMkZ2MiUyRnRpdGxlJTJGY3ElM0FkZXNpZ25fZGlhbG9nJmFtcDtyZWZlcnJlcj0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJGbGFuZ3VhZ2UtbWFz +dGVycyUyRmVuJTJGZXF1aXBtZW50JmFtcDtwb2xpY3lDb250ZW50UGF0aD0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJGbGFuZ3VhZ2UtbWFzdGVycyUyRmVuJTJGZXF1aXBtZW50JTJGamNyJTNBY29u +dGVudCUyRnJvb3QlMkZyZXNwb25zaXZlZ3JpZCUyRnRpdGxlJmFtcDtwb2xpY3lDb250ZW50UmVzb3VyY2VUeXBlPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0aXRsZSZhbXA7cG9s +aWN5RGlyZWN0b3J5UGF0aD0lMkZjb25mJTJGd2UtcmV0YWlsJTJGc2V0dGluZ3MlMkZ3Y20lMkZwb2xpY2llcyUyRndlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0aXRsZSUyRiZhbXA7 +cG9saWN5TWFwcGluZ1BhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGdGVtcGxhdGVzJTJGaGVyby1wYWdlJTJGcG9saWNpZXMlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUy +RnJlc3BvbnNpdmVncmlkJTJGd2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRpdGxlJmFtcDtwb2xpY3lNYXBwaW5nUmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJG +cG9saWNpZXMlMkZtYXBwaW5nJmFtcDtwb2xpY3lOYW1lPXdlLXJldGFpbC1oZXJvLXBhZ2UmYW1wO3BvbGljeVJlbGF0aXZlUGF0aD13ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGl0 +bGUlMkZ3ZS1yZXRhaWwtaGVyby1wYWdlJmFtcDtyZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY3klMkZwb2xpY3kmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nQ2xhc3Np +YyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RpdGxlL3YyL3RpdGxlL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7aGFzUG9saWN5TWFwcGluZyZxdW90Ozp0cnVlLCZx +dW90O3R5cGUmcXVvdDs6JnF1b3Q7d2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3RpdGxlJnF1b3Q7LCZxdW90O2lzUmVzcG9uc2l2ZUdyaWQmcXVvdDs6ZmFsc2UsJnF1b3Q7cG9saWN5UGF0aCZx +dW90OzomcXVvdDtyb290L3Jlc3BvbnNpdmVncmlkL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90aXRsZSZxdW90OywmcXVvdDtjc3AmcXVvdDs6JnF1b3Q7cGFnZXxiYXNpY3BhZ2Uvcm9vdHxy +ZXNwb25zaXZlZ3JpZC9yZXNwb25zaXZlZ3JpZC90aXRsZSZxdW90OywmcXVvdDtlZGl0Q29uZmlnJnF1b3Q7OnsmcXVvdDtpbnBsYWNlRWRpdGluZ0NvbmZpZyZxdW90Ozp7JnF1b3Q7YWN0aXZlJnF1 +b3Q7OnRydWUsJnF1b3Q7ZWRpdG9yVHlwZSZxdW90OzomcXVvdDt0aXRsZSZxdW90OywmcXVvdDtjb25maWdQYXRoJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGl0bGUvdjIv +dGl0bGUvY3E6ZWRpdENvbmZpZy9jcTppbnBsYWNlRWRpdGluZy9jb25maWcmcXVvdDt9fSwmcXVvdDtpcGVDb25maWcmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1 +bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dGl0bGVUYWcmcXVvdDs6WyZxdW90O2gxJnF1b3Q7LCZxdW90O2gyJnF1b3Q7LCZxdW90O2gzJnF1b3Q7LCZxdW90O2g0JnF1b3Q7LCZxdW90O2g1JnF1b3Q7 +LCZxdW90O2g2JnF1b3Q7XSwmcXVvdDtjb25maWcmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dGl0bGVUYWcmcXVvdDs6 +WyZxdW90O2gxJnF1b3Q7LCZxdW90O2gyJnF1b3Q7LCZxdW90O2gzJnF1b3Q7LCZxdW90O2g0JnF1b3Q7LCZxdW90O2g1JnF1b3Q7LCZxdW90O2g2JnF1b3Q7XX19fSI+PC9jcT4KPC9kaXY+CjxkaXYg +Y2xhc3M9InRlYXNlciB3ZS1UZWFzZXIgYWVtLUdyaWRDb2x1bW4tLWRlZmF1bHQtLW5vbmUgYWVtLUdyaWRDb2x1bW4gYWVtLUdyaWRDb2x1bW4tLWRlZmF1bHQtLTYgYWVtLUdyaWRDb2x1bW4tLW9m +ZnNldC0tZGVmYXVsdC0tMCI+CjxkaXYgY2xhc3M9ImNtcC10ZWFzZXIgY3EtZGQtaW1hZ2UiPgogICAgCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19pbWFnZSI+CjxkaXYgZGF0YS1jbXAtc3Jj +PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9oaWtlci1hbmFwdXJuYS5qcGciIGRhdGEtYXNzZXQtaWQ9IjFjYjczZWRjLWQ5MGItNGU0OS1hMjYyLTQ1YzRm +ODc4NGMwZSIgZGF0YS10aXRsZT0iSGlrZXIgQW5hcHVybmEiIGNsYXNzPSJjbXAtaW1hZ2UgY3EtZGQtaW1hZ2UiIGl0ZW1zY29wZT0iIiBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvSW1hZ2VP +YmplY3QiPgogICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICA8aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvaGlrZXItYW5hcHVybmEuanBlZyIgY2xhc3M9ImNtcC1pbWFnZV9f +aW1hZ2UiIGl0ZW1wcm9wPSJjb250ZW50VXJsIiBkYXRhLWNtcC1ob29rLWltYWdlPSJpbWFnZSIgYWx0PSJIaWtlciBvbiB0aGUgdHJlayBpbiBIaW1hbGF5YXMsIEFuYXB1cm5hIHZhbGxleSwgTmVw +YWwiIHRpdGxlPSJIaWtlciBBbmFwdXJuYSI+CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAKICAgIDxtZXRhIGl0ZW1wcm9wPSJjYXB0aW9uIiBjb250ZW50PSJIaWtlciBBbmFwdXJuYSI+ +CjwvZGl2PgoKICAgIAo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6ImNvcmUvd2NtL2NvbXBvbmVudHMvaW1hZ2UvdjIvaW1hZ2UiLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4v +Li4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXIvbm9fcmVzb3VyY2VfMCIsInNlbGVj +dG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL2ltYWdlL3YyL2ltYWdlL2ltYWdlLmh0bWwiLCJ0b3RhbFRpbWUiOjIsInNlbGZUaW1lIjoyfS0tPgo8 +L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19jb250ZW50Ij4KICAgICAgICAKICAgIAoKICAgICAgICAKICAgIAoKICAgICAgICAKICAgIDxkaXYgY2xhc3M9ImNtcC10ZWFzZXJfX2Fj +dGlvbi1jb250YWluZXIiPgogICAgICAgIAogICAgPGEgY2xhc3M9ImNtcC10ZWFzZXJfX2FjdGlvbi1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVu +dC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvaGlraW5nLmh0bWwiPkhpa2luZzwvYT4KCiAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KPC9kaXY+CgogICAgCgo8 +IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90ZWFzZXIiLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93 +ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXIiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3JpcHQg +L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL3RlYXNlci5odG1sIiwidG90YWxUaW1lIjozLCJzZWxmVGltZSI6MX0tLT4KPGNxIGRhdGEtcGF0aD0iLi4vLi4vLi4vLi4v +Li4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXIiIGRhdGEtY29u +ZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFz +ZXImcXVvdDssJnF1b3Q7c2xpbmdQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVn +cmlkL3RlYXNlci5odG1sJnF1b3Q7LCZxdW90O2RpYWxvZyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvY3E6ZGlhbG9nJnF1b3Q7LCZxdW90O2Rp +YWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQv +b3ZlcnJpZGUvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvX2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50 +L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90 +ZWFzZXIvY3E6ZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7ZnVsbHNjcmVlbiZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dMb2FkaW5nTW9kZSZx +dW90OzomcXVvdDthdXRvJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ1NyYyZxdW90OzomcXVvdDsvbW50L292ZXJyaWRlL2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL19j +cV9kZXNpZ25fZGlhbG9nLnBvbGljeWRlc2lnbi5lZGl0YWJsZXRlbXBsYXRlLmh0bWwvY29uZi93ZS1yZXRhaWwvc2V0dGluZ3Mvd2NtL3BvbGljaWVzL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVu +dC90ZWFzZXIvcG9saWN5XzE1MjYwMzcyNTMyMDI/ZGlhbG9nPSUyRmFwcHMlMkZjb3JlJTJGd2NtJTJGY29tcG9uZW50cyUyRnRlYXNlciUyRnYxJTJGdGVhc2VyJTJGY3ElM0FkZXNpZ25fZGlhbG9n +JmFtcDtyZWZlcnJlcj0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJGbGFuZ3VhZ2UtbWFzdGVycyUyRmVuJTJGZXF1aXBtZW50JmFtcDtwb2xpY3lDb250ZW50UGF0aD0lMkZjb250ZW50JTJGd2UtcmV0 +YWlsJTJGbGFuZ3VhZ2UtbWFzdGVycyUyRmVuJTJGZXF1aXBtZW50JTJGamNyJTNBY29udGVudCUyRnJvb3QlMkZyZXNwb25zaXZlZ3JpZCUyRnRlYXNlciZhbXA7cG9saWN5Q29udGVudFJlc291cmNl +VHlwZT13ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGVhc2VyJmFtcDtwb2xpY3lEaXJlY3RvcnlQYXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnBvbGlj +aWVzJTJGd2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciUyRiZhbXA7cG9saWN5TWFwcGluZ1BhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGdGVt +cGxhdGVzJTJGaGVyby1wYWdlJTJGcG9saWNpZXMlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnJlc3BvbnNpdmVncmlkJTJGd2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciZh +bXA7cG9saWN5TWFwcGluZ1Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGljaWVzJTJGbWFwcGluZyZhbXA7cG9saWN5TmFtZT1wb2xpY3lfMTUyNjAzNzI1MzIwMiZhbXA7 +cG9saWN5UmVsYXRpdmVQYXRoPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0ZWFzZXIlMkZwb2xpY3lfMTUyNjAzNzI1MzIwMiZhbXA7cmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZj +b21wb25lbnRzJTJGcG9saWN5JTJGcG9saWN5JnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0NsYXNzaWMmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2Vy +L2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7aGFzUG9saWN5TWFwcGluZyZxdW90Ozp0cnVlLCZxdW90O3R5cGUmcXVvdDs6JnF1b3Q7d2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3RlYXNl +ciZxdW90OywmcXVvdDtpc1Jlc3BvbnNpdmVHcmlkJnF1b3Q7OmZhbHNlLCZxdW90O3BvbGljeVBhdGgmcXVvdDs6JnF1b3Q7cm9vdC9yZXNwb25zaXZlZ3JpZC93ZXJldGFpbC9jb21wb25lbnRzL2Nv +bnRlbnQvdGVhc2VyJnF1b3Q7LCZxdW90O2NzcCZxdW90OzomcXVvdDtwYWdlfGJhc2ljcGFnZS9yb290fHJlc3BvbnNpdmVncmlkL3Jlc3BvbnNpdmVncmlkL3RlYXNlciZxdW90OywmcXVvdDtlZGl0 +Q29uZmlnJnF1b3Q7OnsmcXVvdDtkcm9wVGFyZ2V0JnF1b3Q7Olt7JnF1b3Q7aWQmcXVvdDs6JnF1b3Q7aW1hZ2UmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDsuL2ZpbGVSZWZlcmVuY2UmcXVv +dDssJnF1b3Q7YWNjZXB0JnF1b3Q7OlsmcXVvdDtpbWFnZS9naWYmcXVvdDssJnF1b3Q7aW1hZ2UvanBlZyZxdW90OywmcXVvdDtpbWFnZS9wbmcmcXVvdDssJnF1b3Q7aW1hZ2Uvd2VicCZxdW90Oywm +cXVvdDtpbWFnZS90aWZmJnF1b3Q7XSwmcXVvdDtncm91cHMmcXVvdDs6WyZxdW90O21lZGlhJnF1b3Q7XSwmcXVvdDtwYXJhbXMmcXVvdDs6eyZxdW90Oy4vaW1hZ2VSb3RhdGUmcXVvdDs6JnF1b3Q7 +JnF1b3Q7LCZxdW90Oy4vaW1hZ2VNYXAmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90Oy4vaW1hZ2VDcm9wJnF1b3Q7OiZxdW90OyZxdW90O319XSwmcXVvdDtpbnBsYWNlRWRpdGluZ0NvbmZpZyZxdW90 +Ozp7JnF1b3Q7YWN0aXZlJnF1b3Q7OnRydWUsJnF1b3Q7ZWRpdG9yVHlwZSZxdW90OzomcXVvdDtpbWFnZSZxdW90OywmcXVvdDtjb25maWdQYXRoJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2Nv +bXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci9jcTplZGl0Q29uZmlnL2NxOmlucGxhY2VFZGl0aW5nL2NvbmZpZyZxdW90O319LCZxdW90O2lwZUNvbmZpZyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlU +eXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjb25maWcmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDss +JnF1b3Q7cGx1Z2lucyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5 +cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDssJnF1b3Q7YXNwZWN0UmF0aW9zJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFy +eVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3dpZGVMYW5kc2NhcGUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVy +ZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtXaWRlIExhbmRzY2FwZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDswLjYxODAmcXVvdDt9LCZxdW90O2xhbmRzY2FwZSZxdW90Ozp7 +JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O0xhbmRzY2FwZSZxdW90OywmcXVvdDtyYXRpbyZxdW90Ozom +cXVvdDswLjgyODQmcXVvdDt9LCZxdW90O3NxdWFyZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZx +dW90O1NxdWFyZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDsxJnF1b3Q7fSwmcXVvdDtwb3J0cmFpdCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3Ry +dWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1BvcnRyYWl0JnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzEuNjE4MCZxdW90O319fSwmcXVvdDtmbGlwJnF1b3Q7OnsmcXVv +dDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90Oy0mcXVvdDt9LCZxdW90O21hcCZxdW90Ozp7JnF1b3Q7amNy +OnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fSwmcXVvdDtyb3RhdGUmcXVvdDs6eyZxdW90O2pjcjpw +cmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O30sJnF1b3Q7em9vbSZxdW90Ozp7JnF1b3Q7amNyOnByaW1h +cnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fX0sJnF1b3Q7dWkmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlw +ZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7aW5saW5lJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZx +dW90O3Rvb2xiYXImcXVvdDs6WyZxdW90O2Nyb3AjbGF1bmNoJnF1b3Q7LCZxdW90O3JvdGF0ZSNyaWdodCZxdW90OywmcXVvdDtoaXN0b3J5I3VuZG8mcXVvdDssJnF1b3Q7aGlzdG9yeSNyZWRvJnF1 +b3Q7LCZxdW90O2Z1bGxzY3JlZW4jZnVsbHNjcmVlbiZxdW90OywmcXVvdDtjb250cm9sI2Nsb3NlJnF1b3Q7LCZxdW90O2NvbnRyb2wjZmluaXNoJnF1b3Q7XSwmcXVvdDtyZXBsYWNlbWVudFRvb2xi +YXJzJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6WyZxdW90O2Nyb3AjaWRlbnRpZmllciZxdW90Oywm +cXVvdDtjcm9wI3VubGF1bmNoJnF1b3Q7LCZxdW90O2Nyb3AjY29uZmlybSZxdW90O119fSwmcXVvdDtmdWxsc2NyZWVuJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6 +dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3Rvb2xiYXImcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bGVmdCZxdW90Ozpb +JnF1b3Q7Y3JvcCNsYXVuY2h3aXRocmF0aW8mcXVvdDssJnF1b3Q7cm90YXRlI3JpZ2h0JnF1b3Q7LCZxdW90O2ZsaXAjaG9yaXpvbnRhbCZxdW90OywmcXVvdDtmbGlwI3ZlcnRpY2FsJnF1b3Q7LCZx +dW90O3pvb20jcmVzZXQxMDAmcXVvdDssJnF1b3Q7em9vbSNwb3B1cHNsaWRlciZxdW90O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2hpc3RvcnkjdW5kbyZxdW90OywmcXVvdDtoaXN0b3J5I3Jl +ZG8mcXVvdDssJnF1b3Q7ZnVsbHNjcmVlbiNmdWxsc2NyZWVuZXhpdCZxdW90O119LCZxdW90O3JlcGxhY2VtZW50VG9vbGJhcnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVv +dDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtsZWZ0JnF1b3Q7 +OlsmcXVvdDtjcm9wI2lkZW50aWZpZXImcXVvdDtdLCZxdW90O3JpZ2h0JnF1b3Q7OlsmcXVvdDtjcm9wI3VubGF1bmNoJnF1b3Q7LCZxdW90O2Nyb3AjY29uZmlybSZxdW90O119fX19fSwmcXVvdDtw +bHVnaW5zJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90 +OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90OywmcXVvdDthc3BlY3RSYXRpb3MmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZx +dW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7d2lkZUxhbmRzY2FwZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90 +OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1dpZGUgTGFuZHNjYXBlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzAuNjE4MCZxdW90O30sJnF1b3Q7bGFuZHNjYXBlJnF1b3Q7OnsmcXVvdDtq +Y3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7TGFuZHNjYXBlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzAu +ODI4NCZxdW90O30sJnF1b3Q7c3F1YXJlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7U3F1 +YXJlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzEmcXVvdDt9LCZxdW90O3BvcnRyYWl0JnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVk +JnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7UG9ydHJhaXQmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MS42MTgwJnF1b3Q7fX19LCZxdW90O2ZsaXAmcXVvdDs6eyZxdW90O2pjcjpw +cmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7LSZxdW90O30sJnF1b3Q7bWFwJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFy +eVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9LCZxdW90O3JvdGF0ZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlU +eXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fSwmcXVvdDt6b29tJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUm +cXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9fSwmcXVvdDt1aSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7 +OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtpbmxpbmUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dG9v +bGJhciZxdW90OzpbJnF1b3Q7Y3JvcCNsYXVuY2gmcXVvdDssJnF1b3Q7cm90YXRlI3JpZ2h0JnF1b3Q7LCZxdW90O2hpc3RvcnkjdW5kbyZxdW90OywmcXVvdDtoaXN0b3J5I3JlZG8mcXVvdDssJnF1 +b3Q7ZnVsbHNjcmVlbiNmdWxsc2NyZWVuJnF1b3Q7LCZxdW90O2NvbnRyb2wjY2xvc2UmcXVvdDssJnF1b3Q7Y29udHJvbCNmaW5pc2gmcXVvdDtdLCZxdW90O3JlcGxhY2VtZW50VG9vbGJhcnMmcXVv +dDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90OzpbJnF1b3Q7Y3JvcCNpZGVudGlmaWVyJnF1b3Q7LCZxdW90O2Ny +b3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19LCZxdW90O2Z1bGxzY3JlZW4mcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVj +dHVyZWQmcXVvdDssJnF1b3Q7dG9vbGJhciZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtsZWZ0JnF1b3Q7OlsmcXVvdDtj +cm9wI2xhdW5jaHdpdGhyYXRpbyZxdW90OywmcXVvdDtyb3RhdGUjcmlnaHQmcXVvdDssJnF1b3Q7ZmxpcCNob3Jpem9udGFsJnF1b3Q7LCZxdW90O2ZsaXAjdmVydGljYWwmcXVvdDssJnF1b3Q7em9v +bSNyZXNldDEwMCZxdW90OywmcXVvdDt6b29tI3BvcHVwc2xpZGVyJnF1b3Q7XSwmcXVvdDtyaWdodCZxdW90OzpbJnF1b3Q7aGlzdG9yeSN1bmRvJnF1b3Q7LCZxdW90O2hpc3RvcnkjcmVkbyZxdW90 +OywmcXVvdDtmdWxsc2NyZWVuI2Z1bGxzY3JlZW5leGl0JnF1b3Q7XX0sJnF1b3Q7cmVwbGFjZW1lbnRUb29sYmFycyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVu +c3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2xlZnQmcXVvdDs6WyZxdW90 +O2Nyb3AjaWRlbnRpZmllciZxdW90O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2Nyb3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19fX19LCZxdW90O3Jlc3BvbnNp +dmUmcXVvdDs6eyZxdW90O2RlZmF1bHQmcXVvdDs6eyZxdW90O29mZnNldCZxdW90OzomcXVvdDswJnF1b3Q7LCZxdW90O3dpZHRoJnF1b3Q7OiZxdW90OzYmcXVvdDssJnF1b3Q7YmVoYXZpb3ImcXVv +dDs6bnVsbH19fSI+PC9jcT4KPC9kaXY+CjxkaXYgY2xhc3M9InRlYXNlciB3ZS1UZWFzZXIgYWVtLUdyaWRDb2x1bW4tLWRlZmF1bHQtLW5vbmUgYWVtLUdyaWRDb2x1bW4gYWVtLUdyaWRDb2x1bW4t +LWRlZmF1bHQtLTYgYWVtLUdyaWRDb2x1bW4tLW9mZnNldC0tZGVmYXVsdC0tMCI+CjxkaXYgY2xhc3M9ImNtcC10ZWFzZXIgY3EtZGQtaW1hZ2UiPgogICAgCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVh +c2VyX19pbWFnZSI+CjxkaXYgZGF0YS1jbXAtc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9ydW5uaW5nLXRyYWlsLW1hbi5qcGciIGRhdGEtYXNzZXQt +aWQ9IjQzM2Q1M2UyLTBiYmQtNGY1My05OGU1LTg4MDFiMzkwNDlkZiIgZGF0YS10aXRsZT0iUnVubmluZyBUcmFpbCBNYW4iIGNsYXNzPSJjbXAtaW1hZ2UgY3EtZGQtaW1hZ2UiIGl0ZW1zY29wZT0i +IiBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvSW1hZ2VPYmplY3QiPgogICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICA8aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvcnVu +bmluZy10cmFpbC1tYW4uanBlZyIgY2xhc3M9ImNtcC1pbWFnZV9faW1hZ2UiIGl0ZW1wcm9wPSJjb250ZW50VXJsIiBkYXRhLWNtcC1ob29rLWltYWdlPSJpbWFnZSIgYWx0PSJUcmFpbCBydW5uaW5n +IG1hbiBleGVyY2lzaW5nIG91dGRvb3JzIGZvciBmaXRuZXNzIiB0aXRsZT0iUnVubmluZyBUcmFpbCBNYW4iPgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgCiAgICA8bWV0YSBpdGVtcHJv +cD0iY2FwdGlvbiIgY29udGVudD0iUnVubmluZyBUcmFpbCBNYW4iPgo8L2Rpdj4KCiAgICAKPCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJjb3JlL3djbS9jb21wb25lbnRzL2ltYWdlL3Yy +L2ltYWdlIiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVz +cG9uc2l2ZWdyaWQvdGVhc2VyXzIwODI1MzY3NTQvbm9fcmVzb3VyY2VfMCIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL2ltYWdlL3Yy +L2ltYWdlL2ltYWdlLmh0bWwiLCJ0b3RhbFRpbWUiOjEsInNlbGZUaW1lIjoxfS0tPgo8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19jb250ZW50Ij4KICAgICAgICAKICAgIAoKICAg +ICAgICAKICAgIAoKICAgICAgICAKICAgIDxkaXYgY2xhc3M9ImNtcC10ZWFzZXJfX2FjdGlvbi1jb250YWluZXIiPgogICAgICAgIAogICAgPGEgY2xhc3M9ImNtcC10ZWFzZXJfX2FjdGlvbi1saW5r +IiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvcnVubmluZy5odG1s +Ij5SdW5uaW5nPC9hPgoKICAgIDwvZGl2PgoKICAgIDwvZGl2Pgo8L2Rpdj4KCiAgICAKCjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3Rl +YXNlciIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3Bv +bnNpdmVncmlkL3RlYXNlcl8yMDgyNTM2NzU0Iiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci90ZWFzZXIu +aHRtbCIsInRvdGFsVGltZSI6Miwic2VsZlRpbWUiOjF9LS0+CjxjcSBkYXRhLXBhdGg9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3Rl +cnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzIwODI1MzY3NTQiIGRhdGEtY29uZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93 +ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXJfMjA4MjUzNjc1NCZxdW90OywmcXVvdDtzbGluZ1BhdGgmcXVv +dDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzIwODI1MzY3NTQuaHRtbCZx +dW90OywmcXVvdDtkaWFsb2cmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL2NxOmRpYWxvZyZxdW90OywmcXVvdDtkaWFsb2dMb2FkaW5nTW9kZSZx +dW90OzomcXVvdDthdXRvJnF1b3Q7LCZxdW90O2RpYWxvZ0xheW91dCZxdW90OzomcXVvdDthdXRvJnF1b3Q7LCZxdW90O2RpYWxvZ1NyYyZxdW90OzomcXVvdDsvbW50L292ZXJyaWRlL2FwcHMvY29y +ZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL19jcV9kaWFsb2cuaHRtbC9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290 +L3Jlc3BvbnNpdmVncmlkL3RlYXNlcl8yMDgyNTM2NzU0JnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIv +Y3E6ZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7ZnVsbHNjcmVlbiZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dMb2FkaW5nTW9kZSZxdW90Ozom +cXVvdDthdXRvJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ1NyYyZxdW90OzomcXVvdDsvbW50L292ZXJyaWRlL2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL19jcV9kZXNp +Z25fZGlhbG9nLnBvbGljeWRlc2lnbi5lZGl0YWJsZXRlbXBsYXRlLmh0bWwvY29uZi93ZS1yZXRhaWwvc2V0dGluZ3Mvd2NtL3BvbGljaWVzL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90ZWFz +ZXIvcG9saWN5XzE1MjYwMzcyNTMyMDI/ZGlhbG9nPSUyRmFwcHMlMkZjb3JlJTJGd2NtJTJGY29tcG9uZW50cyUyRnRlYXNlciUyRnYxJTJGdGVhc2VyJTJGY3ElM0FkZXNpZ25fZGlhbG9nJmFtcDty +ZWZlcnJlcj0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJGbGFuZ3VhZ2UtbWFzdGVycyUyRmVuJTJGZXF1aXBtZW50JmFtcDtwb2xpY3lDb250ZW50UGF0aD0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJG +bGFuZ3VhZ2UtbWFzdGVycyUyRmVuJTJGZXF1aXBtZW50JTJGamNyJTNBY29udGVudCUyRnJvb3QlMkZyZXNwb25zaXZlZ3JpZCUyRnRlYXNlcl8yMDgyNTM2NzU0JmFtcDtwb2xpY3lDb250ZW50UmVz +b3VyY2VUeXBlPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0ZWFzZXImYW1wO3BvbGljeURpcmVjdG9yeVBhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJG +cG9saWNpZXMlMkZ3ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGVhc2VyJTJGJmFtcDtwb2xpY3lNYXBwaW5nUGF0aD0lMkZjb25mJTJGd2UtcmV0YWlsJTJGc2V0dGluZ3MlMkZ3Y20l +MkZ0ZW1wbGF0ZXMlMkZoZXJvLXBhZ2UlMkZwb2xpY2llcyUyRmpjciUzQWNvbnRlbnQlMkZyb290JTJGcmVzcG9uc2l2ZWdyaWQlMkZ3ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGVh +c2VyJmFtcDtwb2xpY3lNYXBwaW5nUmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9saWNpZXMlMkZtYXBwaW5nJmFtcDtwb2xpY3lOYW1lPXBvbGljeV8xNTI2MDM3MjUzMjAy +JmFtcDtwb2xpY3lSZWxhdGl2ZVBhdGg9d2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciUyRnBvbGljeV8xNTI2MDM3MjUzMjAyJmFtcDtyZXNvdXJjZVR5cGU9d2NtJTJGY29y +ZSUyRmNvbXBvbmVudHMlMkZwb2xpY3klMkZwb2xpY3kmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nQ2xhc3NpYyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90 +ZWFzZXIvY3E6ZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDtoYXNQb2xpY3lNYXBwaW5nJnF1b3Q7OnRydWUsJnF1b3Q7dHlwZSZxdW90OzomcXVvdDt3ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQv +dGVhc2VyJnF1b3Q7LCZxdW90O2lzUmVzcG9uc2l2ZUdyaWQmcXVvdDs6ZmFsc2UsJnF1b3Q7cG9saWN5UGF0aCZxdW90OzomcXVvdDtyb290L3Jlc3BvbnNpdmVncmlkL3dlcmV0YWlsL2NvbXBvbmVu +dHMvY29udGVudC90ZWFzZXImcXVvdDssJnF1b3Q7Y3NwJnF1b3Q7OiZxdW90O3BhZ2V8YmFzaWNwYWdlL3Jvb3R8cmVzcG9uc2l2ZWdyaWQvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyJnF1b3Q7LCZxdW90 +O2VkaXRDb25maWcmcXVvdDs6eyZxdW90O2Ryb3BUYXJnZXQmcXVvdDs6W3smcXVvdDtpZCZxdW90OzomcXVvdDtpbWFnZSZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90Oy4vZmlsZVJlZmVyZW5j +ZSZxdW90OywmcXVvdDthY2NlcHQmcXVvdDs6WyZxdW90O2ltYWdlL2dpZiZxdW90OywmcXVvdDtpbWFnZS9qcGVnJnF1b3Q7LCZxdW90O2ltYWdlL3BuZyZxdW90OywmcXVvdDtpbWFnZS93ZWJwJnF1 +b3Q7LCZxdW90O2ltYWdlL3RpZmYmcXVvdDtdLCZxdW90O2dyb3VwcyZxdW90OzpbJnF1b3Q7bWVkaWEmcXVvdDtdLCZxdW90O3BhcmFtcyZxdW90Ozp7JnF1b3Q7Li9pbWFnZVJvdGF0ZSZxdW90Ozom +cXVvdDsmcXVvdDssJnF1b3Q7Li9pbWFnZU1hcCZxdW90OzomcXVvdDsmcXVvdDssJnF1b3Q7Li9pbWFnZUNyb3AmcXVvdDs6JnF1b3Q7JnF1b3Q7fX1dLCZxdW90O2lucGxhY2VFZGl0aW5nQ29uZmln +JnF1b3Q7OnsmcXVvdDthY3RpdmUmcXVvdDs6dHJ1ZSwmcXVvdDtlZGl0b3JUeXBlJnF1b3Q7OiZxdW90O2ltYWdlJnF1b3Q7LCZxdW90O2NvbmZpZ1BhdGgmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93 +Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL2NxOmVkaXRDb25maWcvY3E6aW5wbGFjZUVkaXRpbmcvY29uZmlnJnF1b3Q7fX0sJnF1b3Q7aXBlQ29uZmlnJnF1b3Q7OnsmcXVvdDtqY3I6cHJp +bWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2NvbmZpZyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZx +dW90OywmcXVvdDtwbHVnaW5zJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6eyZxdW90O2pjcjpwcmlt +YXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90OywmcXVvdDthc3BlY3RSYXRpb3MmcXVvdDs6eyZxdW90O2pjcjpw +cmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7d2lkZUxhbmRzY2FwZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3Ry +dWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1dpZGUgTGFuZHNjYXBlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzAuNjE4MCZxdW90O30sJnF1b3Q7bGFuZHNjYXBlJnF1 +b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7TGFuZHNjYXBlJnF1b3Q7LCZxdW90O3JhdGlvJnF1 +b3Q7OiZxdW90OzAuODI4NCZxdW90O30sJnF1b3Q7c3F1YXJlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVv +dDs6JnF1b3Q7U3F1YXJlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzEmcXVvdDt9LCZxdW90O3BvcnRyYWl0JnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6 +dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7UG9ydHJhaXQmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MS42MTgwJnF1b3Q7fX19LCZxdW90O2ZsaXAmcXVvdDs6 +eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7LSZxdW90O30sJnF1b3Q7bWFwJnF1b3Q7OnsmcXVv +dDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9LCZxdW90O3JvdGF0ZSZxdW90Ozp7JnF1b3Q7 +amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fSwmcXVvdDt6b29tJnF1b3Q7OnsmcXVvdDtqY3I6 +cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9fSwmcXVvdDt1aSZxdW90Ozp7JnF1b3Q7amNyOnByaW1h +cnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtpbmxpbmUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVv +dDssJnF1b3Q7dG9vbGJhciZxdW90OzpbJnF1b3Q7Y3JvcCNsYXVuY2gmcXVvdDssJnF1b3Q7cm90YXRlI3JpZ2h0JnF1b3Q7LCZxdW90O2hpc3RvcnkjdW5kbyZxdW90OywmcXVvdDtoaXN0b3J5I3Jl +ZG8mcXVvdDssJnF1b3Q7ZnVsbHNjcmVlbiNmdWxsc2NyZWVuJnF1b3Q7LCZxdW90O2NvbnRyb2wjY2xvc2UmcXVvdDssJnF1b3Q7Y29udHJvbCNmaW5pc2gmcXVvdDtdLCZxdW90O3JlcGxhY2VtZW50 +VG9vbGJhcnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90OzpbJnF1b3Q7Y3JvcCNpZGVudGlmaWVyJnF1 +b3Q7LCZxdW90O2Nyb3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19LCZxdW90O2Z1bGxzY3JlZW4mcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVv +dDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dG9vbGJhciZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtsZWZ0JnF1 +b3Q7OlsmcXVvdDtjcm9wI2xhdW5jaHdpdGhyYXRpbyZxdW90OywmcXVvdDtyb3RhdGUjcmlnaHQmcXVvdDssJnF1b3Q7ZmxpcCNob3Jpem9udGFsJnF1b3Q7LCZxdW90O2ZsaXAjdmVydGljYWwmcXVv +dDssJnF1b3Q7em9vbSNyZXNldDEwMCZxdW90OywmcXVvdDt6b29tI3BvcHVwc2xpZGVyJnF1b3Q7XSwmcXVvdDtyaWdodCZxdW90OzpbJnF1b3Q7aGlzdG9yeSN1bmRvJnF1b3Q7LCZxdW90O2hpc3Rv +cnkjcmVkbyZxdW90OywmcXVvdDtmdWxsc2NyZWVuI2Z1bGxzY3JlZW5leGl0JnF1b3Q7XX0sJnF1b3Q7cmVwbGFjZW1lbnRUb29sYmFycyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7 +OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2xlZnQm +cXVvdDs6WyZxdW90O2Nyb3AjaWRlbnRpZmllciZxdW90O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2Nyb3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19fX19LCZx +dW90O3BsdWdpbnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBl +JnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7LCZxdW90O2FzcGVjdFJhdGlvcyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlU +eXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDt3aWRlTGFuZHNjYXBlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVk +JnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7V2lkZSBMYW5kc2NhcGUmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MC42MTgwJnF1b3Q7fSwmcXVvdDtsYW5kc2NhcGUmcXVvdDs6eyZx +dW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtMYW5kc2NhcGUmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1 +b3Q7MC44Mjg0JnF1b3Q7fSwmcXVvdDtzcXVhcmUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVv +dDtTcXVhcmUmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MSZxdW90O30sJnF1b3Q7cG9ydHJhaXQmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVj +dHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtQb3J0cmFpdCZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDsxLjYxODAmcXVvdDt9fX0sJnF1b3Q7ZmxpcCZxdW90Ozp7JnF1b3Q7 +amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDstJnF1b3Q7fSwmcXVvdDttYXAmcXVvdDs6eyZxdW90O2pjcjpw +cmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O30sJnF1b3Q7cm90YXRlJnF1b3Q7OnsmcXVvdDtqY3I6cHJp +bWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9LCZxdW90O3pvb20mcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5 +VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O319LCZxdW90O3VpJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUm +cXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2lubGluZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVv +dDt0b29sYmFyJnF1b3Q7OlsmcXVvdDtjcm9wI2xhdW5jaCZxdW90OywmcXVvdDtyb3RhdGUjcmlnaHQmcXVvdDssJnF1b3Q7aGlzdG9yeSN1bmRvJnF1b3Q7LCZxdW90O2hpc3RvcnkjcmVkbyZxdW90 +OywmcXVvdDtmdWxsc2NyZWVuI2Z1bGxzY3JlZW4mcXVvdDssJnF1b3Q7Y29udHJvbCNjbG9zZSZxdW90OywmcXVvdDtjb250cm9sI2ZpbmlzaCZxdW90O10sJnF1b3Q7cmVwbGFjZW1lbnRUb29sYmFy +cyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OlsmcXVvdDtjcm9wI2lkZW50aWZpZXImcXVvdDssJnF1 +b3Q7Y3JvcCN1bmxhdW5jaCZxdW90OywmcXVvdDtjcm9wI2NvbmZpcm0mcXVvdDtdfX0sJnF1b3Q7ZnVsbHNjcmVlbiZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVu +c3RydWN0dXJlZCZxdW90OywmcXVvdDt0b29sYmFyJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2xlZnQmcXVvdDs6WyZx +dW90O2Nyb3AjbGF1bmNod2l0aHJhdGlvJnF1b3Q7LCZxdW90O3JvdGF0ZSNyaWdodCZxdW90OywmcXVvdDtmbGlwI2hvcml6b250YWwmcXVvdDssJnF1b3Q7ZmxpcCN2ZXJ0aWNhbCZxdW90OywmcXVv +dDt6b29tI3Jlc2V0MTAwJnF1b3Q7LCZxdW90O3pvb20jcG9wdXBzbGlkZXImcXVvdDtdLCZxdW90O3JpZ2h0JnF1b3Q7OlsmcXVvdDtoaXN0b3J5I3VuZG8mcXVvdDssJnF1b3Q7aGlzdG9yeSNyZWRv +JnF1b3Q7LCZxdW90O2Z1bGxzY3JlZW4jZnVsbHNjcmVlbmV4aXQmcXVvdDtdfSwmcXVvdDtyZXBsYWNlbWVudFRvb2xiYXJzJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7 +bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bGVmdCZxdW90Ozpb +JnF1b3Q7Y3JvcCNpZGVudGlmaWVyJnF1b3Q7XSwmcXVvdDtyaWdodCZxdW90OzpbJnF1b3Q7Y3JvcCN1bmxhdW5jaCZxdW90OywmcXVvdDtjcm9wI2NvbmZpcm0mcXVvdDtdfX19fX0sJnF1b3Q7cmVz +cG9uc2l2ZSZxdW90Ozp7JnF1b3Q7ZGVmYXVsdCZxdW90Ozp7JnF1b3Q7b2Zmc2V0JnF1b3Q7OiZxdW90OzAmcXVvdDssJnF1b3Q7d2lkdGgmcXVvdDs6JnF1b3Q7NiZxdW90OywmcXVvdDtiZWhhdmlv +ciZxdW90OzpudWxsfX19Ij48L2NxPgo8L2Rpdj4KPGRpdiBjbGFzcz0idGVhc2VyIHdlLVRlYXNlciBhZW0tR3JpZENvbHVtbi0tZGVmYXVsdC0tbm9uZSBhZW0tR3JpZENvbHVtbiBhZW0tR3JpZENv +bHVtbi0tb2Zmc2V0LS1kZWZhdWx0LS0wIGFlbS1HcmlkQ29sdW1uLS1kZWZhdWx0LS00Ij4KPGRpdiBjbGFzcz0iY21wLXRlYXNlciBjcS1kZC1pbWFnZSI+CiAgICAKICAgIDxkaXYgY2xhc3M9ImNt +cC10ZWFzZXJfX2ltYWdlIj4KPGRpdiBkYXRhLWNtcC1zcmM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvcmVzb3VyY2VzL2VuZHVyby10cmFpbC1qdW1wLmpwZyIgZGF0YS1h +c3NldC1pZD0iM2Y2YzZkMmEtYjRkOS00NDBlLWI2OTEtNWRhZmQ3MjQyZjU2IiBkYXRhLXRpdGxlPSJFbmR1cm8gVHJhaWwgSnVtcCIgY2xhc3M9ImNtcC1pbWFnZSBjcS1kZC1pbWFnZSIgaXRlbXNj +b3BlPSIiIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9JbWFnZU9iamVjdCI+CiAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIDxpbWcgc3JjPSIuL0VxdWlwbWVudF9maWxl +cy9lbmR1cm8tdHJhaWwtanVtcC5qcGVnIiBjbGFzcz0iY21wLWltYWdlX19pbWFnZSIgaXRlbXByb3A9ImNvbnRlbnRVcmwiIGRhdGEtY21wLWhvb2staW1hZ2U9ImltYWdlIiBhbHQ9IkVuZHVybyBt +b3VudGFpbiBiaWtpbmcgaW4gdGhlIGZvcmVzdCIgdGl0bGU9IkVuZHVybyBUcmFpbCBKdW1wIj4KICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgIAogICAgPG1ldGEgaXRlbXByb3A9ImNhcHRp +b24iIGNvbnRlbnQ9IkVuZHVybyBUcmFpbCBKdW1wIj4KPC9kaXY+CgogICAgCjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoiY29yZS93Y20vY29tcG9uZW50cy9pbWFnZS92Mi9pbWFnZSIs +InBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVn +cmlkL3RlYXNlcl82NDc0MTQzOTEvbm9fcmVzb3VyY2VfMCIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL2ltYWdlL3YyL2ltYWdlL2lt +YWdlLmh0bWwiLCJ0b3RhbFRpbWUiOjEsInNlbGZUaW1lIjoxfS0tPgo8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19jb250ZW50Ij4KICAgICAgICAKICAgIAoKICAgICAgICAKICAg +IAoKICAgICAgICAKICAgIDxkaXYgY2xhc3M9ImNtcC10ZWFzZXJfX2FjdGlvbi1jb250YWluZXIiPgogICAgICAgIAogICAgPGEgY2xhc3M9ImNtcC10ZWFzZXJfX2FjdGlvbi1saW5rIiBocmVmPSJo +dHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvYmlraW5nLmh0bWwiPkJpa2luZzwv +YT4KCiAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KPC9kaXY+CgogICAgCgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90ZWFzZXIiLCJwYXRo +IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90 +ZWFzZXJfNjQ3NDE0MzkxIiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci90ZWFzZXIuaHRtbCIsInRvdGFs +VGltZSI6Miwic2VsZlRpbWUiOjF9LS0+CjxjcSBkYXRhLXBhdGg9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBt +ZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzY0NzQxNDM5MSIgZGF0YS1jb25maWc9InsmcXVvdDtwYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5n +dWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RlYXNlcl82NDc0MTQzOTEmcXVvdDssJnF1b3Q7c2xpbmdQYXRoJnF1b3Q7OiZxdW90Oy9jb250 +ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RlYXNlcl82NDc0MTQzOTEuaHRtbCZxdW90OywmcXVvdDtkaWFs +b2cmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL2NxOmRpYWxvZyZxdW90OywmcXVvdDtkaWFsb2dMb2FkaW5nTW9kZSZxdW90OzomcXVvdDthdXRv +JnF1b3Q7LCZxdW90O2RpYWxvZ0xheW91dCZxdW90OzomcXVvdDthdXRvJnF1b3Q7LCZxdW90O2RpYWxvZ1NyYyZxdW90OzomcXVvdDsvbW50L292ZXJyaWRlL2FwcHMvY29yZS93Y20vY29tcG9uZW50 +cy90ZWFzZXIvdjEvdGVhc2VyL19jcV9kaWFsb2cuaHRtbC9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlk +L3RlYXNlcl82NDc0MTQzOTEmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci9jcTpkZXNpZ25fZGlhbG9n +JnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xheW91dCZxdW90OzomcXVvdDtmdWxsc2NyZWVuJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDss +JnF1b3Q7ZGVzaWduRGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvX2NxX2Rlc2lnbl9kaWFsb2cucG9saWN5 +ZGVzaWduLmVkaXRhYmxldGVtcGxhdGUuaHRtbC9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vcG9saWNpZXMvd2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3RlYXNlci9wb2xpY3lfMTUyNjAz +NzI1MzIwMj9kaWFsb2c9JTJGYXBwcyUyRmNvcmUlMkZ3Y20lMkZjb21wb25lbnRzJTJGdGVhc2VyJTJGdjElMkZ0ZWFzZXIlMkZjcSUzQWRlc2lnbl9kaWFsb2cmYW1wO3JlZmVycmVyPSUyRmNvbnRl +bnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQmYW1wO3BvbGljeUNvbnRlbnRQYXRoPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJz +JTJGZW4lMkZlcXVpcG1lbnQlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnJlc3BvbnNpdmVncmlkJTJGdGVhc2VyXzY0NzQxNDM5MSZhbXA7cG9saWN5Q29udGVudFJlc291cmNlVHlwZT13ZXJldGFp +bCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGVhc2VyJmFtcDtwb2xpY3lEaXJlY3RvcnlQYXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnBvbGljaWVzJTJGd2VyZXRh +aWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciUyRiZhbXA7cG9saWN5TWFwcGluZ1BhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGdGVtcGxhdGVzJTJGaGVy +by1wYWdlJTJGcG9saWNpZXMlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnJlc3BvbnNpdmVncmlkJTJGd2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciZhbXA7cG9saWN5TWFw +cGluZ1Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGljaWVzJTJGbWFwcGluZyZhbXA7cG9saWN5TmFtZT1wb2xpY3lfMTUyNjAzNzI1MzIwMiZhbXA7cG9saWN5UmVsYXRp +dmVQYXRoPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0ZWFzZXIlMkZwb2xpY3lfMTUyNjAzNzI1MzIwMiZhbXA7cmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJG +cG9saWN5JTJGcG9saWN5JnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0NsYXNzaWMmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL2NxOmRlc2lnbl9k +aWFsb2cmcXVvdDssJnF1b3Q7aGFzUG9saWN5TWFwcGluZyZxdW90Ozp0cnVlLCZxdW90O3R5cGUmcXVvdDs6JnF1b3Q7d2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3RlYXNlciZxdW90OywmcXVv +dDtpc1Jlc3BvbnNpdmVHcmlkJnF1b3Q7OmZhbHNlLCZxdW90O3BvbGljeVBhdGgmcXVvdDs6JnF1b3Q7cm9vdC9yZXNwb25zaXZlZ3JpZC93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvdGVhc2Vy +JnF1b3Q7LCZxdW90O2NzcCZxdW90OzomcXVvdDtwYWdlfGJhc2ljcGFnZS9yb290fHJlc3BvbnNpdmVncmlkL3Jlc3BvbnNpdmVncmlkL3RlYXNlciZxdW90OywmcXVvdDtlZGl0Q29uZmlnJnF1b3Q7 +OnsmcXVvdDtkcm9wVGFyZ2V0JnF1b3Q7Olt7JnF1b3Q7aWQmcXVvdDs6JnF1b3Q7aW1hZ2UmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDsuL2ZpbGVSZWZlcmVuY2UmcXVvdDssJnF1b3Q7YWNj +ZXB0JnF1b3Q7OlsmcXVvdDtpbWFnZS9naWYmcXVvdDssJnF1b3Q7aW1hZ2UvanBlZyZxdW90OywmcXVvdDtpbWFnZS9wbmcmcXVvdDssJnF1b3Q7aW1hZ2Uvd2VicCZxdW90OywmcXVvdDtpbWFnZS90 +aWZmJnF1b3Q7XSwmcXVvdDtncm91cHMmcXVvdDs6WyZxdW90O21lZGlhJnF1b3Q7XSwmcXVvdDtwYXJhbXMmcXVvdDs6eyZxdW90Oy4vaW1hZ2VSb3RhdGUmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90 +Oy4vaW1hZ2VNYXAmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90Oy4vaW1hZ2VDcm9wJnF1b3Q7OiZxdW90OyZxdW90O319XSwmcXVvdDtpbnBsYWNlRWRpdGluZ0NvbmZpZyZxdW90Ozp7JnF1b3Q7YWN0 +aXZlJnF1b3Q7OnRydWUsJnF1b3Q7ZWRpdG9yVHlwZSZxdW90OzomcXVvdDtpbWFnZSZxdW90OywmcXVvdDtjb25maWdQYXRoJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGVh +c2VyL3YxL3RlYXNlci9jcTplZGl0Q29uZmlnL2NxOmlucGxhY2VFZGl0aW5nL2NvbmZpZyZxdW90O319LCZxdW90O2lwZUNvbmZpZyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZx +dW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjb25maWcmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7cGx1Z2lu +cyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1 +b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDssJnF1b3Q7YXNwZWN0UmF0aW9zJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6 +JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3dpZGVMYW5kc2NhcGUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1 +b3Q7bmFtZSZxdW90OzomcXVvdDtXaWRlIExhbmRzY2FwZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDswLjYxODAmcXVvdDt9LCZxdW90O2xhbmRzY2FwZSZxdW90Ozp7JnF1b3Q7amNyOnBy +aW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O0xhbmRzY2FwZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDswLjgyODQm +cXVvdDt9LCZxdW90O3NxdWFyZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1NxdWFyZSZx +dW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDsxJnF1b3Q7fSwmcXVvdDtwb3J0cmFpdCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90 +OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1BvcnRyYWl0JnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzEuNjE4MCZxdW90O319fSwmcXVvdDtmbGlwJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFy +eVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90Oy0mcXVvdDt9LCZxdW90O21hcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBl +JnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fSwmcXVvdDtyb3RhdGUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZx +dW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O30sJnF1b3Q7em9vbSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7 +OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fX0sJnF1b3Q7dWkmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVv +dDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7aW5saW5lJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3Rvb2xiYXIm +cXVvdDs6WyZxdW90O2Nyb3AjbGF1bmNoJnF1b3Q7LCZxdW90O3JvdGF0ZSNyaWdodCZxdW90OywmcXVvdDtoaXN0b3J5I3VuZG8mcXVvdDssJnF1b3Q7aGlzdG9yeSNyZWRvJnF1b3Q7LCZxdW90O2Z1 +bGxzY3JlZW4jZnVsbHNjcmVlbiZxdW90OywmcXVvdDtjb250cm9sI2Nsb3NlJnF1b3Q7LCZxdW90O2NvbnRyb2wjZmluaXNoJnF1b3Q7XSwmcXVvdDtyZXBsYWNlbWVudFRvb2xiYXJzJnF1b3Q7Onsm +cXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6WyZxdW90O2Nyb3AjaWRlbnRpZmllciZxdW90OywmcXVvdDtjcm9wI3Vu +bGF1bmNoJnF1b3Q7LCZxdW90O2Nyb3AjY29uZmlybSZxdW90O119fSwmcXVvdDtmdWxsc2NyZWVuJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVk +JnF1b3Q7LCZxdW90O3Rvb2xiYXImcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bGVmdCZxdW90OzpbJnF1b3Q7Y3JvcCNs +YXVuY2h3aXRocmF0aW8mcXVvdDssJnF1b3Q7cm90YXRlI3JpZ2h0JnF1b3Q7LCZxdW90O2ZsaXAjaG9yaXpvbnRhbCZxdW90OywmcXVvdDtmbGlwI3ZlcnRpY2FsJnF1b3Q7LCZxdW90O3pvb20jcmVz +ZXQxMDAmcXVvdDssJnF1b3Q7em9vbSNwb3B1cHNsaWRlciZxdW90O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2hpc3RvcnkjdW5kbyZxdW90OywmcXVvdDtoaXN0b3J5I3JlZG8mcXVvdDssJnF1 +b3Q7ZnVsbHNjcmVlbiNmdWxsc2NyZWVuZXhpdCZxdW90O119LCZxdW90O3JlcGxhY2VtZW50VG9vbGJhcnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVj +dHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtsZWZ0JnF1b3Q7OlsmcXVvdDtjcm9w +I2lkZW50aWZpZXImcXVvdDtdLCZxdW90O3JpZ2h0JnF1b3Q7OlsmcXVvdDtjcm9wI3VubGF1bmNoJnF1b3Q7LCZxdW90O2Nyb3AjY29uZmlybSZxdW90O119fX19fSwmcXVvdDtwbHVnaW5zJnF1b3Q7 +OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1 +bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90OywmcXVvdDthc3BlY3RSYXRpb3MmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtu +dDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7d2lkZUxhbmRzY2FwZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1l +JnF1b3Q7OiZxdW90O1dpZGUgTGFuZHNjYXBlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzAuNjE4MCZxdW90O30sJnF1b3Q7bGFuZHNjYXBlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5 +cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7TGFuZHNjYXBlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzAuODI4NCZxdW90O30s +JnF1b3Q7c3F1YXJlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7U3F1YXJlJnF1b3Q7LCZx +dW90O3JhdGlvJnF1b3Q7OiZxdW90OzEmcXVvdDt9LCZxdW90O3BvcnRyYWl0JnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90 +O25hbWUmcXVvdDs6JnF1b3Q7UG9ydHJhaXQmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MS42MTgwJnF1b3Q7fX19LCZxdW90O2ZsaXAmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZx +dW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7LSZxdW90O30sJnF1b3Q7bWFwJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6 +JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9LCZxdW90O3JvdGF0ZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZx +dW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fSwmcXVvdDt6b29tJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7 +bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9fSwmcXVvdDt1aSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVu +c3RydWN0dXJlZCZxdW90OywmcXVvdDtpbmxpbmUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dG9vbGJhciZxdW90Ozpb +JnF1b3Q7Y3JvcCNsYXVuY2gmcXVvdDssJnF1b3Q7cm90YXRlI3JpZ2h0JnF1b3Q7LCZxdW90O2hpc3RvcnkjdW5kbyZxdW90OywmcXVvdDtoaXN0b3J5I3JlZG8mcXVvdDssJnF1b3Q7ZnVsbHNjcmVl +biNmdWxsc2NyZWVuJnF1b3Q7LCZxdW90O2NvbnRyb2wjY2xvc2UmcXVvdDssJnF1b3Q7Y29udHJvbCNmaW5pc2gmcXVvdDtdLCZxdW90O3JlcGxhY2VtZW50VG9vbGJhcnMmcXVvdDs6eyZxdW90O2pj +cjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90OzpbJnF1b3Q7Y3JvcCNpZGVudGlmaWVyJnF1b3Q7LCZxdW90O2Nyb3AjdW5sYXVuY2gm +cXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19LCZxdW90O2Z1bGxzY3JlZW4mcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDss +JnF1b3Q7dG9vbGJhciZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtsZWZ0JnF1b3Q7OlsmcXVvdDtjcm9wI2xhdW5jaHdp +dGhyYXRpbyZxdW90OywmcXVvdDtyb3RhdGUjcmlnaHQmcXVvdDssJnF1b3Q7ZmxpcCNob3Jpem9udGFsJnF1b3Q7LCZxdW90O2ZsaXAjdmVydGljYWwmcXVvdDssJnF1b3Q7em9vbSNyZXNldDEwMCZx +dW90OywmcXVvdDt6b29tI3BvcHVwc2xpZGVyJnF1b3Q7XSwmcXVvdDtyaWdodCZxdW90OzpbJnF1b3Q7aGlzdG9yeSN1bmRvJnF1b3Q7LCZxdW90O2hpc3RvcnkjcmVkbyZxdW90OywmcXVvdDtmdWxs +c2NyZWVuI2Z1bGxzY3JlZW5leGl0JnF1b3Q7XX0sJnF1b3Q7cmVwbGFjZW1lbnRUb29sYmFycyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZx +dW90OywmcXVvdDtjcm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2xlZnQmcXVvdDs6WyZxdW90O2Nyb3AjaWRlbnRp +ZmllciZxdW90O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2Nyb3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19fX19LCZxdW90O3Jlc3BvbnNpdmUmcXVvdDs6eyZx +dW90O2RlZmF1bHQmcXVvdDs6eyZxdW90O29mZnNldCZxdW90OzomcXVvdDswJnF1b3Q7LCZxdW90O3dpZHRoJnF1b3Q7OiZxdW90OzQmcXVvdDssJnF1b3Q7YmVoYXZpb3ImcXVvdDs6bnVsbH19fSI+ +PC9jcT4KPC9kaXY+CjxkaXYgY2xhc3M9InRlYXNlciB3ZS1UZWFzZXIgYWVtLUdyaWRDb2x1bW4tLWRlZmF1bHQtLW5vbmUgYWVtLUdyaWRDb2x1bW4gYWVtLUdyaWRDb2x1bW4tLW9mZnNldC0tZGVm +YXVsdC0tMCBhZW0tR3JpZENvbHVtbi0tZGVmYXVsdC0tNCI+CjxkaXYgY2xhc3M9ImNtcC10ZWFzZXIgY3EtZGQtaW1hZ2UiPgogICAgCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19pbWFnZSI+ +CjxkaXYgZGF0YS1jbXAtc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy93YXZlLW5pY2FyYWd1YS5qcGciIGRhdGEtYXNzZXQtaWQ9IjMxMTU5YzM3LTcz +MWQtNGE0Mi05ZWNjLWZiNzljNTIwMzU0ZiIgZGF0YS10aXRsZT0iV2F2ZSBOaWNhcmFndWEiIGNsYXNzPSJjbXAtaW1hZ2UgY3EtZGQtaW1hZ2UiIGl0ZW1zY29wZT0iIiBpdGVtdHlwZT0iaHR0cDov +L3NjaGVtYS5vcmcvSW1hZ2VPYmplY3QiPgogICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICA8aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvd2F2ZS1uaWNhcmFndWEuanBlZyIg +Y2xhc3M9ImNtcC1pbWFnZV9faW1hZ2UiIGl0ZW1wcm9wPSJjb250ZW50VXJsIiBkYXRhLWNtcC1ob29rLWltYWdlPSJpbWFnZSIgYWx0PSJTdXJmaW5nIGluIE5pY2FyYWd1YSIgdGl0bGU9IldhdmUg +TmljYXJhZ3VhIj4KICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgIAogICAgPG1ldGEgaXRlbXByb3A9ImNhcHRpb24iIGNvbnRlbnQ9IldhdmUgTmljYXJhZ3VhIj4KPC9kaXY+CgogICAgCjwh +LS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoiY29yZS93Y20vY29tcG9uZW50cy9pbWFnZS92Mi9pbWFnZSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dl +LXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RlYXNlcl8xMzQxOTQ5NTg5L25vX3Jlc291cmNlXzAiLCJzZWxlY3RvcnMi +Om51bGwsInNlcnZsZXQiOiJTY3JpcHQgL2FwcHMvY29yZS93Y20vY29tcG9uZW50cy9pbWFnZS92Mi9pbWFnZS9pbWFnZS5odG1sIiwidG90YWxUaW1lIjoxLCJzZWxmVGltZSI6MX0tLT4KPC9kaXY+ +CgogICAgPGRpdiBjbGFzcz0iY21wLXRlYXNlcl9fY29udGVudCI+CiAgICAgICAgCiAgICAKCiAgICAgICAgCiAgICAKCiAgICAgICAgCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19hY3Rpb24t +Y29udGFpbmVyIj4KICAgICAgICAKICAgIDxhIGNsYXNzPSJjbXAtdGVhc2VyX19hY3Rpb24tbGluayIgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2Ut +cmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L3N1cmZpbmcuaHRtbCI+U3VyZmluZzwvYT4KCiAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KPC9kaXY+CgogICAgCgo8IS0t +Y3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90ZWFzZXIiLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1y +ZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXJfMTM0MTk0OTU4OSIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6 +IlNjcmlwdCAvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvdGVhc2VyLmh0bWwiLCJ0b3RhbFRpbWUiOjMsInNlbGZUaW1lIjoyfS0tPgo8Y3EgZGF0YS1wYXRoPSIuLi8u +Li8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RlYXNlcl8x +MzQxOTQ5NTg5IiBkYXRhLWNvbmZpZz0ieyZxdW90O3BhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3Qv +cmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzEzNDE5NDk1ODkmcXVvdDssJnF1b3Q7c2xpbmdQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVu +dC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RlYXNlcl8xMzQxOTQ5NTg5Lmh0bWwmcXVvdDssJnF1b3Q7ZGlhbG9nJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMv +dGVhc2VyL3YxL3RlYXNlci9jcTpkaWFsb2cmcXVvdDssJnF1b3Q7ZGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7YXV0 +byZxdW90OywmcXVvdDtkaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci9fY3FfZGlhbG9nLmh0bWwvY29udGVu +dC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXJfMTM0MTk0OTU4OSZxdW90OywmcXVvdDtkZXNpZ25EaWFs +b2cmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTGF5b3V0JnF1b3Q7OiZx +dW90O2Z1bGxzY3JlZW4mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9v +dmVycmlkZS9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci9fY3FfZGVzaWduX2RpYWxvZy5wb2xpY3lkZXNpZ24uZWRpdGFibGV0ZW1wbGF0ZS5odG1sL2NvbmYvd2UtcmV0 +YWlsL3NldHRpbmdzL3djbS9wb2xpY2llcy93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvdGVhc2VyL3BvbGljeV8xNTI2MDM3MjUzMjAyP2RpYWxvZz0lMkZhcHBzJTJGY29yZSUyRndjbSUyRmNv +bXBvbmVudHMlMkZ0ZWFzZXIlMkZ2MSUyRnRlYXNlciUyRmNxJTNBZGVzaWduX2RpYWxvZyZhbXA7cmVmZXJyZXI9JTJGY29udGVudCUyRndlLXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUy +RmVxdWlwbWVudCZhbXA7cG9saWN5Q29udGVudFBhdGg9JTJGY29udGVudCUyRndlLXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUyRmVxdWlwbWVudCUyRmpjciUzQWNvbnRlbnQlMkZyb290 +JTJGcmVzcG9uc2l2ZWdyaWQlMkZ0ZWFzZXJfMTM0MTk0OTU4OSZhbXA7cG9saWN5Q29udGVudFJlc291cmNlVHlwZT13ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGVhc2VyJmFtcDtw +b2xpY3lEaXJlY3RvcnlQYXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnBvbGljaWVzJTJGd2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciUyRiZh +bXA7cG9saWN5TWFwcGluZ1BhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGdGVtcGxhdGVzJTJGaGVyby1wYWdlJTJGcG9saWNpZXMlMkZqY3IlM0Fjb250ZW50JTJGcm9v +dCUyRnJlc3BvbnNpdmVncmlkJTJGd2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciZhbXA7cG9saWN5TWFwcGluZ1Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50 +cyUyRnBvbGljaWVzJTJGbWFwcGluZyZhbXA7cG9saWN5TmFtZT1wb2xpY3lfMTUyNjAzNzI1MzIwMiZhbXA7cG9saWN5UmVsYXRpdmVQYXRoPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQl +MkZ0ZWFzZXIlMkZwb2xpY3lfMTUyNjAzNzI1MzIwMiZhbXA7cmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9saWN5JTJGcG9saWN5JnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxv +Z0NsYXNzaWMmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7aGFzUG9saWN5TWFwcGluZyZxdW90 +Ozp0cnVlLCZxdW90O3R5cGUmcXVvdDs6JnF1b3Q7d2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3RlYXNlciZxdW90OywmcXVvdDtpc1Jlc3BvbnNpdmVHcmlkJnF1b3Q7OmZhbHNlLCZxdW90O3Bv +bGljeVBhdGgmcXVvdDs6JnF1b3Q7cm9vdC9yZXNwb25zaXZlZ3JpZC93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvdGVhc2VyJnF1b3Q7LCZxdW90O2NzcCZxdW90OzomcXVvdDtwYWdlfGJhc2lj +cGFnZS9yb290fHJlc3BvbnNpdmVncmlkL3Jlc3BvbnNpdmVncmlkL3RlYXNlciZxdW90OywmcXVvdDtlZGl0Q29uZmlnJnF1b3Q7OnsmcXVvdDtkcm9wVGFyZ2V0JnF1b3Q7Olt7JnF1b3Q7aWQmcXVv +dDs6JnF1b3Q7aW1hZ2UmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDsuL2ZpbGVSZWZlcmVuY2UmcXVvdDssJnF1b3Q7YWNjZXB0JnF1b3Q7OlsmcXVvdDtpbWFnZS9naWYmcXVvdDssJnF1b3Q7 +aW1hZ2UvanBlZyZxdW90OywmcXVvdDtpbWFnZS9wbmcmcXVvdDssJnF1b3Q7aW1hZ2Uvd2VicCZxdW90OywmcXVvdDtpbWFnZS90aWZmJnF1b3Q7XSwmcXVvdDtncm91cHMmcXVvdDs6WyZxdW90O21l +ZGlhJnF1b3Q7XSwmcXVvdDtwYXJhbXMmcXVvdDs6eyZxdW90Oy4vaW1hZ2VSb3RhdGUmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90Oy4vaW1hZ2VNYXAmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90Oy4v +aW1hZ2VDcm9wJnF1b3Q7OiZxdW90OyZxdW90O319XSwmcXVvdDtpbnBsYWNlRWRpdGluZ0NvbmZpZyZxdW90Ozp7JnF1b3Q7YWN0aXZlJnF1b3Q7OnRydWUsJnF1b3Q7ZWRpdG9yVHlwZSZxdW90Ozom +cXVvdDtpbWFnZSZxdW90OywmcXVvdDtjb25maWdQYXRoJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci9jcTplZGl0Q29uZmlnL2NxOmlucGxhY2VF +ZGl0aW5nL2NvbmZpZyZxdW90O319LCZxdW90O2lwZUNvbmZpZyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjb25maWcm +cXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7cGx1Z2lucyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZx +dW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVz +JnF1b3Q7OiZxdW90OyomcXVvdDssJnF1b3Q7YXNwZWN0UmF0aW9zJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3dpZGVM +YW5kc2NhcGUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtXaWRlIExhbmRzY2FwZSZxdW90 +OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDswLjYxODAmcXVvdDt9LCZxdW90O2xhbmRzY2FwZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZx +dW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O0xhbmRzY2FwZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDswLjgyODQmcXVvdDt9LCZxdW90O3NxdWFyZSZxdW90Ozp7JnF1b3Q7amNyOnBy +aW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1NxdWFyZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDsxJnF1b3Q7fSwm +cXVvdDtwb3J0cmFpdCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1BvcnRyYWl0JnF1b3Q7 +LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzEuNjE4MCZxdW90O319fSwmcXVvdDtmbGlwJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7 +LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90Oy0mcXVvdDt9LCZxdW90O21hcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVv +dDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fSwmcXVvdDtyb3RhdGUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7 +ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O30sJnF1b3Q7em9vbSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0 +dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fX0sJnF1b3Q7dWkmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7aW5saW5lJnF1 +b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3Rvb2xiYXImcXVvdDs6WyZxdW90O2Nyb3AjbGF1bmNoJnF1b3Q7LCZxdW90O3Jv +dGF0ZSNyaWdodCZxdW90OywmcXVvdDtoaXN0b3J5I3VuZG8mcXVvdDssJnF1b3Q7aGlzdG9yeSNyZWRvJnF1b3Q7LCZxdW90O2Z1bGxzY3JlZW4jZnVsbHNjcmVlbiZxdW90OywmcXVvdDtjb250cm9s +I2Nsb3NlJnF1b3Q7LCZxdW90O2NvbnRyb2wjZmluaXNoJnF1b3Q7XSwmcXVvdDtyZXBsYWNlbWVudFRvb2xiYXJzJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5z +dHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6WyZxdW90O2Nyb3AjaWRlbnRpZmllciZxdW90OywmcXVvdDtjcm9wI3VubGF1bmNoJnF1b3Q7LCZxdW90O2Nyb3AjY29uZmlybSZxdW90O119 +fSwmcXVvdDtmdWxsc2NyZWVuJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3Rvb2xiYXImcXVvdDs6eyZxdW90O2pjcjpw +cmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bGVmdCZxdW90OzpbJnF1b3Q7Y3JvcCNsYXVuY2h3aXRocmF0aW8mcXVvdDssJnF1b3Q7cm90YXRlI3JpZ2h0 +JnF1b3Q7LCZxdW90O2ZsaXAjaG9yaXpvbnRhbCZxdW90OywmcXVvdDtmbGlwI3ZlcnRpY2FsJnF1b3Q7LCZxdW90O3pvb20jcmVzZXQxMDAmcXVvdDssJnF1b3Q7em9vbSNwb3B1cHNsaWRlciZxdW90 +O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2hpc3RvcnkjdW5kbyZxdW90OywmcXVvdDtoaXN0b3J5I3JlZG8mcXVvdDssJnF1b3Q7ZnVsbHNjcmVlbiNmdWxsc2NyZWVuZXhpdCZxdW90O119LCZx +dW90O3JlcGxhY2VtZW50VG9vbGJhcnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90Ozp7JnF1b3Q7amNy +OnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtsZWZ0JnF1b3Q7OlsmcXVvdDtjcm9wI2lkZW50aWZpZXImcXVvdDtdLCZxdW90O3JpZ2h0JnF1b3Q7Olsm +cXVvdDtjcm9wI3VubGF1bmNoJnF1b3Q7LCZxdW90O2Nyb3AjY29uZmlybSZxdW90O119fX19fSwmcXVvdDtwbHVnaW5zJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6 +dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6 +JnF1b3Q7KiZxdW90OywmcXVvdDthc3BlY3RSYXRpb3MmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7d2lkZUxhbmRzY2Fw +ZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1dpZGUgTGFuZHNjYXBlJnF1b3Q7LCZxdW90 +O3JhdGlvJnF1b3Q7OiZxdW90OzAuNjE4MCZxdW90O30sJnF1b3Q7bGFuZHNjYXBlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZx +dW90O25hbWUmcXVvdDs6JnF1b3Q7TGFuZHNjYXBlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzAuODI4NCZxdW90O30sJnF1b3Q7c3F1YXJlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5 +cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7U3F1YXJlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzEmcXVvdDt9LCZxdW90O3Bv +cnRyYWl0JnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7UG9ydHJhaXQmcXVvdDssJnF1b3Q7 +cmF0aW8mcXVvdDs6JnF1b3Q7MS42MTgwJnF1b3Q7fX19LCZxdW90O2ZsaXAmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7 +ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7LSZxdW90O30sJnF1b3Q7bWFwJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1 +cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9LCZxdW90O3JvdGF0ZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJl +cyZxdW90OzomcXVvdDsqJnF1b3Q7fSwmcXVvdDt6b29tJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1 +b3Q7OiZxdW90OyomcXVvdDt9fSwmcXVvdDt1aSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtpbmxpbmUmcXVvdDs6eyZx +dW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dG9vbGJhciZxdW90OzpbJnF1b3Q7Y3JvcCNsYXVuY2gmcXVvdDssJnF1b3Q7cm90YXRlI3Jp +Z2h0JnF1b3Q7LCZxdW90O2hpc3RvcnkjdW5kbyZxdW90OywmcXVvdDtoaXN0b3J5I3JlZG8mcXVvdDssJnF1b3Q7ZnVsbHNjcmVlbiNmdWxsc2NyZWVuJnF1b3Q7LCZxdW90O2NvbnRyb2wjY2xvc2Um +cXVvdDssJnF1b3Q7Y29udHJvbCNmaW5pc2gmcXVvdDtdLCZxdW90O3JlcGxhY2VtZW50VG9vbGJhcnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVy +ZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90OzpbJnF1b3Q7Y3JvcCNpZGVudGlmaWVyJnF1b3Q7LCZxdW90O2Nyb3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19LCZxdW90 +O2Z1bGxzY3JlZW4mcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dG9vbGJhciZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlU +eXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtsZWZ0JnF1b3Q7OlsmcXVvdDtjcm9wI2xhdW5jaHdpdGhyYXRpbyZxdW90OywmcXVvdDtyb3RhdGUjcmlnaHQmcXVvdDss +JnF1b3Q7ZmxpcCNob3Jpem9udGFsJnF1b3Q7LCZxdW90O2ZsaXAjdmVydGljYWwmcXVvdDssJnF1b3Q7em9vbSNyZXNldDEwMCZxdW90OywmcXVvdDt6b29tI3BvcHVwc2xpZGVyJnF1b3Q7XSwmcXVv +dDtyaWdodCZxdW90OzpbJnF1b3Q7aGlzdG9yeSN1bmRvJnF1b3Q7LCZxdW90O2hpc3RvcnkjcmVkbyZxdW90OywmcXVvdDtmdWxsc2NyZWVuI2Z1bGxzY3JlZW5leGl0JnF1b3Q7XX0sJnF1b3Q7cmVw +bGFjZW1lbnRUb29sYmFycyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFy +eVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2xlZnQmcXVvdDs6WyZxdW90O2Nyb3AjaWRlbnRpZmllciZxdW90O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2Ny +b3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19fX19LCZxdW90O3Jlc3BvbnNpdmUmcXVvdDs6eyZxdW90O2RlZmF1bHQmcXVvdDs6eyZxdW90O29mZnNldCZxdW90Ozom +cXVvdDswJnF1b3Q7LCZxdW90O3dpZHRoJnF1b3Q7OiZxdW90OzQmcXVvdDssJnF1b3Q7YmVoYXZpb3ImcXVvdDs6bnVsbH19fSI+PC9jcT4KPC9kaXY+CjxkaXYgY2xhc3M9InRlYXNlciB3ZS1UZWFz +ZXIgYWVtLUdyaWRDb2x1bW4tLWRlZmF1bHQtLW5vbmUgYWVtLUdyaWRDb2x1bW4gYWVtLUdyaWRDb2x1bW4tLW9mZnNldC0tZGVmYXVsdC0tMCBhZW0tR3JpZENvbHVtbi0tZGVmYXVsdC0tNCI+Cjxk +aXYgY2xhc3M9ImNtcC10ZWFzZXIgY3EtZGQtaW1hZ2UiPgogICAgCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19pbWFnZSI+CjxkaXYgZGF0YS1jbXAtc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8u +Li8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9mcmVlcmlkZS1zdGVlcC5qcGciIGRhdGEtYXNzZXQtaWQ9IjEwNzgwM2NhLTdjMWUtNDkwZS1hZmRjLWRmYzBiZGE5MmJmZiIgZGF0YS10aXRsZT0i +RnJlZXJpZGUgU3RlZXAiIGNsYXNzPSJjbXAtaW1hZ2UgY3EtZGQtaW1hZ2UiIGl0ZW1zY29wZT0iIiBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvSW1hZ2VPYmplY3QiPgogICAgCiAgICAgICAg +CiAgICAgICAgICAgIAogICAgICAgICAgICA8aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvZnJlZXJpZGUtc3RlZXAuanBlZyIgY2xhc3M9ImNtcC1pbWFnZV9faW1hZ2UiIGl0ZW1wcm9wPSJjb250 +ZW50VXJsIiBkYXRhLWNtcC1ob29rLWltYWdlPSJpbWFnZSIgYWx0PSJTdGVlcCBza2lpbmcgYWJvdmUgdmFsbGV5IiB0aXRsZT0iRnJlZXJpZGUgU3RlZXAiPgogICAgICAgICAgICAKICAgICAgICAK +ICAgIAogICAgCiAgICA8bWV0YSBpdGVtcHJvcD0iY2FwdGlvbiIgY29udGVudD0iRnJlZXJpZGUgU3RlZXAiPgo8L2Rpdj4KCiAgICAKPCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJjb3Jl +L3djbS9jb21wb25lbnRzL2ltYWdlL3YyL2ltYWdlIiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBt +ZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzEzOTgwNDI3MDgvbm9fcmVzb3VyY2VfMCIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy9jb3Jl +L3djbS9jb21wb25lbnRzL2ltYWdlL3YyL2ltYWdlL2ltYWdlLmh0bWwiLCJ0b3RhbFRpbWUiOjAsInNlbGZUaW1lIjowfS0tPgo8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19jb250 +ZW50Ij4KICAgICAgICAKICAgIAoKICAgICAgICAKICAgIAoKICAgICAgICAKICAgIDxkaXYgY2xhc3M9ImNtcC10ZWFzZXJfX2FjdGlvbi1jb250YWluZXIiPgogICAgICAgIAogICAgPGEgY2xhc3M9 +ImNtcC10ZWFzZXJfX2FjdGlvbi1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0 +cy9lcXVpcG1lbnQvc25vdy1zcG9ydHMuaHRtbCI+U25vdyBTcG9ydHM8L2E+CgogICAgPC9kaXY+CgogICAgPC9kaXY+CjwvZGl2PgoKICAgIAoKPCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUi +OiJ3ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvdGVhc2VyIiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4v +ZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzEzOTgwNDI3MDgiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3JpcHQgL2FwcHMvY29yZS93Y20vY29t +cG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL3RlYXNlci5odG1sIiwidG90YWxUaW1lIjoyLCJzZWxmVGltZSI6Mn0tLT4KPGNxIGRhdGEtcGF0aD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4v +Y29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXJfMTM5ODA0MjcwOCIgZGF0YS1jb25maWc9Insm +cXVvdDtwYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RlYXNlcl8xMzk4 +MDQyNzA4JnF1b3Q7LCZxdW90O3NsaW5nUGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25z +aXZlZ3JpZC90ZWFzZXJfMTM5ODA0MjcwOC5odG1sJnF1b3Q7LCZxdW90O2RpYWxvZyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvY3E6ZGlhbG9n +JnF1b3Q7LCZxdW90O2RpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nU3JjJnF1 +b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvX2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3Rl +cnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzEzOTgwNDI3MDgmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUv +d2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci9jcTpkZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xheW91dCZxdW90OzomcXVvdDtmdWxsc2NyZWVuJnF1b3Q7LCZxdW90 +O2Rlc2lnbkRpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvYXBwcy9jb3JlL3djbS9jb21w +b25lbnRzL3RlYXNlci92MS90ZWFzZXIvX2NxX2Rlc2lnbl9kaWFsb2cucG9saWN5ZGVzaWduLmVkaXRhYmxldGVtcGxhdGUuaHRtbC9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vcG9saWNpZXMv +d2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3RlYXNlci9wb2xpY3lfMTUyNjAzNzI1MzIwMj9kaWFsb2c9JTJGYXBwcyUyRmNvcmUlMkZ3Y20lMkZjb21wb25lbnRzJTJGdGVhc2VyJTJGdjElMkZ0 +ZWFzZXIlMkZjcSUzQWRlc2lnbl9kaWFsb2cmYW1wO3JlZmVycmVyPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQmYW1wO3BvbGljeUNvbnRl +bnRQYXRoPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnJlc3BvbnNpdmVncmlkJTJGdGVhc2Vy +XzEzOTgwNDI3MDgmYW1wO3BvbGljeUNvbnRlbnRSZXNvdXJjZVR5cGU9d2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciZhbXA7cG9saWN5RGlyZWN0b3J5UGF0aD0lMkZjb25m +JTJGd2UtcmV0YWlsJTJGc2V0dGluZ3MlMkZ3Y20lMkZwb2xpY2llcyUyRndlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0ZWFzZXIlMkYmYW1wO3BvbGljeU1hcHBpbmdQYXRoPSUyRmNv +bmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnRlbXBsYXRlcyUyRmhlcm8tcGFnZSUyRnBvbGljaWVzJTJGamNyJTNBY29udGVudCUyRnJvb3QlMkZyZXNwb25zaXZlZ3JpZCUyRndlcmV0 +YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0ZWFzZXImYW1wO3BvbGljeU1hcHBpbmdSZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY2llcyUyRm1hcHBpbmcmYW1w +O3BvbGljeU5hbWU9cG9saWN5XzE1MjYwMzcyNTMyMDImYW1wO3BvbGljeVJlbGF0aXZlUGF0aD13ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGVhc2VyJTJGcG9saWN5XzE1MjYwMzcy +NTMyMDImYW1wO3Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGljeSUyRnBvbGljeSZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dDbGFzc2ljJnF1b3Q7OiZxdW90Oy9hcHBz +L2NvcmUvd2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNlci9jcTpkZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O2hhc1BvbGljeU1hcHBpbmcmcXVvdDs6dHJ1ZSwmcXVvdDt0eXBlJnF1b3Q7OiZx +dW90O3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90ZWFzZXImcXVvdDssJnF1b3Q7aXNSZXNwb25zaXZlR3JpZCZxdW90OzpmYWxzZSwmcXVvdDtwb2xpY3lQYXRoJnF1b3Q7OiZxdW90O3Jvb3Qv +cmVzcG9uc2l2ZWdyaWQvd2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3RlYXNlciZxdW90OywmcXVvdDtjc3AmcXVvdDs6JnF1b3Q7cGFnZXxiYXNpY3BhZ2Uvcm9vdHxyZXNwb25zaXZlZ3JpZC9y +ZXNwb25zaXZlZ3JpZC90ZWFzZXImcXVvdDssJnF1b3Q7ZWRpdENvbmZpZyZxdW90Ozp7JnF1b3Q7ZHJvcFRhcmdldCZxdW90OzpbeyZxdW90O2lkJnF1b3Q7OiZxdW90O2ltYWdlJnF1b3Q7LCZxdW90 +O25hbWUmcXVvdDs6JnF1b3Q7Li9maWxlUmVmZXJlbmNlJnF1b3Q7LCZxdW90O2FjY2VwdCZxdW90OzpbJnF1b3Q7aW1hZ2UvZ2lmJnF1b3Q7LCZxdW90O2ltYWdlL2pwZWcmcXVvdDssJnF1b3Q7aW1h +Z2UvcG5nJnF1b3Q7LCZxdW90O2ltYWdlL3dlYnAmcXVvdDssJnF1b3Q7aW1hZ2UvdGlmZiZxdW90O10sJnF1b3Q7Z3JvdXBzJnF1b3Q7OlsmcXVvdDttZWRpYSZxdW90O10sJnF1b3Q7cGFyYW1zJnF1 +b3Q7OnsmcXVvdDsuL2ltYWdlUm90YXRlJnF1b3Q7OiZxdW90OyZxdW90OywmcXVvdDsuL2ltYWdlTWFwJnF1b3Q7OiZxdW90OyZxdW90OywmcXVvdDsuL2ltYWdlQ3JvcCZxdW90OzomcXVvdDsmcXVv +dDt9fV0sJnF1b3Q7aW5wbGFjZUVkaXRpbmdDb25maWcmcXVvdDs6eyZxdW90O2FjdGl2ZSZxdW90Ozp0cnVlLCZxdW90O2VkaXRvclR5cGUmcXVvdDs6JnF1b3Q7aW1hZ2UmcXVvdDssJnF1b3Q7Y29u +ZmlnUGF0aCZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvY3E6ZWRpdENvbmZpZy9jcTppbnBsYWNlRWRpdGluZy9jb25maWcmcXVvdDt9fSwmcXVv +dDtpcGVDb25maWcmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y29uZmlnJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5 +cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3BsdWdpbnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDss +JnF1b3Q7Y3JvcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7LCZxdW90 +O2FzcGVjdFJhdGlvcyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDt3aWRlTGFuZHNjYXBlJnF1b3Q7OnsmcXVvdDtqY3I6 +cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7V2lkZSBMYW5kc2NhcGUmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7 +MC42MTgwJnF1b3Q7fSwmcXVvdDtsYW5kc2NhcGUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVv +dDtMYW5kc2NhcGUmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MC44Mjg0JnF1b3Q7fSwmcXVvdDtzcXVhcmUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1 +bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtTcXVhcmUmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MSZxdW90O30sJnF1b3Q7cG9ydHJhaXQmcXVvdDs6eyZxdW90 +O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtQb3J0cmFpdCZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDsx +LjYxODAmcXVvdDt9fX0sJnF1b3Q7ZmxpcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVv +dDstJnF1b3Q7fSwmcXVvdDttYXAmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZx +dW90O30sJnF1b3Q7cm90YXRlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVv +dDt9LCZxdW90O3pvb20mcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O319 +LCZxdW90O3VpJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2lubGluZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBl +JnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDt0b29sYmFyJnF1b3Q7OlsmcXVvdDtjcm9wI2xhdW5jaCZxdW90OywmcXVvdDtyb3RhdGUjcmlnaHQmcXVvdDssJnF1b3Q7aGlz +dG9yeSN1bmRvJnF1b3Q7LCZxdW90O2hpc3RvcnkjcmVkbyZxdW90OywmcXVvdDtmdWxsc2NyZWVuI2Z1bGxzY3JlZW4mcXVvdDssJnF1b3Q7Y29udHJvbCNjbG9zZSZxdW90OywmcXVvdDtjb250cm9s +I2ZpbmlzaCZxdW90O10sJnF1b3Q7cmVwbGFjZW1lbnRUb29sYmFycyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9w +JnF1b3Q7OlsmcXVvdDtjcm9wI2lkZW50aWZpZXImcXVvdDssJnF1b3Q7Y3JvcCN1bmxhdW5jaCZxdW90OywmcXVvdDtjcm9wI2NvbmZpcm0mcXVvdDtdfX0sJnF1b3Q7ZnVsbHNjcmVlbiZxdW90Ozp7 +JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDt0b29sYmFyJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6 +dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2xlZnQmcXVvdDs6WyZxdW90O2Nyb3AjbGF1bmNod2l0aHJhdGlvJnF1b3Q7LCZxdW90O3JvdGF0ZSNyaWdodCZxdW90OywmcXVvdDtmbGlwI2hvcml6b250 +YWwmcXVvdDssJnF1b3Q7ZmxpcCN2ZXJ0aWNhbCZxdW90OywmcXVvdDt6b29tI3Jlc2V0MTAwJnF1b3Q7LCZxdW90O3pvb20jcG9wdXBzbGlkZXImcXVvdDtdLCZxdW90O3JpZ2h0JnF1b3Q7OlsmcXVv +dDtoaXN0b3J5I3VuZG8mcXVvdDssJnF1b3Q7aGlzdG9yeSNyZWRvJnF1b3Q7LCZxdW90O2Z1bGxzY3JlZW4jZnVsbHNjcmVlbmV4aXQmcXVvdDtdfSwmcXVvdDtyZXBsYWNlbWVudFRvb2xiYXJzJnF1 +b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtu +dDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bGVmdCZxdW90OzpbJnF1b3Q7Y3JvcCNpZGVudGlmaWVyJnF1b3Q7XSwmcXVvdDtyaWdodCZxdW90OzpbJnF1b3Q7Y3JvcCN1bmxhdW5jaCZxdW90Oywm +cXVvdDtjcm9wI2NvbmZpcm0mcXVvdDtdfX19fX0sJnF1b3Q7cGx1Z2lucyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtj +cm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDssJnF1b3Q7YXNwZWN0 +UmF0aW9zJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3dpZGVMYW5kc2NhcGUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5 +VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtXaWRlIExhbmRzY2FwZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDswLjYxODAm +cXVvdDt9LCZxdW90O2xhbmRzY2FwZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O0xhbmRz +Y2FwZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDswLjgyODQmcXVvdDt9LCZxdW90O3NxdWFyZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0 +dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1NxdWFyZSZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDsxJnF1b3Q7fSwmcXVvdDtwb3J0cmFpdCZxdW90Ozp7JnF1b3Q7amNyOnBy +aW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1BvcnRyYWl0JnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzEuNjE4MCZx +dW90O319fSwmcXVvdDtmbGlwJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90Oy0mcXVv +dDt9LCZxdW90O21hcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fSwm +cXVvdDtyb3RhdGUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O30sJnF1 +b3Q7em9vbSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fX0sJnF1b3Q7 +dWkmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7aW5saW5lJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6 +JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3Rvb2xiYXImcXVvdDs6WyZxdW90O2Nyb3AjbGF1bmNoJnF1b3Q7LCZxdW90O3JvdGF0ZSNyaWdodCZxdW90OywmcXVvdDtoaXN0b3J5I3Vu +ZG8mcXVvdDssJnF1b3Q7aGlzdG9yeSNyZWRvJnF1b3Q7LCZxdW90O2Z1bGxzY3JlZW4jZnVsbHNjcmVlbiZxdW90OywmcXVvdDtjb250cm9sI2Nsb3NlJnF1b3Q7LCZxdW90O2NvbnRyb2wjZmluaXNo +JnF1b3Q7XSwmcXVvdDtyZXBsYWNlbWVudFRvb2xiYXJzJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6 +WyZxdW90O2Nyb3AjaWRlbnRpZmllciZxdW90OywmcXVvdDtjcm9wI3VubGF1bmNoJnF1b3Q7LCZxdW90O2Nyb3AjY29uZmlybSZxdW90O119fSwmcXVvdDtmdWxsc2NyZWVuJnF1b3Q7OnsmcXVvdDtq +Y3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3Rvb2xiYXImcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVj +dHVyZWQmcXVvdDssJnF1b3Q7bGVmdCZxdW90OzpbJnF1b3Q7Y3JvcCNsYXVuY2h3aXRocmF0aW8mcXVvdDssJnF1b3Q7cm90YXRlI3JpZ2h0JnF1b3Q7LCZxdW90O2ZsaXAjaG9yaXpvbnRhbCZxdW90 +OywmcXVvdDtmbGlwI3ZlcnRpY2FsJnF1b3Q7LCZxdW90O3pvb20jcmVzZXQxMDAmcXVvdDssJnF1b3Q7em9vbSNwb3B1cHNsaWRlciZxdW90O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2hpc3Rv +cnkjdW5kbyZxdW90OywmcXVvdDtoaXN0b3J5I3JlZG8mcXVvdDssJnF1b3Q7ZnVsbHNjcmVlbiNmdWxsc2NyZWVuZXhpdCZxdW90O119LCZxdW90O3JlcGxhY2VtZW50VG9vbGJhcnMmcXVvdDs6eyZx +dW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3Ry +dWN0dXJlZCZxdW90OywmcXVvdDtsZWZ0JnF1b3Q7OlsmcXVvdDtjcm9wI2lkZW50aWZpZXImcXVvdDtdLCZxdW90O3JpZ2h0JnF1b3Q7OlsmcXVvdDtjcm9wI3VubGF1bmNoJnF1b3Q7LCZxdW90O2Ny +b3AjY29uZmlybSZxdW90O119fX19fSwmcXVvdDtyZXNwb25zaXZlJnF1b3Q7OnsmcXVvdDtkZWZhdWx0JnF1b3Q7OnsmcXVvdDtvZmZzZXQmcXVvdDs6JnF1b3Q7MCZxdW90OywmcXVvdDt3aWR0aCZx +dW90OzomcXVvdDs0JnF1b3Q7LCZxdW90O2JlaGF2aW9yJnF1b3Q7Om51bGx9fX0iPjwvY3E+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJ0aXRsZSBhZW0tR3JpZENvbHVtbiBhZW0tR3JpZENvbHVtbi0tZGVm +YXVsdC0tMTIiPgo8ZGl2IGNsYXNzPSJjbXAtdGl0bGUiPgogICAgPGgyIGNsYXNzPSJjbXAtdGl0bGVfX3RleHQiPkZlYXR1cmVkIHByb2R1Y3RzICg4OjE3IEFNKTwvaDI+CjwvZGl2PgoKICAgIAoK +PCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJ3ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvdGl0bGUiLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93 +ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90aXRsZV8yMTEyMzEzNzE3Iiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0 +IjoiU2NyaXB0IC9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGl0bGUvdjIvdGl0bGUvdGl0bGUuaHRtbCIsInRvdGFsVGltZSI6MSwic2VsZlRpbWUiOjF9LS0+CjxjcSBkYXRhLXBhdGg9Ii4uLy4u +Ly4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGl0bGVfMjEx +MjMxMzcxNyIgZGF0YS1jb25maWc9InsmcXVvdDtwYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jl +c3BvbnNpdmVncmlkL3RpdGxlXzIxMTIzMTM3MTcmcXVvdDssJnF1b3Q7c2xpbmdQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9q +Y3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RpdGxlXzIxMTIzMTM3MTcuaHRtbCZxdW90OywmcXVvdDtkaWFsb2cmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90aXRs +ZS92Mi90aXRsZS9jcTpkaWFsb2cmcXVvdDssJnF1b3Q7ZGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7YXV0byZxdW90 +OywmcXVvdDtkaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGl0bGUvdjIvdGl0bGUvX2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0 +YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGl0bGVfMjExMjMxMzcxNyZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2cmcXVvdDs6 +JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90aXRsZS92Mi90aXRsZS9jcTpkZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xheW91dCZxdW90OzomcXVvdDtmdWxsc2Ny +ZWVuJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvYXBw +cy9jb3JlL3djbS9jb21wb25lbnRzL3RpdGxlL3YyL3RpdGxlL19jcV9kZXNpZ25fZGlhbG9nLnBvbGljeWRlc2lnbi5lZGl0YWJsZXRlbXBsYXRlLmh0bWwvY29uZi93ZS1yZXRhaWwvc2V0dGluZ3Mv +d2NtL3BvbGljaWVzL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90aXRsZS93ZS1yZXRhaWwtaGVyby1wYWdlP2RpYWxvZz0lMkZhcHBzJTJGY29yZSUyRndjbSUyRmNvbXBvbmVudHMlMkZ0aXRs +ZSUyRnYyJTJGdGl0bGUlMkZjcSUzQWRlc2lnbl9kaWFsb2cmYW1wO3JlZmVycmVyPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQmYW1wO3Bv +bGljeUNvbnRlbnRQYXRoPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnJlc3BvbnNpdmVncmlk +JTJGdGl0bGVfMjExMjMxMzcxNyZhbXA7cG9saWN5Q29udGVudFJlc291cmNlVHlwZT13ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGl0bGUmYW1wO3BvbGljeURpcmVjdG9yeVBhdGg9 +JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGcG9saWNpZXMlMkZ3ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGl0bGUlMkYmYW1wO3BvbGljeU1hcHBpbmdQYXRo +PSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnRlbXBsYXRlcyUyRmhlcm8tcGFnZSUyRnBvbGljaWVzJTJGamNyJTNBY29udGVudCUyRnJvb3QlMkZyZXNwb25zaXZlZ3JpZCUy +RndlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0aXRsZSZhbXA7cG9saWN5TWFwcGluZ1Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGljaWVzJTJGbWFwcGlu +ZyZhbXA7cG9saWN5TmFtZT13ZS1yZXRhaWwtaGVyby1wYWdlJmFtcDtwb2xpY3lSZWxhdGl2ZVBhdGg9d2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRpdGxlJTJGd2UtcmV0YWlsLWhl +cm8tcGFnZSZhbXA7cmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9saWN5JTJGcG9saWN5JnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0NsYXNzaWMmcXVvdDs6JnF1b3Q7L2Fw +cHMvY29yZS93Y20vY29tcG9uZW50cy90aXRsZS92Mi90aXRsZS9jcTpkZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O2hhc1BvbGljeU1hcHBpbmcmcXVvdDs6dHJ1ZSwmcXVvdDt0eXBlJnF1b3Q7OiZx +dW90O3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90aXRsZSZxdW90OywmcXVvdDtpc1Jlc3BvbnNpdmVHcmlkJnF1b3Q7OmZhbHNlLCZxdW90O3BvbGljeVBhdGgmcXVvdDs6JnF1b3Q7cm9vdC9y +ZXNwb25zaXZlZ3JpZC93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvdGl0bGUmcXVvdDssJnF1b3Q7Y3NwJnF1b3Q7OiZxdW90O3BhZ2V8YmFzaWNwYWdlL3Jvb3R8cmVzcG9uc2l2ZWdyaWQvcmVz +cG9uc2l2ZWdyaWQvdGl0bGUmcXVvdDssJnF1b3Q7ZWRpdENvbmZpZyZxdW90Ozp7JnF1b3Q7aW5wbGFjZUVkaXRpbmdDb25maWcmcXVvdDs6eyZxdW90O2FjdGl2ZSZxdW90Ozp0cnVlLCZxdW90O2Vk +aXRvclR5cGUmcXVvdDs6JnF1b3Q7dGl0bGUmcXVvdDssJnF1b3Q7Y29uZmlnUGF0aCZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RpdGxlL3YyL3RpdGxlL2NxOmVkaXRDb25m +aWcvY3E6aW5wbGFjZUVkaXRpbmcvY29uZmlnJnF1b3Q7fX0sJnF1b3Q7aXBlQ29uZmlnJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7 +LCZxdW90O3RpdGxlVGFnJnF1b3Q7OlsmcXVvdDtoMSZxdW90OywmcXVvdDtoMiZxdW90OywmcXVvdDtoMyZxdW90OywmcXVvdDtoNCZxdW90OywmcXVvdDtoNSZxdW90OywmcXVvdDtoNiZxdW90O10s +JnF1b3Q7Y29uZmlnJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O3RpdGxlVGFnJnF1b3Q7OlsmcXVvdDtoMSZxdW90Oywm +cXVvdDtoMiZxdW90OywmcXVvdDtoMyZxdW90OywmcXVvdDtoNCZxdW90OywmcXVvdDtoNSZxdW90OywmcXVvdDtoNiZxdW90O119fX0iPjwvY3E+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJ3ZS1wcm9kdWN0 +Z3JpZCBhZW0tR3JpZENvbHVtbiBhZW0tR3JpZENvbHVtbi0tZGVmYXVsdC0tMTIiPgo8ZGl2IGNsYXNzPSJ3ZS1wcm9kdWN0LWdyaWQtY29udGFpbmVyIj4KICAgIDx1bCBjbGFzcz0iZm91bmRhdGlv +bi1vcmRlcmVkLWxpc3QtY29udGFpbmVyIj4KICAgICAgICAKPGxpIGNsYXNzPSJmb3VuZGF0aW9uLWxpc3QtaXRlbSI+CiAgICA8d2UtcHJvZHVjdC1pdGVtIHByaWNlPSIkMTEwLjAwIiBzaXplPSIx +MSwxMiw3LDgsOSwxMCIgaW5saW5lLXRlbXBsYXRlPSIiPgogICAgICAgIDxkaXYgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtUHJvZHVjdHNH +cmlkLWl0ZW0taW1hZ2UgaW1nLWNlbnRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjcS1pbWFnZS1qc3AtL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMv +ZXF1aXBtZW50L2Jpa2luZy9tYXJpbi1tb3VudGFpbi1iaWtlLXNob2VzL2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSI+PGltZyBzcmM9Ii4vRXF1aXBtZW50X2ZpbGVzL2NxX2NrXzE0NzM2 +ODA4ODQyNTYuanBnIiBhbHQ9Ik1hcmluIiB0aXRsZT0iTWFyaW4iIGNsYXNzPSJjcS1kZC1pbWFnZSI+PC9kaXY+CgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgKGZ1bmN0aW9u +KCkgewogICAgICAgIHZhciBpbWFnZURpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjcVx1MDAyRGltYWdlXHUwMDJEanNwXHUwMDJEXC9jb250ZW50XC93ZVx1MDAyRHJldGFpbFwvbGFuZ3Vh +Z2VcdTAwMkRtYXN0ZXJzXC9lblwvcHJvZHVjdHNcL2VxdWlwbWVudFwvYmlraW5nXC9tYXJpblx1MDAyRG1vdW50YWluXHUwMDJEYmlrZVx1MDAyRHNob2VzXC9qY3I6Y29udGVudFwvcm9vdFwvcHJv +ZHVjdFwvaW1hZ2UiKTsKICAgICAgICB2YXIgaW1hZ2VFdmFycyA9ICd7IGltYWdlTGluazogIiIsIGltYWdlQXNzZXQ6ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291 +cmNlcy9NYXJpbi5qcGciLCBpbWFnZVRpdGxlOiAiTWFyaW4iIH0nOwogICAgICAgIHZhciB0YWdOb2RlcyA9IGltYWdlRGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdBJyk7CiAgICAgICAgZm9yICh2 +YXIgaSA9IDA7IGkgPCB0YWdOb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgbGluayA9IHRhZ05vZGVzLml0ZW0oaSk7IAogICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnb25j +bGljaycsICdDUV9BbmFseXRpY3MucmVjb3JkKHtldmVudDogImltYWdlQ2xpY2siLCB2YWx1ZXM6ICcgKyBpbWFnZUV2YXJzICsgJywgY29sbGVjdDogZmFsc2UsIG9wdGlvbnM6IHsgb2JqOiB0aGlz +IH0sIGNvbXBvbmVudFBhdGg6ICJjb21tZXJjZVwvY29tcG9uZW50c1wvcHJvZHVjdFwvaW1hZ2UifSknKTsKICAgICAgICB9CiAgICAgICAgCiAgICB9KSgpOwo8L3NjcmlwdD4KCjwhLS1jcXsiZGVj +b3JhdGVkIjp0cnVlLCJ0eXBlIjoiY29tbWVyY2UvY29tcG9uZW50cy9wcm9kdWN0L2ltYWdlIiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvcmVzb3VyY2VzL2lt +YWdlLmpzcCIsInRvdGFsVGltZSI6MSwic2VsZlRpbWUiOjF9LS0+CjxjcSBkYXRhLXBhdGg9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1h +c3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2Jpa2luZy9tYXJpbi1tb3VudGFpbi1iaWtlLXNob2VzL2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSIgZGF0YS1jb25maWc9InsmcXVvdDtw +YXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9iaWtpbmcvbWFyaW4tbW91bnRhaW4tYmlrZS1zaG9lcy9qY3I6Y29u +dGVudC9yb290L3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7c2xpbmdQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVu +dC9iaWtpbmcvbWFyaW4tbW91bnRhaW4tYmlrZS1zaG9lcy9qY3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1hZ2UuaHRtbCZxdW90OywmcXVvdDtkaWFsb2cmcXVvdDs6JnF1b3Q7L2xpYnMvZm91bmRh +dGlvbi9jb21wb25lbnRzL2ltYWdlL2NxOmRpYWxvZyZxdW90OywmcXVvdDtkaWFsb2dMb2FkaW5nTW9kZSZxdW90OzomcXVvdDthdXRvJnF1b3Q7LCZxdW90O2RpYWxvZ0xheW91dCZxdW90OzomcXVv +dDthdXRvJnF1b3Q7LCZxdW90O2RpYWxvZ1NyYyZxdW90OzomcXVvdDsvbW50L292ZXJyaWRlL2xpYnMvZm91bmRhdGlvbi9jb21wb25lbnRzL2ltYWdlL19jcV9kaWFsb2cuaHRtbC9jb250ZW50L3dl +LXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9iaWtpbmcvbWFyaW4tbW91bnRhaW4tYmlrZS1zaG9lcy9qY3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1hZ2UmcXVv +dDssJnF1b3Q7ZGlhbG9nQ2xhc3NpYyZxdW90OzomcXVvdDsvbGlicy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW1hZ2UvZGlhbG9nJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZyZxdW90OzomcXVvdDsv +bGlicy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW1hZ2UvY3E6ZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7ZnVsbHNjcmVlbiZxdW90OywmcXVv +dDtkZXNpZ25EaWFsb2dMb2FkaW5nTW9kZSZxdW90OzomcXVvdDthdXRvJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ1NyYyZxdW90OzomcXVvdDsvbW50L292ZXJyaWRlL2xpYnMvZm91bmRhdGlvbi9j +b21wb25lbnRzL2ltYWdlL19jcV9kZXNpZ25fZGlhbG9nLnBvbGljeWRlc2lnbi5lZGl0YWJsZXRlbXBsYXRlLmh0bWwvY29uZi93ZS1yZXRhaWwvc2V0dGluZ3Mvd2NtL3BvbGljaWVzL2NvbW1lcmNl +L2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZS9wb2xpY3lfMTY0NzMwNTY2MTgxODIxMzMwP2RpYWxvZz0lMkZsaWJzJTJGZm91bmRhdGlvbiUyRmNvbXBvbmVudHMlMkZpbWFnZSUyRmNxJTNBZGVzaWdu +X2RpYWxvZyZhbXA7cmVmZXJyZXI9JTJGY29udGVudCUyRndlLXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUyRmVxdWlwbWVudCZhbXA7cG9saWN5Q29udGVudFBhdGg9JTJGY29udGVudCUy +RndlLXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUyRnByb2R1Y3RzJTJGZXF1aXBtZW50JTJGYmlraW5nJTJGbWFyaW4tbW91bnRhaW4tYmlrZS1zaG9lcyUyRmpjciUzQWNvbnRlbnQlMkZy +b290JTJGcHJvZHVjdCUyRmltYWdlJmFtcDtwb2xpY3lDb250ZW50UmVzb3VyY2VUeXBlPWNvbW1lcmNlJTJGY29tcG9uZW50cyUyRnByb2R1Y3QlMkZpbWFnZSZhbXA7cG9saWN5RGlyZWN0b3J5UGF0 +aD0lMkZjb25mJTJGd2UtcmV0YWlsJTJGc2V0dGluZ3MlMkZ3Y20lMkZwb2xpY2llcyUyRmNvbW1lcmNlJTJGY29tcG9uZW50cyUyRnByb2R1Y3QlMkZpbWFnZSUyRiZhbXA7cG9saWN5TWFwcGluZ1Bh +dGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGdGVtcGxhdGVzJTJGcHJvZHVjdC1wYWdlJTJGcG9saWNpZXMlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnByb2R1Y3QlMkZj +b21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2UmYW1wO3BvbGljeU1hcHBpbmdSZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY2llcyUyRm1hcHBpbmcm +YW1wO3BvbGljeU5hbWU9cG9saWN5XzE2NDczMDU2NjE4MTgyMTMzMCZhbXA7cG9saWN5UmVsYXRpdmVQYXRoPWNvbW1lcmNlJTJGY29tcG9uZW50cyUyRnByb2R1Y3QlMkZpbWFnZSUyRnBvbGljeV8x +NjQ3MzA1NjYxODE4MjEzMzAmYW1wO3Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGljeSUyRnBvbGljeSZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dDbGFzc2ljJnF1b3Q7 +OiZxdW90Oy9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9kZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O3R5cGUmcXVvdDs6JnF1b3Q7Y29tbWVyY2UvY29tcG9uZW50cy9wcm9kdWN0L2lt +YWdlJnF1b3Q7LCZxdW90O2lzUmVzcG9uc2l2ZUdyaWQmcXVvdDs6ZmFsc2UsJnF1b3Q7cG9saWN5UGF0aCZxdW90OzomcXVvdDtyb290L3Byb2R1Y3QvY29tbWVyY2UvY29tcG9uZW50cy9wcm9kdWN0 +L2ltYWdlJnF1b3Q7LCZxdW90O2NzcCZxdW90OzomcXVvdDtwYWdlfGJhc2ljcGFnZS9yb290fHJlc3BvbnNpdmVncmlkL3Jlc3BvbnNpdmVncmlkL3Byb2R1Y3RncmlkfGxpc3QvaXRlbS9pbWFnZXxw +YXJiYXNlJnF1b3Q7LCZxdW90O2VkaXRDb25maWcmcXVvdDs6eyZxdW90O2Ryb3BUYXJnZXQmcXVvdDs6W3smcXVvdDtpZCZxdW90OzomcXVvdDtpbWFnZSZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZx +dW90Oy4vZmlsZVJlZmVyZW5jZSZxdW90OywmcXVvdDthY2NlcHQmcXVvdDs6WyZxdW90O2ltYWdlLy4qJnF1b3Q7XSwmcXVvdDtncm91cHMmcXVvdDs6WyZxdW90O21lZGlhJnF1b3Q7XSwmcXVvdDtw +YXJhbXMmcXVvdDs6eyZxdW90Oy4vaW1hZ2VSb3RhdGUmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90Oy4vaW1hZ2VNYXAmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90Oy4vc2xpbmc6cmVzb3VyY2VUeXBl +JnF1b3Q7OiZxdW90O2NvbW1lcmNlL2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDsuL2ltYWdlQ3JvcCZxdW90OzomcXVvdDsmcXVvdDt9fV0sJnF1b3Q7bGlzdGVuZXJzJnF1b3Q7 +OnsmcXVvdDthZnRlcmVkaXQmcXVvdDs6JnF1b3Q7UkVGUkVTSF9QQUdFJnF1b3Q7fSwmcXVvdDthY3Rpb25zJnF1b3Q7OlsmcXVvdDtDUS53Y20uRWRpdEJhc2UuRURJVEFOTk9UQVRFJnF1b3Q7LHsm +cXVvdDt4dHlwZSZxdW90OzomcXVvdDt0YnNlcGFyYXRvciZxdW90O30sJnF1b3Q7Q1Eud2NtLkVkaXRCYXNlLkRFTEVURSZxdW90O10sJnF1b3Q7ZGlzYWJsZVRhcmdldGluZyZxdW90Ozp0cnVlfSwm +cXVvdDttc206bGl2ZVJlbGF0aW9uc2hpcCZxdW90Ozp7JnF1b3Q7bXNtOnN5bmNQYXRoJnF1b3Q7OiZxdW90Oy9qY3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7bXNtOnNv +dXJjZVBhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvY2F0YWxvZ3Mvd2UtcmV0YWlsL2VuL3dlYnNpdGUtdGVtcGxhdGUtcGFnZXMvcHJvZHVjdC1wYWdlLXRlbXBsYXRlL2pjcjpjb250ZW50L3Jvb3Qv +cHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDttc206dGFyZ2V0UGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvYmlr +aW5nL21hcmluLW1vdW50YWluLWJpa2Utc2hvZXMvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90O21zbTpsaXZlQ29weVBhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2Ut +cmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2Jpa2luZy9tYXJpbi1tb3VudGFpbi1iaWtlLXNob2VzJnF1b3Q7LCZxdW90O21zbTpsaXZlQ29weUJwUGF0aCZxdW90 +OzomcXVvdDsvY29udGVudC9jYXRhbG9ncy93ZS1yZXRhaWwvZW4vd2Vic2l0ZS10ZW1wbGF0ZS1wYWdlcy9wcm9kdWN0LXBhZ2UtdGVtcGxhdGUmcXVvdDssJnF1b3Q7bXNtOmlzRGVlcCZxdW90Ozpm +YWxzZSwmcXVvdDttc206aXNJbmhlcml0ZWRDb25maWcmcXVvdDs6dHJ1ZSwmcXVvdDttc206aXNSb290Q29uZmlnJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOnN0YXR1cyZxdW90Ozp7JnF1b3Q7bXNtOmlz +Q2FuY2VsbGVkJnF1b3Q7OmZhbHNlLCZxdW90O21zbTppc0NhbmNlbGxlZEZvckNoaWxkcmVuJnF1b3Q7OmZhbHNlLCZxdW90O21zbTppc0NhbmNlbGxlZE9uJnF1b3Q7OiZxdW90OyZxdW90OywmcXVv +dDttc206aXNFZGl0YWJsZSZxdW90Ozp0cnVlLCZxdW90O21zbTppc1RhcmdldEV4aXN0aW5nJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzU291cmNlRXhpc3RpbmcmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNt +OmlzUGFnZSZxdW90OzpmYWxzZSwmcXVvdDtjcTpsYXN0Um9sbGVkb3V0JnF1b3Q7OjE0Njc2MjQ5MjI0MjgsJnF1b3Q7Y3E6bGFzdFJvbGxlZG91dEJ5JnF1b3Q7OiZxdW90O2FkbWluJnF1b3Q7LCZx +dW90O21zbTppc1NvdXJjZU1vZGlmaWVkJnF1b3Q7OmZhbHNlLCZxdW90O21zbTppc1NvdXJjZURlbGV0ZWQmcXVvdDs6dHJ1ZSwmcXVvdDttc206aXNUYXJnZXRGcm9tRGlmZmVyZW50VHJlZSZxdW90 +OzpmYWxzZSwmcXVvdDttc206aXNUYXJnZXRTa2lwcGVkJnF1b3Q7OmZhbHNlLCZxdW90O21zbTppc1RhcmdldE1vZGlmaWVkJnF1b3Q7OmZhbHNlLCZxdW90O21zbTppc1RhcmdldERlbGV0ZWQmcXVv +dDs6ZmFsc2UsJnF1b3Q7bXNtOmlzVGFyZ2V0TWFudWFsbHlDcmVhdGVkJnF1b3Q7OmZhbHNlLCZxdW90O21zbTpjYW5jZWxsZWRQcm9wZXJ0aWVzJnF1b3Q7OltdfSwmcXVvdDtjcTpyb2xsb3V0Q29u +ZmlncyZxdW90OzpbJnF1b3Q7L2xpYnMvbXNtL2NhdGFsb2cvcm9sbG91dGNvbmZpZ3MvY2F0YWxvZ3BhZ2Vjb250ZW50JnF1b3Q7LCZxdW90Oy9saWJzL21zbS9jYXRhbG9nL3JvbGxvdXRjb25maWdz +L2NhdGFsb2dyb2xsb3V0aG9va3MmcXVvdDtdLCZxdW90O21zbTpjb21wdXRhdGlvblRpbWUmcXVvdDs6LTF9fSI+PC9jcT4KCiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGgzIGNsYXNz +PSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS10aXRsZSBoNCI+TWFyaW4gTW91bnRhaW4gQmlrZSBTaG9lczwvaDM+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1zdWJ0 +aXRsZSBzbWFsbCB0ZXh0LW11dGVkIj5mb290d2Vhcjwvc3Bhbj4KCiAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXByaWNlIj4KICAgICAgICAgICAgICAgIDxz +cGFuPiQxMTAuMDA8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tcHJpY2UtbmV3Ij48L3NwYW4+CiAgICAgICAgICAgICAgICA8cyBjbGFzcz0i +d2UtUHJvZHVjdHNHcmlkLWl0ZW0tcHJpY2Utb2xkIj48L3M+CiAgICAgICAgICAgIDwvc3Ryb25nPgoKICAgICAgICAgICAgPHNwYW4gY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLWRpc2NvdW50 +IGhpZGRlbiI+PHNwYW4+PC9zcGFuPm9mZjwvc3Bhbj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvd2UtcmV0 +YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2Jpa2luZy9tYXJpbi1tb3VudGFpbi1iaWtlLXNob2VzLmh0bWwiIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1saW5r +Ij48L2E+CgogICAgICAgIDwvZGl2PgogICAgICAgIDwhLS0gLy53ZS1Qcm9kdWN0c0dyaWQtaXRlbSAtLT4KICAgIDwvd2UtcHJvZHVjdC1pdGVtPgo8L2xpPjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVl +LCJ0eXBlIjoid2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3Byb2R1Y3RncmlkL2l0ZW0iLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFu +Z3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvYmlraW5nL21hcmluLW1vdW50YWluLWJpa2Utc2hvZXMvamNyOmNvbnRlbnQiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3Jp +cHQgL2FwcHMvd2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3Byb2R1Y3RncmlkL2l0ZW0vaXRlbS5odG1sIiwidG90YWxUaW1lIjo1LCJzZWxmVGltZSI6NH0tLT4KCiAgICAKICAgICAgICAKPGxp +IGNsYXNzPSJmb3VuZGF0aW9uLWxpc3QtaXRlbSI+CiAgICA8d2UtcHJvZHVjdC1pdGVtIHByaWNlPSIkNjUuMDAiIHNpemU9IjExLDEzLDkiIGlubGluZS10ZW1wbGF0ZT0iIj4KICAgICAgICA8ZGl2 +IGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLWltYWdlIGltZy1jZW50ZXIiPgogICAgICAgICAgICAgICAgPGRp +diBpZD0iY3EtaW1hZ2UtanNwLS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9ydW5uaW5nL2ZsZWV0LWNyb3NzLXRyYWluaW5nLXNob2UvamNy +OmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlIj48aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvY3FfY2tfMTQ3MzY4MDg4NTA1My5qcGciIGFsdD0iRmxlZXQgU2hvZSIgdGl0bGU9IkZsZWV0IFNo +b2UiIGNsYXNzPSJjcS1kZC1pbWFnZSI+PC9kaXY+CgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpbWFnZURpdiA9IGRvY3VtZW50 +LmdldEVsZW1lbnRCeUlkKCJjcVx1MDAyRGltYWdlXHUwMDJEanNwXHUwMDJEXC9jb250ZW50XC93ZVx1MDAyRHJldGFpbFwvbGFuZ3VhZ2VcdTAwMkRtYXN0ZXJzXC9lblwvcHJvZHVjdHNcL2VxdWlw +bWVudFwvcnVubmluZ1wvZmxlZXRcdTAwMkRjcm9zc1x1MDAyRHRyYWluaW5nXHUwMDJEc2hvZVwvamNyOmNvbnRlbnRcL3Jvb3RcL3Byb2R1Y3RcL2ltYWdlIik7CiAgICAgICAgdmFyIGltYWdlRXZh +cnMgPSAneyBpbWFnZUxpbms6ICIiLCBpbWFnZUFzc2V0OiAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC9yZXNvdXJjZXMvRmxlZXQlMjBTaG9lLmpwZyIsIGltYWdlVGl0bGU6 +ICJGbGVldCBTaG9lIiB9JzsKICAgICAgICB2YXIgdGFnTm9kZXMgPSBpbWFnZURpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFnTm9kZXMu +bGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGxpbmsgPSB0YWdOb2Rlcy5pdGVtKGkpOyAKICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ29uY2xpY2snLCAnQ1FfQW5hbHl0aWNzLnJl +Y29yZCh7ZXZlbnQ6ICJpbWFnZUNsaWNrIiwgdmFsdWVzOiAnICsgaW1hZ2VFdmFycyArICcsIGNvbGxlY3Q6IGZhbHNlLCBvcHRpb25zOiB7IG9iajogdGhpcyB9LCBjb21wb25lbnRQYXRoOiAiY29t +bWVyY2VcL2NvbXBvbmVudHNcL3Byb2R1Y3RcL2ltYWdlIn0pJyk7CiAgICAgICAgfQogICAgICAgIAogICAgfSkoKTsKPC9zY3JpcHQ+Cgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6ImNv +bW1lcmNlL2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9pbWFnZS5qc3AiLCJ0b3RhbFRpbWUiOjAs +InNlbGZUaW1lIjowfS0tPgo8Y3EgZGF0YS1wYXRoPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlw +bWVudC9ydW5uaW5nL2ZsZWV0LWNyb3NzLXRyYWluaW5nLXNob2UvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlIiBkYXRhLWNvbmZpZz0ieyZxdW90O3BhdGgmcXVvdDs6JnF1b3Q7L2NvbnRl +bnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L3J1bm5pbmcvZmxlZXQtY3Jvc3MtdHJhaW5pbmctc2hvZS9qY3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1h +Z2UmcXVvdDssJnF1b3Q7c2xpbmdQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9ydW5uaW5nL2ZsZWV0LWNyb3Nz +LXRyYWluaW5nLXNob2UvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlLmh0bWwmcXVvdDssJnF1b3Q7ZGlhbG9nJnF1b3Q7OiZxdW90Oy9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFn +ZS9jcTpkaWFsb2cmcXVvdDssJnF1b3Q7ZGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtk +aWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9fY3FfZGlhbG9nLmh0bWwvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFz +dGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvcnVubmluZy9mbGVldC1jcm9zcy10cmFpbmluZy1zaG9lL2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtkaWFsb2dDbGFz +c2ljJnF1b3Q7OiZxdW90Oy9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9kaWFsb2cmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nJnF1b3Q7OiZxdW90Oy9saWJzL2ZvdW5kYXRpb24vY29t +cG9uZW50cy9pbWFnZS9jcTpkZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xheW91dCZxdW90OzomcXVvdDtmdWxsc2NyZWVuJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xvYWRp +bmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvbGlicy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW1hZ2UvX2Nx +X2Rlc2lnbl9kaWFsb2cucG9saWN5ZGVzaWduLmVkaXRhYmxldGVtcGxhdGUuaHRtbC9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vcG9saWNpZXMvY29tbWVyY2UvY29tcG9uZW50cy9wcm9kdWN0 +L2ltYWdlL3BvbGljeV8xNjQ3MzA1NjYxODY1ODUwMzY/ZGlhbG9nPSUyRmxpYnMlMkZmb3VuZGF0aW9uJTJGY29tcG9uZW50cyUyRmltYWdlJTJGY3ElM0FkZXNpZ25fZGlhbG9nJmFtcDtyZWZlcnJl +cj0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJGbGFuZ3VhZ2UtbWFzdGVycyUyRmVuJTJGZXF1aXBtZW50JmFtcDtwb2xpY3lDb250ZW50UGF0aD0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJGbGFuZ3Vh +Z2UtbWFzdGVycyUyRmVuJTJGcHJvZHVjdHMlMkZlcXVpcG1lbnQlMkZydW5uaW5nJTJGZmxlZXQtY3Jvc3MtdHJhaW5pbmctc2hvZSUyRmpjciUzQWNvbnRlbnQlMkZyb290JTJGcHJvZHVjdCUyRmlt +YWdlJmFtcDtwb2xpY3lDb250ZW50UmVzb3VyY2VUeXBlPWNvbW1lcmNlJTJGY29tcG9uZW50cyUyRnByb2R1Y3QlMkZpbWFnZSZhbXA7cG9saWN5RGlyZWN0b3J5UGF0aD0lMkZjb25mJTJGd2UtcmV0 +YWlsJTJGc2V0dGluZ3MlMkZ3Y20lMkZwb2xpY2llcyUyRmNvbW1lcmNlJTJGY29tcG9uZW50cyUyRnByb2R1Y3QlMkZpbWFnZSUyRiZhbXA7cG9saWN5TWFwcGluZ1BhdGg9JTJGY29uZiUyRndlLXJl +dGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGdGVtcGxhdGVzJTJGcHJvZHVjdC1wYWdlJTJGcG9saWNpZXMlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnByb2R1Y3QlMkZjb21tZXJjZSUyRmNvbXBvbmVu +dHMlMkZwcm9kdWN0JTJGaW1hZ2UmYW1wO3BvbGljeU1hcHBpbmdSZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY2llcyUyRm1hcHBpbmcmYW1wO3BvbGljeU5hbWU9cG9s +aWN5XzE2NDczMDU2NjE4NjU4NTAzNiZhbXA7cG9saWN5UmVsYXRpdmVQYXRoPWNvbW1lcmNlJTJGY29tcG9uZW50cyUyRnByb2R1Y3QlMkZpbWFnZSUyRnBvbGljeV8xNjQ3MzA1NjYxODY1ODUwMzYm +YW1wO3Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGljeSUyRnBvbGljeSZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dDbGFzc2ljJnF1b3Q7OiZxdW90Oy9saWJzL2ZvdW5k +YXRpb24vY29tcG9uZW50cy9pbWFnZS9kZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O3R5cGUmcXVvdDs6JnF1b3Q7Y29tbWVyY2UvY29tcG9uZW50cy9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90O2lz +UmVzcG9uc2l2ZUdyaWQmcXVvdDs6ZmFsc2UsJnF1b3Q7cG9saWN5UGF0aCZxdW90OzomcXVvdDtyb290L3Byb2R1Y3QvY29tbWVyY2UvY29tcG9uZW50cy9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90 +O2NzcCZxdW90OzomcXVvdDtwYWdlfGJhc2ljcGFnZS9yb290fHJlc3BvbnNpdmVncmlkL3Jlc3BvbnNpdmVncmlkL3Byb2R1Y3RncmlkfGxpc3QvaXRlbS9pbWFnZXxwYXJiYXNlJnF1b3Q7LCZxdW90 +O2VkaXRDb25maWcmcXVvdDs6eyZxdW90O2Ryb3BUYXJnZXQmcXVvdDs6W3smcXVvdDtpZCZxdW90OzomcXVvdDtpbWFnZSZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90Oy4vZmlsZVJlZmVyZW5j +ZSZxdW90OywmcXVvdDthY2NlcHQmcXVvdDs6WyZxdW90O2ltYWdlLy4qJnF1b3Q7XSwmcXVvdDtncm91cHMmcXVvdDs6WyZxdW90O21lZGlhJnF1b3Q7XSwmcXVvdDtwYXJhbXMmcXVvdDs6eyZxdW90 +Oy4vaW1hZ2VSb3RhdGUmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90Oy4vaW1hZ2VNYXAmcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90Oy4vc2xpbmc6cmVzb3VyY2VUeXBlJnF1b3Q7OiZxdW90O2NvbW1l +cmNlL2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDsuL2ltYWdlQ3JvcCZxdW90OzomcXVvdDsmcXVvdDt9fV0sJnF1b3Q7bGlzdGVuZXJzJnF1b3Q7OnsmcXVvdDthZnRlcmVkaXQm +cXVvdDs6JnF1b3Q7UkVGUkVTSF9QQUdFJnF1b3Q7fSwmcXVvdDthY3Rpb25zJnF1b3Q7OlsmcXVvdDtDUS53Y20uRWRpdEJhc2UuRURJVEFOTk9UQVRFJnF1b3Q7LHsmcXVvdDt4dHlwZSZxdW90Ozom +cXVvdDt0YnNlcGFyYXRvciZxdW90O30sJnF1b3Q7Q1Eud2NtLkVkaXRCYXNlLkRFTEVURSZxdW90O10sJnF1b3Q7ZGlzYWJsZVRhcmdldGluZyZxdW90Ozp0cnVlfSwmcXVvdDttc206bGl2ZVJlbGF0 +aW9uc2hpcCZxdW90Ozp7JnF1b3Q7bXNtOnN5bmNQYXRoJnF1b3Q7OiZxdW90Oy9qY3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7bXNtOnNvdXJjZVBhdGgmcXVvdDs6JnF1 +b3Q7L2NvbnRlbnQvY2F0YWxvZ3Mvd2UtcmV0YWlsL2VuL3dlYnNpdGUtdGVtcGxhdGUtcGFnZXMvcHJvZHVjdC1wYWdlLXRlbXBsYXRlL2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSZxdW90 +OywmcXVvdDttc206dGFyZ2V0UGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvcnVubmluZy9mbGVldC1jcm9zcy10 +cmFpbmluZy1zaG9lL2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDttc206bGl2ZUNvcHlQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1t +YXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9ydW5uaW5nL2ZsZWV0LWNyb3NzLXRyYWluaW5nLXNob2UmcXVvdDssJnF1b3Q7bXNtOmxpdmVDb3B5QnBQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50 +L2NhdGFsb2dzL3dlLXJldGFpbC9lbi93ZWJzaXRlLXRlbXBsYXRlLXBhZ2VzL3Byb2R1Y3QtcGFnZS10ZW1wbGF0ZSZxdW90OywmcXVvdDttc206aXNEZWVwJnF1b3Q7OmZhbHNlLCZxdW90O21zbTpp +c0luaGVyaXRlZENvbmZpZyZxdW90Ozp0cnVlLCZxdW90O21zbTppc1Jvb3RDb25maWcmcXVvdDs6dHJ1ZSwmcXVvdDttc206c3RhdHVzJnF1b3Q7OnsmcXVvdDttc206aXNDYW5jZWxsZWQmcXVvdDs6 +ZmFsc2UsJnF1b3Q7bXNtOmlzQ2FuY2VsbGVkRm9yQ2hpbGRyZW4mcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzQ2FuY2VsbGVkT24mcXVvdDs6JnF1b3Q7JnF1b3Q7LCZxdW90O21zbTppc0VkaXRhYmxl +JnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzVGFyZ2V0RXhpc3RpbmcmcXVvdDs6dHJ1ZSwmcXVvdDttc206aXNTb3VyY2VFeGlzdGluZyZxdW90OzpmYWxzZSwmcXVvdDttc206aXNQYWdlJnF1b3Q7OmZh +bHNlLCZxdW90O2NxOmxhc3RSb2xsZWRvdXQmcXVvdDs6MTQ2NzYyNDkwNzY5NCwmcXVvdDtjcTpsYXN0Um9sbGVkb3V0QnkmcXVvdDs6JnF1b3Q7YWRtaW4mcXVvdDssJnF1b3Q7bXNtOmlzU291cmNl +TW9kaWZpZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzU291cmNlRGVsZXRlZCZxdW90Ozp0cnVlLCZxdW90O21zbTppc1RhcmdldEZyb21EaWZmZXJlbnRUcmVlJnF1b3Q7OmZhbHNlLCZxdW90O21z +bTppc1RhcmdldFNraXBwZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzVGFyZ2V0TW9kaWZpZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzVGFyZ2V0RGVsZXRlZCZxdW90OzpmYWxzZSwmcXVvdDtt +c206aXNUYXJnZXRNYW51YWxseUNyZWF0ZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmNhbmNlbGxlZFByb3BlcnRpZXMmcXVvdDs6W119LCZxdW90O2NxOnJvbGxvdXRDb25maWdzJnF1b3Q7OlsmcXVv +dDsvbGlicy9tc20vY2F0YWxvZy9yb2xsb3V0Y29uZmlncy9jYXRhbG9ncGFnZWNvbnRlbnQmcXVvdDssJnF1b3Q7L2xpYnMvbXNtL2NhdGFsb2cvcm9sbG91dGNvbmZpZ3MvY2F0YWxvZ3JvbGxvdXRo +b29rcyZxdW90O10sJnF1b3Q7bXNtOmNvbXB1dGF0aW9uVGltZSZxdW90OzotMX19Ij48L2NxPgoKICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8aDMgY2xhc3M9IndlLVByb2R1Y3RzR3Jp +ZC1pdGVtLXRpdGxlIGg0Ij5GbGVldCBDcm9zcy1UcmFpbmluZyBTaG9lPC9oMz4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXN1YnRpdGxlIHNtYWxsIHRleHQt +bXV0ZWQiPmZvb3R3ZWFyPC9zcGFuPgoKICAgICAgICAgICAgPHN0cm9uZyBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tcHJpY2UiPgogICAgICAgICAgICAgICAgPHNwYW4+JDY1LjAwPC9zcGFu +PgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXByaWNlLW5ldyI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHMgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1p +dGVtLXByaWNlLW9sZCI+PC9zPgogICAgICAgICAgICA8L3N0cm9uZz4KCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1kaXNjb3VudCBoaWRkZW4iPjxzcGFuPjwv +c3Bhbj5vZmY8L3NwYW4+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9wcm92ZXR0YS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0 +ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9ydW5uaW5nL2ZsZWV0LWNyb3NzLXRyYWluaW5nLXNob2UuaHRtbCIgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLWxpbmsiPjwvYT4KCiAgICAgICAg +PC9kaXY+CiAgICAgICAgPCEtLSAvLndlLVByb2R1Y3RzR3JpZC1pdGVtIC0tPgogICAgPC93ZS1wcm9kdWN0LWl0ZW0+CjwvbGk+PCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJ3ZXJldGFp +bC9jb21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQvaXRlbSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2Vu +L3Byb2R1Y3RzL2VxdWlwbWVudC9ydW5uaW5nL2ZsZWV0LWNyb3NzLXRyYWluaW5nLXNob2UvamNyOmNvbnRlbnQiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3JpcHQgL2FwcHMvd2VyZXRh +aWwvY29tcG9uZW50cy9jb250ZW50L3Byb2R1Y3RncmlkL2l0ZW0vaXRlbS5odG1sIiwidG90YWxUaW1lIjo0LCJzZWxmVGltZSI6NH0tLT4KCiAgICAKICAgICAgICAKPGxpIGNsYXNzPSJmb3VuZGF0 +aW9uLWxpc3QtaXRlbSI+CiAgICA8d2UtcHJvZHVjdC1pdGVtIHByaWNlPSIkNzUuMDAiIHNpemU9IlMsWEwsTCxNIiBpbmxpbmUtdGVtcGxhdGU9IiI+CiAgICAgICAgPGRpdiBjbGFzcz0id2UtUHJv +ZHVjdHNHcmlkLWl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1pbWFnZSBpbWctY2VudGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNxLWltYWdl +LWpzcC0vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvYmlraW5nL3NlcXVvaWEtYmlrZS1oZWxtZXQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0 +L2ltYWdlIj48aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvY3FfY2tfMTQ3MzY4MDgwMDU0My5qcGciIGFsdD0iU2VxdW9pYSIgdGl0bGU9IlNlcXVvaWEiIGNsYXNzPSJjcS1kZC1pbWFnZSI+PC9k +aXY+CgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpbWFnZURpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjcVx1MDAyRGlt +YWdlXHUwMDJEanNwXHUwMDJEXC9jb250ZW50XC93ZVx1MDAyRHJldGFpbFwvbGFuZ3VhZ2VcdTAwMkRtYXN0ZXJzXC9lblwvcHJvZHVjdHNcL2VxdWlwbWVudFwvYmlraW5nXC9zZXF1b2lhXHUwMDJE +YmlrZVx1MDAyRGhlbG1ldFwvamNyOmNvbnRlbnRcL3Jvb3RcL3Byb2R1Y3RcL2ltYWdlIik7CiAgICAgICAgdmFyIGltYWdlRXZhcnMgPSAneyBpbWFnZUxpbms6ICIiLCBpbWFnZUFzc2V0OiAiLi4v +Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC9yZXNvdXJjZXMvU2VxdW9pYS5qcGciLCBpbWFnZVRpdGxlOiAiU2VxdW9pYSIgfSc7CiAgICAgICAgdmFyIHRhZ05vZGVzID0gaW1hZ2VE +aXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0EnKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZ05vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gdGFnTm9kZXMu +aXRlbShpKTsgCiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdvbmNsaWNrJywgJ0NRX0FuYWx5dGljcy5yZWNvcmQoe2V2ZW50OiAiaW1hZ2VDbGljayIsIHZhbHVlczogJyArIGltYWdlRXZh +cnMgKyAnLCBjb2xsZWN0OiBmYWxzZSwgb3B0aW9uczogeyBvYmo6IHRoaXMgfSwgY29tcG9uZW50UGF0aDogImNvbW1lcmNlXC9jb21wb25lbnRzXC9wcm9kdWN0XC9pbWFnZSJ9KScpOwogICAgICAg +IH0KICAgICAgICAKICAgIH0pKCk7Cjwvc2NyaXB0PgoKPCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJjb21tZXJjZS9jb21wb25lbnRzL3Byb2R1Y3QvaW1hZ2UiLCJwYXRoIjoiLi4vLi4v +Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC9yZXNvdXJjZXMvaW1hZ2UuanNwIiwidG90YWxUaW1lIjowLCJzZWxmVGltZSI6MH0tLT4KPGNxIGRhdGEtcGF0aD0iLi4vLi4vLi4vLi4vLi4v +Li4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvYmlraW5nL3NlcXVvaWEtYmlrZS1oZWxtZXQvamNyOmNvbnRlbnQvcm9v +dC9wcm9kdWN0L2ltYWdlIiBkYXRhLWNvbmZpZz0ieyZxdW90O3BhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2Jp +a2luZy9zZXF1b2lhLWJpa2UtaGVsbWV0L2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtzbGluZ1BhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1 +YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2Jpa2luZy9zZXF1b2lhLWJpa2UtaGVsbWV0L2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZS5odG1sJnF1b3Q7LCZxdW90O2RpYWxv +ZyZxdW90OzomcXVvdDsvbGlicy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW1hZ2UvY3E6ZGlhbG9nJnF1b3Q7LCZxdW90O2RpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1 +b3Q7ZGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvbGlicy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW1hZ2Uv +X2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2Jpa2luZy9zZXF1b2lhLWJpa2UtaGVsbWV0L2pjcjpjb250ZW50L3Jv +b3QvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtkaWFsb2dDbGFzc2ljJnF1b3Q7OiZxdW90Oy9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9kaWFsb2cmcXVvdDssJnF1b3Q7ZGVzaWdu +RGlhbG9nJnF1b3Q7OiZxdW90Oy9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9jcTpkZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xheW91dCZxdW90OzomcXVvdDtm +dWxsc2NyZWVuJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJp +ZGUvbGlicy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW1hZ2UvX2NxX2Rlc2lnbl9kaWFsb2cucG9saWN5ZGVzaWduLmVkaXRhYmxldGVtcGxhdGUuaHRtbC9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93 +Y20vcG9saWNpZXMvY29tbWVyY2UvY29tcG9uZW50cy9wcm9kdWN0L2ltYWdlL3BvbGljeV8xNjQ3MzA1NjYxOTEyNjk5NjQ/ZGlhbG9nPSUyRmxpYnMlMkZmb3VuZGF0aW9uJTJGY29tcG9uZW50cyUy +RmltYWdlJTJGY3ElM0FkZXNpZ25fZGlhbG9nJmFtcDtyZWZlcnJlcj0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJGbGFuZ3VhZ2UtbWFzdGVycyUyRmVuJTJGZXF1aXBtZW50JmFtcDtwb2xpY3lDb250 +ZW50UGF0aD0lMkZjb250ZW50JTJGd2UtcmV0YWlsJTJGbGFuZ3VhZ2UtbWFzdGVycyUyRmVuJTJGcHJvZHVjdHMlMkZlcXVpcG1lbnQlMkZiaWtpbmclMkZzZXF1b2lhLWJpa2UtaGVsbWV0JTJGamNy +JTNBY29udGVudCUyRnJvb3QlMkZwcm9kdWN0JTJGaW1hZ2UmYW1wO3BvbGljeUNvbnRlbnRSZXNvdXJjZVR5cGU9Y29tbWVyY2UlMkZjb21wb25lbnRzJTJGcHJvZHVjdCUyRmltYWdlJmFtcDtwb2xp +Y3lEaXJlY3RvcnlQYXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnBvbGljaWVzJTJGY29tbWVyY2UlMkZjb21wb25lbnRzJTJGcHJvZHVjdCUyRmltYWdlJTJGJmFtcDtw +b2xpY3lNYXBwaW5nUGF0aD0lMkZjb25mJTJGd2UtcmV0YWlsJTJGc2V0dGluZ3MlMkZ3Y20lMkZ0ZW1wbGF0ZXMlMkZwcm9kdWN0LXBhZ2UlMkZwb2xpY2llcyUyRmpjciUzQWNvbnRlbnQlMkZyb290 +JTJGcHJvZHVjdCUyRmNvbW1lcmNlJTJGY29tcG9uZW50cyUyRnByb2R1Y3QlMkZpbWFnZSZhbXA7cG9saWN5TWFwcGluZ1Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGlj +aWVzJTJGbWFwcGluZyZhbXA7cG9saWN5TmFtZT1wb2xpY3lfMTY0NzMwNTY2MTkxMjY5OTY0JmFtcDtwb2xpY3lSZWxhdGl2ZVBhdGg9Y29tbWVyY2UlMkZjb21wb25lbnRzJTJGcHJvZHVjdCUyRmlt +YWdlJTJGcG9saWN5XzE2NDczMDU2NjE5MTI2OTk2NCZhbXA7cmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9saWN5JTJGcG9saWN5JnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxv +Z0NsYXNzaWMmcXVvdDs6JnF1b3Q7L2xpYnMvZm91bmRhdGlvbi9jb21wb25lbnRzL2ltYWdlL2Rlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7dHlwZSZxdW90OzomcXVvdDtjb21tZXJjZS9jb21wb25l +bnRzL3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7aXNSZXNwb25zaXZlR3JpZCZxdW90OzpmYWxzZSwmcXVvdDtwb2xpY3lQYXRoJnF1b3Q7OiZxdW90O3Jvb3QvcHJvZHVjdC9jb21tZXJjZS9jb21w +b25lbnRzL3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7Y3NwJnF1b3Q7OiZxdW90O3BhZ2V8YmFzaWNwYWdlL3Jvb3R8cmVzcG9uc2l2ZWdyaWQvcmVzcG9uc2l2ZWdyaWQvcHJvZHVjdGdyaWR8bGlz +dC9pdGVtL2ltYWdlfHBhcmJhc2UmcXVvdDssJnF1b3Q7ZWRpdENvbmZpZyZxdW90Ozp7JnF1b3Q7ZHJvcFRhcmdldCZxdW90OzpbeyZxdW90O2lkJnF1b3Q7OiZxdW90O2ltYWdlJnF1b3Q7LCZxdW90 +O25hbWUmcXVvdDs6JnF1b3Q7Li9maWxlUmVmZXJlbmNlJnF1b3Q7LCZxdW90O2FjY2VwdCZxdW90OzpbJnF1b3Q7aW1hZ2UvLiomcXVvdDtdLCZxdW90O2dyb3VwcyZxdW90OzpbJnF1b3Q7bWVkaWEm +cXVvdDtdLCZxdW90O3BhcmFtcyZxdW90Ozp7JnF1b3Q7Li9pbWFnZVJvdGF0ZSZxdW90OzomcXVvdDsmcXVvdDssJnF1b3Q7Li9pbWFnZU1hcCZxdW90OzomcXVvdDsmcXVvdDssJnF1b3Q7Li9zbGlu +ZzpyZXNvdXJjZVR5cGUmcXVvdDs6JnF1b3Q7Y29tbWVyY2UvY29tcG9uZW50cy9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90Oy4vaW1hZ2VDcm9wJnF1b3Q7OiZxdW90OyZxdW90O319XSwmcXVvdDts +aXN0ZW5lcnMmcXVvdDs6eyZxdW90O2FmdGVyZWRpdCZxdW90OzomcXVvdDtSRUZSRVNIX1BBR0UmcXVvdDt9LCZxdW90O2FjdGlvbnMmcXVvdDs6WyZxdW90O0NRLndjbS5FZGl0QmFzZS5FRElUQU5O +T1RBVEUmcXVvdDsseyZxdW90O3h0eXBlJnF1b3Q7OiZxdW90O3Ric2VwYXJhdG9yJnF1b3Q7fSwmcXVvdDtDUS53Y20uRWRpdEJhc2UuREVMRVRFJnF1b3Q7XSwmcXVvdDtkaXNhYmxlVGFyZ2V0aW5n +JnF1b3Q7OnRydWV9LCZxdW90O21zbTpsaXZlUmVsYXRpb25zaGlwJnF1b3Q7OnsmcXVvdDttc206c3luY1BhdGgmcXVvdDs6JnF1b3Q7L2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSZxdW90 +OywmcXVvdDttc206c291cmNlUGF0aCZxdW90OzomcXVvdDsvY29udGVudC9jYXRhbG9ncy93ZS1yZXRhaWwvZW4vd2Vic2l0ZS10ZW1wbGF0ZS1wYWdlcy9wcm9kdWN0LXBhZ2UtdGVtcGxhdGUvamNy +OmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90O21zbTp0YXJnZXRQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3Rz +L2VxdWlwbWVudC9iaWtpbmcvc2VxdW9pYS1iaWtlLWhlbG1ldC9qY3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7bXNtOmxpdmVDb3B5UGF0aCZxdW90OzomcXVvdDsvY29u +dGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvYmlraW5nL3NlcXVvaWEtYmlrZS1oZWxtZXQmcXVvdDssJnF1b3Q7bXNtOmxpdmVDb3B5QnBQYXRoJnF1 +b3Q7OiZxdW90Oy9jb250ZW50L2NhdGFsb2dzL3dlLXJldGFpbC9lbi93ZWJzaXRlLXRlbXBsYXRlLXBhZ2VzL3Byb2R1Y3QtcGFnZS10ZW1wbGF0ZSZxdW90OywmcXVvdDttc206aXNEZWVwJnF1b3Q7 +OmZhbHNlLCZxdW90O21zbTppc0luaGVyaXRlZENvbmZpZyZxdW90Ozp0cnVlLCZxdW90O21zbTppc1Jvb3RDb25maWcmcXVvdDs6dHJ1ZSwmcXVvdDttc206c3RhdHVzJnF1b3Q7OnsmcXVvdDttc206 +aXNDYW5jZWxsZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzQ2FuY2VsbGVkRm9yQ2hpbGRyZW4mcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzQ2FuY2VsbGVkT24mcXVvdDs6JnF1b3Q7JnF1b3Q7LCZx +dW90O21zbTppc0VkaXRhYmxlJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzVGFyZ2V0RXhpc3RpbmcmcXVvdDs6dHJ1ZSwmcXVvdDttc206aXNTb3VyY2VFeGlzdGluZyZxdW90OzpmYWxzZSwmcXVvdDtt +c206aXNQYWdlJnF1b3Q7OmZhbHNlLCZxdW90O2NxOmxhc3RSb2xsZWRvdXQmcXVvdDs6MTQ2NzYyNDkyMTIyNSwmcXVvdDtjcTpsYXN0Um9sbGVkb3V0QnkmcXVvdDs6JnF1b3Q7YWRtaW4mcXVvdDss +JnF1b3Q7bXNtOmlzU291cmNlTW9kaWZpZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzU291cmNlRGVsZXRlZCZxdW90Ozp0cnVlLCZxdW90O21zbTppc1RhcmdldEZyb21EaWZmZXJlbnRUcmVlJnF1 +b3Q7OmZhbHNlLCZxdW90O21zbTppc1RhcmdldFNraXBwZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzVGFyZ2V0TW9kaWZpZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzVGFyZ2V0RGVsZXRlZCZx +dW90OzpmYWxzZSwmcXVvdDttc206aXNUYXJnZXRNYW51YWxseUNyZWF0ZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmNhbmNlbGxlZFByb3BlcnRpZXMmcXVvdDs6W119LCZxdW90O2NxOnJvbGxvdXRD +b25maWdzJnF1b3Q7OlsmcXVvdDsvbGlicy9tc20vY2F0YWxvZy9yb2xsb3V0Y29uZmlncy9jYXRhbG9ncGFnZWNvbnRlbnQmcXVvdDssJnF1b3Q7L2xpYnMvbXNtL2NhdGFsb2cvcm9sbG91dGNvbmZp +Z3MvY2F0YWxvZ3JvbGxvdXRob29rcyZxdW90O10sJnF1b3Q7bXNtOmNvbXB1dGF0aW9uVGltZSZxdW90OzotMX19Ij48L2NxPgoKICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8aDMgY2xh +c3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXRpdGxlIGg0Ij5TZXF1b2lhIEJpa2UgSGVsbWV0PC9oMz4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXN1YnRpdGxl +IHNtYWxsIHRleHQtbXV0ZWQiPmhlbG1ldDwvc3Bhbj4KCiAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXByaWNlIj4KICAgICAgICAgICAgICAgIDxzcGFuPiQ3 +NS4wMDwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1wcmljZS1uZXciPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzIGNsYXNzPSJ3ZS1Qcm9k +dWN0c0dyaWQtaXRlbS1wcmljZS1vbGQiPjwvcz4KICAgICAgICAgICAgPC9zdHJvbmc+CgogICAgICAgICAgICA8c3BhbiBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tZGlzY291bnQgaGlkZGVu +Ij48c3Bhbj48L3NwYW4+b2ZmPC9zcGFuPgogICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC93ZS1yZXRhaWwvbGFu +Z3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvYmlraW5nL3NlcXVvaWEtYmlrZS1oZWxtZXQuaHRtbCIgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLWxpbmsiPjwvYT4KCiAgICAg +ICAgPC9kaXY+CiAgICAgICAgPCEtLSAvLndlLVByb2R1Y3RzR3JpZC1pdGVtIC0tPgogICAgPC93ZS1wcm9kdWN0LWl0ZW0+CjwvbGk+PCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJ3ZXJl +dGFpbC9jb21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQvaXRlbSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJz +L2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9iaWtpbmcvc2VxdW9pYS1iaWtlLWhlbG1ldC9qY3I6Y29udGVudCIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy93ZXJldGFpbC9j +b21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQvaXRlbS9pdGVtLmh0bWwiLCJ0b3RhbFRpbWUiOjUsInNlbGZUaW1lIjo1fS0tPgoKICAgIAogICAgICAgIAo8bGkgY2xhc3M9ImZvdW5kYXRpb24t +bGlzdC1pdGVtIj4KICAgIDx3ZS1wcm9kdWN0LWl0ZW0gcHJpY2U9IiQzOS4wMCIgc2l6ZT0iWFhTLFMsWEwsTCxNLFhYTCIgaW5saW5lLXRlbXBsYXRlPSIiPgogICAgICAgIDxkaXYgY2xhc3M9Indl +LVByb2R1Y3RzR3JpZC1pdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0taW1hZ2UgaW1nLWNlbnRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjcS1p +bWFnZS1qc3AtL2NvbnRlbnQvd2UtcmV0YWlsL3VzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9oaWtpbmcvcmlvcy10LXNoaXJ0L2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSI+PGltZyBzcmM9 +Ii4vRXF1aXBtZW50X2ZpbGVzL2NxX2NrXzE0NzM2ODA4NjI3NzQuanBnIiBhbHQ9IlJpb3MiIHRpdGxlPSJSaW9zIiBjbGFzcz0iY3EtZGQtaW1hZ2UiPjwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4 +dC9qYXZhc2NyaXB0Ij4KICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaW1hZ2VEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY3FcdTAwMkRpbWFnZVx1MDAyRGpzcFx1MDAyRFwvY29u +dGVudFwvd2VcdTAwMkRyZXRhaWxcL3VzXC9lblwvcHJvZHVjdHNcL2VxdWlwbWVudFwvaGlraW5nXC9yaW9zXHUwMDJEdFx1MDAyRHNoaXJ0XC9qY3I6Y29udGVudFwvcm9vdFwvcHJvZHVjdFwvaW1h +Z2UiKTsKICAgICAgICB2YXIgaW1hZ2VFdmFycyA9ICd7IGltYWdlTGluazogIiIsIGltYWdlQXNzZXQ6ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9SaW9z +LmpwZyIsIGltYWdlVGl0bGU6ICJSaW9zIiB9JzsKICAgICAgICB2YXIgdGFnTm9kZXMgPSBpbWFnZURpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBp +IDwgdGFnTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGxpbmsgPSB0YWdOb2Rlcy5pdGVtKGkpOyAKICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ29uY2xpY2snLCAnQ1Ff +QW5hbHl0aWNzLnJlY29yZCh7ZXZlbnQ6ICJpbWFnZUNsaWNrIiwgdmFsdWVzOiAnICsgaW1hZ2VFdmFycyArICcsIGNvbGxlY3Q6IGZhbHNlLCBvcHRpb25zOiB7IG9iajogdGhpcyB9LCBjb21wb25l +bnRQYXRoOiAiY29tbWVyY2VcL2NvbXBvbmVudHNcL3Byb2R1Y3RcL2ltYWdlIn0pJyk7CiAgICAgICAgfQogICAgICAgIAogICAgfSkoKTsKPC9zY3JpcHQ+Cgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1 +ZSwidHlwZSI6ImNvbW1lcmNlL2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9pbWFnZS5qc3AiLCJ0 +b3RhbFRpbWUiOjEsInNlbGZUaW1lIjoxfS0tPgo8Y3EgZGF0YS1wYXRoPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC91cy9lbi9wcm9kdWN0cy9lcXVpcG1l +bnQvaGlraW5nL3Jpb3MtdC1zaGlydC9qY3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1hZ2UiIGRhdGEtY29uZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvdXMv +ZW4vcHJvZHVjdHMvZXF1aXBtZW50L2hpa2luZy9yaW9zLXQtc2hpcnQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90O3NsaW5nUGF0aCZxdW90OzomcXVvdDsvY29udGVu +dC93ZS1yZXRhaWwvdXMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2hpa2luZy9yaW9zLXQtc2hpcnQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlLmh0bWwmcXVvdDssJnF1b3Q7ZGlhbG9nJnF1 +b3Q7OiZxdW90Oy9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9jcTpkaWFsb2cmcXVvdDssJnF1b3Q7ZGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtk +aWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9fY3Ff +ZGlhbG9nLmh0bWwvY29udGVudC93ZS1yZXRhaWwvdXMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2hpa2luZy9yaW9zLXQtc2hpcnQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZx +dW90O2RpYWxvZ0NsYXNzaWMmcXVvdDs6JnF1b3Q7L2xpYnMvZm91bmRhdGlvbi9jb21wb25lbnRzL2ltYWdlL2RpYWxvZyZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2cmcXVvdDs6JnF1b3Q7L2xpYnMv +Zm91bmRhdGlvbi9jb21wb25lbnRzL2ltYWdlL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2Z1bGxzY3JlZW4mcXVvdDssJnF1b3Q7ZGVz +aWduRGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9saWJzL2ZvdW5kYXRpb24vY29tcG9u +ZW50cy9pbWFnZS9fY3FfZGVzaWduX2RpYWxvZy5wb2xpY3lkZXNpZ24uZWRpdGFibGV0ZW1wbGF0ZS5odG1sL2NvbmYvd2UtcmV0YWlsL3NldHRpbmdzL3djbS9wb2xpY2llcy9jb21tZXJjZS9jb21w +b25lbnRzL3Byb2R1Y3QvaW1hZ2UvcG9saWN5XzE2NDczMDU2NjE5NTk5MTk5OT9kaWFsb2c9JTJGbGlicyUyRmZvdW5kYXRpb24lMkZjb21wb25lbnRzJTJGaW1hZ2UlMkZjcSUzQWRlc2lnbl9kaWFs +b2cmYW1wO3JlZmVycmVyPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQmYW1wO3BvbGljeUNvbnRlbnRQYXRoPSUyRmNvbnRlbnQlMkZ3ZS1y +ZXRhaWwlMkZ1cyUyRmVuJTJGcHJvZHVjdHMlMkZlcXVpcG1lbnQlMkZoaWtpbmclMkZyaW9zLXQtc2hpcnQlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnByb2R1Y3QlMkZpbWFnZSZhbXA7cG9saWN5 +Q29udGVudFJlc291cmNlVHlwZT1jb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2UmYW1wO3BvbGljeURpcmVjdG9yeVBhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdz +JTJGd2NtJTJGcG9saWNpZXMlMkZjb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2UlMkYmYW1wO3BvbGljeU1hcHBpbmdQYXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5n +cyUyRndjbSUyRnRlbXBsYXRlcyUyRnByb2R1Y3QtcGFnZSUyRnBvbGljaWVzJTJGamNyJTNBY29udGVudCUyRnJvb3QlMkZwcm9kdWN0JTJGY29tbWVyY2UlMkZjb21wb25lbnRzJTJGcHJvZHVjdCUy +RmltYWdlJmFtcDtwb2xpY3lNYXBwaW5nUmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9saWNpZXMlMkZtYXBwaW5nJmFtcDtwb2xpY3lOYW1lPXBvbGljeV8xNjQ3MzA1NjYx +OTU5OTE5OTkmYW1wO3BvbGljeVJlbGF0aXZlUGF0aD1jb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2UlMkZwb2xpY3lfMTY0NzMwNTY2MTk1OTkxOTk5JmFtcDtyZXNvdXJjZVR5 +cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY3klMkZwb2xpY3kmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nQ2xhc3NpYyZxdW90OzomcXVvdDsvbGlicy9mb3VuZGF0aW9uL2NvbXBvbmVu +dHMvaW1hZ2UvZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDt0eXBlJnF1b3Q7OiZxdW90O2NvbW1lcmNlL2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtpc1Jlc3BvbnNpdmVHcmlk +JnF1b3Q7OmZhbHNlLCZxdW90O3BvbGljeVBhdGgmcXVvdDs6JnF1b3Q7cm9vdC9wcm9kdWN0L2NvbW1lcmNlL2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtjc3AmcXVvdDs6JnF1 +b3Q7cGFnZXxiYXNpY3BhZ2Uvcm9vdHxyZXNwb25zaXZlZ3JpZC9yZXNwb25zaXZlZ3JpZC9wcm9kdWN0Z3JpZHxsaXN0L2l0ZW0vaW1hZ2V8cGFyYmFzZSZxdW90OywmcXVvdDtlZGl0Q29uZmlnJnF1 +b3Q7OnsmcXVvdDtkcm9wVGFyZ2V0JnF1b3Q7Olt7JnF1b3Q7aWQmcXVvdDs6JnF1b3Q7aW1hZ2UmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDsuL2ZpbGVSZWZlcmVuY2UmcXVvdDssJnF1b3Q7 +YWNjZXB0JnF1b3Q7OlsmcXVvdDtpbWFnZS8uKiZxdW90O10sJnF1b3Q7Z3JvdXBzJnF1b3Q7OlsmcXVvdDttZWRpYSZxdW90O10sJnF1b3Q7cGFyYW1zJnF1b3Q7OnsmcXVvdDsuL2ltYWdlUm90YXRl +JnF1b3Q7OiZxdW90OyZxdW90OywmcXVvdDsuL2ltYWdlTWFwJnF1b3Q7OiZxdW90OyZxdW90OywmcXVvdDsuL3NsaW5nOnJlc291cmNlVHlwZSZxdW90OzomcXVvdDtjb21tZXJjZS9jb21wb25lbnRz +L3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7Li9pbWFnZUNyb3AmcXVvdDs6JnF1b3Q7JnF1b3Q7fX1dLCZxdW90O2xpc3RlbmVycyZxdW90Ozp7JnF1b3Q7YWZ0ZXJlZGl0JnF1b3Q7OiZxdW90O1JF +RlJFU0hfUEFHRSZxdW90O30sJnF1b3Q7YWN0aW9ucyZxdW90OzpbJnF1b3Q7Q1Eud2NtLkVkaXRCYXNlLkVESVRBTk5PVEFURSZxdW90Oyx7JnF1b3Q7eHR5cGUmcXVvdDs6JnF1b3Q7dGJzZXBhcmF0 +b3ImcXVvdDt9LCZxdW90O0NRLndjbS5FZGl0QmFzZS5ERUxFVEUmcXVvdDtdLCZxdW90O2Rpc2FibGVUYXJnZXRpbmcmcXVvdDs6dHJ1ZX0sJnF1b3Q7bXNtOmxpdmVSZWxhdGlvbnNoaXAmcXVvdDs6 +eyZxdW90O21zbTpzeW5jUGF0aCZxdW90OzomcXVvdDsvcHJvZHVjdHMvZXF1aXBtZW50L2hpa2luZy9yaW9zLXQtc2hpcnQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90 +O21zbTpzb3VyY2VQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9oaWtpbmcvcmlvcy10LXNoaXJ0L2pjcjpjb250 +ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDttc206dGFyZ2V0UGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvdXMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L2hpa2luZy9y +aW9zLXQtc2hpcnQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90O21zbTpsaXZlQ29weVBhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL3VzL2VuJnF1b3Q7 +LCZxdW90O21zbTpsaXZlQ29weUJwUGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbiZxdW90OywmcXVvdDttc206aXNEZWVwJnF1b3Q7OnRydWUsJnF1 +b3Q7bXNtOmlzSW5oZXJpdGVkQ29uZmlnJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzUm9vdENvbmZpZyZxdW90Ozp0cnVlLCZxdW90O21zbTpzdGF0dXMmcXVvdDs6eyZxdW90O21zbTppc0NhbmNlbGxl +ZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNDYW5jZWxsZWRGb3JDaGlsZHJlbiZxdW90OzpmYWxzZSwmcXVvdDttc206aXNDYW5jZWxsZWRPbiZxdW90OzomcXVvdDsmcXVvdDssJnF1b3Q7bXNtOmlz +RWRpdGFibGUmcXVvdDs6dHJ1ZSwmcXVvdDttc206aXNUYXJnZXRFeGlzdGluZyZxdW90Ozp0cnVlLCZxdW90O21zbTppc1NvdXJjZUV4aXN0aW5nJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzUGFnZSZx +dW90OzpmYWxzZSwmcXVvdDtjcTpsYXN0Um9sbGVkb3V0JnF1b3Q7OjE0NjcyMDI4NjAyMjMsJnF1b3Q7Y3E6bGFzdFJvbGxlZG91dEJ5JnF1b3Q7OiZxdW90O2FkbWluJnF1b3Q7LCZxdW90O21zbTpp +c1NvdXJjZU1vZGlmaWVkJnF1b3Q7OmZhbHNlLCZxdW90O21zbTppc1NvdXJjZURlbGV0ZWQmcXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzVGFyZ2V0RnJvbURpZmZlcmVudFRyZWUmcXVvdDs6ZmFsc2Us +JnF1b3Q7bXNtOmlzVGFyZ2V0U2tpcHBlZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNUYXJnZXRNb2RpZmllZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNUYXJnZXREZWxldGVkJnF1b3Q7OmZhbHNl +LCZxdW90O21zbTppc1RhcmdldE1hbnVhbGx5Q3JlYXRlZCZxdW90OzpmYWxzZSwmcXVvdDttc206Y2FuY2VsbGVkUHJvcGVydGllcyZxdW90OzpbXX0sJnF1b3Q7Y3E6cm9sbG91dENvbmZpZ3MmcXVv +dDs6WyZxdW90Oy9saWJzL21zbS93Y20vcm9sbG91dGNvbmZpZ3MvZGVmYXVsdCZxdW90O10sJnF1b3Q7bXNtOmNvbXB1dGF0aW9uVGltZSZxdW90OzotMX19Ij48L2NxPgoKICAgICAgICAgICAgPC9k +aXY+CgogICAgICAgICAgICA8aDMgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXRpdGxlIGg0Ij5SaW9zIFQgU2hpcnQ8L2gzPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0id2UtUHJvZHVjdHNH +cmlkLWl0ZW0tc3VidGl0bGUgc21hbGwgdGV4dC1tdXRlZCI+c2hpcnQ8L3NwYW4+CgogICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1wcmljZSI+CiAgICAgICAg +ICAgICAgICA8c3Bhbj4kMzkuMDA8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tcHJpY2UtbmV3Ij48L3NwYW4+CiAgICAgICAgICAgICAgICA8 +cyBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tcHJpY2Utb2xkIj48L3M+CiAgICAgICAgICAgIDwvc3Ryb25nPgoKICAgICAgICAgICAgPHNwYW4gY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVt +LWRpc2NvdW50IGhpZGRlbiI+PHNwYW4+PC9zcGFuPm9mZjwvc3Bhbj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRl +bnQvd2UtcmV0YWlsL3VzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9oaWtpbmcvcmlvcy10LXNoaXJ0Lmh0bWwiIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1saW5rIj48L2E+CgogICAgICAgIDwv +ZGl2PgogICAgICAgIDwhLS0gLy53ZS1Qcm9kdWN0c0dyaWQtaXRlbSAtLT4KICAgIDwvd2UtcHJvZHVjdC1pdGVtPgo8L2xpPjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2VyZXRhaWwv +Y29tcG9uZW50cy9jb250ZW50L3Byb2R1Y3RncmlkL2l0ZW0iLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvdXMvZW4vcHJvZHVjdHMvZXF1aXBt +ZW50L2hpa2luZy9yaW9zLXQtc2hpcnQvamNyOmNvbnRlbnQiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3JpcHQgL2FwcHMvd2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3Byb2R1Y3Rn +cmlkL2l0ZW0vaXRlbS5odG1sIiwidG90YWxUaW1lIjo0LCJzZWxmVGltZSI6M30tLT4KCiAgICAKICAgICAgICAKPGxpIGNsYXNzPSJmb3VuZGF0aW9uLWxpc3QtaXRlbSI+CiAgICA8d2UtcHJvZHVj +dC1pdGVtIHByaWNlPSIkOTAwLjAwIiBpbmxpbmUtdGVtcGxhdGU9IiI+CiAgICAgICAgPGRpdiBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1Q +cm9kdWN0c0dyaWQtaXRlbS1pbWFnZSBpbWctY2VudGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNxLWltYWdlLWpzcC0vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9w +cm9kdWN0cy9lcXVpcG1lbnQvc3VyZmluZy90aGUtc3RyZXRjaC1sb25nYm9hcmQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlIj48aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvY3FfY2tf +MTQ3MzY4MDg2MzY4MC5wbmciIGFsdD0ic3RyZXRjaF9zaWRlIiB0aXRsZT0ic3RyZXRjaF9zaWRlIiBjbGFzcz0iY3EtZGQtaW1hZ2UiPjwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2Ny +aXB0Ij4KICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaW1hZ2VEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY3FcdTAwMkRpbWFnZVx1MDAyRGpzcFx1MDAyRFwvY29udGVudFwvd2Vc +dTAwMkRyZXRhaWxcL2xhbmd1YWdlXHUwMDJEbWFzdGVyc1wvZW5cL3Byb2R1Y3RzXC9lcXVpcG1lbnRcL3N1cmZpbmdcL3RoZVx1MDAyRHN0cmV0Y2hcdTAwMkRsb25nYm9hcmRcL2pjcjpjb250ZW50 +XC9yb290XC9wcm9kdWN0XC9pbWFnZSIpOwogICAgICAgIHZhciBpbWFnZUV2YXJzID0gJ3sgaW1hZ2VMaW5rOiAiIiwgaW1hZ2VBc3NldDogIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2Nv +bnRlbnQvcmVzb3VyY2VzL3N0cmV0Y2hfc2lkZS5wbmciLCBpbWFnZVRpdGxlOiAic3RyZXRjaF9zaWRlIiB9JzsKICAgICAgICB2YXIgdGFnTm9kZXMgPSBpbWFnZURpdi5nZXRFbGVtZW50c0J5VGFn +TmFtZSgnQScpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFnTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGxpbmsgPSB0YWdOb2Rlcy5pdGVtKGkpOyAKICAgICAgICAg +ICAgbGluay5zZXRBdHRyaWJ1dGUoJ29uY2xpY2snLCAnQ1FfQW5hbHl0aWNzLnJlY29yZCh7ZXZlbnQ6ICJpbWFnZUNsaWNrIiwgdmFsdWVzOiAnICsgaW1hZ2VFdmFycyArICcsIGNvbGxlY3Q6IGZh +bHNlLCBvcHRpb25zOiB7IG9iajogdGhpcyB9LCBjb21wb25lbnRQYXRoOiAiY29tbWVyY2VcL2NvbXBvbmVudHNcL3Byb2R1Y3RcL2ltYWdlIn0pJyk7CiAgICAgICAgfQogICAgICAgIAogICAgfSko +KTsKPC9zY3JpcHQ+Cgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6ImNvbW1lcmNlL2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8u +Li8uLi9jb250ZW50L3Jlc291cmNlcy9pbWFnZS5qc3AiLCJ0b3RhbFRpbWUiOjAsInNlbGZUaW1lIjowfS0tPgo8Y3EgZGF0YS1wYXRoPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250 +ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9zdXJmaW5nL3RoZS1zdHJldGNoLWxvbmdib2FyZC9qY3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1hZ2Ui +IGRhdGEtY29uZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvc3VyZmluZy90aGUtc3RyZXRj +aC1sb25nYm9hcmQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90O3NsaW5nUGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9l +bi9wcm9kdWN0cy9lcXVpcG1lbnQvc3VyZmluZy90aGUtc3RyZXRjaC1sb25nYm9hcmQvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlLmh0bWwmcXVvdDssJnF1b3Q7ZGlhbG9nJnF1b3Q7OiZx +dW90Oy9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9jcTpkaWFsb2cmcXVvdDssJnF1b3Q7ZGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dM +YXlvdXQmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9fY3FfZGlhbG9n +Lmh0bWwvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvc3VyZmluZy90aGUtc3RyZXRjaC1sb25nYm9hcmQvamNyOmNvbnRlbnQvcm9vdC9wcm9k +dWN0L2ltYWdlJnF1b3Q7LCZxdW90O2RpYWxvZ0NsYXNzaWMmcXVvdDs6JnF1b3Q7L2xpYnMvZm91bmRhdGlvbi9jb21wb25lbnRzL2ltYWdlL2RpYWxvZyZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2cm +cXVvdDs6JnF1b3Q7L2xpYnMvZm91bmRhdGlvbi9jb21wb25lbnRzL2ltYWdlL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2Z1bGxzY3Jl +ZW4mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9saWJz +L2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9fY3FfZGVzaWduX2RpYWxvZy5wb2xpY3lkZXNpZ24uZWRpdGFibGV0ZW1wbGF0ZS5odG1sL2NvbmYvd2UtcmV0YWlsL3NldHRpbmdzL3djbS9wb2xp +Y2llcy9jb21tZXJjZS9jb21wb25lbnRzL3Byb2R1Y3QvaW1hZ2UvcG9saWN5XzE2NDczMDU2NjIwMDMwODI0ND9kaWFsb2c9JTJGbGlicyUyRmZvdW5kYXRpb24lMkZjb21wb25lbnRzJTJGaW1hZ2Ul +MkZjcSUzQWRlc2lnbl9kaWFsb2cmYW1wO3JlZmVycmVyPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQmYW1wO3BvbGljeUNvbnRlbnRQYXRo +PSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZwcm9kdWN0cyUyRmVxdWlwbWVudCUyRnN1cmZpbmclMkZ0aGUtc3RyZXRjaC1sb25nYm9hcmQlMkZqY3IlM0Fj +b250ZW50JTJGcm9vdCUyRnByb2R1Y3QlMkZpbWFnZSZhbXA7cG9saWN5Q29udGVudFJlc291cmNlVHlwZT1jb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2UmYW1wO3BvbGljeURp +cmVjdG9yeVBhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGcG9saWNpZXMlMkZjb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2UlMkYmYW1wO3BvbGlj +eU1hcHBpbmdQYXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnRlbXBsYXRlcyUyRnByb2R1Y3QtcGFnZSUyRnBvbGljaWVzJTJGamNyJTNBY29udGVudCUyRnJvb3QlMkZw +cm9kdWN0JTJGY29tbWVyY2UlMkZjb21wb25lbnRzJTJGcHJvZHVjdCUyRmltYWdlJmFtcDtwb2xpY3lNYXBwaW5nUmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9saWNpZXMl +MkZtYXBwaW5nJmFtcDtwb2xpY3lOYW1lPXBvbGljeV8xNjQ3MzA1NjYyMDAzMDgyNDQmYW1wO3BvbGljeVJlbGF0aXZlUGF0aD1jb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2Ul +MkZwb2xpY3lfMTY0NzMwNTY2MjAwMzA4MjQ0JmFtcDtyZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY3klMkZwb2xpY3kmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nQ2xh +c3NpYyZxdW90OzomcXVvdDsvbGlicy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW1hZ2UvZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDt0eXBlJnF1b3Q7OiZxdW90O2NvbW1lcmNlL2NvbXBvbmVudHMv +cHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtpc1Jlc3BvbnNpdmVHcmlkJnF1b3Q7OmZhbHNlLCZxdW90O3BvbGljeVBhdGgmcXVvdDs6JnF1b3Q7cm9vdC9wcm9kdWN0L2NvbW1lcmNlL2NvbXBvbmVu +dHMvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtjc3AmcXVvdDs6JnF1b3Q7cGFnZXxiYXNpY3BhZ2Uvcm9vdHxyZXNwb25zaXZlZ3JpZC9yZXNwb25zaXZlZ3JpZC9wcm9kdWN0Z3JpZHxsaXN0L2l0 +ZW0vaW1hZ2V8cGFyYmFzZSZxdW90OywmcXVvdDtlZGl0Q29uZmlnJnF1b3Q7OnsmcXVvdDtkcm9wVGFyZ2V0JnF1b3Q7Olt7JnF1b3Q7aWQmcXVvdDs6JnF1b3Q7aW1hZ2UmcXVvdDssJnF1b3Q7bmFt +ZSZxdW90OzomcXVvdDsuL2ZpbGVSZWZlcmVuY2UmcXVvdDssJnF1b3Q7YWNjZXB0JnF1b3Q7OlsmcXVvdDtpbWFnZS8uKiZxdW90O10sJnF1b3Q7Z3JvdXBzJnF1b3Q7OlsmcXVvdDttZWRpYSZxdW90 +O10sJnF1b3Q7cGFyYW1zJnF1b3Q7OnsmcXVvdDsuL2ltYWdlUm90YXRlJnF1b3Q7OiZxdW90OyZxdW90OywmcXVvdDsuL2ltYWdlTWFwJnF1b3Q7OiZxdW90OyZxdW90OywmcXVvdDsuL3NsaW5nOnJl +c291cmNlVHlwZSZxdW90OzomcXVvdDtjb21tZXJjZS9jb21wb25lbnRzL3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7Li9pbWFnZUNyb3AmcXVvdDs6JnF1b3Q7JnF1b3Q7fX1dLCZxdW90O2xpc3Rl +bmVycyZxdW90Ozp7JnF1b3Q7YWZ0ZXJlZGl0JnF1b3Q7OiZxdW90O1JFRlJFU0hfUEFHRSZxdW90O30sJnF1b3Q7YWN0aW9ucyZxdW90OzpbJnF1b3Q7Q1Eud2NtLkVkaXRCYXNlLkVESVRBTk5PVEFU +RSZxdW90Oyx7JnF1b3Q7eHR5cGUmcXVvdDs6JnF1b3Q7dGJzZXBhcmF0b3ImcXVvdDt9LCZxdW90O0NRLndjbS5FZGl0QmFzZS5ERUxFVEUmcXVvdDtdLCZxdW90O2Rpc2FibGVUYXJnZXRpbmcmcXVv +dDs6dHJ1ZX0sJnF1b3Q7bXNtOmxpdmVSZWxhdGlvbnNoaXAmcXVvdDs6eyZxdW90O21zbTpzeW5jUGF0aCZxdW90OzomcXVvdDsvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZx +dW90O21zbTpzb3VyY2VQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L2NhdGFsb2dzL3dlLXJldGFpbC9lbi93ZWJzaXRlLXRlbXBsYXRlLXBhZ2VzL3Byb2R1Y3QtcGFnZS10ZW1wbGF0ZS9qY3I6Y29u +dGVudC9yb290L3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7bXNtOnRhcmdldFBhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1 +aXBtZW50L3N1cmZpbmcvdGhlLXN0cmV0Y2gtbG9uZ2JvYXJkL2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDttc206bGl2ZUNvcHlQYXRoJnF1b3Q7OiZxdW90Oy9jb250 +ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9zdXJmaW5nL3RoZS1zdHJldGNoLWxvbmdib2FyZCZxdW90OywmcXVvdDttc206bGl2ZUNvcHlCcFBhdGgm +cXVvdDs6JnF1b3Q7L2NvbnRlbnQvY2F0YWxvZ3Mvd2UtcmV0YWlsL2VuL3dlYnNpdGUtdGVtcGxhdGUtcGFnZXMvcHJvZHVjdC1wYWdlLXRlbXBsYXRlJnF1b3Q7LCZxdW90O21zbTppc0RlZXAmcXVv +dDs6ZmFsc2UsJnF1b3Q7bXNtOmlzSW5oZXJpdGVkQ29uZmlnJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzUm9vdENvbmZpZyZxdW90Ozp0cnVlLCZxdW90O21zbTpzdGF0dXMmcXVvdDs6eyZxdW90O21z +bTppc0NhbmNlbGxlZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNDYW5jZWxsZWRGb3JDaGlsZHJlbiZxdW90OzpmYWxzZSwmcXVvdDttc206aXNDYW5jZWxsZWRPbiZxdW90OzomcXVvdDsmcXVvdDss +JnF1b3Q7bXNtOmlzRWRpdGFibGUmcXVvdDs6dHJ1ZSwmcXVvdDttc206aXNUYXJnZXRFeGlzdGluZyZxdW90Ozp0cnVlLCZxdW90O21zbTppc1NvdXJjZUV4aXN0aW5nJnF1b3Q7OmZhbHNlLCZxdW90 +O21zbTppc1BhZ2UmcXVvdDs6ZmFsc2UsJnF1b3Q7Y3E6bGFzdFJvbGxlZG91dCZxdW90OzoxNDY3NjI0OTAyOTU0LCZxdW90O2NxOmxhc3RSb2xsZWRvdXRCeSZxdW90OzomcXVvdDthZG1pbiZxdW90 +OywmcXVvdDttc206aXNTb3VyY2VNb2RpZmllZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNTb3VyY2VEZWxldGVkJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzVGFyZ2V0RnJvbURpZmZlcmVudFRyZWUm +cXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzVGFyZ2V0U2tpcHBlZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNUYXJnZXRNb2RpZmllZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNUYXJnZXREZWxldGVk +JnF1b3Q7OmZhbHNlLCZxdW90O21zbTppc1RhcmdldE1hbnVhbGx5Q3JlYXRlZCZxdW90OzpmYWxzZSwmcXVvdDttc206Y2FuY2VsbGVkUHJvcGVydGllcyZxdW90OzpbXX0sJnF1b3Q7Y3E6cm9sbG91 +dENvbmZpZ3MmcXVvdDs6WyZxdW90Oy9saWJzL21zbS9jYXRhbG9nL3JvbGxvdXRjb25maWdzL2NhdGFsb2dwYWdlY29udGVudCZxdW90OywmcXVvdDsvbGlicy9tc20vY2F0YWxvZy9yb2xsb3V0Y29u +Zmlncy9jYXRhbG9ncm9sbG91dGhvb2tzJnF1b3Q7XSwmcXVvdDttc206Y29tcHV0YXRpb25UaW1lJnF1b3Q7Oi0xfX0iPjwvY3E+CgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxoMyBj +bGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tdGl0bGUgaDQiPlRoZSBTdHJldGNoIExvbmdib2FyZDwvaDM+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1zdWJ0 +aXRsZSBzbWFsbCB0ZXh0LW11dGVkIj5lcXVpcG1lbnQ8L3NwYW4+CgogICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1wcmljZSI+CiAgICAgICAgICAgICAgICA8 +c3Bhbj4kOTAwLjAwPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXByaWNlLW5ldyI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHMgY2xhc3M9 +IndlLVByb2R1Y3RzR3JpZC1pdGVtLXByaWNlLW9sZCI+PC9zPgogICAgICAgICAgICA8L3N0cm9uZz4KCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1kaXNjb3Vu +dCBoaWRkZW4iPjxzcGFuPjwvc3Bhbj5vZmY8L3NwYW4+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9wcm92ZXR0YS9jb250ZW50L3dlLXJl +dGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9zdXJmaW5nL3RoZS1zdHJldGNoLWxvbmdib2FyZC5odG1sIiBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tbGluayI+ +PC9hPgoKICAgICAgICA8L2Rpdj4KICAgICAgICA8IS0tIC8ud2UtUHJvZHVjdHNHcmlkLWl0ZW0gLS0+CiAgICA8L3dlLXByb2R1Y3QtaXRlbT4KPC9saT48IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwi +dHlwZSI6IndlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9wcm9kdWN0Z3JpZC9pdGVtIiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1 +YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L3N1cmZpbmcvdGhlLXN0cmV0Y2gtbG9uZ2JvYXJkL2pjcjpjb250ZW50Iiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9h +cHBzL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9wcm9kdWN0Z3JpZC9pdGVtL2l0ZW0uaHRtbCIsInRvdGFsVGltZSI6NSwic2VsZlRpbWUiOjV9LS0+CgogICAgCiAgICAgICAgCjxsaSBjbGFz +cz0iZm91bmRhdGlvbi1saXN0LWl0ZW0iPgogICAgPHdlLXByb2R1Y3QtaXRlbSBwcmljZT0iJDM5Ljk5IiBpbmxpbmUtdGVtcGxhdGU9IiI+CiAgICAgICAgPGRpdiBjbGFzcz0id2UtUHJvZHVjdHNH +cmlkLWl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1pbWFnZSBpbWctY2VudGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNxLWltYWdlLWpzcC0v +Y29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvcnVubmluZy9mYWJhLXJ1bm5pbmctcGFudHMvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdl +Ij48aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmlsZXMvY3FfY2tfMTQ3MzY4MDg4MzMzNS5qcGciIGFsdD0iMTE2MTM4NjQ3IiB0aXRsZT0iMTE2MTM4NjQ3IiBjbGFzcz0iY3EtZGQtaW1hZ2UiPjwvZGl2 +PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaW1hZ2VEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY3FcdTAwMkRpbWFn +ZVx1MDAyRGpzcFx1MDAyRFwvY29udGVudFwvd2VcdTAwMkRyZXRhaWxcL2xhbmd1YWdlXHUwMDJEbWFzdGVyc1wvZW5cL3Byb2R1Y3RzXC9lcXVpcG1lbnRcL3J1bm5pbmdcL2ZhYmFcdTAwMkRydW5u +aW5nXHUwMDJEcGFudHNcL2pjcjpjb250ZW50XC9yb290XC9wcm9kdWN0XC9pbWFnZSIpOwogICAgICAgIHZhciBpbWFnZUV2YXJzID0gJ3sgaW1hZ2VMaW5rOiAiIiwgaW1hZ2VBc3NldDogIi4uLy4u +Ly4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvcmVzb3VyY2VzLzExNjEzODY0Ny5qcGciLCBpbWFnZVRpdGxlOiAiMTE2MTM4NjQ3IiB9JzsKICAgICAgICB2YXIgdGFnTm9kZXMgPSBpbWFn +ZURpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFnTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGxpbmsgPSB0YWdOb2Rl +cy5pdGVtKGkpOyAKICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ29uY2xpY2snLCAnQ1FfQW5hbHl0aWNzLnJlY29yZCh7ZXZlbnQ6ICJpbWFnZUNsaWNrIiwgdmFsdWVzOiAnICsgaW1hZ2VF +dmFycyArICcsIGNvbGxlY3Q6IGZhbHNlLCBvcHRpb25zOiB7IG9iajogdGhpcyB9LCBjb21wb25lbnRQYXRoOiAiY29tbWVyY2VcL2NvbXBvbmVudHNcL3Byb2R1Y3RcL2ltYWdlIn0pJyk7CiAgICAg +ICAgfQogICAgICAgIAogICAgfSkoKTsKPC9zY3JpcHQ+Cgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6ImNvbW1lcmNlL2NvbXBvbmVudHMvcHJvZHVjdC9pbWFnZSIsInBhdGgiOiIuLi8u +Li8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9pbWFnZS5qc3AiLCJ0b3RhbFRpbWUiOjEsInNlbGZUaW1lIjoxfS0tPgo8Y3EgZGF0YS1wYXRoPSIuLi8uLi8uLi8uLi8u +Li8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9ydW5uaW5nL2ZhYmEtcnVubmluZy1wYW50cy9qY3I6Y29udGVudC9y +b290L3Byb2R1Y3QvaW1hZ2UiIGRhdGEtY29uZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQv +cnVubmluZy9mYWJhLXJ1bm5pbmctcGFudHMvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90O3NsaW5nUGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFu +Z3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvcnVubmluZy9mYWJhLXJ1bm5pbmctcGFudHMvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlLmh0bWwmcXVvdDssJnF1b3Q7ZGlh +bG9nJnF1b3Q7OiZxdW90Oy9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9jcTpkaWFsb2cmcXVvdDssJnF1b3Q7ZGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90Oywm +cXVvdDtkaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFn +ZS9fY3FfZGlhbG9nLmh0bWwvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvcnVubmluZy9mYWJhLXJ1bm5pbmctcGFudHMvamNyOmNvbnRlbnQv +cm9vdC9wcm9kdWN0L2ltYWdlJnF1b3Q7LCZxdW90O2RpYWxvZ0NsYXNzaWMmcXVvdDs6JnF1b3Q7L2xpYnMvZm91bmRhdGlvbi9jb21wb25lbnRzL2ltYWdlL2RpYWxvZyZxdW90OywmcXVvdDtkZXNp +Z25EaWFsb2cmcXVvdDs6JnF1b3Q7L2xpYnMvZm91bmRhdGlvbi9jb21wb25lbnRzL2ltYWdlL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90 +O2Z1bGxzY3JlZW4mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVy +cmlkZS9saWJzL2ZvdW5kYXRpb24vY29tcG9uZW50cy9pbWFnZS9fY3FfZGVzaWduX2RpYWxvZy5wb2xpY3lkZXNpZ24uZWRpdGFibGV0ZW1wbGF0ZS5odG1sL2NvbmYvd2UtcmV0YWlsL3NldHRpbmdz +L3djbS9wb2xpY2llcy9jb21tZXJjZS9jb21wb25lbnRzL3Byb2R1Y3QvaW1hZ2UvcG9saWN5XzE2NDczMDU2NjIwNjM0NDA2Mj9kaWFsb2c9JTJGbGlicyUyRmZvdW5kYXRpb24lMkZjb21wb25lbnRz +JTJGaW1hZ2UlMkZjcSUzQWRlc2lnbl9kaWFsb2cmYW1wO3JlZmVycmVyPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQmYW1wO3BvbGljeUNv +bnRlbnRQYXRoPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZwcm9kdWN0cyUyRmVxdWlwbWVudCUyRnJ1bm5pbmclMkZmYWJhLXJ1bm5pbmctcGFudHMlMkZq +Y3IlM0Fjb250ZW50JTJGcm9vdCUyRnByb2R1Y3QlMkZpbWFnZSZhbXA7cG9saWN5Q29udGVudFJlc291cmNlVHlwZT1jb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2UmYW1wO3Bv +bGljeURpcmVjdG9yeVBhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGcG9saWNpZXMlMkZjb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJGaW1hZ2UlMkYmYW1w +O3BvbGljeU1hcHBpbmdQYXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnRlbXBsYXRlcyUyRnByb2R1Y3QtcGFnZSUyRnBvbGljaWVzJTJGamNyJTNBY29udGVudCUyRnJv +b3QlMkZwcm9kdWN0JTJGY29tbWVyY2UlMkZjb21wb25lbnRzJTJGcHJvZHVjdCUyRmltYWdlJmFtcDtwb2xpY3lNYXBwaW5nUmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9s +aWNpZXMlMkZtYXBwaW5nJmFtcDtwb2xpY3lOYW1lPXBvbGljeV8xNjQ3MzA1NjYyMDYzNDQwNjImYW1wO3BvbGljeVJlbGF0aXZlUGF0aD1jb21tZXJjZSUyRmNvbXBvbmVudHMlMkZwcm9kdWN0JTJG +aW1hZ2UlMkZwb2xpY3lfMTY0NzMwNTY2MjA2MzQ0MDYyJmFtcDtyZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY3klMkZwb2xpY3kmcXVvdDssJnF1b3Q7ZGVzaWduRGlh +bG9nQ2xhc3NpYyZxdW90OzomcXVvdDsvbGlicy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW1hZ2UvZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDt0eXBlJnF1b3Q7OiZxdW90O2NvbW1lcmNlL2NvbXBv +bmVudHMvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtpc1Jlc3BvbnNpdmVHcmlkJnF1b3Q7OmZhbHNlLCZxdW90O3BvbGljeVBhdGgmcXVvdDs6JnF1b3Q7cm9vdC9wcm9kdWN0L2NvbW1lcmNlL2Nv +bXBvbmVudHMvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDtjc3AmcXVvdDs6JnF1b3Q7cGFnZXxiYXNpY3BhZ2Uvcm9vdHxyZXNwb25zaXZlZ3JpZC9yZXNwb25zaXZlZ3JpZC9wcm9kdWN0Z3JpZHxs +aXN0L2l0ZW0vaW1hZ2V8cGFyYmFzZSZxdW90OywmcXVvdDtlZGl0Q29uZmlnJnF1b3Q7OnsmcXVvdDtkcm9wVGFyZ2V0JnF1b3Q7Olt7JnF1b3Q7aWQmcXVvdDs6JnF1b3Q7aW1hZ2UmcXVvdDssJnF1 +b3Q7bmFtZSZxdW90OzomcXVvdDsuL2ZpbGVSZWZlcmVuY2UmcXVvdDssJnF1b3Q7YWNjZXB0JnF1b3Q7OlsmcXVvdDtpbWFnZS8uKiZxdW90O10sJnF1b3Q7Z3JvdXBzJnF1b3Q7OlsmcXVvdDttZWRp +YSZxdW90O10sJnF1b3Q7cGFyYW1zJnF1b3Q7OnsmcXVvdDsuL2ltYWdlUm90YXRlJnF1b3Q7OiZxdW90OyZxdW90OywmcXVvdDsuL2ltYWdlTWFwJnF1b3Q7OiZxdW90OyZxdW90OywmcXVvdDsuL3Ns +aW5nOnJlc291cmNlVHlwZSZxdW90OzomcXVvdDtjb21tZXJjZS9jb21wb25lbnRzL3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7Li9pbWFnZUNyb3AmcXVvdDs6JnF1b3Q7JnF1b3Q7fX1dLCZxdW90 +O2xpc3RlbmVycyZxdW90Ozp7JnF1b3Q7YWZ0ZXJlZGl0JnF1b3Q7OiZxdW90O1JFRlJFU0hfUEFHRSZxdW90O30sJnF1b3Q7YWN0aW9ucyZxdW90OzpbJnF1b3Q7Q1Eud2NtLkVkaXRCYXNlLkVESVRB +Tk5PVEFURSZxdW90Oyx7JnF1b3Q7eHR5cGUmcXVvdDs6JnF1b3Q7dGJzZXBhcmF0b3ImcXVvdDt9LCZxdW90O0NRLndjbS5FZGl0QmFzZS5ERUxFVEUmcXVvdDtdLCZxdW90O2Rpc2FibGVUYXJnZXRp +bmcmcXVvdDs6dHJ1ZX0sJnF1b3Q7bXNtOmxpdmVSZWxhdGlvbnNoaXAmcXVvdDs6eyZxdW90O21zbTpzeW5jUGF0aCZxdW90OzomcXVvdDsvamNyOmNvbnRlbnQvcm9vdC9wcm9kdWN0L2ltYWdlJnF1 +b3Q7LCZxdW90O21zbTpzb3VyY2VQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L2NhdGFsb2dzL3dlLXJldGFpbC9lbi93ZWJzaXRlLXRlbXBsYXRlLXBhZ2VzL3Byb2R1Y3QtcGFnZS10ZW1wbGF0ZS9q +Y3I6Y29udGVudC9yb290L3Byb2R1Y3QvaW1hZ2UmcXVvdDssJnF1b3Q7bXNtOnRhcmdldFBhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVj +dHMvZXF1aXBtZW50L3J1bm5pbmcvZmFiYS1ydW5uaW5nLXBhbnRzL2pjcjpjb250ZW50L3Jvb3QvcHJvZHVjdC9pbWFnZSZxdW90OywmcXVvdDttc206bGl2ZUNvcHlQYXRoJnF1b3Q7OiZxdW90Oy9j +b250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9ydW5uaW5nL2ZhYmEtcnVubmluZy1wYW50cyZxdW90OywmcXVvdDttc206bGl2ZUNvcHlCcFBhdGgm +cXVvdDs6JnF1b3Q7L2NvbnRlbnQvY2F0YWxvZ3Mvd2UtcmV0YWlsL2VuL3dlYnNpdGUtdGVtcGxhdGUtcGFnZXMvcHJvZHVjdC1wYWdlLXRlbXBsYXRlJnF1b3Q7LCZxdW90O21zbTppc0RlZXAmcXVv +dDs6ZmFsc2UsJnF1b3Q7bXNtOmlzSW5oZXJpdGVkQ29uZmlnJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzUm9vdENvbmZpZyZxdW90Ozp0cnVlLCZxdW90O21zbTpzdGF0dXMmcXVvdDs6eyZxdW90O21z +bTppc0NhbmNlbGxlZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNDYW5jZWxsZWRGb3JDaGlsZHJlbiZxdW90OzpmYWxzZSwmcXVvdDttc206aXNDYW5jZWxsZWRPbiZxdW90OzomcXVvdDsmcXVvdDss +JnF1b3Q7bXNtOmlzRWRpdGFibGUmcXVvdDs6dHJ1ZSwmcXVvdDttc206aXNUYXJnZXRFeGlzdGluZyZxdW90Ozp0cnVlLCZxdW90O21zbTppc1NvdXJjZUV4aXN0aW5nJnF1b3Q7OmZhbHNlLCZxdW90 +O21zbTppc1BhZ2UmcXVvdDs6ZmFsc2UsJnF1b3Q7Y3E6bGFzdFJvbGxlZG91dCZxdW90OzoxNDY3NjI0OTA2NjUxLCZxdW90O2NxOmxhc3RSb2xsZWRvdXRCeSZxdW90OzomcXVvdDthZG1pbiZxdW90 +OywmcXVvdDttc206aXNTb3VyY2VNb2RpZmllZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNTb3VyY2VEZWxldGVkJnF1b3Q7OnRydWUsJnF1b3Q7bXNtOmlzVGFyZ2V0RnJvbURpZmZlcmVudFRyZWUm +cXVvdDs6ZmFsc2UsJnF1b3Q7bXNtOmlzVGFyZ2V0U2tpcHBlZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNUYXJnZXRNb2RpZmllZCZxdW90OzpmYWxzZSwmcXVvdDttc206aXNUYXJnZXREZWxldGVk +JnF1b3Q7OmZhbHNlLCZxdW90O21zbTppc1RhcmdldE1hbnVhbGx5Q3JlYXRlZCZxdW90OzpmYWxzZSwmcXVvdDttc206Y2FuY2VsbGVkUHJvcGVydGllcyZxdW90OzpbXX0sJnF1b3Q7Y3E6cm9sbG91 +dENvbmZpZ3MmcXVvdDs6WyZxdW90Oy9saWJzL21zbS9jYXRhbG9nL3JvbGxvdXRjb25maWdzL2NhdGFsb2dwYWdlY29udGVudCZxdW90OywmcXVvdDsvbGlicy9tc20vY2F0YWxvZy9yb2xsb3V0Y29u +Zmlncy9jYXRhbG9ncm9sbG91dGhvb2tzJnF1b3Q7XSwmcXVvdDttc206Y29tcHV0YXRpb25UaW1lJnF1b3Q7Oi0xfX0iPjwvY3E+CgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxoMyBj +bGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tdGl0bGUgaDQiPkZhYmEgUnVubmluZyBQYW50czwvaDM+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1zdWJ0aXRs +ZSBzbWFsbCB0ZXh0LW11dGVkIj5wYW50czwvc3Bhbj4KCiAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLXByaWNlIj4KICAgICAgICAgICAgICAgIDxzcGFuPiQz +OS45OTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3ZS1Qcm9kdWN0c0dyaWQtaXRlbS1wcmljZS1uZXciPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzIGNsYXNzPSJ3ZS1Qcm9k +dWN0c0dyaWQtaXRlbS1wcmljZS1vbGQiPjwvcz4KICAgICAgICAgICAgPC9zdHJvbmc+CgogICAgICAgICAgICA8c3BhbiBjbGFzcz0id2UtUHJvZHVjdHNHcmlkLWl0ZW0tZGlzY291bnQgaGlkZGVu +Ij48c3Bhbj48L3NwYW4+b2ZmPC9zcGFuPgogICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC93ZS1yZXRhaWwvbGFu +Z3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvcnVubmluZy9mYWJhLXJ1bm5pbmctcGFudHMuaHRtbCIgY2xhc3M9IndlLVByb2R1Y3RzR3JpZC1pdGVtLWxpbmsiPjwvYT4KCiAgICAg +ICAgPC9kaXY+CiAgICAgICAgPCEtLSAvLndlLVByb2R1Y3RzR3JpZC1pdGVtIC0tPgogICAgPC93ZS1wcm9kdWN0LWl0ZW0+CjwvbGk+PCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJ3ZXJl +dGFpbC9jb21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQvaXRlbSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJz +L2VuL3Byb2R1Y3RzL2VxdWlwbWVudC9ydW5uaW5nL2ZhYmEtcnVubmluZy1wYW50cy9qY3I6Y29udGVudCIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy93ZXJldGFpbC9j +b21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQvaXRlbS9pdGVtLmh0bWwiLCJ0b3RhbFRpbWUiOjYsInNlbGZUaW1lIjo1fS0tPgoKICAgIDwvdWw+CjwvZGl2PgoKICAgIAoKPCEtLWNxeyJkZWNv +cmF0ZWQiOnRydWUsInR5cGUiOiJ3ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQiLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRh +aWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC9wcm9kdWN0X2dyaWQiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3JpcHQg +L2FwcHMvd2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3Byb2R1Y3RncmlkL3Byb2R1Y3RncmlkLmh0bWwiLCJ0b3RhbFRpbWUiOjMzLCJzZWxmVGltZSI6NH0tLT4KPGNxIGRhdGEtcGF0aD0iLi4v +Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC9wcm9kdWN0 +X2dyaWQiIGRhdGEtY29uZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNw +b25zaXZlZ3JpZC9wcm9kdWN0X2dyaWQmcXVvdDssJnF1b3Q7c2xpbmdQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29u +dGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3Byb2R1Y3RfZ3JpZC5odG1sJnF1b3Q7LCZxdW90O2RpYWxvZyZxdW90OzomcXVvdDsvYXBwcy93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvcHJvZHVj +dGdyaWQvY3E6ZGlhbG9nJnF1b3Q7LCZxdW90O2RpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1 +b3Q7ZGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvYXBwcy93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQvX2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0 +YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvcHJvZHVjdF9ncmlkJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZyZxdW90OzomcXVv +dDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL2xpc3QvdjIvbGlzdC9jcTpkZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xheW91dCZxdW90OzomcXVvdDtmdWxsc2NyZWVuJnF1 +b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvYXBwcy9jb3Jl +L3djbS9jb21wb25lbnRzL2xpc3QvdjIvbGlzdC9fY3FfZGVzaWduX2RpYWxvZy5wb2xpY3lkZXNpZ24uZWRpdGFibGV0ZW1wbGF0ZS5odG1sL2NvbmYvd2UtcmV0YWlsL3NldHRpbmdzL3djbS9wb2xp +Y2llcy93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQvcG9saWN5XzE2NDczMDU2NjIxMDgxOTc0Nj9kaWFsb2c9JTJGYXBwcyUyRmNvcmUlMkZ3Y20lMkZjb21wb25lbnRzJTJG +bGlzdCUyRnYyJTJGbGlzdCUyRmNxJTNBZGVzaWduX2RpYWxvZyZhbXA7cmVmZXJyZXI9JTJGY29udGVudCUyRndlLXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUyRmVxdWlwbWVudCZhbXA7 +cG9saWN5Q29udGVudFBhdGg9JTJGY29udGVudCUyRndlLXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUyRmVxdWlwbWVudCUyRmpjciUzQWNvbnRlbnQlMkZyb290JTJGcmVzcG9uc2l2ZWdy +aWQlMkZwcm9kdWN0X2dyaWQmYW1wO3BvbGljeUNvbnRlbnRSZXNvdXJjZVR5cGU9d2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnByb2R1Y3RncmlkJmFtcDtwb2xpY3lEaXJlY3RvcnlQ +YXRoPSUyRmNvbmYlMkZ3ZS1yZXRhaWwlMkZzZXR0aW5ncyUyRndjbSUyRnBvbGljaWVzJTJGd2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnByb2R1Y3RncmlkJTJGJmFtcDtwb2xpY3lN +YXBwaW5nUGF0aD0lMkZjb25mJTJGd2UtcmV0YWlsJTJGc2V0dGluZ3MlMkZ3Y20lMkZ0ZW1wbGF0ZXMlMkZoZXJvLXBhZ2UlMkZwb2xpY2llcyUyRmpjciUzQWNvbnRlbnQlMkZyb290JTJGcmVzcG9u +c2l2ZWdyaWQlMkZ3ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGcHJvZHVjdGdyaWQmYW1wO3BvbGljeU1hcHBpbmdSZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZw +b2xpY2llcyUyRm1hcHBpbmcmYW1wO3BvbGljeU5hbWU9cG9saWN5XzE2NDczMDU2NjIxMDgxOTc0NiZhbXA7cG9saWN5UmVsYXRpdmVQYXRoPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQl +MkZwcm9kdWN0Z3JpZCUyRnBvbGljeV8xNjQ3MzA1NjYyMTA4MTk3NDYmYW1wO3Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGljeSUyRnBvbGljeSZxdW90OywmcXVvdDtk +ZXNpZ25EaWFsb2dDbGFzc2ljJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvbGlzdC92Mi9saXN0L2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7dHlwZSZxdW90OzomcXVv +dDt3ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvcHJvZHVjdGdyaWQmcXVvdDssJnF1b3Q7aXNSZXNwb25zaXZlR3JpZCZxdW90OzpmYWxzZSwmcXVvdDtwb2xpY3lQYXRoJnF1b3Q7OiZxdW90O3Jv +b3QvcmVzcG9uc2l2ZWdyaWQvd2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3Byb2R1Y3RncmlkJnF1b3Q7LCZxdW90O2NzcCZxdW90OzomcXVvdDtwYWdlfGJhc2ljcGFnZS9yb290fHJlc3BvbnNp +dmVncmlkL3Jlc3BvbnNpdmVncmlkL3Byb2R1Y3RncmlkfGxpc3QmcXVvdDssJnF1b3Q7ZWRpdENvbmZpZyZxdW90Ozp7JnF1b3Q7ZHJvcFRhcmdldCZxdW90OzpbeyZxdW90O2lkJnF1b3Q7OiZxdW90 +O3BhZ2VzJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7Li9wYWdlcyZxdW90OywmcXVvdDthY2NlcHQmcXVvdDs6WyZxdW90OyomcXVvdDtdLCZxdW90O2dyb3VwcyZxdW90OzpbJnF1b3Q7cGFn +ZSZxdW90O10sJnF1b3Q7cGFyYW1zJnF1b3Q7OnsmcXVvdDsuL2xpc3RGcm9tJnF1b3Q7OiZxdW90O3N0YXRpYyZxdW90O319XX19Ij48L2NxPgo8L2Rpdj4KPGRpdiBjbGFzcz0iYnV0dG9uIGFlbS1H +cmlkQ29sdW1uIGFlbS1HcmlkQ29sdW1uLS1kZWZhdWx0LS0xMiI+CjxhIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgYnRuLWFjdGlvbiBjcS1kZC1saW5rVG8gIiBocmVmPSJodHRwczovL2ZpbGVzLnNh +bmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQuaHRtbCIgcm9sZT0iYnV0dG9uIj5BbGwgZXF1aXBtZW50PC9h +Pgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9idXR0b24iLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVu +dC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC9idXR0b24iLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3Jp +cHQgL2FwcHMvd2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L2J1dHRvbi9idXR0b24uaHRtbCIsInRvdGFsVGltZSI6MSwic2VsZlRpbWUiOjF9LS0+CjxjcSBkYXRhLXBhdGg9Ii4uLy4uLy4uLy4u +Ly4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvYnV0dG9uIiBkYXRhLWNv +bmZpZz0ieyZxdW90O3BhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvYnV0 +dG9uJnF1b3Q7LCZxdW90O3NsaW5nUGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZl +Z3JpZC9idXR0b24uaHRtbCZxdW90OywmcXVvdDtkaWFsb2cmcXVvdDs6JnF1b3Q7L2FwcHMvd2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L2J1dHRvbi9jcTpkaWFsb2cmcXVvdDssJnF1b3Q7ZGlh +bG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dMYXlvdXQmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9v +dmVycmlkZS9hcHBzL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9idXR0b24vX2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pj +cjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvYnV0dG9uJnF1b3Q7LCZxdW90O3R5cGUmcXVvdDs6JnF1b3Q7d2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L2J1dHRvbiZxdW90OywmcXVvdDtp +c1Jlc3BvbnNpdmVHcmlkJnF1b3Q7OmZhbHNlLCZxdW90O3BvbGljeVBhdGgmcXVvdDs6JnF1b3Q7cm9vdC9yZXNwb25zaXZlZ3JpZC93ZXJldGFpbC9jb21wb25lbnRzL2NvbnRlbnQvYnV0dG9uJnF1 +b3Q7LCZxdW90O2NzcCZxdW90OzomcXVvdDtwYWdlfGJhc2ljcGFnZS9yb290fHJlc3BvbnNpdmVncmlkL3Jlc3BvbnNpdmVncmlkL2J1dHRvbiZxdW90OywmcXVvdDtlZGl0Q29uZmlnJnF1b3Q7Onsm +cXVvdDtkcm9wVGFyZ2V0JnF1b3Q7Olt7JnF1b3Q7aWQmcXVvdDs6JnF1b3Q7bGlua1RvJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7Li9saW5rVG8mcXVvdDssJnF1b3Q7YWNjZXB0JnF1b3Q7 +OlsmcXVvdDsqJnF1b3Q7XSwmcXVvdDtncm91cHMmcXVvdDs6WyZxdW90O3BhZ2UmcXVvdDtdfV19fSI+PC9jcT4KPC9kaXY+CjxkaXYgY2xhc3M9InRpdGxlIGFlbS1HcmlkQ29sdW1uIGFlbS1Hcmlk +Q29sdW1uLS1kZWZhdWx0LS0xMiI+CjxkaXYgY2xhc3M9ImNtcC10aXRsZSI+CiAgICA8aDIgY2xhc3M9ImNtcC10aXRsZV9fdGV4dCI+V2ludGVyIGlzIGNvbWluZywgZ2V0IHJlYWR5PC9oMj4KPC9k +aXY+CgogICAgCgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90aXRsZSIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8u +Li9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RpdGxlXzQxOTY5NDA0NiIsInNlbGVjdG9ycyI6bnVs +bCwic2VydmxldCI6IlNjcmlwdCAvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RpdGxlL3YyL3RpdGxlL3RpdGxlLmh0bWwiLCJ0b3RhbFRpbWUiOjEsInNlbGZUaW1lIjoxfS0tPgo8Y3EgZGF0YS1w +YXRoPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlk +L3RpdGxlXzQxOTY5NDA0NiIgZGF0YS1jb25maWc9InsmcXVvdDtwYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVu +dC9yb290L3Jlc3BvbnNpdmVncmlkL3RpdGxlXzQxOTY5NDA0NiZxdW90OywmcXVvdDtzbGluZ1BhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1 +aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGl0bGVfNDE5Njk0MDQ2Lmh0bWwmcXVvdDssJnF1b3Q7ZGlhbG9nJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVu +dHMvdGl0bGUvdjIvdGl0bGUvY3E6ZGlhbG9nJnF1b3Q7LCZxdW90O2RpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2F1 +dG8mcXVvdDssJnF1b3Q7ZGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RpdGxlL3YyL3RpdGxlL19jcV9kaWFsb2cuaHRtbC9jb250ZW50 +L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RpdGxlXzQxOTY5NDA0NiZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2cm +cXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90aXRsZS92Mi90aXRsZS9jcTpkZXNpZ25fZGlhbG9nJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xheW91dCZxdW90OzomcXVvdDtm +dWxsc2NyZWVuJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZ0xvYWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJp +ZGUvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RpdGxlL3YyL3RpdGxlL19jcV9kZXNpZ25fZGlhbG9nLnBvbGljeWRlc2lnbi5lZGl0YWJsZXRlbXBsYXRlLmh0bWwvY29uZi93ZS1yZXRhaWwvc2V0 +dGluZ3Mvd2NtL3BvbGljaWVzL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90aXRsZS93ZS1yZXRhaWwtaGVyby1wYWdlP2RpYWxvZz0lMkZhcHBzJTJGY29yZSUyRndjbSUyRmNvbXBvbmVudHMl +MkZ0aXRsZSUyRnYyJTJGdGl0bGUlMkZjcSUzQWRlc2lnbl9kaWFsb2cmYW1wO3JlZmVycmVyPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQm +YW1wO3BvbGljeUNvbnRlbnRQYXRoPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnJlc3BvbnNp +dmVncmlkJTJGdGl0bGVfNDE5Njk0MDQ2JmFtcDtwb2xpY3lDb250ZW50UmVzb3VyY2VUeXBlPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0aXRsZSZhbXA7cG9saWN5RGlyZWN0b3J5 +UGF0aD0lMkZjb25mJTJGd2UtcmV0YWlsJTJGc2V0dGluZ3MlMkZ3Y20lMkZwb2xpY2llcyUyRndlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0aXRsZSUyRiZhbXA7cG9saWN5TWFwcGlu +Z1BhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGdGVtcGxhdGVzJTJGaGVyby1wYWdlJTJGcG9saWNpZXMlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnJlc3BvbnNpdmVn +cmlkJTJGd2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRpdGxlJmFtcDtwb2xpY3lNYXBwaW5nUmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9saWNpZXMlMkZt +YXBwaW5nJmFtcDtwb2xpY3lOYW1lPXdlLXJldGFpbC1oZXJvLXBhZ2UmYW1wO3BvbGljeVJlbGF0aXZlUGF0aD13ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGl0bGUlMkZ3ZS1yZXRh +aWwtaGVyby1wYWdlJmFtcDtyZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY3klMkZwb2xpY3kmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nQ2xhc3NpYyZxdW90OzomcXVv +dDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RpdGxlL3YyL3RpdGxlL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7aGFzUG9saWN5TWFwcGluZyZxdW90Ozp0cnVlLCZxdW90O3R5cGUmcXVv +dDs6JnF1b3Q7d2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L3RpdGxlJnF1b3Q7LCZxdW90O2lzUmVzcG9uc2l2ZUdyaWQmcXVvdDs6ZmFsc2UsJnF1b3Q7cG9saWN5UGF0aCZxdW90OzomcXVvdDty +b290L3Jlc3BvbnNpdmVncmlkL3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC90aXRsZSZxdW90OywmcXVvdDtjc3AmcXVvdDs6JnF1b3Q7cGFnZXxiYXNpY3BhZ2Uvcm9vdHxyZXNwb25zaXZlZ3Jp +ZC9yZXNwb25zaXZlZ3JpZC90aXRsZSZxdW90OywmcXVvdDtlZGl0Q29uZmlnJnF1b3Q7OnsmcXVvdDtpbnBsYWNlRWRpdGluZ0NvbmZpZyZxdW90Ozp7JnF1b3Q7YWN0aXZlJnF1b3Q7OnRydWUsJnF1 +b3Q7ZWRpdG9yVHlwZSZxdW90OzomcXVvdDt0aXRsZSZxdW90OywmcXVvdDtjb25maWdQYXRoJnF1b3Q7OiZxdW90Oy9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGl0bGUvdjIvdGl0bGUvY3E6ZWRp +dENvbmZpZy9jcTppbnBsYWNlRWRpdGluZy9jb25maWcmcXVvdDt9fSwmcXVvdDtpcGVDb25maWcmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQm +cXVvdDssJnF1b3Q7dGl0bGVUYWcmcXVvdDs6WyZxdW90O2gxJnF1b3Q7LCZxdW90O2gyJnF1b3Q7LCZxdW90O2gzJnF1b3Q7LCZxdW90O2g0JnF1b3Q7LCZxdW90O2g1JnF1b3Q7LCZxdW90O2g2JnF1 +b3Q7XSwmcXVvdDtjb25maWcmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dGl0bGVUYWcmcXVvdDs6WyZxdW90O2gxJnF1 +b3Q7LCZxdW90O2gyJnF1b3Q7LCZxdW90O2gzJnF1b3Q7LCZxdW90O2g0JnF1b3Q7LCZxdW90O2g1JnF1b3Q7LCZxdW90O2g2JnF1b3Q7XX19fSI+PC9jcT4KPC9kaXY+CjxkaXYgY2xhc3M9InRlYXNl +ciB3ZS1UZWFzZXIgYWVtLUdyaWRDb2x1bW4gYWVtLUdyaWRDb2x1bW4tLWRlZmF1bHQtLTEyIj4KPGRpdiBjbGFzcz0iY21wLXRlYXNlciBjcS1kZC1pbWFnZSI+CiAgICAKICAgIDxkaXYgY2xhc3M9 +ImNtcC10ZWFzZXJfX2ltYWdlIj4KPGRpdiBkYXRhLWNtcC1zcmM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvcmVzb3VyY2VzL2ZyZWVyaWRlLWV4dHJlbWUuanBnIiBkYXRh +LWFzc2V0LWlkPSIyMDdjYTRlYy0yNDZlLTQwNGItYjQ2NS1lMDQ2MzhkOWJjZDQiIGRhdGEtdGl0bGU9IkZyZWVyaWRlIEV4dHJlbWUiIGNsYXNzPSJjbXAtaW1hZ2UgY3EtZGQtaW1hZ2UiIGl0ZW1z +Y29wZT0iIiBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvSW1hZ2VPYmplY3QiPgogICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICA8aW1nIHNyYz0iLi9FcXVpcG1lbnRfZmls +ZXMvZnJlZXJpZGUtZXh0cmVtZS5qcGVnIiBjbGFzcz0iY21wLWltYWdlX19pbWFnZSIgaXRlbXByb3A9ImNvbnRlbnRVcmwiIGRhdGEtY21wLWhvb2staW1hZ2U9ImltYWdlIiBhbHQ9IkFnZ3Jlc3Np +dmUgcG93ZGVyIHNraWluZyIgdGl0bGU9IkZyZWVyaWRlIEV4dHJlbWUiPgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgCiAgICA8bWV0YSBpdGVtcHJvcD0iY2FwdGlvbiIgY29udGVudD0i +RnJlZXJpZGUgRXh0cmVtZSI+CjwvZGl2PgoKICAgIAo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6ImNvcmUvd2NtL2NvbXBvbmVudHMvaW1hZ2UvdjIvaW1hZ2UiLCJwYXRoIjoiLi4vLi4v +Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXJfNjQz +NjA2OTQ5L25vX3Jlc291cmNlXzAiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3JpcHQgL2FwcHMvY29yZS93Y20vY29tcG9uZW50cy9pbWFnZS92Mi9pbWFnZS9pbWFnZS5odG1sIiwidG90 +YWxUaW1lIjoxLCJzZWxmVGltZSI6MX0tLT4KPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iY21wLXRlYXNlcl9fY29udGVudCI+CiAgICAgICAgCiAgICAKCiAgICAgICAgCiAgICAKCiAgICAgICAgCiAg +ICA8ZGl2IGNsYXNzPSJjbXAtdGVhc2VyX19hY3Rpb24tY29udGFpbmVyIj4KICAgICAgICAKICAgIDxhIGNsYXNzPSJjbXAtdGVhc2VyX19hY3Rpb24tbGluayIgaHJlZj0iaHR0cHM6Ly9maWxlcy5z +YW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMvZXF1aXBtZW50L3Nub3ctc3BvcnRzLmh0bWwiPlNub3cgU3BvcnRzPC9hPgoK +ICAgIAogICAgICAgIAogICAgPGEgY2xhc3M9ImNtcC10ZWFzZXJfX2FjdGlvbi1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwv +bGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvc25vdy1zcG9ydHMuaHRtbCI+U2tpaW5nPC9hPgoKICAgIAogICAgICAgIAogICAgPGEgY2xhc3M9ImNtcC10ZWFzZXJfX2FjdGlv +bi1saW5rIiBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9wcm9kdWN0cy9lcXVpcG1lbnQvc25vdy1z +cG9ydHMuaHRtbCI+U25vd2JvYXJkaW5nPC9hPgoKICAgIDwvZGl2PgoKICAgIDwvZGl2Pgo8L2Rpdj4KCiAgICAKCjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2VyZXRhaWwvY29tcG9u +ZW50cy9jb250ZW50L3RlYXNlciIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29u +dGVudC9yb290L3Jlc3BvbnNpdmVncmlkL3RlYXNlcl82NDM2MDY5NDkiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3JpcHQgL2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEv +dGVhc2VyL3RlYXNlci5odG1sIiwidG90YWxUaW1lIjozLCJzZWxmVGltZSI6Mn0tLT4KPGNxIGRhdGEtcGF0aD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwv +bGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC90ZWFzZXJfNjQzNjA2OTQ5IiBkYXRhLWNvbmZpZz0ieyZxdW90O3BhdGgmcXVvdDs6JnF1 +b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzY0MzYwNjk0OSZxdW90OywmcXVvdDtz +bGluZ1BhdGgmcXVvdDs6JnF1b3Q7L2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzY0MzYw +Njk0OS5odG1sJnF1b3Q7LCZxdW90O2RpYWxvZyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvY3E6ZGlhbG9nJnF1b3Q7LCZxdW90O2RpYWxvZ0xv +YWRpbmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJp +ZGUvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3RlYXNlci92MS90ZWFzZXIvX2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpj +b250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyXzY0MzYwNjk0OSZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2cmcXVvdDs6JnF1b3Q7L2FwcHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIv +djEvdGVhc2VyL2NxOmRlc2lnbl9kaWFsb2cmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2Z1bGxzY3JlZW4mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTG9hZGluZ01v +ZGUmcXVvdDs6JnF1b3Q7YXV0byZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9hcHBzL2NvcmUvd2NtL2NvbXBvbmVudHMvdGVhc2VyL3YxL3RlYXNl +ci9fY3FfZGVzaWduX2RpYWxvZy5wb2xpY3lkZXNpZ24uZWRpdGFibGV0ZW1wbGF0ZS5odG1sL2NvbmYvd2UtcmV0YWlsL3NldHRpbmdzL3djbS9wb2xpY2llcy93ZXJldGFpbC9jb21wb25lbnRzL2Nv +bnRlbnQvdGVhc2VyL3BvbGljeV8xNTI2MDM3MjUzMjAyP2RpYWxvZz0lMkZhcHBzJTJGY29yZSUyRndjbSUyRmNvbXBvbmVudHMlMkZ0ZWFzZXIlMkZ2MSUyRnRlYXNlciUyRmNxJTNBZGVzaWduX2Rp +YWxvZyZhbXA7cmVmZXJyZXI9JTJGY29udGVudCUyRndlLXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUyRmVxdWlwbWVudCZhbXA7cG9saWN5Q29udGVudFBhdGg9JTJGY29udGVudCUyRndl +LXJldGFpbCUyRmxhbmd1YWdlLW1hc3RlcnMlMkZlbiUyRmVxdWlwbWVudCUyRmpjciUzQWNvbnRlbnQlMkZyb290JTJGcmVzcG9uc2l2ZWdyaWQlMkZ0ZWFzZXJfNjQzNjA2OTQ5JmFtcDtwb2xpY3lD +b250ZW50UmVzb3VyY2VUeXBlPXdlcmV0YWlsJTJGY29tcG9uZW50cyUyRmNvbnRlbnQlMkZ0ZWFzZXImYW1wO3BvbGljeURpcmVjdG9yeVBhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdz +JTJGd2NtJTJGcG9saWNpZXMlMkZ3ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250ZW50JTJGdGVhc2VyJTJGJmFtcDtwb2xpY3lNYXBwaW5nUGF0aD0lMkZjb25mJTJGd2UtcmV0YWlsJTJGc2V0dGlu +Z3MlMkZ3Y20lMkZ0ZW1wbGF0ZXMlMkZoZXJvLXBhZ2UlMkZwb2xpY2llcyUyRmpjciUzQWNvbnRlbnQlMkZyb290JTJGcmVzcG9uc2l2ZWdyaWQlMkZ3ZXJldGFpbCUyRmNvbXBvbmVudHMlMkZjb250 +ZW50JTJGdGVhc2VyJmFtcDtwb2xpY3lNYXBwaW5nUmVzb3VyY2VUeXBlPXdjbSUyRmNvcmUlMkZjb21wb25lbnRzJTJGcG9saWNpZXMlMkZtYXBwaW5nJmFtcDtwb2xpY3lOYW1lPXBvbGljeV8xNTI2 +MDM3MjUzMjAyJmFtcDtwb2xpY3lSZWxhdGl2ZVBhdGg9d2VyZXRhaWwlMkZjb21wb25lbnRzJTJGY29udGVudCUyRnRlYXNlciUyRnBvbGljeV8xNTI2MDM3MjUzMjAyJmFtcDtyZXNvdXJjZVR5cGU9 +d2NtJTJGY29yZSUyRmNvbXBvbmVudHMlMkZwb2xpY3klMkZwb2xpY3kmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nQ2xhc3NpYyZxdW90OzomcXVvdDsvYXBwcy9jb3JlL3djbS9jb21wb25lbnRzL3Rl +YXNlci92MS90ZWFzZXIvY3E6ZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDtoYXNQb2xpY3lNYXBwaW5nJnF1b3Q7OnRydWUsJnF1b3Q7dHlwZSZxdW90OzomcXVvdDt3ZXJldGFpbC9jb21wb25lbnRz +L2NvbnRlbnQvdGVhc2VyJnF1b3Q7LCZxdW90O2lzUmVzcG9uc2l2ZUdyaWQmcXVvdDs6ZmFsc2UsJnF1b3Q7cG9saWN5UGF0aCZxdW90OzomcXVvdDtyb290L3Jlc3BvbnNpdmVncmlkL3dlcmV0YWls +L2NvbXBvbmVudHMvY29udGVudC90ZWFzZXImcXVvdDssJnF1b3Q7Y3NwJnF1b3Q7OiZxdW90O3BhZ2V8YmFzaWNwYWdlL3Jvb3R8cmVzcG9uc2l2ZWdyaWQvcmVzcG9uc2l2ZWdyaWQvdGVhc2VyJnF1 +b3Q7LCZxdW90O2VkaXRDb25maWcmcXVvdDs6eyZxdW90O2Ryb3BUYXJnZXQmcXVvdDs6W3smcXVvdDtpZCZxdW90OzomcXVvdDtpbWFnZSZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90Oy4vZmls +ZVJlZmVyZW5jZSZxdW90OywmcXVvdDthY2NlcHQmcXVvdDs6WyZxdW90O2ltYWdlL2dpZiZxdW90OywmcXVvdDtpbWFnZS9qcGVnJnF1b3Q7LCZxdW90O2ltYWdlL3BuZyZxdW90OywmcXVvdDtpbWFn +ZS93ZWJwJnF1b3Q7LCZxdW90O2ltYWdlL3RpZmYmcXVvdDtdLCZxdW90O2dyb3VwcyZxdW90OzpbJnF1b3Q7bWVkaWEmcXVvdDtdLCZxdW90O3BhcmFtcyZxdW90Ozp7JnF1b3Q7Li9pbWFnZVJvdGF0 +ZSZxdW90OzomcXVvdDsmcXVvdDssJnF1b3Q7Li9pbWFnZU1hcCZxdW90OzomcXVvdDsmcXVvdDssJnF1b3Q7Li9pbWFnZUNyb3AmcXVvdDs6JnF1b3Q7JnF1b3Q7fX1dLCZxdW90O2lucGxhY2VFZGl0 +aW5nQ29uZmlnJnF1b3Q7OnsmcXVvdDthY3RpdmUmcXVvdDs6dHJ1ZSwmcXVvdDtlZGl0b3JUeXBlJnF1b3Q7OiZxdW90O2ltYWdlJnF1b3Q7LCZxdW90O2NvbmZpZ1BhdGgmcXVvdDs6JnF1b3Q7L2Fw +cHMvY29yZS93Y20vY29tcG9uZW50cy90ZWFzZXIvdjEvdGVhc2VyL2NxOmVkaXRDb25maWcvY3E6aW5wbGFjZUVkaXRpbmcvY29uZmlnJnF1b3Q7fX0sJnF1b3Q7aXBlQ29uZmlnJnF1b3Q7OnsmcXVv +dDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2NvbmZpZyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3Ry +dWN0dXJlZCZxdW90OywmcXVvdDtwbHVnaW5zJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6eyZxdW90 +O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90OywmcXVvdDthc3BlY3RSYXRpb3MmcXVvdDs6eyZx +dW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7d2lkZUxhbmRzY2FwZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90 +O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90O1dpZGUgTGFuZHNjYXBlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzAuNjE4MCZxdW90O30sJnF1b3Q7bGFu +ZHNjYXBlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7TGFuZHNjYXBlJnF1b3Q7LCZxdW90 +O3JhdGlvJnF1b3Q7OiZxdW90OzAuODI4NCZxdW90O30sJnF1b3Q7c3F1YXJlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90 +O25hbWUmcXVvdDs6JnF1b3Q7U3F1YXJlJnF1b3Q7LCZxdW90O3JhdGlvJnF1b3Q7OiZxdW90OzEmcXVvdDt9LCZxdW90O3BvcnRyYWl0JnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6 +JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7UG9ydHJhaXQmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MS42MTgwJnF1b3Q7fX19LCZxdW90O2Zs +aXAmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7LSZxdW90O30sJnF1b3Q7bWFwJnF1 +b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9LCZxdW90O3JvdGF0ZSZxdW90 +Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7fSwmcXVvdDt6b29tJnF1b3Q7Onsm +cXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9fSwmcXVvdDt1aSZxdW90Ozp7JnF1b3Q7 +amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtpbmxpbmUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVj +dHVyZWQmcXVvdDssJnF1b3Q7dG9vbGJhciZxdW90OzpbJnF1b3Q7Y3JvcCNsYXVuY2gmcXVvdDssJnF1b3Q7cm90YXRlI3JpZ2h0JnF1b3Q7LCZxdW90O2hpc3RvcnkjdW5kbyZxdW90OywmcXVvdDto +aXN0b3J5I3JlZG8mcXVvdDssJnF1b3Q7ZnVsbHNjcmVlbiNmdWxsc2NyZWVuJnF1b3Q7LCZxdW90O2NvbnRyb2wjY2xvc2UmcXVvdDssJnF1b3Q7Y29udHJvbCNmaW5pc2gmcXVvdDtdLCZxdW90O3Jl +cGxhY2VtZW50VG9vbGJhcnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90OzpbJnF1b3Q7Y3JvcCNpZGVu +dGlmaWVyJnF1b3Q7LCZxdW90O2Nyb3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7XX19LCZxdW90O2Z1bGxzY3JlZW4mcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZx +dW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7dG9vbGJhciZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVv +dDtsZWZ0JnF1b3Q7OlsmcXVvdDtjcm9wI2xhdW5jaHdpdGhyYXRpbyZxdW90OywmcXVvdDtyb3RhdGUjcmlnaHQmcXVvdDssJnF1b3Q7ZmxpcCNob3Jpem9udGFsJnF1b3Q7LCZxdW90O2ZsaXAjdmVy +dGljYWwmcXVvdDssJnF1b3Q7em9vbSNyZXNldDEwMCZxdW90OywmcXVvdDt6b29tI3BvcHVwc2xpZGVyJnF1b3Q7XSwmcXVvdDtyaWdodCZxdW90OzpbJnF1b3Q7aGlzdG9yeSN1bmRvJnF1b3Q7LCZx +dW90O2hpc3RvcnkjcmVkbyZxdW90OywmcXVvdDtmdWxsc2NyZWVuI2Z1bGxzY3JlZW5leGl0JnF1b3Q7XX0sJnF1b3Q7cmVwbGFjZW1lbnRUb29sYmFycyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlU +eXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZx +dW90O2xlZnQmcXVvdDs6WyZxdW90O2Nyb3AjaWRlbnRpZmllciZxdW90O10sJnF1b3Q7cmlnaHQmcXVvdDs6WyZxdW90O2Nyb3AjdW5sYXVuY2gmcXVvdDssJnF1b3Q7Y3JvcCNjb25maXJtJnF1b3Q7 +XX19fX19LCZxdW90O3BsdWdpbnMmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7Y3JvcCZxdW90Ozp7JnF1b3Q7amNyOnBy +aW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDsqJnF1b3Q7LCZxdW90O2FzcGVjdFJhdGlvcyZxdW90Ozp7JnF1b3Q7amNy +OnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDt3aWRlTGFuZHNjYXBlJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5z +dHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O25hbWUmcXVvdDs6JnF1b3Q7V2lkZSBMYW5kc2NhcGUmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MC42MTgwJnF1b3Q7fSwmcXVvdDtsYW5kc2NhcGUm +cXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtMYW5kc2NhcGUmcXVvdDssJnF1b3Q7cmF0aW8m +cXVvdDs6JnF1b3Q7MC44Mjg0JnF1b3Q7fSwmcXVvdDtzcXVhcmUmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZx +dW90OzomcXVvdDtTcXVhcmUmcXVvdDssJnF1b3Q7cmF0aW8mcXVvdDs6JnF1b3Q7MSZxdW90O30sJnF1b3Q7cG9ydHJhaXQmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtu +dDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bmFtZSZxdW90OzomcXVvdDtQb3J0cmFpdCZxdW90OywmcXVvdDtyYXRpbyZxdW90OzomcXVvdDsxLjYxODAmcXVvdDt9fX0sJnF1b3Q7ZmxpcCZxdW90 +Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtmZWF0dXJlcyZxdW90OzomcXVvdDstJnF1b3Q7fSwmcXVvdDttYXAmcXVvdDs6eyZx +dW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O30sJnF1b3Q7cm90YXRlJnF1b3Q7OnsmcXVv +dDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2ZlYXR1cmVzJnF1b3Q7OiZxdW90OyomcXVvdDt9LCZxdW90O3pvb20mcXVvdDs6eyZxdW90O2pj +cjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7ZmVhdHVyZXMmcXVvdDs6JnF1b3Q7KiZxdW90O319LCZxdW90O3VpJnF1b3Q7OnsmcXVvdDtqY3I6cHJp +bWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2lubGluZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZx +dW90OywmcXVvdDt0b29sYmFyJnF1b3Q7OlsmcXVvdDtjcm9wI2xhdW5jaCZxdW90OywmcXVvdDtyb3RhdGUjcmlnaHQmcXVvdDssJnF1b3Q7aGlzdG9yeSN1bmRvJnF1b3Q7LCZxdW90O2hpc3Rvcnkj +cmVkbyZxdW90OywmcXVvdDtmdWxsc2NyZWVuI2Z1bGxzY3JlZW4mcXVvdDssJnF1b3Q7Y29udHJvbCNjbG9zZSZxdW90OywmcXVvdDtjb250cm9sI2ZpbmlzaCZxdW90O10sJnF1b3Q7cmVwbGFjZW1l +bnRUb29sYmFycyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtjcm9wJnF1b3Q7OlsmcXVvdDtjcm9wI2lkZW50aWZpZXIm +cXVvdDssJnF1b3Q7Y3JvcCN1bmxhdW5jaCZxdW90OywmcXVvdDtjcm9wI2NvbmZpcm0mcXVvdDtdfX0sJnF1b3Q7ZnVsbHNjcmVlbiZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZx +dW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDt0b29sYmFyJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2xlZnQm +cXVvdDs6WyZxdW90O2Nyb3AjbGF1bmNod2l0aHJhdGlvJnF1b3Q7LCZxdW90O3JvdGF0ZSNyaWdodCZxdW90OywmcXVvdDtmbGlwI2hvcml6b250YWwmcXVvdDssJnF1b3Q7ZmxpcCN2ZXJ0aWNhbCZx +dW90OywmcXVvdDt6b29tI3Jlc2V0MTAwJnF1b3Q7LCZxdW90O3pvb20jcG9wdXBzbGlkZXImcXVvdDtdLCZxdW90O3JpZ2h0JnF1b3Q7OlsmcXVvdDtoaXN0b3J5I3VuZG8mcXVvdDssJnF1b3Q7aGlz +dG9yeSNyZWRvJnF1b3Q7LCZxdW90O2Z1bGxzY3JlZW4jZnVsbHNjcmVlbmV4aXQmcXVvdDtdfSwmcXVvdDtyZXBsYWNlbWVudFRvb2xiYXJzJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVv +dDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2Nyb3AmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7bGVm +dCZxdW90OzpbJnF1b3Q7Y3JvcCNpZGVudGlmaWVyJnF1b3Q7XSwmcXVvdDtyaWdodCZxdW90OzpbJnF1b3Q7Y3JvcCN1bmxhdW5jaCZxdW90OywmcXVvdDtjcm9wI2NvbmZpcm0mcXVvdDtdfX19fX19 +Ij48L2NxPgo8L2Rpdj4KPGRpdiBjbGFzcz0iZXhwZXJpZW5jZWZyYWdtZW50IGFlbS1HcmlkQ29sdW1uIGFlbS1HcmlkQ29sdW1uLS1kZWZhdWx0LS0xMiI+CgogICAgCiAgICAKCiAgICAKPGxpbmsg +cmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuL0VxdWlwbWVudF9maWxlcy9jb250ZW50LmNzcyIgdHlwZT0idGV4dC9jc3MiPgoKCgo8ZGl2IGNsYXNzPSJ4Zi1jb250ZW50LWhlaWdodCI+CiAgICAKCgo8 +ZGl2IGNsYXNzPSJhZW0tR3JpZCBhZW0tR3JpZC0tMTIgYWVtLUdyaWQtLWRlZmF1bHQtLTEyICI+CiAgICAKICAgIDxkaXYgY2xhc3M9InRpdGxlIGFlbS1HcmlkQ29sdW1uIGFlbS1HcmlkQ29sdW1u +LS1kZWZhdWx0LS0xMiI+CjxkaXYgY2xhc3M9ImNtcC10aXRsZSI+CiAgICA8aDMgY2xhc3M9ImNtcC10aXRsZV9fdGV4dCI+VGVzdCBUcmFuc2xhdGlvbiBTZWN0aW9uPC9oMz4KPC9kaXY+CgogICAg +Cgo8L2Rpdj4KPGRpdiBjbGFzcz0idGV4dCBhZW0tR3JpZENvbHVtbiBhZW0tR3JpZENvbHVtbi0tZGVmYXVsdC0tMTIiPgo8ZGl2IGNsYXNzPSJjbXAtdGV4dCI+CiAgICA8cD5UaGlzIGlzIGEgdGVz +dCA8aT5FeHBlcmllbmNlIEZyYWdtZW50PC9pPi4gSXQgc2hvdWxkIGFwcGVhciBvbiBldmVyeSBwYWdlIHdoZXJlIGl0IGlzIGFkZGVkLjwvcD4KPHA+PGI+U3BlY2lhbCBDaGFyYWN0ZXJzOjwvYj4g +IUAjJCVeJmFtcDsqKClfKy09Oyc6IiwuLyZsdDsmZ3Q7P2B+PC9wPgoKPC9kaXY+CgogICAgCgo8L2Rpdj4KCiAgICAKPC9kaXY+Cgo8L2Rpdj4KPCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUi +OiJjcS9leHBlcmllbmNlLWZyYWdtZW50cy9lZGl0b3IvY29tcG9uZW50cy9leHBlcmllbmNlZnJhZ21lbnQiLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1y +ZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC9leHBlcmllbmNlZnJhZ21lbnQiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQi +OiJTY3JpcHQgL2xpYnMvY3EvZXhwZXJpZW5jZS1mcmFnbWVudHMvZWRpdG9yL2NvbXBvbmVudHMvZXhwZXJpZW5jZWZyYWdtZW50L2V4cGVyaWVuY2VmcmFnbWVudC5odG1sIiwidG90YWxUaW1lIjo4 +LCJzZWxmVGltZSI6OH0tLT4KPGNxIGRhdGEtcGF0aD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNy +OmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC9leHBlcmllbmNlZnJhZ21lbnQiIGRhdGEtY29uZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2Ut +bWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC9leHBlcmllbmNlZnJhZ21lbnQmcXVvdDssJnF1b3Q7c2xpbmdQYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50 +L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkL2V4cGVyaWVuY2VmcmFnbWVudC5odG1sJnF1b3Q7LCZxdW90O2RpYWxv +ZyZxdW90OzomcXVvdDsvbGlicy9jcS9leHBlcmllbmNlLWZyYWdtZW50cy9lZGl0b3IvY29tcG9uZW50cy9leHBlcmllbmNlZnJhZ21lbnQvY3E6ZGlhbG9nJnF1b3Q7LCZxdW90O2RpYWxvZ0xvYWRp +bmdNb2RlJnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2F1dG8mcXVvdDssJnF1b3Q7ZGlhbG9nU3JjJnF1b3Q7OiZxdW90Oy9tbnQvb3ZlcnJpZGUv +bGlicy9jcS9leHBlcmllbmNlLWZyYWdtZW50cy9lZGl0b3IvY29tcG9uZW50cy9leHBlcmllbmNlZnJhZ21lbnQvX2NxX2RpYWxvZy5odG1sL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3Rl +cnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvZXhwZXJpZW5jZWZyYWdtZW50JnF1b3Q7LCZxdW90O3R5cGUmcXVvdDs6JnF1b3Q7Y3EvZXhwZXJpZW5jZS1mcmFn +bWVudHMvZWRpdG9yL2NvbXBvbmVudHMvZXhwZXJpZW5jZWZyYWdtZW50JnF1b3Q7LCZxdW90O2lzUmVzcG9uc2l2ZUdyaWQmcXVvdDs6ZmFsc2UsJnF1b3Q7cG9saWN5UGF0aCZxdW90OzomcXVvdDty +b290L3Jlc3BvbnNpdmVncmlkL2NxL2V4cGVyaWVuY2UtZnJhZ21lbnRzL2VkaXRvci9jb21wb25lbnRzL2V4cGVyaWVuY2VmcmFnbWVudCZxdW90OywmcXVvdDtjc3AmcXVvdDs6JnF1b3Q7cGFnZXxi +YXNpY3BhZ2Uvcm9vdHxyZXNwb25zaXZlZ3JpZC9yZXNwb25zaXZlZ3JpZC9leHBlcmllbmNlZnJhZ21lbnQmcXVvdDssJnF1b3Q7ZWRpdENvbmZpZyZxdW90Ozp7JnF1b3Q7ZHJvcFRhcmdldCZxdW90 +OzpbeyZxdW90O2lkJnF1b3Q7OiZxdW90O2V4cGVyaWVuY2VmcmFnbWVudCZxdW90OywmcXVvdDtuYW1lJnF1b3Q7OiZxdW90Oy4vZnJhZ21lbnRQYXRoJnF1b3Q7LCZxdW90O2FjY2VwdCZxdW90Ozpb +JnF1b3Q7dGV4dC9odG1sJnF1b3Q7XSwmcXVvdDtncm91cHMmcXVvdDs6WyZxdW90O2NvbnRlbnQmcXVvdDtdfV0sJnF1b3Q7bGlzdGVuZXJzJnF1b3Q7OnsmcXVvdDthZnRlcmluc2VydCZxdW90Ozom +cXVvdDtSRUZSRVNIX1BBR0UmcXVvdDt9LCZxdW90O2FjdGlvbnMmcXVvdDs6WyZxdW90O0NRLndjbS5FZGl0QmFzZS5FRElUJnF1b3Q7LCZxdW90O0NRLndjbS5FZGl0QmFzZS5ERUxFVEUmcXVvdDss +JnF1b3Q7Q1Eud2NtLkVkaXRCYXNlLklOU0VSVCZxdW90OywmcXVvdDtDUS53Y20uRWRpdEJhc2UuQ09QWU1PVkUmcXVvdDsseyZxdW90O25hbWUmcXVvdDs6JnF1b3Q7ZWRpdEluTmV3VGFiJnF1b3Q7 +LCZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7aWNvbiZxdW90OzomcXVvdDtlZGl0JnF1b3Q7LCZxdW90O3RleHQmcXVvdDs6JnF1b3Q7 +RWRpdCZxdW90OywmcXVvdDtoYW5kbGVyJnF1b3Q7OiZxdW90O0dyYW5pdGUuYXV0aG9yLmV4cGVyaWVuY2VGcmFnbWVudHMgJmFtcDsmYW1wOyBHcmFuaXRlLmF1dGhvci5leHBlcmllbmNlRnJhZ21l +bnRzLmFjdGlvbnMuZWRpdEluTmV3VGFiJnF1b3Q7fV19fSI+PC9jcT4KPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ibmV3IG5ld3BhciBzZWN0aW9uIGFlbS1HcmlkLW5ld0NvbXBvbmVudCI+Cgo8IS0t +Y3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndjbS9mb3VuZGF0aW9uL2NvbXBvbmVudHMvcmVzcG9uc2l2ZWdyaWQvbmV3IiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2Nv +bnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQvKiIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlw +dCAvbGlicy93Y20vZm91bmRhdGlvbi9jb21wb25lbnRzL3BhcnN5cy9uZXdwYXIvbmV3cGFyLmh0bWwiLCJ0b3RhbFRpbWUiOjEsInNlbGZUaW1lIjoxfS0tPgo8Y3EgZGF0YS1wYXRoPSIuLi8uLi8u +Li8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L3Jlc3BvbnNpdmVncmlkLyoiIGRhdGEtY29u +ZmlnPSJ7JnF1b3Q7cGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC8qJnF1 +b3Q7LCZxdW90O3NsaW5nUGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNwb25zaXZlZ3JpZC8q +Lmh0bWwmcXVvdDssJnF1b3Q7dHlwZSZxdW90OzomcXVvdDt3Y20vZm91bmRhdGlvbi9jb21wb25lbnRzL3Jlc3BvbnNpdmVncmlkL25ldyZxdW90OywmcXVvdDtpc1Jlc3BvbnNpdmVHcmlkJnF1b3Q7 +OmZhbHNlLCZxdW90O2NzcCZxdW90OzomcXVvdDtwYWdlfGJhc2ljcGFnZS9yb290fHJlc3BvbnNpdmVncmlkL3Jlc3BvbnNpdmVncmlkL25ld3xuZXdwYXImcXVvdDssJnF1b3Q7ZWRpdENvbmZpZyZx +dW90Ozp7JnF1b3Q7YWN0aW9ucyZxdW90OzpbbnVsbCwmcXVvdDtDUS53Y20uRWRpdEJhc2UuSU5TRVJUJnF1b3Q7XSwmcXVvdDtkaXNhYmxlVGFyZ2V0aW5nJnF1b3Q7OnRydWV9fSI+PC9jcT4KPC9k +aXY+Cgo8L2Rpdj4KPCEtLWNxeyJkZWNvcmF0ZWQiOnRydWUsInR5cGUiOiJ3Y20vZm91bmRhdGlvbi9jb21wb25lbnRzL3Jlc3BvbnNpdmVncmlkIiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4u +Ly4uLy4uLy4uL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L3Jvb3QvcmVzcG9uc2l2ZWdyaWQiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZs +ZXQiOiJTY3JpcHQgL2xpYnMvd2NtL2ZvdW5kYXRpb24vY29tcG9uZW50cy9yZXNwb25zaXZlZ3JpZC9yZXNwb25zaXZlZ3JpZC5odG1sIiwidG90YWxUaW1lIjoxMDgsInNlbGZUaW1lIjo0N30tLT4K +PGNxIGRhdGEtcGF0aD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC9yZXNw +b25zaXZlZ3JpZCIgZGF0YS1jb25maWc9InsmcXVvdDtwYXRoJnF1b3Q7OiZxdW90Oy9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290 +L3Jlc3BvbnNpdmVncmlkJnF1b3Q7LCZxdW90O3NsaW5nUGF0aCZxdW90OzomcXVvdDsvY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9v +dC9yZXNwb25zaXZlZ3JpZC5odG1sJnF1b3Q7LCZxdW90O2Rlc2lnbkRpYWxvZyZxdW90OzomcXVvdDsvbGlicy93Y20vZm91bmRhdGlvbi9jb21wb25lbnRzL3Jlc3BvbnNpdmVncmlkL2NxOmRlc2ln +bl9kaWFsb2cmcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTGF5b3V0JnF1b3Q7OiZxdW90O2Z1bGxzY3JlZW4mcXVvdDssJnF1b3Q7ZGVzaWduRGlhbG9nTG9hZGluZ01vZGUmcXVvdDs6JnF1b3Q7YXV0 +byZxdW90OywmcXVvdDtkZXNpZ25EaWFsb2dTcmMmcXVvdDs6JnF1b3Q7L21udC9vdmVycmlkZS9saWJzL3djbS9mb3VuZGF0aW9uL2NvbXBvbmVudHMvcmVzcG9uc2l2ZWdyaWQvX2NxX2Rlc2lnbl9k +aWFsb2cucG9saWN5ZGVzaWduLmVkaXRhYmxldGVtcGxhdGUuaHRtbC9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vcG9saWNpZXMvd2NtL2ZvdW5kYXRpb24vY29tcG9uZW50cy9yZXNwb25zaXZl +Z3JpZC93ZS1yZXRhaWwtZGVmYXVsdD9kaWFsb2c9JTJGbGlicyUyRndjbSUyRmZvdW5kYXRpb24lMkZjb21wb25lbnRzJTJGcmVzcG9uc2l2ZWdyaWQlMkZjcSUzQWRlc2lnbl9kaWFsb2cmYW1wO3Jl +ZmVycmVyPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZsYW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQmYW1wO3BvbGljeUNvbnRlbnRQYXRoPSUyRmNvbnRlbnQlMkZ3ZS1yZXRhaWwlMkZs +YW5ndWFnZS1tYXN0ZXJzJTJGZW4lMkZlcXVpcG1lbnQlMkZqY3IlM0Fjb250ZW50JTJGcm9vdCUyRnJlc3BvbnNpdmVncmlkJmFtcDtwb2xpY3lDb250ZW50UmVzb3VyY2VUeXBlPXdjbSUyRmZvdW5k +YXRpb24lMkZjb21wb25lbnRzJTJGcmVzcG9uc2l2ZWdyaWQmYW1wO3BvbGljeURpcmVjdG9yeVBhdGg9JTJGY29uZiUyRndlLXJldGFpbCUyRnNldHRpbmdzJTJGd2NtJTJGcG9saWNpZXMlMkZ3Y20l +MkZmb3VuZGF0aW9uJTJGY29tcG9uZW50cyUyRnJlc3BvbnNpdmVncmlkJTJGJmFtcDtwb2xpY3lNYXBwaW5nUGF0aD0lMkZjb25mJTJGd2UtcmV0YWlsJTJGc2V0dGluZ3MlMkZ3Y20lMkZ0ZW1wbGF0 +ZXMlMkZoZXJvLXBhZ2UlMkZwb2xpY2llcyUyRmpjciUzQWNvbnRlbnQlMkZyb290JTJGcmVzcG9uc2l2ZWdyaWQmYW1wO3BvbGljeU1hcHBpbmdSZXNvdXJjZVR5cGU9d2NtJTJGY29yZSUyRmNvbXBv +bmVudHMlMkZwb2xpY2llcyUyRm1hcHBpbmcmYW1wO3BvbGljeU5hbWU9d2UtcmV0YWlsLWRlZmF1bHQmYW1wO3BvbGljeVJlbGF0aXZlUGF0aD13Y20lMkZmb3VuZGF0aW9uJTJGY29tcG9uZW50cyUy +RnJlc3BvbnNpdmVncmlkJTJGd2UtcmV0YWlsLWRlZmF1bHQmYW1wO3Jlc291cmNlVHlwZT13Y20lMkZjb3JlJTJGY29tcG9uZW50cyUyRnBvbGljeSUyRnBvbGljeSZxdW90OywmcXVvdDtkZXNpZ25E +aWFsb2dDbGFzc2ljJnF1b3Q7OiZxdW90Oy9saWJzL3djbS9mb3VuZGF0aW9uL2NvbXBvbmVudHMvcmVzcG9uc2l2ZWdyaWQvZGVzaWduX2RpYWxvZyZxdW90OywmcXVvdDtoYXNQb2xpY3lNYXBwaW5n +JnF1b3Q7OnRydWUsJnF1b3Q7dHlwZSZxdW90OzomcXVvdDt3Y20vZm91bmRhdGlvbi9jb21wb25lbnRzL3Jlc3BvbnNpdmVncmlkJnF1b3Q7LCZxdW90O2lzUmVzcG9uc2l2ZUdyaWQmcXVvdDs6dHJ1 +ZSwmcXVvdDtwb2xpY3lQYXRoJnF1b3Q7OiZxdW90O3Jvb3QvcmVzcG9uc2l2ZWdyaWQmcXVvdDssJnF1b3Q7Y3NwJnF1b3Q7OiZxdW90O3BhZ2V8YmFzaWNwYWdlL3Jvb3R8cmVzcG9uc2l2ZWdyaWQv +cmVzcG9uc2l2ZWdyaWQmcXVvdDssJnF1b3Q7aXNDb250YWluZXImcXVvdDs6dHJ1ZSwmcXVvdDtlZGl0Q29uZmlnJnF1b3Q7OnsmcXVvdDtsaXN0ZW5lcnMmcXVvdDs6eyZxdW90O2FmdGVyY2hpbGRp +bnNlcnQmcXVvdDs6JnF1b3Q7ZnVuY3Rpb24oZWRpdGFibGUpe0dyYW5pdGUuYXV0aG9yLnJlc3BvbnNpdmUuRWRpdGFibGVBY3Rpb25zLlJFRlJFU0guZXhlY3V0ZShlZGl0YWJsZSl9JnF1b3Q7fSwm +cXVvdDtzdHJ1Y3R1cmUmcXVvdDs6dHJ1ZX0sJnF1b3Q7aXBlQ29uZmlnJnF1b3Q7OnsmcXVvdDtqY3I6cHJpbWFyeVR5cGUmcXVvdDs6JnF1b3Q7bnQ6dW5zdHJ1Y3R1cmVkJnF1b3Q7LCZxdW90O2pj +cjp0aXRsZSZxdW90OzomcXVvdDtXZS5SZXRhaWwgRGVmYXVsdCZxdW90OywmcXVvdDtqY3I6bGFzdE1vZGlmaWVkQnkmcXVvdDs6JnF1b3Q7YWRtaW4mcXVvdDssJnF1b3Q7Y29tcG9uZW50cyZxdW90 +OzpbJnF1b3Q7L2xpYnMvY3EvZXhwZXJpZW5jZS1mcmFnbWVudHMvZWRpdG9yL2NvbXBvbmVudHMvZXhwZXJpZW5jZWZyYWdtZW50JnF1b3Q7LCZxdW90Oy9saWJzL3djbS9mb3VuZGF0aW9uL2NvbXBv +bmVudHMvcmVzcG9uc2l2ZWdyaWQmcXVvdDssJnF1b3Q7Z3JvdXA6V2UuUmV0YWlsJnF1b3Q7LCZxdW90O2dyb3VwOldlLlJldGFpbCBDb21tZXJjZSZxdW90O10sJnF1b3Q7cG9saWN5UmVzb3VyY2VU +eXBlJnF1b3Q7OiZxdW90O3djbS9mb3VuZGF0aW9uL2NvbXBvbmVudHMvcmVzcG9uc2l2ZWdyaWQmcXVvdDssJnF1b3Q7amNyOmRlc2NyaXB0aW9uJnF1b3Q7OiZxdW90O1BvbGljeSBmb3IgZWRpdGFi +bGUgbGF5b3V0IGNvbnRhaW5lcnMmcXVvdDssJnF1b3Q7amNyOmxhc3RNb2RpZmllZCZxdW90OzomcXVvdDtqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXJbdGltZT0xNTE3ODUyMDU3NDIwLGFyZUZp +ZWxkc1NldD10cnVlLGFyZUFsbEZpZWxkc1NldD10cnVlLGxlbmllbnQ9ZmFsc2Usem9uZT1zdW4udXRpbC5jYWxlbmRhci5ab25lSW5mb1tpZD1cJnF1b3Q7R01UKzAxOjAwXCZxdW90OyxvZmZzZXQ9 +MzYwMDAwMCxkc3RTYXZpbmdzPTAsdXNlRGF5bGlnaHQ9ZmFsc2UsdHJhbnNpdGlvbnM9MCxsYXN0UnVsZT1udWxsXSxmaXJzdERheU9mV2Vlaz0xLG1pbmltYWxEYXlzSW5GaXJzdFdlZWs9MSxFUkE9 +MSxZRUFSPTIwMTgsTU9OVEg9MSxXRUVLX09GX1lFQVI9NixXRUVLX09GX01PTlRIPTIsREFZX09GX01PTlRIPTUsREFZX09GX1lFQVI9MzYsREFZX09GX1dFRUs9MixEQVlfT0ZfV0VFS19JTl9NT05U +SD0xLEFNX1BNPTEsSE9VUj02LEhPVVJfT0ZfREFZPTE4LE1JTlVURT0zNCxTRUNPTkQ9MTcsTUlMTElTRUNPTkQ9NDIwLFpPTkVfT0ZGU0VUPTM2MDAwMDAsRFNUX09GRlNFVD0wXSZxdW90OywmcXVv +dDtzbGluZzpyZXNvdXJjZVR5cGUmcXVvdDs6JnF1b3Q7d2NtL2NvcmUvY29tcG9uZW50cy9wb2xpY3kvcG9saWN5JnF1b3Q7LCZxdW90O2NxOmF1dGhvcmluZyZxdW90Ozp7JnF1b3Q7amNyOnByaW1h +cnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDthc3NldFRvQ29tcG9uZW50TWFwcGluZyZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250 +OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtpbWFnZSZxdW90Ozp7JnF1b3Q7amNyOnByaW1hcnlUeXBlJnF1b3Q7OiZxdW90O250OnVuc3RydWN0dXJlZCZxdW90OywmcXVvdDtyZXNvdXJjZVR5cGUm +cXVvdDs6JnF1b3Q7d2VyZXRhaWwvY29tcG9uZW50cy9jb250ZW50L2ltYWdlJnF1b3Q7LCZxdW90O2Fzc2V0TWltZXR5cGUmcXVvdDs6JnF1b3Q7aW1hZ2UvKiZxdW90OywmcXVvdDt0eXBlJnF1b3Q7 +OiZxdW90O0ltYWdlcyZxdW90OywmcXVvdDtkcm9wdGFyZ2V0JnF1b3Q7OiZxdW90O2ltYWdlJnF1b3Q7LCZxdW90O2Fzc2V0R3JvdXAmcXVvdDs6JnF1b3Q7bWVkaWEmcXVvdDt9LCZxdW90O3Byb2R1 +Y3QmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7cmVzb3VyY2VUeXBlJnF1b3Q7OiZxdW90O3dlcmV0YWlsL2NvbXBvbmVu +dHMvc3RydWN0dXJlL3Byb2R1Y3QmcXVvdDssJnF1b3Q7dHlwZSZxdW90OzomcXVvdDtQcm9kdWN0cyZxdW90OywmcXVvdDtkcm9wdGFyZ2V0JnF1b3Q7OiZxdW90O3Byb2R1Y3QtZGF0YS1yZWZlcmVu +Y2UmcXVvdDssJnF1b3Q7YXNzZXRHcm91cCZxdW90OzomcXVvdDtwcm9kdWN0JnF1b3Q7fSwmcXVvdDtjb250ZW50ZnJhZ21lbnQmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVv +dDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7cmVzb3VyY2VUeXBlJnF1b3Q7OiZxdW90O3dlcmV0YWlsL2NvbXBvbmVudHMvY29udGVudC9jb250ZW50ZnJhZ21lbnQmcXVvdDssJnF1b3Q7YXNz +ZXRNaW1ldHlwZSZxdW90OzpbJnF1b3Q7dGV4dC9odG1sJnF1b3Q7LCZxdW90O2FwcGxpY2F0aW9uL3ZuZC5hZG9iZS5jb250ZW50ZnJhZ21lbnQmcXVvdDtdLCZxdW90O3R5cGUmcXVvdDs6JnF1b3Q7 +Q29udGVudCBGcmFnbWVudCZxdW90OywmcXVvdDtkcm9wdGFyZ2V0JnF1b3Q7OiZxdW90O2NvbnRlbnRmcmFnbWVudCZxdW90OywmcXVvdDthc3NldEdyb3VwJnF1b3Q7OiZxdW90O21lZGlhJnF1b3Q7 +fSwmcXVvdDtleHBlcmllbmNlZnJhZ21lbnQmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVyZWQmcXVvdDssJnF1b3Q7cmVzb3VyY2VUeXBlJnF1b3Q7 +OiZxdW90O2NxL2V4cGVyaWVuY2UtZnJhZ21lbnRzL2VkaXRvci9jb21wb25lbnRzL2V4cGVyaWVuY2VmcmFnbWVudCZxdW90OywmcXVvdDthc3NldE1pbWV0eXBlJnF1b3Q7OiZxdW90O3RleHQvaHRt +bCZxdW90OywmcXVvdDt0eXBlJnF1b3Q7OiZxdW90O2V4cGVyaWVuY2VmcmFnbWVudCZxdW90OywmcXVvdDtkcm9wdGFyZ2V0JnF1b3Q7OiZxdW90O2V4cGVyaWVuY2VmcmFnbWVudCZxdW90OywmcXVv +dDthc3NldEdyb3VwJnF1b3Q7OiZxdW90O2NvbnRlbnQmcXVvdDt9fX0sJnF1b3Q7amNyOmNvbnRlbnQmcXVvdDs6eyZxdW90O2pjcjpwcmltYXJ5VHlwZSZxdW90OzomcXVvdDtudDp1bnN0cnVjdHVy +ZWQmcXVvdDssJnF1b3Q7amNyOm1peGluVHlwZXMmcXVvdDs6WyZxdW90O2NxOlJlcGxpY2F0aW9uU3RhdHVzJnF1b3Q7XSwmcXVvdDtjcTpsYXN0UmVwbGljYXRpb25BY3Rpb24mcXVvdDs6JnF1b3Q7 +QWN0aXZhdGUmcXVvdDssJnF1b3Q7Y3E6bGFzdFJlcGxpY2F0ZWRCeSZxdW90OzomcXVvdDtjbGFpcmUmcXVvdDssJnF1b3Q7Y3E6bGFzdFJlcGxpY2F0ZWQmcXVvdDs6JnF1b3Q7amF2YS51dGlsLkdy +ZWdvcmlhbkNhbGVuZGFyW3RpbWU9MTcwODc5MzQzMzEyOCxhcmVGaWVsZHNTZXQ9dHJ1ZSxhcmVBbGxGaWVsZHNTZXQ9dHJ1ZSxsZW5pZW50PWZhbHNlLHpvbmU9c3VuLnV0aWwuY2FsZW5kYXIuWm9u +ZUluZm9baWQ9XCZxdW90O0dNVFwmcXVvdDssb2Zmc2V0PTAsZHN0U2F2aW5ncz0wLHVzZURheWxpZ2h0PWZhbHNlLHRyYW5zaXRpb25zPTAsbGFzdFJ1bGU9bnVsbF0sZmlyc3REYXlPZldlZWs9MSxt +aW5pbWFsRGF5c0luRmlyc3RXZWVrPTEsRVJBPTEsWUVBUj0yMDI0LE1PTlRIPTEsV0VFS19PRl9ZRUFSPTgsV0VFS19PRl9NT05USD00LERBWV9PRl9NT05USD0yNCxEQVlfT0ZfWUVBUj01NSxEQVlf +T0ZfV0VFSz03LERBWV9PRl9XRUVLX0lOX01PTlRIPTQsQU1fUE09MSxIT1VSPTQsSE9VUl9PRl9EQVk9MTYsTUlOVVRFPTUwLFNFQ09ORD0zMyxNSUxMSVNFQ09ORD0xMjgsWk9ORV9PRkZTRVQ9MCxE +U1RfT0ZGU0VUPTBdJnF1b3Q7LCZxdW90O21lcmdlTGlzdCZxdW90Ozp0cnVlfX19Ij48L2NxPgo8L2Rpdj4KPGRpdiBjbGFzcz0iZm9vdGVyIGFlbS1HcmlkQ29sdW1uIGFlbS1HcmlkQ29sdW1uLS1k +ZWZhdWx0LS0xMiI+CgogICAgCgoKCgoKICAgIDxmb290ZXIgY2xhc3M9IndlLUZvb3RlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJv +dyI+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTMiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndlLUxvZ28gd2UtTG9nby0tYmlnIj4KICAgICAgICAgICAgICAg +ICAgICAgICAgd2UuPHN0cm9uZz5SZXRhaWw8L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9 +ImNvbC1tZC05IGNvbC1zbS0xMiI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtbmF2aWdhdGlvbiI+CjxuYXYgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uIiBpdGVtc2NvcGU9IiIgaXRl +bXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+CiAgICA8dWwgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19ncm91cCI+CiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNt +cC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250 +ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2V4cGVyaWVuY2UuaHRtbCIgdGl0bGU9IkV4cGVyaWVuY2UiIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5FeHBlcmllbmNl +PC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAg +ICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL21lbi5odG1sIiB0aXRsZT0iTWVuIiBj +bGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+TWVuPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNt +cC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFn +ZS1tYXN0ZXJzL2VuL3dvbWVuLmh0bWwiIHRpdGxlPSJXb21lbiIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPldvbWVuPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAg +ICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1hY3RpdmUiPgogICAgICAgIAogICAg +PGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50Lmh0bWwiIHRpdGxlPSJFcXVpcG1l +bnQiIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5FcXVpcG1lbnQ8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRp +b25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0 +YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vYWJvdXQtdXMuaHRtbCIgdGl0bGU9IkFib3V0IFVzIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+QWJvdXQgVXM8L2E+CgogICAgICAgIAog +ICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0i +aHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vcHJvZHVjdHMuaHRtbCIgdGl0bGU9IlByb2R1Y3RzIiBjbGFzcz0i +Y21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+UHJvZHVjdHM8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21w +LW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdl +LW1hc3RlcnMvZW4vbWVuMS5odG1sIiB0aXRsZT0iTWVuIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+TWVuPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAg +ICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFu +c2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3Rlc3QtdGl0bGUtY2hhcmFjdGVycy0uaHRtbCIgdGl0bGU9Ik5TWCBEaXN0cmlidXRlZCBJRFMvSVBTIHwgSW50 +cnVzaW9uIERldGVjdGlvbiAmYW1wOyBQcmV2ZW50aW9uIFN5c3RlbSB8IFZNd2FyZSIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPk5TWCBEaXN0cmlidXRlZCBJRFMvSVBTIHwgSW50 +cnVzaW9uIERldGVjdGlvbiAmYW1wOyBQcmV2ZW50aW9uIFN5c3RlbSB8IFZNd2FyZTwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdh +dGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1y +ZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9hYm91dC11czEuaHRtbCIgdGl0bGU9IkFib3V0IFVzIDIuMCIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkFib3V0IFVzIDIuMDwvYT4K +CiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAg +ICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9hYm91dC11czIuaHRtbCIgdGl0bGU9IkFib3V0 +IFVzICZhbXA7IE90aGVycyIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkFib3V0IFVzICZhbXA7IE90aGVyczwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAog +ICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJh +bnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi93b21lbjEuaHRtbCIgdGl0bGU9Ik1lbiAmYW1wOyBXb21lbiIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVt +LWxpbmsiPk1lbiAmYW1wOyBXb21lbjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9f +aXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9t +ZW4yLmh0bWwiIHRpdGxlPSJQcm9kdWN0cyAmYW1wOyBJdGVtcyIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPlByb2R1Y3RzICZhbXA7IEl0ZW1zPC9hPgoKICAgICAgICAKICAgIDwv +bGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBz +Oi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL3dvbWVuMi5odG1sIiB0aXRsZT0iV29tZW4iIGNsYXNzPSJjbXAtbmF2aWdh +dGlvbl9faXRlbS1saW5rIj5Xb21lbjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9f +aXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9t +ZW4zLmh0bWwiIHRpdGxlPSJNZW4iIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5NZW48L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0i +Y21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2Nv +bnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vYWJvdXQtdXMzLmh0bWwiIHRpdGxlPSJBYm91dCBVcyIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkFib3V0IFVzPC9h +PgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZpZ2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAK +ICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudDEuaHRtbCIgdGl0bGU9IkVx +dWlwbWVudCIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPkVxdWlwbWVudDwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2 +aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93 +ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi90ZXN0LXRpdGxlLWNoYXJhY3RlcnMtMS5odG1sIiB0aXRsZT0iTlNYIERpc3RyaWJ1dGVkIElEUy9JUFMgfCBJbnRydXNpb24gRGV0ZWN0aW9uICZh +bXA7IFByZXZlbnRpb24gU3lzdGVtIHwgVk13YXJlIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+TlNYIERpc3RyaWJ1dGVkIElEUy9JUFMgfCBJbnRydXNpb24gRGV0ZWN0aW9uICZh +bXA7IFByZXZlbnRpb24gU3lzdGVtIHwgVk13YXJlPC9hPgoKICAgICAgICAKICAgIDwvbGk+CgogICAgCiAgICAgICAgCiAgICA8bGkgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtIGNtcC1uYXZp +Z2F0aW9uX19pdGVtLS1sZXZlbC0wIj4KICAgICAgICAKICAgIDxhIGhyZWY9Imh0dHBzOi8vZmlsZXMuc2FuZGJveC50cmFuc2xhdGVkLmNvbS9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0 +ZXJzL2VuL3Rlc3QtdGl0bGUtY2hhcmFjdGVycy0yLmh0bWwiIHRpdGxlPSJOU1ggRGlzdHJpYnV0ZWQgSURTL0lQUyB8IEludHJ1c2lvbiBEZXRlY3Rpb24gJmFtcDsgUHJldmVudGlvbiBTeXN0ZW0g +fCBWTXdhcmUiIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5OU1ggRGlzdHJpYnV0ZWQgSURTL0lQUyB8IEludHJ1c2lvbiBEZXRlY3Rpb24gJmFtcDsgUHJldmVudGlvbiBTeXN0ZW0g +fCBWTXdhcmU8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAi +PgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50Mi5odG1s +IiB0aXRsZT0iRXF1aXBtZW50LTIiIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5rIj5FcXVpcG1lbnQtMjwvYT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxp +IGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAgCiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRl +ZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9hYm91dC11czExLmh0bWwiIHRpdGxlPSJBYm91dCBVcyAyLjAiIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbS1saW5r +Ij5BYm91dCBVcyAyLjA8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAKICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxl +dmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50 +MjEuaHRtbCIgdGl0bGU9IkVxdWlwbWVudC0yIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+RXF1aXBtZW50LTI8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICAKICAgICAgICAK +ICAgIDxsaSBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0gY21wLW5hdmlnYXRpb25fX2l0ZW0tLWxldmVsLTAiPgogICAgICAgIAogICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRy +YW5zbGF0ZWQuY29tL2NvbnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vbWVuMzEuaHRtbCIgdGl0bGU9Ik1lbiIgY2xhc3M9ImNtcC1uYXZpZ2F0aW9uX19pdGVtLWxpbmsiPk1lbjwv +YT4KCiAgICAgICAgCiAgICA8L2xpPgoKICAgIAogICAgICAgIAogICAgPGxpIGNsYXNzPSJjbXAtbmF2aWdhdGlvbl9faXRlbSBjbXAtbmF2aWdhdGlvbl9faXRlbS0tbGV2ZWwtMCI+CiAgICAgICAg +CiAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJhbnNsYXRlZC5jb20vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9lbi9lcXVpcG1lbnQyMTEuaHRtbCIgdGl0bGU9 +IkVxdWlwbWVudC0yIiBjbGFzcz0iY21wLW5hdmlnYXRpb25fX2l0ZW0tbGluayI+RXF1aXBtZW50LTI8L2E+CgogICAgICAgIAogICAgPC9saT4KCiAgICA8L3VsPgo8L25hdj4KCiAgICAKCjwhLS1j +cXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2VyZXRhaWwvY29tcG9uZW50cy9zdHJ1Y3R1cmUvbmF2aWdhdGlvbiIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50 +L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290L2Zvb3Rlci9uYXZpZ2F0aW9uIiwic3RydWN0dXJlUGF0aCI6Ii9jb25mL3dlLXJldGFpbC9zZXR0 +aW5ncy93Y20vdGVtcGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1cmUvamNyOmNvbnRlbnQvcm9vdC9mb290ZXIvbmF2aWdhdGlvbiIsInNlbGVjdG9ycyI6bnVsbCwic2VydmxldCI6IlNjcmlwdCAvYXBw +cy9jb3JlL3djbS9jb21wb25lbnRzL25hdmlnYXRpb24vdjEvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLmh0bWwiLCJ0b3RhbFRpbWUiOjEyLCJzZWxmVGltZSI6MTJ9LS0+CjwvZGl2PgoKICAgICAgICAg +ICAgICAgIDwvZGl2PgoKCiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93IHdlLUZvb3Rlci1zZWN0aW9uIHdlLUZvb3Rlci1zZWN0aW9uLS1zdWIiPgogICAgICAg +ICAgICAgICAgPGRpdiBjbGFzcz0id2UtRm9vdGVyLXNlY3Rpb24taXRlbSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtdXBwZXJjYXNlIHRleHQtbXV0ZWQiPsKpIDIwMjUg +QWxsIHJpZ2h0cyByZXNlcnZlZDwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2UtRm9vdGVyLXNlY3Rpb24taXRlbSI+CiAgICAgICAgICAg +ICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9maWxlcy5zYW5kYm94LnRyYW5zbGF0ZWQuY29tL3Byb3ZldHRhL2NvbnRlbnQvbGF1bmNoZXMvMjAyNS8wNC8wNC9sYXVuY2hfY29weV9vZl9kZW1vL2Nv +bnRlbnQvd2UtcmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZGUvZXF1aXBtZW50Lmh0bWwjIiBjbGFzcz0idGV4dC11cHBlcmNhc2UgdGV4dC1tdXRlZCI+VGVybXMgb2YgdXNlICZhbXA7IHByaXZhY3kg +cG9saWN5PC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNv +bC1tZC0xMiI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dC1jZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2ZpbGVzLnNhbmRib3gudHJh +bnNsYXRlZC5jb20vcHJvdmV0dGEvY29udGVudC9sYXVuY2hlcy8yMDI1LzA0LzA0L2xhdW5jaF9jb3B5X29mX2RlbW8vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2UtbWFzdGVycy9kZS9lcXVpcG1l +bnQuaHRtbCN0b3AiIGNsYXNzPSJidG4gYnRuLWFjdGlvbiBidG4tYWN0aW9uLXVwIGJ0bi1wcmltYXJ5Ij5SaWRlIHRvIHRoZSB0b3A8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAg +ICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgIDwvZGl2PgogICAgPC9mb290ZXI+Cgo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6IndlcmV0YWlsL2NvbXBv +bmVudHMvc3RydWN0dXJlL2Zvb3RlciIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6 +Y29udGVudC9yb290L2Zvb3RlciIsInN0cnVjdHVyZVBhdGgiOiIvY29uZi93ZS1yZXRhaWwvc2V0dGluZ3Mvd2NtL3RlbXBsYXRlcy9oZXJvLXBhZ2Uvc3RydWN0dXJlL2pjcjpjb250ZW50L3Jvb3Qv +Zm9vdGVyIiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9hcHBzL3dlcmV0YWlsL2NvbXBvbmVudHMvc3RydWN0dXJlL2Zvb3Rlci9mb290ZXIuaHRtbCIsInRvdGFsVGltZSI6MTMs +InNlbGZUaW1lIjoxfS0tPgo8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJuZXcgbmV3cGFyIHNlY3Rpb24gYWVtLUdyaWQtbmV3Q29tcG9uZW50Ij4KCjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBl +Ijoid2NtL2ZvdW5kYXRpb24vY29tcG9uZW50cy9yZXNwb25zaXZlZ3JpZC9uZXciLCJwYXRoIjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29udGVudC93ZS1yZXRhaWwvbGFuZ3VhZ2Ut +bWFzdGVycy9lbi9lcXVpcG1lbnQvamNyOmNvbnRlbnQvcm9vdC8qIiwic3RydWN0dXJlUGF0aCI6Ii9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vdGVtcGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1 +cmUvamNyOmNvbnRlbnQvcm9vdC8qIiwic2VsZWN0b3JzIjpudWxsLCJzZXJ2bGV0IjoiU2NyaXB0IC9saWJzL3djbS9mb3VuZGF0aW9uL2NvbXBvbmVudHMvcGFyc3lzL25ld3Bhci9uZXdwYXIuaHRt +bCIsInRvdGFsVGltZSI6MSwic2VsZlRpbWUiOjF9LS0+CjwvZGl2PgoKPC9kaXY+CjwhLS1jcXsiZGVjb3JhdGVkIjp0cnVlLCJ0eXBlIjoid2NtL2ZvdW5kYXRpb24vY29tcG9uZW50cy9yZXNwb25z +aXZlZ3JpZCIsInBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9yb290Iiwi +c3RydWN0dXJlUGF0aCI6Ii9jb25mL3dlLXJldGFpbC9zZXR0aW5ncy93Y20vdGVtcGxhdGVzL2hlcm8tcGFnZS9zdHJ1Y3R1cmUvamNyOmNvbnRlbnQvcm9vdCIsInNlbGVjdG9ycyI6bnVsbCwic2Vy +dmxldCI6IlNjcmlwdCAvbGlicy93Y20vZm91bmRhdGlvbi9jb21wb25lbnRzL3Jlc3BvbnNpdmVncmlkL3Jlc3BvbnNpdmVncmlkLmh0bWwiLCJ0b3RhbFRpbWUiOjE2MCwic2VsZlRpbWUiOjE0fS0t +Pgo8L2Rpdj4KCjwvZGl2PgoKICAgICAgICAgICAgCiAgICAKICAgIAoKICAgIAogICAgCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4vRXF1aXBtZW50X2ZpbGVzL2pxdWVyeS11 +aS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4vRXF1aXBtZW50X2ZpbGVzL2pxdWVyeS11aS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9q +YXZhc2NyaXB0IiBzcmM9Ii4vRXF1aXBtZW50X2ZpbGVzL3NpdGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuL0VxdWlwbWVudF9maWxlcy9jbGllbnRs +aWItYmFzZS5qcyI+PC9zY3JpcHQ+CgoKCiAgICAKICAgIAogICAgCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4vRXF1aXBtZW50X2ZpbGVzL2F1dGhvcmluZy5qcyI+PC9zY3Jp +cHQ+CgoKCgoKICAgIAo8IS0tY3F7ImRlY29yYXRlZCI6dHJ1ZSwidHlwZSI6ImNxL2Nsb3Vkc2VydmljZWNvbmZpZ3MvY29tcG9uZW50cy9zZXJ2aWNlY29tcG9uZW50cyIsInBhdGgiOiIuLi8uLi8u +Li8uLi8uLi8uLi8uLi8uLi8uLi8uLi9jb250ZW50L3Jlc291cmNlcy9zZXJ2aWNlY29tcG9uZW50cy5qc3AiLCJ0b3RhbFRpbWUiOjAsInNlbGZUaW1lIjowfS0tPgoKICAgIAo8IS0tY3F7ImRlY29y +YXRlZCI6ZmFsc2UsInR5cGUiOiJjcS9jbG91ZGNvbmZpZy9jb21wb25lbnRzL3NjcmlwdHRhZ3MvZm9vdGVyIiwicGF0aCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnRlbnQvd2Ut +cmV0YWlsL2xhbmd1YWdlLW1hc3RlcnMvZW4vZXF1aXBtZW50L2pjcjpjb250ZW50L2Nsb3VkY29uZmlnLWZvb3RlciIsInN0cnVjdHVyZVBhdGgiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8u +Li9jb250ZW50L3dlLXJldGFpbC9sYW5ndWFnZS1tYXN0ZXJzL2VuL2VxdWlwbWVudC9qY3I6Y29udGVudC9jbG91ZGNvbmZpZy1mb290ZXIiLCJzZWxlY3RvcnMiOm51bGwsInNlcnZsZXQiOiJTY3Jp +cHQgL2xpYnMvY3EvY2xvdWRjb25maWcvY29tcG9uZW50cy9zY3JpcHR0YWdzL2Zvb3Rlci9mb290ZXIuaHRtbCIsInRvdGFsVGltZSI6Miwic2VsZlRpbWUiOjJ9LS0+CgoKICAgICAgICAgICAgCgog +ICAgICAgIAogICAgCgoKPC9ib2R5PjwvaHRtbD4=
+
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cjwh +LS1QTEVBU0UsIERPIE5PVCBSRU5BTUUsIE1PVkUsIE1PRElGWSBPUiBBTFRFUiBJTiBBTlkgV0FZIFRISVMgRklMRS0tPgo8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KPG1hbmlmZXN0IHZlcnNpb249IjIiIGxpYlZlcnNpb249IjEuNDAuNy1UUkFOU0xBVEVEIiBwcm9qZWN0SWQ9Ik5FMkQzNTc0NCIgcGFja2FnZUlk +PSIwZTRjNzk5MS02ZmQyLTQ5OTItYjllNy1mNDZkOTNhNDY5ZjMiIHNvdXJjZT0iZW4tVVMiIHRhcmdldD0iZnItRlIiIG9yaWdpbmFsU3ViRGlyPSJvcmlnaW5hbCIgc2tlbGV0b25TdWJEaXI9InNr +ZWxldG9uIiBzb3VyY2VTdWJEaXI9IndvcmsiIHRhcmdldFN1YkRpcj0id29yayIgbWVyZ2VTdWJEaXI9ImRvbmUiIHRtU3ViRGlyPSIiIGRhdGU9IjIwMjYtMDMtMjMgMTU6NDM6MzUrMDAwMCIgdXNl +QXBwcm92ZWRPbmx5PSIwIiB1cGRhdGVBcHByb3ZlZEZsYWc9IjAiPgo8Y3JlYXRvclBhcmFtZXRlcnM+STNZeENuQnNZV05sYUc5c1pHVnlUVzlrWlM1aVBYUnlkV1VLYVc1amJIVmtaVTV2VkhKaGJu +TnNZWFJsTG1JOWRISjFaUXB6WlhSQmNIQnliM1psWkVGelRtOVVjbUZ1YzJ4aGRHVXVZajFtWVd4elpRcGpiM0I1VTI5MWNtTmxMbUk5ZEhKMVpRcHBibU5zZFdSbFFXeDBWSEpoYm5NdVlqMTBjblZs +Q21sdVkyeDFaR1ZEYjJSbFFYUjBjbk11WWoxbVlXeHpaUXBwYm1Oc2RXUmxTWFJ6TG1JOVptRnNjMlVLWlhOallYQmxSMVF1WWoxMGNuVmw8L2NyZWF0b3JQYXJhbWV0ZXJzPgo8ZG9jIHhtbDpzcGFj +ZT0icHJlc2VydmUiIGRvY0lkPSIxIiBleHRyYWN0aW9uVHlwZT0ieGxpZmYiIHJlbGF0aXZlSW5wdXRQYXRoPSJFcXVpcG1lbnQuaHRtbCIgZmlsdGVySWQ9Im9rZl9odG1sIiBpbnB1dEVuY29kaW5n +PSJVVEYtOCIgcmVsYXRpdmVUYXJnZXRQYXRoPSJFcXVpcG1lbnQub3V0Lmh0bWwiIHRhcmdldEVuY29kaW5nPSJVVEYtOCIgc2VsZWN0ZWQ9IjEiPllYTnpkVzFsVjJWc2JHWnZjbTFsWkRvZ1ptRnNj +MlVLY0hKbGMyVnlkbVZmZDJocGRHVnpjR0ZqWlRvZ2RISjFaUXB4ZFc5MFpVMXZaR1ZFWldacGJtVmtPaUIwY25WbENuRjFiM1JsVFc5a1pUb2dNd3BoZEhSeWFXSjFkR1Z6T2dvZ0lHUnBjam9LSUNB +Z0lISjFiR1ZVZVhCbGN6b2dXMEZVVkZKSlFsVlVSVjlYVWtsVVFVSk1SVjBLSUNBZ0lHRnNiRVZzWlcxbGJuUnpSWGhqWlhCME9pQmJZbUZ6WlN3Z1ltRnpaV1p5YjI1MExDQm9aV0ZrTENCb2RHMXNM +Q0J0WlhSaExDQndZWEpoYlN3Z2MyTnlhWEIwWFFvZ0lIUnBkR3hsT2dvZ0lDQWdjblZzWlZSNWNHVnpPaUJiUVZSVVVrbENWVlJGWDFSU1FVNVRYUW9nSUNBZ1lXeHNSV3hsYldWdWRITkZlR05sY0hR +NklGdGlZWE5sTENCaVlYTmxabkp2Ym5Rc0lHaGxZV1FzSUdoMGJXd3NJRzFsZEdFc0lIQmhjbUZ0TENCelkzSnBjSFFzSUhScGRHeGxYUW9nSUd4aGJtYzZDaUFnSUNCeWRXeGxWSGx3WlhNNklGdEJW +RlJTU1VKVlZFVmZWMUpKVkVGQ1RFVmRDaUFnZUcxc09teGhibWM2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRCVkZSU1NVSlZWRVZmVjFKSlZFRkNURVZkQ21Wc1pXMWxiblJ6T2dvZ0lHNXZaV1JwZERv +S0lDQWdJSEoxYkdWVWVYQmxjem9nVzBWWVEweFZSRVZkQ2lBZ2JXVjBZVG9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMEZVVkZKSlFsVlVSVk5mVDA1TVdWMEtJQ0FnSUhSeVlXNXpiR0YwWVdKc1pVRjBk +SEpwWW5WMFpYTTZDaUFnSUNBZ0lHTnZiblJsYm5RNkNpQWdJQ0FnSUMwZ1cyaDBkSEF0WlhGMWFYWXNJRVZSVlVGTVV5d2dhMlY1ZDI5eVpITmRDaUFnSUNBZ0lDMGdMU0J1WVcxbENpQWdJQ0FnSUNB +Z0xTQkZVVlZCVEZNS0lDQWdJQ0FnSUNBdElGdHJaWGwzYjNKa2N5d2daR1Z6WTNKcGNIUnBiMjVkQ2lBZ0lDQjNjbWwwWVdKc1pVeHZZMkZzYVhwaFlteGxRWFIwY21saWRYUmxjem9LSUNBZ0lDQWdZ +Mjl1ZEdWdWREb0tJQ0FnSUNBZ0xTQXRJR2gwZEhBdFpYRjFhWFlLSUNBZ0lDQWdJQ0F0SUVWUlZVRk1Vd29nSUNBZ0lDQWdJQzBnVzJOdmJuUmxiblF0YkdGdVozVmhaMlVzSUdOdmJuUmxiblF0ZEhs +d1pWMEtJQ0FnSUNBZ1kyaGhjbk5sZERvZ2JuVnNiQW9nSUNBZ2NtVmhaRTl1YkhsTWIyTmhiR2w2WVdKc1pVRjBkSEpwWW5WMFpYTTZDaUFnSUNBZ0lHTnZiblJsYm5RNkNpQWdJQ0FnSUMwZ0xTQnVZ +VzFsQ2lBZ0lDQWdJQ0FnTFNCRlVWVkJURk1LSUNBZ0lDQWdJQ0F0SUZ0blpXNWxjbUYwYjNJc0lHRjFkR2h2Y2l3Z2NISnZaMmxrTENCa1lYUmxYUW9nSUdGeVpXRTZDaUFnSUNCeWRXeGxWSGx3WlhN +NklGdEJWRlJTU1VKVlZFVlRYMDlPVEZsZENpQWdJQ0IwY21GdWMyeGhkR0ZpYkdWQmRIUnlhV0oxZEdWek9pQmJZV05qWlhOemEyVjVMQ0JoY21WaExDQmhiSFJkQ2lBZ2FYTnBibVJsZURvS0lDQWdJ +SEoxYkdWVWVYQmxjem9nVzBGVVZGSkpRbFZVUlZOZlQwNU1XVjBLSUNBZ0lIUnlZVzV6YkdGMFlXSnNaVUYwZEhKcFluVjBaWE02SUZ0d2NtOXRjSFJkQ2lBZ2IzQjBhVzl1T2dvZ0lDQWdjblZzWlZS +NWNHVnpPaUJiVkVWWVZGVk9TVlJkQ2lBZ0lDQjBjbUZ1YzJ4aGRHRmliR1ZCZEhSeWFXSjFkR1Z6T2lCYmJHRmlaV3hkQ2lBZ2IzQjBaM0p2ZFhBNkNpQWdJQ0J5ZFd4bFZIbHdaWE02SUZ0QlZGUlNT +VUpWVkVWVFgwOU9URmxkQ2lBZ0lDQjBjbUZ1YzJ4aGRHRmliR1ZCZEhSeWFXSjFkR1Z6T2lCYmJHRmlaV3hkQ2lBZ1lXUmtjbVZ6Y3pvS0lDQWdJSEoxYkdWVWVYQmxjem9nVzFSRldGUlZUa2xVWFFv +Z0lDQWdhV1JCZEhSeWFXSjFkR1Z6T2lCYmFXUmRDaUFnWkhRNkNpQWdJQ0J5ZFd4bFZIbHdaWE02SUZ0VVJWaFVWVTVKVkYwS0lDQWdJR2xrUVhSMGNtbGlkWFJsY3pvZ1cybGtYUW9nSUdneE9nb2dJ +Q0FnY25Wc1pWUjVjR1Z6T2lCYlZFVllWRlZPU1ZSZENpQWdJQ0JwWkVGMGRISnBZblYwWlhNNklGdHBaRjBLSUNCb01qb0tJQ0FnSUhKMWJHVlVlWEJsY3pvZ1cxUkZXRlJWVGtsVVhRb2dJQ0FnYVdS +QmRIUnlhV0oxZEdWek9pQmJhV1JkQ2lBZ2FETTZDaUFnSUNCeWRXeGxWSGx3WlhNNklGdFVSVmhVVlU1SlZGMEtJQ0FnSUdsa1FYUjBjbWxpZFhSbGN6b2dXMmxrWFFvZ0lHZzBPZ29nSUNBZ2NuVnNa +VlI1Y0dWek9pQmJWRVZZVkZWT1NWUmRDaUFnSUNCcFpFRjBkSEpwWW5WMFpYTTZJRnRwWkYwS0lDQm9OVG9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMVJGV0ZSVlRrbFVYUW9nSUNBZ2FXUkJkSFJ5YVdK +MWRHVnpPaUJiYVdSZENpQWdhRFk2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRVUlZoVVZVNUpWRjBLSUNBZ0lHbGtRWFIwY21saWRYUmxjem9nVzJsa1hRb2dJR3hsWjJWdVpEb0tJQ0FnSUhKMWJHVlVl +WEJsY3pvZ1cxUkZXRlJWVGtsVVhRb2dJQ0FnZEhKaGJuTnNZWFJoWW14bFFYUjBjbWxpZFhSbGN6b2dXMkZqWTJWemMydGxlVjBLSUNBZ0lHbGtRWFIwY21saWRYUmxjem9nVzJsa1hRb2dJR3hwT2dv +Z0lDQWdjblZzWlZSNWNHVnpPaUJiVkVWWVZGVk9TVlFzSUZCU1JWTkZVbFpGWDFkSVNWUkZVMUJCUTBWZENpQWdJQ0IwY21GdWMyeGhkR0ZpYkdWQmRIUnlhV0oxZEdWek9pQmJkbUZzZFdWZENpQWdJ +Q0JwWkVGMGRISnBZblYwWlhNNklGdHBaRjBLSUNCdFlYSnhkV1ZsT2dvZ0lDQWdjblZzWlZSNWNHVnpPaUJiVkVWWVZGVk9TVlJkQ2lBZ0lDQnBaRUYwZEhKcFluVjBaWE02SUZ0cFpGMEtJQ0J3T2dv +Z0lDQWdjblZzWlZSNWNHVnpPaUJiVkVWWVZGVk9TVlJkQ2lBZ0lDQnBaRUYwZEhKcFluVjBaWE02SUZ0cFpGMEtJQ0FnSUdWc1pXMWxiblJVZVhCbE9pQndZWEpoWjNKaGNHZ0tJQ0J3Y21VNkNpQWdJ +Q0J5ZFd4bFZIbHdaWE02SUZ0VVJWaFVWVTVKVkN3Z1VGSkZVMFZTVmtWZlYwaEpWRVZUVUVGRFJWMEtJQ0FnSUdsa1FYUjBjbWxpZFhSbGN6b2dXMmxrWFFvZ0lIUmtPZ29nSUNBZ2NuVnNaVlI1Y0dW +ek9pQmJWRVZZVkZWT1NWUmRDaUFnSUNCMGNtRnVjMnhoZEdGaWJHVkJkSFJ5YVdKMWRHVnpPaUJiWVdKaWNsMEtJQ0FnSUdsa1FYUjBjbWxpZFhSbGN6b2dXMmxrWFFvZ0lIUm9PZ29nSUNBZ2NuVnNa +VlI1Y0dWek9pQmJWRVZZVkZWT1NWUmRDaUFnSUNCcFpFRjBkSEpwWW5WMFpYTTZJRnRwWkYwS0lDQWdJSFJ5WVc1emJHRjBZV0pzWlVGMGRISnBZblYwWlhNNklGdGhZbUp5WFFvZ0lIUnBkR3hsT2dv +Z0lDQWdjblZzWlZSNWNHVnpPaUJiVkVWWVZGVk9TVlJkQ2lBZ0lDQnBaRUYwZEhKcFluVjBaWE02SUZ0cFpGMEtJQ0JoT2dvZ0lDQWdjblZzWlZSNWNHVnpPaUJiU1U1TVNVNUZYUW9nSUNBZ1pXeGxi +V1Z1ZEZSNWNHVTZJR3hwYm1zS0lDQWdJSFJ5WVc1emJHRjBZV0pzWlVGMGRISnBZblYwWlhNNklGdDBhWFJzWlN3Z1lXTmpaWE56YTJWNVhRb2dJQ0FnZDNKcGRHRmliR1ZNYjJOaGJHbDZZV0pzWlVG +MGRISnBZblYwWlhNNklGdG9jbVZtWFFvZ0lHRmlZbkk2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRKVGt4SlRrVmRDaUFnWVdOeWIyNTViVG9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMGxPVEVsT1JWMEtJ +Q0JoY0hCc1pYUTZDaUFnSUNCeWRXeGxWSGx3WlhNNklGdEpUa3hKVGtWZENpQWdJQ0IwY21GdWMyeGhkR0ZpYkdWQmRIUnlhV0oxZEdWek9pQmJZV3gwWFFvZ0lHSTZDaUFnSUNCeWRXeGxWSGx3WlhN +NklGdEpUa3hKVGtWZENpQWdJQ0JsYkdWdFpXNTBWSGx3WlRvZ1ltOXNaQW9nSUdKa2J6b0tJQ0FnSUhKMWJHVlVlWEJsY3pvZ1cwbE9URWxPUlYwS0lDQmlhV2M2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJ +RnRKVGt4SlRrVmRDaUFnWW14cGJtczZDaUFnSUNCeWRXeGxWSGx3WlhNNklGdEpUa3hKVGtWZENpQWdZbkk2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRKVGt4SlRrVmRDaUFnWW5WMGRHOXVPZ29nSUNB +Z2NuVnNaVlI1Y0dWek9pQmJTVTVNU1U1RlhRb2dJQ0FnZEhKaGJuTnNZWFJoWW14bFFYUjBjbWxpZFhSbGN6b2dXMkZqWTJWemMydGxlU3dnZG1Gc2RXVmRDaUFnWTJsMFpUb0tJQ0FnSUhKMWJHVlVl +WEJsY3pvZ1cwbE9URWxPUlYwS0lDQmpiMlJsT2dvZ0lDQWdjblZzWlZSNWNHVnpPaUJiU1U1TVNVNUZYUW9nSUdOdmJXMWhibVE2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRKVGt4SlRrVmRDaUFnWkdW +c09nb2dJQ0FnY25Wc1pWUjVjR1Z6T2lCYlNVNU1TVTVGWFFvZ0lHUm1iam9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMGxPVEVsT1JWMEtJQ0JsYlRvS0lDQWdJSEoxYkdWVWVYQmxjem9nVzBsT1RFbE9S +VjBLSUNCbGJXSmxaRG9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMGxPVEVsT1JWMEtJQ0JtYjI1ME9nb2dJQ0FnY25Wc1pWUjVjR1Z6T2lCYlNVNU1TVTVGWFFvZ0lHaHlPZ29nSUNBZ2NuVnNaVlI1Y0dW +ek9pQmJTVTVNU1U1RlhRb2dJR2s2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRKVGt4SlRrVmRDaUFnSUNCbGJHVnRaVzUwVkhsd1pUb2dhWFJoYkdsakNpQWdhV1p5WVcxbE9nb2dJQ0FnY25Wc1pWUjVj +R1Z6T2lCYlNVNU1TVTVGWFFvZ0lHbHRaem9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMGxPVEVsT1JWMEtJQ0FnSUdWc1pXMWxiblJVZVhCbE9pQnBiV0ZuWlFvZ0lDQWdkSEpoYm5Oc1lYUmhZbXhsUVhS +MGNtbGlkWFJsY3pvZ1czUnBkR3hsTENCaGJIUmRDaUFnSUNCM2NtbDBZV0pzWlV4dlkyRnNhWHBoWW14bFFYUjBjbWxpZFhSbGN6b2dXMmh5WldZc0lITnlZMTBLSUNCcGJuQjFkRG9LSUNBZ0lISjFi +R1ZVZVhCbGN6b2dXMGxPVEVsT1JWMEtJQ0FnSUhSeVlXNXpiR0YwWVdKc1pVRjBkSEpwWW5WMFpYTTZDaUFnSUNBZ0lHRnNkRG9LSUNBZ0lDQWdMU0IwZVhCbENpQWdJQ0FnSUMwZ1RrOVVYMFZSVlVG +TVV3b2dJQ0FnSUNBdElGdG1hV3hsTENCb2FXUmtaVzRzSUdsdFlXZGxMQ0J3WVhOemQyOXlaRjBLSUNBZ0lDQWdkbUZzZFdVNkNpQWdJQ0FnSUMwZ2RIbHdaUW9nSUNBZ0lDQXRJRTVQVkY5RlVWVkJU +Rk1LSUNBZ0lDQWdMU0JiWm1sc1pTd2dhR2xrWkdWdUxDQnBiV0ZuWlN3Z2NHRnpjM2R2Y21SZENpQWdJQ0FnSUdGalkyVnpjMnRsZVRvS0lDQWdJQ0FnTFNCMGVYQmxDaUFnSUNBZ0lDMGdUazlVWDBW +UlZVRk1Vd29nSUNBZ0lDQXRJRnRtYVd4bExDQm9hV1JrWlc0c0lHbHRZV2RsTENCd1lYTnpkMjl5WkYwS0lDQWdJQ0FnZEdsMGJHVTZDaUFnSUNBZ0lDMGdkSGx3WlFvZ0lDQWdJQ0F0SUU1UFZGOUZV +VlZCVEZNS0lDQWdJQ0FnTFNCYlptbHNaU3dnYUdsa1pHVnVMQ0JwYldGblpTd2djR0Z6YzNkdmNtUmRDaUFnSUNBZ0lIQnNZV05sYUc5c1pHVnlPaUJiZEhsd1pTd2dUazlVWDBWUlZVRk1VeXdnWkhW +dGJYbGRDaUFnYVc1ek9nb2dJQ0FnY25Wc1pWUjVjR1Z6T2lCYlNVNU1TVTVGWFFvZ0lHdGlaRG9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMGxPVEVsT1JWMEtJQ0JyWlhsblpXNDZDaUFnSUNCeWRXeGxW +SGx3WlhNNklGdEpUa3hKVGtWZENpQWdiR0ZpWld3NkNpQWdJQ0J5ZFd4bFZIbHdaWE02SUZ0SlRreEpUa1ZkQ2lBZ0lDQjBjbUZ1YzJ4aGRHRmliR1ZCZEhSeWFXSjFkR1Z6T2lCYllXTmpaWE56YTJW +NVhRb2dJRzFoY0RvS0lDQWdJSEoxYkdWVWVYQmxjem9nVzBsT1RFbE9SVjBLSUNCdWIySnlPZ29nSUNBZ2NuVnNaVlI1Y0dWek9pQmJTVTVNU1U1RlhRb2dJRzlpYW1WamREb0tJQ0FnSUhKMWJHVlVl +WEJsY3pvZ1cwbE9URWxPUlYwS0lDQWdJSFJ5WVc1emJHRjBZV0pzWlVGMGRISnBZblYwWlhNNklGdHpkR0Z1WkdKNVhRb2dJSEJoY21GdE9nb2dJQ0FnY25Wc1pWUjVjR1Z6T2lCYlNVNU1TVTVGWFFv +Z0lDQWdkSEpoYm5Oc1lYUmhZbXhsUVhSMGNtbGlkWFJsY3pvZ1czWmhiSFZsWFFvZ0lIRTZDaUFnSUNCeWRXeGxWSGx3WlhNNklGdEpUa3hKVGtWZENpQWdjem9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dX +MGxPVEVsT1JWMEtJQ0J6WVcxd09nb2dJQ0FnY25Wc1pWUjVjR1Z6T2lCYlNVNU1TVTVGWFFvZ0lITnRZV3hzT2dvZ0lDQWdjblZzWlZSNWNHVnpPaUJiU1U1TVNVNUZYUW9nSUhObGJHVmpkRG9LSUNB +Z0lISjFiR1ZVZVhCbGN6b2dXMEZVVkZKSlFsVlVSVk5mVDA1TVdWMEtJQ0J6YjNWeVkyVTZDaUFnSUNCeWRXeGxWSGx3WlhNNklGdEpUa3hKVGtWZENpQWdjM0JoYmpvS0lDQWdJSEoxYkdWVWVYQmxj +em9nVzBsT1RFbE9SVjBLSUNCemNHRmpaWEk2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRKVGt4SlRrVmRDaUFnYzNSeWFXdGxPZ29nSUNBZ2NuVnNaVlI1Y0dWek9pQmJTVTVNU1U1RlhRb2dJSE4wY205 +dVp6b0tJQ0FnSUhKMWJHVlVlWEJsY3pvZ1cwbE9URWxPUlYwS0lDQnpkV0k2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRKVGt4SlRrVmRDaUFnYzNWd09nb2dJQ0FnY25Wc1pWUjVjR1Z6T2lCYlNVNU1T +VTVGWFFvZ0lITjViV0p2YkRvS0lDQWdJSEoxYkdWVWVYQmxjem9nVzBsT1RFbE9SVjBLSUNCMFlXSnNaVG9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMEZVVkZKSlFsVlVSVk5mVDA1TVdWMEtJQ0FnSUhS +eVlXNXpiR0YwWVdKc1pVRjBkSEpwWW5WMFpYTTZJRnR6ZFcxdFlYSjVYUW9nSUhSbGVIUmhjbVZoT2dvZ0lDQWdjblZzWlZSNWNHVnpPaUJiU1U1TVNVNUZYUW9nSUNBZ2RISmhibk5zWVhSaFlteGxR +WFIwY21saWRYUmxjem9nVzJGalkyVnpjMnRsZVYwS0lDQjBjbUZqYXpvS0lDQWdJSEoxYkdWVWVYQmxjem9nVzBsT1RFbE9SVjBLSUNCMGREb0tJQ0FnSUhKMWJHVlVlWEJsY3pvZ1cwbE9URWxPUlYw +S0lDQjFPZ29nSUNBZ2NuVnNaVlI1Y0dWek9pQmJTVTVNU1U1RlhRb2dJQ0FnWld4bGJXVnVkRlI1Y0dVNklIVnVaR1Z5YkdsdVpXUUtJQ0IyWVhJNkNpQWdJQ0J5ZFd4bFZIbHdaWE02SUZ0SlRreEpU +a1ZkQ2lBZ2QySnlPZ29nSUNBZ2NuVnNaVlI1Y0dWek9pQmJTVTVNU1U1RlhRb2dJSEoxWW5rNkNpQWdJQ0J5ZFd4bFZIbHdaWE02SUZ0SlRreEpUa1ZkQ2lBZ2NtSTZDaUFnSUNCeWRXeGxWSGx3WlhN +NklGdEpUa3hKVGtWZENpQWdjblE2Q2lBZ0lDQnlkV3hsVkhsd1pYTTZJRnRKVGt4SlRrVmRDaUFnY21NNkNpQWdJQ0J5ZFd4bFZIbHdaWE02SUZ0SlRreEpUa1ZkQ2lBZ2NuQTZDaUFnSUNCeWRXeGxW +SGx3WlhNNklGdEpUa3hKVGtWZENpQWdjbUpqT2dvZ0lDQWdjblZzWlZSNWNHVnpPaUJiU1U1TVNVNUZYUW9nSUhKMFl6b0tJQ0FnSUhKMWJHVlVlWEJsY3pvZ1cwbE9URWxPUlYwS0lDQm1ZV05sT2dv +Z0lDQWdjblZzWlZSNWNHVnpPaUJiU1U1TVNVNUZYUW9nSUM0cU9nb2dJQ0FnY25Wc1pWUjVjR1Z6T2lCYlJWaERURlZFUlYwS0lDQWdJR052Ym1ScGRHbHZibk02SUZ0MGNtRnVjMnhoZEdVc0lFVlJW +VUZNVXl3Z0oyNXZKMTBLSUNCemRIbHNaVG9LSUNBZ0lISjFiR1ZVZVhCbGN6b2dXMFZZUTB4VlJFVmRDaUFnYzNSNWJHVnphR1ZsZERvS0lDQWdJSEoxYkdWVWVYQmxjem9nVzBWWVEweFZSRVZkQ2lB +Z2MyTnlhWEIwT2dvZ0lDQWdjblZzWlZSNWNHVnpPaUJiUlZoRFRGVkVSVjBLPC9kb2M+CjwvbWFuaWZlc3Q+
+ + + +Equipment +Equipment +Equipment + + +English +English +English + + + en + en + en + + +Account +Account +Account + + +Profile +Profile +Profile + + + + + + + + + + + + + Wishlist {{smartlistEntriesSize}} + + + + + + Wishlist {{smartlistEntriesSize}} + + + + + + Wishlist {{smartlistEntriesSize}} + + + + + + + + + + + + + + + + + + + + + + + + {{smartlistEntriesSize}} items in your wish list + + + {{smartlistEntriesSize}} items in your wish list + + + {{smartlistEntriesSize}} items in your wish list + + + +{{smartlist.name}} +{{smartlist.name}} +{{smartlist.name}} + + +{{ smartlistEntry.title }} +{{ smartlistEntry.title }} +{{ smartlistEntry.title }} + + + + + + + + + + + + + + + + + + + + + + {{ smartlistEntry.title }} + + + + + + {{ smartlistEntry.title }} + + + + + + {{ smartlistEntry.title }} + + + + + + + + + + + + + Add to cart + + + + + + + + + + Add to cart + + + + + + + + + + Add to cart + + + + + + + {{ smartlistEntry.description }} + + + + + {{ smartlistEntry.description }} + + + + + {{ smartlistEntry.description }} + + + + + + {{ key }}: {{ val }} + + + {{ key }}: {{ val }} + + + {{ key }}: {{ val }} + + + + + Qty: + {{smartlistEntry.quantity}} + + + Qty: + {{smartlistEntry.quantity}} + + + Qty: + {{smartlistEntry.quantity}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ smartlistEntry.priceFormatted }} + + + {{ smartlistEntry.priceFormatted }} + + + {{ smartlistEntry.priceFormatted }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Add all products to cart + + + + + + + + + Add all products to cart + + + + + + + + + Add all products to cart + + + + + + You do not have any products on your wish list. + + + You do not have any products on your wish list. + + + You do not have any products on your wish list. + + + + Messages + 0 + Messages + 0 + Messages + 0 + + + Notifications + 0 + Notifications + 0 + Notifications + 0 + + + + + + + + + + + + + + My cart {{cartEntriesSize}} + + + + + + + My cart {{cartEntriesSize}} + + + + + + + My cart {{cartEntriesSize}} + + + + + + + + + + + + + + + + + + + + + + + + {{cartEntriesSize}} items in cart + + + {{cartEntriesSize}} items in cart + + + {{cartEntriesSize}} items in cart + + + +The cart is empty. +The cart is empty. +The cart is empty. + + +{{ cartEntry.title }} +{{ cartEntry.title }} +{{ cartEntry.title }} + + + + + + + + + + + + + + + + + + + + + + {{ cartEntry.title }} + + + + + {{ cartEntry.title }} + + + + + {{ cartEntry.title }} + + + + + + + + + + {{ cartEntry.description }} + + + + + + + + {{ cartEntry.description }} + + + + + + + + {{ cartEntry.description }} + + + + + + {{ key }}: {{ val }} + + + {{ key }}: {{ val }} + + + {{ key }}: {{ val }} + + + + + Qty: + + + + {{ cartEntry.quantity }} + + + + Qty: + + + + {{ cartEntry.quantity }} + + + + Qty: + + + + {{ cartEntry.quantity }} + + + + + + + + + + + + + + + + + + + + + + + {{ cartEntry.priceFormatted }} + + + {{ cartEntry.priceFormatted }} + + + {{ cartEntry.priceFormatted }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sub-total: {{cartTotalPrice}} + + + sub-total: {{cartTotalPrice}} + + + sub-total: {{cartTotalPrice}} + + + + + Checkout + + + Checkout + + + Checkout + + + +Moderation +Moderation +Moderation + + +Log out +Log out +Log out + + + + + Toggle navigation + + + + + Toggle navigation + + + + we.Retail + + + + Toggle navigation + + + + + Toggle navigation + + + + we.Retail + + + + Toggle navigation + + + + + Toggle navigation + + + + we.Retail + + + + + + {{cartEntriesSize}} + + + + + {{cartEntriesSize}} + + + + + {{cartEntriesSize}} + + + + +we.Retail +we.Retail +we.Retail + + +Experience +Experience +Experience + + + + + Experience + + + + + + Experience + + + + + + Experience + + + + + +Arctic Surfing In Lofoten +Arctic Surfing In Lofoten +Arctic Surfing In Lofoten + + + + + Arctic Surfing In Lofoten + + + + + + Arctic Surfing In Lofoten + + + + + + Arctic Surfing In Lofoten + + + + + +48 hours of Wilderness +48 hours of Wilderness +48 hours of Wilderness + + + + + 48 hours of Wilderness + + + + + + 48 hours of Wilderness + + + + + + 48 hours of Wilderness + + + + + +Fly-fishing the Amazon +Fly-fishing the Amazon +Fly-fishing the Amazon + + + + + Fly-fishing the Amazon + + + + + + Fly-fishing the Amazon + + + + + + Fly-fishing the Amazon + + + + + +Skitouring +Skitouring +Skitouring + + + + + Skitouring + + + + + + Skitouring + + + + + + Skitouring + + + + + +Steelhead and Spines in Alaska +Steelhead and Spines in Alaska +Steelhead and Spines in Alaska + + + + + Steelhead and Spines in Alaska + + + + + + Steelhead and Spines in Alaska + + + + + + Steelhead and Spines in Alaska + + + + + +Camping in Western Australia +Camping in Western Australia +Camping in Western Australia + + + + + Camping in Western Australia + + + + + + Camping in Western Australia + + + + + + Camping in Western Australia + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +About Us +About Us +About Us + + + + + About Us + + + + + + About Us + + + + + + About Us + + + + + +Products +Products +Products + + + + + Products + + + + + + Products + + + + + + Products + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +About Us 2.0 +About Us 2.0 +About Us 2.0 + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + +About Us & Others +About Us & Others +About Us & Others + + + + + About Us & Others + + + + + + About Us & Others + + + + + + About Us & Others + + + + + +Men & Women +Men & Women +Men & Women + + + + + Men & Women + + + + + + Men & Women + + + + + + Men & Women + + + + + +Products & Items +Products & Items +Products & Items + + + + + Products & Items + + + + + + Products & Items + + + + + + Products & Items + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +About Us +About Us +About Us + + + + + About Us + + + + + + About Us + + + + + + About Us + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + +About Us 2.0 +About Us 2.0 +About Us 2.0 + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + + + + +Log out +Log out +Log out + + +Profile +Profile +Profile + + + + Messages + 0 + + + + Messages + 0 + + + + Messages + 0 + + + + + + Notifications + 0 + + + + Notifications + 0 + + + + Notifications + 0 + + + + + + + Wishlist {{smartlistEntriesSize}} + + + + + Wishlist {{smartlistEntriesSize}} + + + + + Wishlist {{smartlistEntriesSize}} + + + + + en + en + en + + + + + Search + + + + + Search + + + + + Search + + + + + + + + + + + + + + + + + + + + Search anything + Close search + + + + Search anything + Close search + + + + Search anything + Close search + + + + +Search +Search +Search + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CHOOSE YOUR COUNTRY +CHOOSE YOUR COUNTRY +CHOOSE YOUR COUNTRY + + +United States +United States +United States + + + + + + + + + + + + + + + + + + + + + + + + + +English +English +English + + + + + + English + + + + + + + English + + + + + + + English + + + + + +Español +Español +Español + + + + + + Español + + + + + + + Español + + + + + + + Español + + + + + +French +French +French + + + + + + French + + + + + + + French + + + + + + + French + + + + + +Italian +Italian +Italian + + + + + + Italian + + + + + + + Italian + + + + + + + Italian + + + + + +German +German +German + + + + + + German + + + + + + + German + + + + + + + German + + + + + +Canada +Canada +Canada + + + + + + + + + + + + + + + + + + + + + + + + + +English +English +English + + + + + + English + + + + + + + English + + + + + + + English + + + + + +Français +Français +Français + + + + + + Français + + + + + + + Français + + + + + + + Français + + + + + +Switzerland +Switzerland +Switzerland + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch +Deutsch +Deutsch + + + + + + Deutsch + + + + + + + Deutsch + + + + + + + Deutsch + + + + + +Français +Français +Français + + + + + + Français + + + + + + + Français + + + + + + + Français + + + + + +Italiano +Italiano +Italiano + + + + + + Italiano + + + + + + + Italiano + + + + + + + Italiano + + + + + +Germany +Germany +Germany + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch +Deutsch +Deutsch + + + + + + Deutsch + + + + + + + Deutsch + + + + + + + Deutsch + + + + + +France +France +France + + + + + + + + + + + + + + + + + + + + + + + + + +Français +Français +Français + + + + + + Français + + + + + + + Français + + + + + + + Français + + + + + +Spain +Spain +Spain + + + + + + + + + + + + + + + + + + + + + + + + + +Español +Español +Español + + + + + + Español + + + + + + + Español + + + + + + + Español + + + + + +Italy +Italy +Italy + + + + + + + + + + + + + + + + + + + + + + + + + +Italiano +Italiano +Italiano + + + + + + Italiano + + + + + + + Italiano + + + + + + + Italiano + + + + + +[Page] Navigation Title & +[Page] Navigation Title & +[Page] Navigation Title & + + +[Page] Navigation Title & +[Page] Navigation Title & +[Page] Navigation Title & + + + + + + [Page] Navigation Title & + + + + + + + [Page] Navigation Title & + + + + + + + [Page] Navigation Title & + + + + + + + Close + + + Close + + + Close + + + + + + + + + Equipment + + + + + Equipment + + + + + Equipment + + + + + +Welcome our finest equipment (8:17 AM) +Welcome our finest equipment (8:17 AM) +Welcome our finest equipment (8:17 AM) + + +Hiker on the trek in Himalayas, Anapurna valley, Nepal +Hiker on the trek in Himalayas, Anapurna valley, Nepal +Hiker on the trek in Himalayas, Anapurna valley, Nepal + + +Hiker Anapurna +Hiker Anapurna +Hiker Anapurna + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hiking + + + + + Hiking + + + + + Hiking + + + + +Trail running man exercising outdoors for fitness +Trail running man exercising outdoors for fitness +Trail running man exercising outdoors for fitness + + +Running Trail Man +Running Trail Man +Running Trail Man + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Running + + + + + Running + + + + + Running + + + + +Enduro mountain biking in the forest +Enduro mountain biking in the forest +Enduro mountain biking in the forest + + +Enduro Trail Jump +Enduro Trail Jump +Enduro Trail Jump + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Biking + + + + + Biking + + + + + Biking + + + + +Surfing in Nicaragua +Surfing in Nicaragua +Surfing in Nicaragua + + +Wave Nicaragua +Wave Nicaragua +Wave Nicaragua + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Surfing + + + + + Surfing + + + + + Surfing + + + + +Steep skiing above valley +Steep skiing above valley +Steep skiing above valley + + +Freeride Steep +Freeride Steep +Freeride Steep + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Snow Sports + + + + + Snow Sports + + + + + Snow Sports + + + + +Featured products (8:17 AM) +Featured products (8:17 AM) +Featured products (8:17 AM) + + + + + + + + + + +Marin +Marin +Marin + + +Marin +Marin +Marin + + + + + + + +Marin Mountain Bike Shoes +Marin Mountain Bike Shoes +Marin Mountain Bike Shoes + + + + footwear + + + $110.00 + + + + + off + + + + + footwear + + + $110.00 + + + + + off + + + + + footwear + + + $110.00 + + + + + off + + + + + + + + + + + + + +Fleet Shoe +Fleet Shoe +Fleet Shoe + + +Fleet Shoe +Fleet Shoe +Fleet Shoe + + + + + + + +Fleet Cross-Training Shoe +Fleet Cross-Training Shoe +Fleet Cross-Training Shoe + + + + footwear + + + $65.00 + + + + + off + + + + + footwear + + + $65.00 + + + + + off + + + + + footwear + + + $65.00 + + + + + off + + + + + + + + + + + + + +Sequoia +Sequoia +Sequoia + + +Sequoia +Sequoia +Sequoia + + + + + + + +Sequoia Bike Helmet +Sequoia Bike Helmet +Sequoia Bike Helmet + + + + helmet + + + $75.00 + + + + + off + + + + + helmet + + + $75.00 + + + + + off + + + + + helmet + + + $75.00 + + + + + off + + + + + + + + + + + + + +Rios +Rios +Rios + + +Rios +Rios +Rios + + + + + + + +Rios T Shirt +Rios T Shirt +Rios T Shirt + + + + shirt + + + $39.00 + + + + + off + + + + + shirt + + + $39.00 + + + + + off + + + + + shirt + + + $39.00 + + + + + off + + + + + + + + + + + + + +stretch_side +stretch_side +stretch_side + + +stretch_side +stretch_side +stretch_side + + + + + + + +The Stretch Longboard +The Stretch Longboard +The Stretch Longboard + + + + equipment + + + $900.00 + + + + + off + + + + + equipment + + + $900.00 + + + + + off + + + + + equipment + + + $900.00 + + + + + off + + + + + + + + + + + + + +116138647 +116138647 +116138647 + + +116138647 +116138647 +116138647 + + + + + + + +Faba Running Pants +Faba Running Pants +Faba Running Pants + + + + pants + + + $39.99 + + + + + off + + + + + pants + + + $39.99 + + + + + off + + + + + pants + + + $39.99 + + + + + off + + + + + + +All equipment + + + +All equipment + + + +All equipment + + + + +Winter is coming, get ready +Winter is coming, get ready +Winter is coming, get ready + + +Aggressive powder skiing +Aggressive powder skiing +Aggressive powder skiing + + +Freeride Extreme +Freeride Extreme +Freeride Extreme + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Snow Sports + + + + Skiing + + + + Snowboarding + + + + + Snow Sports + + + + Skiing + + + + Snowboarding + + + + + Snow Sports + + + + Skiing + + + + Snowboarding + + + + +Test Translation Section +Test Translation Section +Test Translation Section + + +This is a test Experience Fragment. It should appear on every page where it is added. +This is a test Experience Fragment. It should appear on every page where it is added. +This is a test Experience Fragment. It should appear on every page where it is added. + + +Special Characters: !@#$%^&*()_+-=;':",./<>?`~ +Special Characters: !@#$%^&*()_+-=;':",./<>?`~ +Special Characters: !@#$%^&*()_+-=;':",./<>?`~ + + + + we.Retail + + + we.Retail + + + we.Retail + + + +Experience +Experience +Experience + + + + + Experience + + + + + + Experience + + + + + + Experience + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +About Us +About Us +About Us + + + + + About Us + + + + + + About Us + + + + + + About Us + + + + + +Products +Products +Products + + + + + Products + + + + + + Products + + + + + + Products + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +About Us 2.0 +About Us 2.0 +About Us 2.0 + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + +About Us & Others +About Us & Others +About Us & Others + + + + + About Us & Others + + + + + + About Us & Others + + + + + + About Us & Others + + + + + +Men & Women +Men & Women +Men & Women + + + + + Men & Women + + + + + + Men & Women + + + + + + Men & Women + + + + + +Products & Items +Products & Items +Products & Items + + + + + Products & Items + + + + + + Products & Items + + + + + + Products & Items + + + + + +Women +Women +Women + + + + + Women + + + + + + Women + + + + + + Women + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +About Us +About Us +About Us + + + + + About Us + + + + + + About Us + + + + + + About Us + + + + + +Equipment +Equipment +Equipment + + + + + Equipment + + + + + + Equipment + + + + + + Equipment + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware +NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + + NSX Distributed IDS/IPS | Intrusion Detection & Prevention System | VMware + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + +About Us 2.0 +About Us 2.0 +About Us 2.0 + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + + About Us 2.0 + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + +Men +Men +Men + + + + + Men + + + + + + Men + + + + + + Men + + + + + +Equipment-2 +Equipment-2 +Equipment-2 + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + Equipment-2 + + + + + + + © 2025 All rights reserved + + + © 2025 All rights reserved + + + © 2025 All rights reserved + + + + + Terms of use & privacy policy + + + Terms of use & privacy policy + + + Terms of use & privacy policy + + + + + Ride to the top + + + Ride to the top + + + Ride to the top + + + + +
\ No newline at end of file diff --git a/public/css/sass/cattool.scss b/public/css/sass/cattool.scss index e76e856e15..103949a0c4 100644 --- a/public/css/sass/cattool.scss +++ b/public/css/sass/cattool.scss @@ -31,7 +31,7 @@ body.cattool { .main-container { position: relative; width: 100%; - height: 100%; + //height: 100%; flex: 1; //overflow: hidden; @@ -45,6 +45,134 @@ body.cattool { background-color: rgba(255, 255, 255, 0.4); } } + .context-preview-wrapper--collapsed { + position: fixed; + bottom: 88px; + left: 0; + right: 0; + display: flex; + justify-content: center; + z-index: 10; + opacity: 1; + height: 0; + pointer-events: none; + transition: + opacity 250ms ease-out, + transform 250ms ease-out; + + .context-preview__tab { + pointer-events: auto; + } + + &.context-preview-wrapper--tab-hidden { + opacity: 0; + transform: translateY(20px); + transition: + opacity 200ms ease-in, + transform 200ms ease-in; + } + } + .context-preview__resize-handle { + width: 100px; + height: 6px; + border-radius: 16px; + cursor: row-resize; + background-color: colors.$grey6; + flex-shrink: 0; + transition: background-color 0.15s; + margin: 0 auto; + &:hover { + background-color: colors.$grey1; + } + } + .context-preview__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 100px; + flex-shrink: 0; + user-select: none; + border: 1px solid colors.$grey4; + border-radius: 16px 16px 0 0; + background-color: colors.$white; + } + .context-preview__header-title { + display: flex; + align-items: center; + gap: 4px; + font-family: Calibri, sans-serif; + font-size: 12px; + font-weight: 700; + line-height: 1.33em; + color: colors.$black; + svg { + width: 16px; + height: 16px; + } + } + .context-preview__header-actions { + display: flex; + align-items: center; + gap: 4px; + } + .context-preview__header-close-label { + font-family: Calibri, sans-serif; + font-size: 12px; + font-weight: 700; + line-height: 1.33em; + color: colors.$grey7; + } + .context-preview__header-btn { + display: flex; + align-items: center; + justify-content: center; + height: 24px; + border: none; + background: transparent; + cursor: pointer; + svg { + width: 16px; + height: 16px; + } + } + .context-preview__tab { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 12px 4px 16px; + height: 26px; + background-color: colors.$white; + border-radius: 8px 8px 0 0; + cursor: pointer; + width: fit-content; + margin: 0 auto; + user-select: none; + } + .context-preview__tab-title { + font-family: Calibri, sans-serif; + font-size: 12px; + font-weight: 700; + line-height: 16px; + color: colors.$grey7; + } + .context-preview__tab-icon { + display: flex; + transform: rotate(180deg); + svg { + width: 16px; + height: 16px; + color: colors.$grey7; + } + } + .context-preview__container { + width: 100%; + flex-shrink: 0; + iframe { + width: 100%; + height: 100%; + border: none; + } + } .pointer-first-segment { height: 36px; diff --git a/public/css/sass/components/CattolFooter.scss b/public/css/sass/components/CattolFooter.scss index f3ea2628cb..b8535485f9 100644 --- a/public/css/sass/components/CattolFooter.scss +++ b/public/css/sass/components/CattolFooter.scss @@ -1,9 +1,14 @@ @use '../commons/colors'; - +.stats-foo { + position: fixed; + bottom: 0; + width: 100%; +} .footer-body { display: flex; height: 64px; padding: 0 10px; + background-color: colors.$white; .container-left, .container-center, diff --git a/public/css/sass/components/pages/ContextPreviewPage.scss b/public/css/sass/components/pages/ContextPreviewPage.scss new file mode 100644 index 0000000000..11d476f145 --- /dev/null +++ b/public/css/sass/components/pages/ContextPreviewPage.scss @@ -0,0 +1,307 @@ +@use '../common/SegmentedControl'; +@use '../../commons/colors'; +.context-preview-page { + width: 100%; + max-width: unset; +} + +.context-preview-zoom { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 8px; + background-color: colors.$grey8; + border-radius: 4px; + + &__button, + &__reset { + background-color: colors.$white; + border: 1px solid colors.$grey4; + border-radius: 3px; + padding: 4px 12px; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: all 0.15s ease; + + &:hover:not(:disabled) { + background-color: colors.$grey8; + border-color: colors.$grey3; + } + + &:disabled { + opacity: 0.4; + cursor: not-allowed; + } + } + + &__button { + width: 32px; + height: 32px; + padding: 0; + font-size: 18px; + line-height: 1; + } + + &__reset { + margin-left: 4px; + } + + &__level { + min-width: 50px; + text-align: center; + font-size: 13px; + font-weight: 600; + color: colors.$grey1; + } +} + +.context-preview-toolbar { + font-family: Calibri, Arial, Helvetica, sans-serif; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 12px; + padding: 12px 16px; + border-bottom: 1px solid colors.$grey4; + flex-shrink: 0; + position: sticky; + top: 0; + z-index: 10; + background-color: colors.$white; + .segmented-control__wrapper { + width: 430px; + } + .custom-segmented-control { + .segmented-control { + background-color: colors.$grey8; + } + .segmented-control__label { + line-height: 28px; + } + .segmented-control__cursor { + padding: 2px; + } + .segmented-control__cursor:before { + background-color: colors.$white; + } + .segmented-control input:checked + .segmented-control__label { + color: colors.$black; + } + } + + .container-segmented-control { + display: flex; + flex-direction: column; + gap: 10px; + } +} + +.context-preview-panels { + display: flex; + flex: 1; + gap: 0; + overflow: hidden; +} + +.context-preview-panel { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + overflow: hidden; +} + +.context-preview-panel-header { + font-family: Calibri, Arial, Helvetica, sans-serif; + padding: 8px 16px; + font-size: 13px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + flex-shrink: 0; +} + +.context-preview-divider { + width: 1px; + background-color: colors.$grey4; + flex-shrink: 0; +} + +.context-preview-content { + flex: 1; + overflow: auto; + cursor: default; + padding: 20px; + transform: translateZ(0); + + &__scaler { + transform-origin: top left; + transition: transform 0.2s ease; + overflow: visible; + } + + p, + li, + td, + th, + h1, + h2, + h3, + h4 { + cursor: pointer; + transition: background-color 0.15s ease; + + &:hover { + background-color: rgba(colors.$blue800, 0.08); + border-radius: 2px; + } + } +} + +.context-preview-loading { + display: flex; + align-items: center; + justify-content: center; + min-height: 300px; + font-size: 16px; + color: colors.$grey1; +} + +.context-preview-error { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 300px; + text-align: center; + + h2 { + color: colors.$red800; + margin-bottom: 12px; + font-size: 20px; + } + + p { + color: colors.$grey1; + font-size: 14px; + } +} + +// Highlight styles for matched text +mark.context-preview-highlight { + background-color: colors.$orangeDefaultTransparent; + color: inherit; + padding: 1px 2px; + border-radius: 2px; + box-decoration-break: clone; +} + +mark.context-preview-highlight--active { + background-color: colors.$warning; + outline: 2px solid colors.$warningHover; + outline-offset: 1px; +} + +// Navigation bar for cycling through multiple occurrences +.context-preview-nav { + display: flex; + align-items: center; + gap: 4px; + margin-left: 16px; + font-family: Calibri, Arial, Helvetica, sans-serif; +} + +.context-preview-nav__button { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + padding: 0; + border: 1px solid colors.$grey4; + border-radius: 4px; + background-color: colors.$white; + color: colors.$grey6; + cursor: pointer; + transition: + background-color 0.15s ease, + color 0.15s ease; + + &:hover { + background-color: colors.$grey5; + color: colors.$black; + } + + &:active { + background-color: colors.$grey4; + } + + // First button is "previous" — rotate the chevron to point up + &:first-child svg { + transform: rotate(180deg); + } +} + +.context-preview-nav__counter { + font-size: 13px; + font-weight: 600; + color: colors.$grey6; + min-width: 50px; + text-align: center; + white-space: nowrap; + user-select: none; +} + +[data-context-sids].context-preview-node--mismatch { + outline: 2px solid #e05c00; + outline-offset: 2px; + position: relative; + + &::after { + content: '⚠'; + position: absolute; + top: -0.6em; + right: -0.3em; + font-size: 0.75em; + color: #e05c00; + pointer-events: none; + } +} + +.context-preview-screenshot { + flex: 1; + width: 100%; + height: 100%; + overflow: auto; + background-color: colors.$white; + padding: 20px; + text-align: center; + white-space: nowrap; + + &__scaler { + transform-origin: center; + transition: + transform 0.2s ease, + margin 0.2s ease; + display: inline-block; + line-height: 0; + white-space: normal; + vertical-align: middle; + } + + img { + display: block; + max-width: none; + border: 1px solid colors.$grey4; + box-shadow: 0 2px 8px rgba(colors.$black, 0.1); + } +} + +.context-preview-screenshot-placeholder { + padding: 2rem; + color: colors.$grey1; + text-align: center; + font-size: 14px; +} diff --git a/public/img/icons/EyeIcon.js b/public/img/icons/EyeIcon.js new file mode 100644 index 0000000000..0dc909ebb5 --- /dev/null +++ b/public/img/icons/EyeIcon.js @@ -0,0 +1,27 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const FileIcon = ({size = 24}) => { + return ( + + + + ) +} + +FileIcon.propTypes = { + size: PropTypes.number, +} + +export default FileIcon diff --git a/public/js/components/contextPreview/LivePreviewPanel.js b/public/js/components/contextPreview/LivePreviewPanel.js new file mode 100644 index 0000000000..5042dc9455 --- /dev/null +++ b/public/js/components/contextPreview/LivePreviewPanel.js @@ -0,0 +1,23 @@ +import React from 'react' +import PropTypes from 'prop-types' + +export const LivePreviewPanel = ({panelRef, title, zoomLevel, ...props}) => { + return ( +
+
{title}
+
+
+
+
+ ) +} + +LivePreviewPanel.propTypes = { + panelRef: PropTypes.object.isRequired, + title: PropTypes.string.isRequired, + zoomLevel: PropTypes.number.isRequired, +} diff --git a/public/js/components/contextPreview/ScreenshotContextPanel.js b/public/js/components/contextPreview/ScreenshotContextPanel.js new file mode 100644 index 0000000000..6ccf597177 --- /dev/null +++ b/public/js/components/contextPreview/ScreenshotContextPanel.js @@ -0,0 +1,38 @@ +import React from 'react' +import PropTypes from 'prop-types' + +export const ScreenshotContextPanel = ({ + screenshotUrl, + zoomLevel, + title, + ...props +}) => { + const scale = zoomLevel / 100 + const margin = scale > 1 ? `${(scale - 1) * 25}%` : '0' + + return ( +
+
{title}
+
+ {screenshotUrl ? ( +
+ Segment context screenshot +
+ ) : ( +
+ No screenshot available +
+ )} +
+
+ ) +} + +ScreenshotContextPanel.propTypes = { + screenshotUrl: PropTypes.string, + zoomLevel: PropTypes.number.isRequired, + title: PropTypes.string.isRequired, +} diff --git a/public/js/components/contextPreview/index.js b/public/js/components/contextPreview/index.js new file mode 100644 index 0000000000..e5b90f0c15 --- /dev/null +++ b/public/js/components/contextPreview/index.js @@ -0,0 +1,2 @@ +export {LivePreviewPanel} from './LivePreviewPanel' +export {ScreenshotContextPanel} from './ScreenshotContextPanel' diff --git a/public/js/components/segments/Editarea.js b/public/js/components/segments/Editarea.js index ab3f5ede99..75e6bb65f1 100644 --- a/public/js/components/segments/Editarea.js +++ b/public/js/components/segments/Editarea.js @@ -46,6 +46,7 @@ import { import {isMacOS} from '../../utils/Utils' import {removeZeroWidthSpace} from './utils/DraftMatecatUtils/tagUtils' import textUtils from '../../utils/textUtils' +import ContextPreviewChannel from '../../utils/contextPreviewChannel' const {hasCommandModifier, isOptionKeyCommand, isCtrlKeyCommand} = KeyBindingUtil @@ -361,6 +362,11 @@ class Editarea extends React.Component { missingTags, lxqDecodedTranslation, ) + ContextPreviewChannel.sendMessage({ + type: 'updateTranslation', + sid: segment.sid, + target: decodedSegment, + }) this.props.updateCounter( DraftMatecatUtils.getCharactersCounter( this.getTextToApplyCounter(decodedSegment), diff --git a/public/js/components/segments/Segment.js b/public/js/components/segments/Segment.js index 205571f8cc..1fe8aa07ae 100644 --- a/public/js/components/segments/Segment.js +++ b/public/js/components/segments/Segment.js @@ -1,9 +1,13 @@ -import {forEach, isEqual, isUndefined} from 'lodash' -import {fromJS} from 'immutable' -import React from 'react' +import {forEach, isUndefined} from 'lodash' +import React, { + useState, + useRef, + useContext, + useEffect, + useCallback, +} from 'react' import {union} from 'lodash/array' import $ from 'jquery' - import SegmentCommentsContainer from './SegmentCommentsContainer' import SegmentsCommentsIcon from './SegmentsCommentsIcon' import SegmentStore from '../../stores/SegmentStore' @@ -31,139 +35,95 @@ import {Shortcuts} from '../../utils/shortcuts' import SearchUtils from '../header/cattol/search/searchUtils' import {SegmentQAIcon} from './SegmentQAIcon' -class Segment extends React.Component { - static contextType = ApplicationWrapperContext - - constructor(props) { - super(props) - - this.createSegmentClasses = this.createSegmentClasses.bind(this) - this.hightlightEditarea = this.hightlightEditarea.bind(this) - this.addClass = this.addClass.bind(this) - this.removeClass = this.removeClass.bind(this) - this.setAsAutopropagated = this.setAsAutopropagated.bind(this) - this.setSegmentStatus = this.setSegmentStatus.bind(this) - this.handleChangeBulk = this.handleChangeBulk.bind(this) - this.openSegment = this.openSegment.bind(this) - this.openSegmentFromAction = this.openSegmentFromAction.bind(this) - this.checkIfCanOpenSegment = this.checkIfCanOpenSegment.bind(this) - this.handleKeyDown = this.handleKeyDown.bind(this) - this.forceUpdateSegment = this.forceUpdateSegment.bind(this) - this.clientReconnection = this.clientReconnection.bind(this) - - let readonly = SegmentUtils.isReadonlySegment(this.props.segment) - this.secondPassLocked = SegmentUtils.isSecondPassLockedSegment( - this.props.segment, +const SegmentComponent = ({ + segment, + segImmutable, + fid, + isReview, + guessTagActive, + sideOpen, + clientConnected, + clientId, + speechToTextActive, + files, + speech2textEnabledFn, + multiMatchLangs, + setBulkSelection, + setLastSelectedSegment, +}) => { + const {userInfo} = useContext(ApplicationWrapperContext) + + // DOM refs + const sectionRef = useRef(null) + const $sectionRef = useRef(null) + const timeoutScrollRef = useRef(null) + + // Value refs — keep latest values for stable store-listener callbacks + const segmentRef = useRef(segment) + segmentRef.current = segment + const fidRef = useRef(fid) + fidRef.current = fid + const isReviewRef = useRef(isReview) + isReviewRef.current = isReview + const clientConnectedRef = useRef(clientConnected) + clientConnectedRef.current = clientConnected + const multiMatchLangsRef = useRef(multiMatchLangs) + multiMatchLangsRef.current = multiMatchLangs + + // Derived values (recomputed each render) + const secondPassLocked = SegmentUtils.isSecondPassLockedSegment(segment) + const readonly = SegmentUtils.isReadonlySegment(segment) + const tagProjectionEnabled = + guessTagActive && + segment && + segment.status && + (segment.status.toLowerCase() === 'draft' || + segment.status.toLowerCase() === 'new') && + !DraftMatecatUtils.checkXliffTagsInText(segment.translation) && + DraftMatecatUtils.removeTagsFromText(segment.segment) !== '' + const dataAttrTagged = + tagProjectionEnabled && !segment.tagged ? 'nottagged' : 'tagged' + + // State + const [segmentClasses, setSegmentClasses] = useState([]) + const [autopropagated, setAutopropagated] = useState( + segment.autopropagated_from != 0, + ) + const [selectedTextObj, setSelectedTextObj] = useState(null) + const [, setForceUpdate] = useState(0) + + // ------------------------------------------------------------------ + // Helpers (stable callbacks that use refs to read current values) + // ------------------------------------------------------------------ + + const checkIfCanOpenSegment = useCallback(() => { + const seg = segmentRef.current + return ( + (isReviewRef.current && + !(seg.status.toUpperCase() == SEGMENTS_STATUS.NEW) && + !(seg.status.toUpperCase() == SEGMENTS_STATUS.DRAFT)) || + !isReviewRef.current ) + }, []) - this.state = { - segment_classes: [], - autopropagated: this.props.segment.autopropagated_from != 0, - unlocked: SegmentUtils.isUnlockedSegment(this.props.segment), - readonly: readonly, - inBulk: false, - tagProjectionEnabled: - this.props.guessTagActive && - this.props.segment && - this.props.segment.status && - (this.props.segment.status.toLowerCase() === 'draft' || - this.props.segment.status.toLowerCase() === 'new') && - !DraftMatecatUtils.checkXliffTagsInText( - this.props.segment.translation, - ) && - DraftMatecatUtils.removeTagsFromText(this.props.segment.segment) !== '', - selectedTextObj: null, - showActions: false, - } - this.timeoutScroll - } - - checkOpenSegmentComment() { + const checkOpenSegmentComment = useCallback(() => { + const seg = segmentRef.current if ( CommentsStore.db.getCommentsCountBySegment && - SegmentStore.getCurrentSegmentId() === this.props.segment.sid + SegmentStore.getCurrentSegmentId() === seg.sid ) { - const comments_obj = CommentsStore.db.getCommentsCountBySegment( - this.props.segment.sid, - ) + const comments_obj = CommentsStore.db.getCommentsCountBySegment(seg.sid) const panelClosed = localStorage.getItem(SegmentActions.localStorageCommentsClosed) === 'true' if (comments_obj.active > 0 && !panelClosed) { - SegmentActions.openSegmentComment(this.props.segment.sid) - SegmentActions.scrollToSegment(this.props.segment.sid) - } - } - } - - openSegment(wasOriginatedFromBrowserHistory) { - if (!this.$section.length) return - if (!this.checkIfCanOpenSegment()) { - const progress = CatToolStore.getProgress() - if (progress && progress.raw.translated === 0) { - this.alertNoTranslatedSegments() - } else { - this.alertNotTranslatedYet(this.props.segment.sid) - } - } else { - if (this.props.segment.translation?.length !== 0) { - SegmentActions.getSegmentsQa(this.props.segment) - } - - // start old cache - SegmentActions.setCurrentSegmentId(this.props.segment.sid) - - $('html').trigger('open') // used by ui.review to open tab Revise in the footer next-unapproved - - //Used by Segment Filter, Comments, Footer, Review extended - setTimeout(() => { - const segmentId = this.props.segment.original_sid - //Segment Filter - if (SegmentFilterUtils.enabled()) { - SegmentFilterUtils.setStoredState({ - lastSegmentId: segmentId, - }) - } - //Review - if (config.isReview) { - const panelClosed = - localStorage.getItem( - SegmentActions.localStorageReviewPanelClosed, - ) === 'true' - if (!panelClosed) { - SegmentActions.openIssuesPanel({sid: segmentId}, false) - } - SegmentActions.getSegmentVersionsIssues(segmentId) - } - }) - this.checkOpenSegmentComment() - - /************/ - if (this.props.clientConnected) { - SegmentActions.getGlossaryForSegment({ - sid: this.props.segment.sid, - fid: this.props.fid, - text: this.props.segment.segment, - }) - } - - const hashUrl = document.location.pathname + '#' + this.props.segment.sid - if (wasOriginatedFromBrowserHistory) { - history.replaceState(null, null, hashUrl) - } else { - history.pushState(null, null, hashUrl) + SegmentActions.openSegmentComment(seg.sid) + SegmentActions.scrollToSegment(seg.sid) } - var historyChangeStateEvent = new Event('historyChangeState') - window.dispatchEvent(historyChangeStateEvent) - - // Update document title with hash segment id - document.title = `${document.title?.split('#')[0]} #${ - this.props.segment.sid - }` } - } + }, []) - alertNotTranslatedYet = (sid) => { + const alertNotTranslatedYet = useCallback((sid) => { setTimeout(() => ModalsActions.showModalComponent(ConfirmMessageModal, { cancelText: 'Close', @@ -172,10 +132,10 @@ class Segment extends React.Component { text: 'This segment is not translated yet.
Only translated segments can be revised.', }), ) - } + }, []) - alertNoTranslatedSegments = () => { - var props = { + const alertNoTranslatedSegments = useCallback(() => { + const props = { text: 'There are no translated segments to revise in this job.', successText: 'Ok', successCallback: function () { @@ -185,707 +145,658 @@ class Segment extends React.Component { setTimeout(() => ModalsActions.showModalComponent(ConfirmMessageModal, props, 'Warning'), ) - } + }, []) - openSegmentFromAction(sid, wasOriginatedFromBrowserHistory) { - sid = sid + '' - if ( - (sid === this.props.segment.sid || - (this.props.segment.original_sid === sid && - this.props.segment.firstOfSplit)) && - !this.props.segment.opened - ) { - this.openSegment(wasOriginatedFromBrowserHistory) - } - } + const openSegment = useCallback( + (wasOriginatedFromBrowserHistory) => { + const seg = segmentRef.current - createSegmentClasses() { - let classes = [] - let splitGroup = this.props.segment.split_group || [] - let readonly = this.state.readonly - if (readonly) { - classes.push('readonly') - } + if (!$sectionRef.current || !$sectionRef.current.length) return - if ( - (SegmentUtils.isIceSegment(this.props.segment) && !readonly) || - this.secondPassLocked - ) { - if (this.props.segment.unlocked) { - classes.push('ice-unlocked') + if (!checkIfCanOpenSegment()) { + const progress = CatToolStore.getProgress() + if (progress && progress.raw.translated === 0) { + alertNoTranslatedSegments() + } else { + alertNotTranslatedYet(seg.sid) + } } else { - classes.push('readonly') - classes.push('ice-locked') - } - } + if (seg.translation?.length !== 0) { + SegmentActions.getSegmentsQa(seg) + } - if (this.props.segment.status) { - classes.push('status-' + this.props.segment.status.toLowerCase()) - } else { - classes.push('status-new') - } + SegmentActions.setCurrentSegmentId(seg.sid) + $('html').trigger('open') - if (this.props.segment.sid == splitGroup[0]) { - classes.push('splitStart') - } else if (this.props.segment.sid == splitGroup[splitGroup.length - 1]) { - classes.push('splitEnd') - } else if (splitGroup.length) { - classes.push('splitInner') - } - if (this.state.tagProjectionEnabled && !this.props.segment.tagged) { - classes.push('enableTP') - this.dataAttrTagged = 'nottagged' - } else { - this.dataAttrTagged = 'tagged' - } - if (this.props.segment.edit_area_locked) { - classes.push('editAreaLocked') - } - if (this.props.segment.inBulk) { - classes.push('segment-selected-inBulk') - } - if (this.props.segment.muted) { - classes.push('muted') - } - if (this.props.segment.opened && this.checkIfCanOpenSegment()) { - classes.push('editor') - classes.push('opened') - } - if ( - this.props.segment.modified || - this.props.segment.autopropagated_from !== 0 - ) { - classes.push('modified') - } - if (this.props.sideOpen) { - classes.push('slide-right') - } - if (this.props.segment.openSplit) { - classes.push('split-action') - } + setTimeout(() => { + const segmentId = segmentRef.current.original_sid + if (SegmentFilterUtils.enabled()) { + SegmentFilterUtils.setStoredState({lastSegmentId: segmentId}) + } + if (config.isReview) { + const panelClosed = + localStorage.getItem( + SegmentActions.localStorageReviewPanelClosed, + ) === 'true' + if (!panelClosed) { + SegmentActions.openIssuesPanel({sid: segmentId}, false) + } + SegmentActions.getSegmentVersionsIssues(segmentId) + } + }) - if (this.props.segment.selected) { - classes.push('segment-selected') - } - return classes - } + checkOpenSegmentComment() - hightlightEditarea(sid) { - if (this.props.segment.sid == sid) { - /* TODO REMOVE THIS CODE - * The segment must know about his classes - */ - let classes = this.state.segment_classes.slice() - if (classes.indexOf('modified')) { - classes.push('modified') - this.setState({ - segment_classes: classes, - }) - } - } - } + if (clientConnectedRef.current) { + SegmentActions.getGlossaryForSegment({ + sid: seg.sid, + fid: fidRef.current, + text: seg.segment, + }) + } - addClass(sid, newClass) { - if ( - this.props.segment.sid == sid || - sid === -1 || - sid.split('-')[0] == this.props.segment.sid - ) { - let classes = this.state.segment_classes.slice() - if (newClass.indexOf(' ') > 0) { - let classesSplit = newClass.split(' ') - forEach(classesSplit, function (item) { - if (classes.indexOf(item) < 0) { - classes.push(item) - } - }) - } else { - if (classes.indexOf(newClass) < 0) { - classes.push(newClass) + const hashUrl = document.location.pathname + '#' + seg.sid + if (wasOriginatedFromBrowserHistory) { + history.replaceState(null, null, hashUrl) + } else { + history.pushState(null, null, hashUrl) } - } - this.setState({ - segment_classes: classes, - }) - } - } + var historyChangeStateEvent = new Event('historyChangeState') + window.dispatchEvent(historyChangeStateEvent) - removeClass(sid, className) { + document.title = `${document.title?.split('#')[0]} #${seg.sid}` + } + }, + [ + checkIfCanOpenSegment, + alertNoTranslatedSegments, + alertNotTranslatedYet, + checkOpenSegmentComment, + ], + ) + + // Keep a ref so store listeners always call the latest version + const openSegmentRef = useRef(openSegment) + openSegmentRef.current = openSegment + + const removeSelection = useCallback(() => { + const selection = document.getSelection() if ( - this.props.segment.sid == sid || - sid === -1 || - sid.indexOf(this.props.segment.sid) !== -1 + sectionRef.current && + sectionRef.current.contains(selection.anchorNode) ) { - let classes = this.state.segment_classes.slice() - let removeFn = function (item) { - let index = classes.indexOf(item) - if (index > -1) { - classes.splice(index, 1) + selection.removeAllRanges() + } + setSelectedTextObj(null) + }, []) + + // ------------------------------------------------------------------ + // Store-listener callbacks (stable — use refs for current values) + // ------------------------------------------------------------------ + + const addClass = useCallback((sid, newClass) => { + const seg = segmentRef.current + if (seg.sid == sid || sid === -1 || sid.split('-')[0] == seg.sid) { + setSegmentClasses((prev) => { + let classes = prev.slice() + if (newClass.indexOf(' ') > 0) { + forEach(newClass.split(' '), function (item) { + if (classes.indexOf(item) < 0) classes.push(item) + }) + } else { + if (classes.indexOf(newClass) < 0) classes.push(newClass) } - } - if (className.indexOf(' ') > 0) { - let classesSplit = className.split(' ') - forEach(classesSplit, function (item) { - removeFn(item) - }) - } else { - removeFn(className) - } - this.setState({ - segment_classes: classes, + return classes }) } - } + }, []) - setAsAutopropagated(sid, propagation) { - if (this.props.segment.sid == sid) { - this.setState({ - autopropagated: propagation, + const removeClass = useCallback((sid, className) => { + const seg = segmentRef.current + if (seg.sid == sid || sid === -1 || sid.indexOf(seg.sid) !== -1) { + setSegmentClasses((prev) => { + let classes = prev.slice() + const removeFn = function (item) { + let index = classes.indexOf(item) + if (index > -1) classes.splice(index, 1) + } + if (className.indexOf(' ') > 0) { + forEach(className.split(' '), function (item) { + removeFn(item) + }) + } else { + removeFn(className) + } + return classes }) } - } - setSegmentStatus(sid, status) { - if (this.props.segment.sid == sid) { - let classes = this.state.segment_classes.slice(0) - let index = classes.findIndex(function (item) { - return item.indexOf('status-') > -1 - }) + }, []) - if (index >= 0) { - classes.splice(index, 1) - } + const setAsAutopropagated = useCallback((sid, propagation) => { + if (segmentRef.current.sid == sid) { + setAutopropagated(propagation) + } + }, []) - this.setState({ - segment_classes: classes, - status: status, + const setSegmentStatus = useCallback((sid) => { + if (segmentRef.current.sid == sid) { + setSegmentClasses((prev) => { + let classes = prev.slice(0) + let index = classes.findIndex(function (item) { + return item.indexOf('status-') > -1 + }) + if (index >= 0) classes.splice(index, 1) + return classes }) } - } - checkSegmentStatus(classes) { - if (classes.length === 0) return classes - // TODO: remove this - //To fix a problem: sometimes the section segment has two different status - let statusMatches = classes.join(' ').match(/status-/g) - if (statusMatches && statusMatches.length > 1) { - let index = classes.findIndex(function (item) { - return item.indexOf('status-new') > -1 - }) + }, []) - if (index >= 0) { - classes.splice(index, 1) + const openSegmentFromAction = useCallback( + (sid, wasOriginatedFromBrowserHistory) => { + sid = sid + '' + const seg = segmentRef.current + if ( + (sid === seg.sid || (seg.original_sid === sid && seg.firstOfSplit)) && + !seg.opened + ) { + openSegmentRef.current(wasOriginatedFromBrowserHistory) } - } - return classes - } - isSplitted() { - return !isUndefined(this.props.segment.split_group) - } + }, + [], + ) - isFirstOfSplit() { - return ( - !isUndefined(this.props.segment.split_group) && - this.props.segment.split_group.indexOf(this.props.segment.sid) === 0 - ) - } - - getTranslationIssues() { + const openRevisionPanel = useCallback((data) => { + const seg = segmentRef.current if ( - ((this.props.sideOpen && - (!this.props.segment.opened || !this.props.segment.openIssues)) || - !this.props.sideOpen) && - !this.props.segment.readonly && - (!this.isSplitted() || (this.isSplitted() && this.isFirstOfSplit())) && - this.props.segment.sid + parseInt(data.sid) === parseInt(seg.sid) && + (!SegmentUtils.isIceSegment(seg) || + (SegmentUtils.isIceSegment(seg) && seg.unlocked)) ) { - return ( - - ) - } - return null - } - - lockUnlockSegment(event) { - event.preventDefault() - event.stopPropagation() - if ( - !this.props.segment.unlocked && - SegmentUtils.isSecondPassLockedSegment(this.props.segment) - ) { - var props = { - text: 'You are about to edit a segment that has been approved in the 2nd pass review. The project owner and 2nd pass reviser will be notified.', - successText: 'Ok', - successCallback: function () { - ModalsActions.onCloseModal() - }, - } - ModalsActions.showModalComponent( - ConfirmMessageModal, - props, - 'Modify locked and approved segment ', - ) - } - SegmentActions.setSegmentLocked( - this.props.segment, - this.props.fid, - !this.props.segment.unlocked, - ) - } - - checkSegmentClasses() { - let classes = this.state.segment_classes.slice() - classes = union(classes, this.createSegmentClasses()) - classes = this.checkSegmentStatus(classes) - if (classes.indexOf('muted') > -1 && classes.indexOf('editor') > -1) { - let indexEditor = classes.indexOf('editor') - classes.splice(indexEditor, 1) - let indexOpened = classes.indexOf('opened') - classes.splice(indexOpened, 1) - } - return classes - } - - handleChangeBulk(event) { - event.stopPropagation() - if (event.shiftKey) { - this.props.setBulkSelection(this.props.segment.sid, this.props.fid) + setSelectedTextObj(data.selection) } else { - SegmentActions.toggleSegmentOnBulk(this.props.segment.sid, this.props.fid) - this.props.setLastSelectedSegment(this.props.segment.sid, this.props.fid) + setSelectedTextObj(null) } - } + }, []) - openRevisionPanel = (data) => { - if ( - parseInt(data.sid) === parseInt(this.props.segment.sid) && - (!SegmentUtils.isIceSegment(this.props.segment) || - (SegmentUtils.isIceSegment(this.props.segment) && - this.props.segment.unlocked)) - ) { - this.setState({ - selectedTextObj: data.selection, - }) - } else { - this.setState({ - selectedTextObj: null, - }) + const forceUpdateSegment = useCallback((sid) => { + if (segmentRef.current.sid === sid) { + setForceUpdate((c) => c + 1) } - } - removeSelection = () => { - var selection = document.getSelection() - if (this.section.contains(selection.anchorNode)) { - selection.removeAllRanges() - } - this.setState({ - selectedTextObj: null, - }) - } + }, []) - checkIfCanOpenSegment() { - return ( - (this.props.isReview && - !(this.props.segment.status.toUpperCase() == SEGMENTS_STATUS.NEW) && - !(this.props.segment.status.toUpperCase() == SEGMENTS_STATUS.DRAFT)) || - !this.props.isReview - ) - } - onClickEvent = () => { - if ( - this.state.readonly || - (!this.props.segment.unlocked && - SegmentUtils.isIceSegment(this.props.segment)) - ) { - SegmentActions.handleClickOnReadOnly(this.props.segment) - } else if (this.props.segment.muted) { - return - } else if (!this.props.segment.opened) { - this.openSegment() - if (this.checkIfCanOpenSegment()) - SegmentActions.setOpenSegment(this.props.segment.sid, this.props.fid) + const clientReconnection = useCallback(() => { + const seg = segmentRef.current + if (seg.opened) { + SegmentActions.getGlossaryForSegment({ + sid: seg.sid, + fid: fidRef.current, + text: seg.segment, + }) + SegmentActions.getContributions(seg.sid, multiMatchLangsRef.current) } - } + }, []) - handleKeyDown(event) { + const handleKeyDown = useCallback((event) => { + const seg = segmentRef.current if (event.code === 'Escape' && !config.targetIsCJK) { if ( - this.props.segment.opened && - !this.props.segment.openComments && - !this.props.segment.openIssues && + seg.opened && + !seg.openComments && + !seg.openIssues && !SearchUtils.searchOpen ) { - if (!this.props.segment.openSplit) { - SegmentActions.closeSegment(this.props.segment.sid) + if (!seg.openSplit) { + SegmentActions.closeSegment(seg.sid) } else { SegmentActions.closeSplitSegment() } - } else if (this.props.segment.openComments) { + } else if (seg.openComments) { SegmentActions.closeSegmentComment() - } else if (this.props.segment.openIssues) { + } else if (seg.openIssues) { SegmentActions.closeIssuesPanel() } } - } - - clientReconnection() { - if (this.props.segment.opened) { - SegmentActions.getGlossaryForSegment({ - sid: this.props.segment.sid, - fid: this.props.fid, - text: this.props.segment.segment, - }) - SegmentActions.getContributions( - this.props.segment.sid, - this.props.multiMatchLangs, - ) - } - } + }, []) - forceUpdateSegment(sid) { - if (this.props.segment.sid === sid) { - this.forceUpdate() - } - } + // ------------------------------------------------------------------ + // Effects + // ------------------------------------------------------------------ - allowHTML(string) { - return {__html: string} - } + // Mount / Unmount — register store listeners & keydown handler + useEffect(() => { + $sectionRef.current = $(sectionRef.current) - componentDidMount() { - this.$section = $(this.section) - document.addEventListener('keydown', this.handleKeyDown) - SegmentStore.addListener(SegmentConstants.ADD_SEGMENT_CLASS, this.addClass) - SegmentStore.addListener( - SegmentConstants.REMOVE_SEGMENT_CLASS, - this.removeClass, - ) + document.addEventListener('keydown', handleKeyDown) + SegmentStore.addListener(SegmentConstants.ADD_SEGMENT_CLASS, addClass) + SegmentStore.addListener(SegmentConstants.REMOVE_SEGMENT_CLASS, removeClass) SegmentStore.addListener( SegmentConstants.SET_SEGMENT_PROPAGATION, - this.setAsAutopropagated, + setAsAutopropagated, ) SegmentStore.addListener( SegmentConstants.SET_SEGMENT_STATUS, - this.setSegmentStatus, + setSegmentStatus, ) SegmentStore.addListener( SegmentConstants.OPEN_SEGMENT, - this.openSegmentFromAction, + openSegmentFromAction, ) SegmentStore.addListener( SegmentConstants.FORCE_UPDATE_SEGMENT, - this.forceUpdateSegment, + forceUpdateSegment, ) CatToolStore.addListener( CatToolConstants.CLIENT_RECONNECTION, - this.clientReconnection, + clientReconnection, ) - - //Review SegmentStore.addListener( SegmentConstants.OPEN_ISSUES_PANEL, - this.openRevisionPanel, + openRevisionPanel, ) - if (this.props.segment.opened) { - setTimeout(() => { - this.openSegment() - }) - setTimeout(() => { - SegmentActions.setCurrentSegment(this.props.segment.sid) - }, 0) - } - } - componentWillUnmount() { - document.removeEventListener('keydown', this.handleKeyDown) - SegmentStore.removeListener( - SegmentConstants.ADD_SEGMENT_CLASS, - this.addClass, - ) - SegmentStore.removeListener( - SegmentConstants.REMOVE_SEGMENT_CLASS, - this.removeClass, - ) - SegmentStore.removeListener( - SegmentConstants.SET_SEGMENT_PROPAGATION, - this.setAsAutopropagated, - ) - SegmentStore.removeListener( - SegmentConstants.SET_SEGMENT_STATUS, - this.setSegmentStatus, - ) - SegmentStore.removeListener( - SegmentConstants.OPEN_SEGMENT, - this.openSegmentFromAction, - ) - SegmentStore.removeListener( - SegmentConstants.FORCE_UPDATE_SEGMENT, - this.forceUpdateSegment, - ) + // If segment was already open on mount + if (segmentRef.current.opened) { + setTimeout(() => openSegmentRef.current()) + setTimeout( + () => SegmentActions.setCurrentSegment(segmentRef.current.sid), + 0, + ) + } - CatToolStore.removeListener( - CatToolConstants.CLIENT_RECONNECTION, - this.clientReconnection, - ) + return () => { + document.removeEventListener('keydown', handleKeyDown) + SegmentStore.removeListener(SegmentConstants.ADD_SEGMENT_CLASS, addClass) + SegmentStore.removeListener( + SegmentConstants.REMOVE_SEGMENT_CLASS, + removeClass, + ) + SegmentStore.removeListener( + SegmentConstants.SET_SEGMENT_PROPAGATION, + setAsAutopropagated, + ) + SegmentStore.removeListener( + SegmentConstants.SET_SEGMENT_STATUS, + setSegmentStatus, + ) + SegmentStore.removeListener( + SegmentConstants.OPEN_SEGMENT, + openSegmentFromAction, + ) + SegmentStore.removeListener( + SegmentConstants.FORCE_UPDATE_SEGMENT, + forceUpdateSegment, + ) + CatToolStore.removeListener( + CatToolConstants.CLIENT_RECONNECTION, + clientReconnection, + ) + SegmentStore.removeListener( + SegmentConstants.OPEN_ISSUES_PANEL, + openRevisionPanel, + ) + } + }, []) // eslint-disable-line react-hooks/exhaustive-deps - //Review - SegmentStore.removeListener( - SegmentConstants.OPEN_ISSUES_PANEL, - this.openRevisionPanel, - ) - } + // Replaces getSnapshotBeforeUpdate — react to open/close transitions + const prevOpenedRef = useRef(segment.opened) + const prevSpeechToTextRef = useRef(speechToTextActive) - shouldComponentUpdate(nextProps, nextState) { - return ( - !nextProps.segImmutable.equals(this.props.segImmutable) || - !fromJS(nextState.segment_classes).equals( - fromJS(this.state.segment_classes), - ) || - nextState.autopropagated !== this.state.autopropagated || - nextState.readonly !== this.state.readonly || - nextState.selectedTextObj !== this.state.selectedTextObj || - nextProps.sideOpen !== this.props.sideOpen || - nextState.showActions !== this.state.showActions || - nextProps.clientConnected !== this.props.clientConnected || - nextProps.speechToTextActive !== this.props.speechToTextActive - ) - } + useEffect(() => { + const wasOpened = prevOpenedRef.current + const wasSpeechActive = prevSpeechToTextRef.current - getSnapshotBeforeUpdate(prevProps) { - if (!prevProps.segment.opened && this.props.segment.opened) { - this.timeoutScroll = setTimeout(() => { - SegmentActions.scrollToSegment(this.props.segment.sid) + if (!wasOpened && segment.opened) { + timeoutScrollRef.current = setTimeout(() => { + SegmentActions.scrollToSegment(segmentRef.current.sid) }, 200) setTimeout(() => { - SegmentActions.setCurrentSegment(this.props.segment.sid) + SegmentActions.setCurrentSegment(segmentRef.current.sid) }, 0) setTimeout(() => { + const seg = segmentRef.current if ( - this.props.segment.opened && + seg.opened && !config.isReview && - !SegmentStore.segmentHasIssues(this.props.segment) + !SegmentStore.segmentHasIssues(seg) ) { - SegmentActions.closeSegmentIssuePanel(this.props.segment.sid) + SegmentActions.closeSegmentIssuePanel(seg.sid) } - if (this.props.segment.opened && !this.props.segment.openComments) { - SegmentActions.closeSegmentComment(this.props.segment.sid) + if (seg.opened && !seg.openComments) { + SegmentActions.closeSegmentComment(seg.sid) } }) - } else if (prevProps.segment.opened && !this.props.segment.opened) { - clearTimeout(this.timeoutScroll) + } else if (wasOpened && !segment.opened) { + clearTimeout(timeoutScrollRef.current) setTimeout(() => { - SegmentActions.saveSegmentBeforeClose(this.props.segment) + SegmentActions.saveSegmentBeforeClose(segmentRef.current) }) } + if ( Speech2Text.enabled() && - ((!prevProps.speechToTextActive && this.props.speechToTextActive) || - (!prevProps.segment.opened && this.props.segment.opened)) + ((!wasSpeechActive && speechToTextActive) || + (!wasOpened && segment.opened)) ) { - setTimeout(() => Speech2Text.enableMicrophone(this.$section)) + setTimeout(() => Speech2Text.enableMicrophone($sectionRef.current)) + } + + prevOpenedRef.current = segment.opened + prevSpeechToTextRef.current = speechToTextActive + }, [segment.opened, speechToTextActive]) + + // ------------------------------------------------------------------ + // Render helpers + // ------------------------------------------------------------------ + + const createSegmentClasses = () => { + let classes = [] + let splitGroup = segment.split_group || [] + + if (readonly) classes.push('readonly') + + if ((SegmentUtils.isIceSegment(segment) && !readonly) || secondPassLocked) { + if (segment.unlocked) { + classes.push('ice-unlocked') + } else { + classes.push('readonly') + classes.push('ice-locked') + } + } + + if (segment.status) { + classes.push('status-' + segment.status.toLowerCase()) + } else { + classes.push('status-new') + } + + if (segment.sid == splitGroup[0]) { + classes.push('splitStart') + } else if (segment.sid == splitGroup[splitGroup.length - 1]) { + classes.push('splitEnd') + } else if (splitGroup.length) { + classes.push('splitInner') + } + + if (tagProjectionEnabled && !segment.tagged) { + classes.push('enableTP') + } + if (segment.edit_area_locked) classes.push('editAreaLocked') + if (segment.inBulk) classes.push('segment-selected-inBulk') + if (segment.muted) classes.push('muted') + if (segment.opened && checkIfCanOpenSegment()) { + classes.push('editor') + classes.push('opened') + } + if (segment.modified || segment.autopropagated_from !== 0) { + classes.push('modified') + } + if (sideOpen) classes.push('slide-right') + if (segment.openSplit) classes.push('split-action') + if (segment.selected) classes.push('segment-selected') + + return classes + } + + const checkSegmentStatus = (classes) => { + if (classes.length === 0) return classes + let statusMatches = classes.join(' ').match(/status-/g) + if (statusMatches && statusMatches.length > 1) { + let index = classes.findIndex(function (item) { + return item.indexOf('status-new') > -1 + }) + if (index >= 0) classes.splice(index, 1) + } + return classes + } + + const checkSegmentClasses = () => { + let classes = segmentClasses.slice() + classes = union(classes, createSegmentClasses()) + classes = checkSegmentStatus(classes) + if (classes.indexOf('muted') > -1 && classes.indexOf('editor') > -1) { + let indexEditor = classes.indexOf('editor') + classes.splice(indexEditor, 1) + let indexOpened = classes.indexOf('opened') + classes.splice(indexOpened, 1) + } + return classes + } + + const isSplitted = () => !isUndefined(segment.split_group) + + const isFirstOfSplit = () => + !isUndefined(segment.split_group) && + segment.split_group.indexOf(segment.sid) === 0 + + const getTranslationIssues = () => { + if ( + ((sideOpen && (!segment.opened || !segment.openIssues)) || !sideOpen) && + !segment.readonly && + (!isSplitted() || (isSplitted() && isFirstOfSplit())) && + segment.sid + ) { + return ( + + ) } return null } - componentDidUpdate(prevProps) { - if (!isEqual(prevProps.segment, this.props.segment)) { - const readonly = SegmentUtils.isReadonlySegment(this.props.segment) - if (readonly !== this.state.readonly) { - this.setState({ - readonly, - }) + + const lockUnlockSegment = (event) => { + event.preventDefault() + event.stopPropagation() + if (!segment.unlocked && SegmentUtils.isSecondPassLockedSegment(segment)) { + const props = { + text: 'You are about to edit a segment that has been approved in the 2nd pass review. The project owner and 2nd pass reviser will be notified.', + successText: 'Ok', + successCallback: function () { + ModalsActions.onCloseModal() + }, } + ModalsActions.showModalComponent( + ConfirmMessageModal, + props, + 'Modify locked and approved segment ', + ) } + SegmentActions.setSegmentLocked(segment, fid, !segment.unlocked) } - render() { - let job_marker = '' - - let readonly = this.state.readonly - let showLockIcon = - SegmentUtils.isIceSegment(this.props.segment) || this.secondPassLocked - let segment_classes = this.checkSegmentClasses() - - let split_group = this.props.segment.split_group || [] - let autoPropagable = this.props.segment.repetitions_in_chunk !== 1 - let originalId = this.props.segment.original_sid - - let translationIssues = this.getTranslationIssues() - let locked = - !this.props.segment.unlocked && - (SegmentUtils.isIceSegment(this.props.segment) || this.secondPassLocked) - const segmentHasIssues = SegmentStore.segmentHasIssues(this.props.segment) - - const getContextProps = () => { - const { - guessTagActive, - isReview, - segImmutable, - segment, - files, - speech2textEnabledFn, - multiMatchLangs, - } = this.props - return { - enableTagProjection: guessTagActive && !this.props.segment.tagged, - isReview, - segImmutable, - segment, - files, - speech2textEnabledFn, - readonly: this.state.readonly, - locked, - removeSelection: this.removeSelection.bind(this), - openSegment: this.openSegment, - clientConnected: this.props.clientConnected, - clientId: this.props.clientId, - multiMatchLangs, - userInfo: this.context.userInfo, - } + const handleChangeBulk = (event) => { + event.stopPropagation() + if (event.shiftKey) { + setBulkSelection(segment.sid, fid) + } else { + SegmentActions.toggleSegmentOnBulk(segment.sid, fid) + setLastSelectedSegment(segment.sid, fid) } + } - return ( - -
(this.section = section)} - id={'segment-' + this.props.segment.sid} - className={`${segment_classes.join(' ')} source-${config.source_code} target-${config.target_code} ${config.isSourceRTL ? 'rtl-source' : ''} ${config.isTargetRTL ? 'rtl-target' : ''}`} - data-autopropagated={this.state.autopropagated} - data-split-group={split_group} - data-split-original-id={originalId} - data-tagmode="crunched" - data-tagprojection={this.dataAttrTagged} - data-fid={this.props.segment.id_file} - data-modified={this.props.segment.modified} - > -
-
{this.props.segment.sid}
- - {showLockIcon ? ( - !readonly ? ( - this.props.segment.unlocked ? ( -
-
- ) : ( -
-
- ) - ) : null - ) : null} - -
- (this.bulk = node)} - checked={this.props.segment.inBulk} - onClick={this.handleChangeBulk} - /> -
+ const onClickEvent = () => { + if (readonly || (!segment.unlocked && SegmentUtils.isIceSegment(segment))) { + SegmentActions.handleClickOnReadOnly(segment) + } else if (segment.muted) { + return + } else if (!segment.opened) { + openSegmentRef.current() + if (checkIfCanOpenSegment()) { + SegmentActions.setOpenSegment(segment.sid, fid) + } + } + } - {!this.props.segment.ice_locked && - config.splitSegmentEnabled && - this.props.segment.opened ? ( - !this.props.segment.openSplit ? ( -
- -

CTRL + S

+ // ------------------------------------------------------------------ + // Render + // ------------------------------------------------------------------ + + const showLockIcon = SegmentUtils.isIceSegment(segment) || secondPassLocked + const segment_classes = checkSegmentClasses() + const split_group = segment.split_group || [] + const autoPropagable = segment.repetitions_in_chunk !== 1 + const originalId = segment.original_sid + const translationIssues = getTranslationIssues() + const locked = + !segment.unlocked && + (SegmentUtils.isIceSegment(segment) || secondPassLocked) + const segmentHasIssues = SegmentStore.segmentHasIssues(segment) + + const contextValue = { + enableTagProjection: guessTagActive && !segment.tagged, + isReview, + segImmutable, + segment, + files, + speech2textEnabledFn, + readonly, + locked, + removeSelection, + openSegment, + clientConnected, + clientId, + multiMatchLangs, + userInfo, + } + + return ( + +
+
+
{segment.sid}
+ + {showLockIcon ? ( + !readonly ? ( + segment.unlocked ? ( +
+
) : ( -
- - {/*

CTRL + W

*/} +
+
) - ) : null} -
- {job_marker} - -
- + - - {SegmentFilter && SegmentFilter.enabled() ? ( -
- Edit Distance: {this.props.segment.edit_distance} -
- ) : null} - - {this.props.segment.opened ? : null}
- {/*//!-- TODO: place this element here only if it's not a split --*/} -
- {config.comments_enabled && - (!this.props.segment.openComments || !this.props.segment.opened) ? ( - - ) : null} - - - {this.props.isReview && ( -
- {translationIssues} + {!segment.ice_locked && + config.splitSegmentEnabled && + segment.opened ? ( + !segment.openSplit ? ( +
+ +

CTRL + S

- )} -
-
- {config.comments_enabled && this.props.segment.openComments ? ( - - ) : null} - {config.isReview && - this.props.segment.openIssues && - this.props.segment.opened && - (config.isReview || (!config.isReview && segmentHasIssues)) ? ( -
- {!this.props.segment.versions ? null : ( - - )} + ) : ( +
+
- ) : null} -
-
-
- ) - } + ) + ) : null} +
+ +
+ + + {SegmentFilter && SegmentFilter.enabled() ? ( +
+ Edit Distance: {segment.edit_distance} +
+ ) : null} + + {segment.opened ? : null} +
+ +
+ {config.comments_enabled && + (!segment.openComments || !segment.opened) ? ( + + ) : null} + + + {isReview && ( +
+ {translationIssues} +
+ )} +
+
+ {config.comments_enabled && segment.openComments ? ( + + ) : null} + {config.isReview && + segment.openIssues && + segment.opened && + (config.isReview || (!config.isReview && segmentHasIssues)) ? ( +
+ {!segment.versions ? null : ( + + )} +
+ ) : null} +
+
+
+ ) } +const Segment = React.memo( + SegmentComponent, + (prevProps, nextProps) => + nextProps.segImmutable.equals(prevProps.segImmutable) && + nextProps.sideOpen === prevProps.sideOpen && + nextProps.clientConnected === prevProps.clientConnected && + nextProps.speechToTextActive === prevProps.speechToTextActive, +) + +Segment.displayName = 'Segment' + export default Segment diff --git a/public/js/components/segments/Segment.test.js b/public/js/components/segments/Segment.test.js index e2ebfa3f97..46ad02c632 100644 --- a/public/js/components/segments/Segment.test.js +++ b/public/js/components/segments/Segment.test.js @@ -1,4 +1,5 @@ import React from 'react' +import {render} from '@testing-library/react' const mockIsReadonlySegment = jest.fn() @@ -117,6 +118,7 @@ jest.mock('immutable', () => { jest.mock('../modals/ConfirmMessageModal', () => 'ConfirmMessageModal') import Segment from './Segment' +import {fromJS} from 'immutable' function makeSegment(overrides = {}) { return { @@ -140,10 +142,21 @@ function makeSegment(overrides = {}) { } } -describe('Segment componentDidUpdate readonly re-evaluation', () => { - let instance - let setStateCalls +function renderSegment(segment, extraProps = {}) { + return render( + , + ) +} +describe('Segment readonly re-evaluation', () => { beforeEach(() => { window.React = React window.config = { @@ -153,84 +166,92 @@ describe('Segment componentDidUpdate readonly re-evaluation', () => { isReview: false, project_completion_feature_enabled: false, segmentFilterEnabled: false, + source_code: 'en-US', source_rfc: 'en-US', + target_code: 'it-IT', target_rfc: 'it-IT', + isSourceRTL: false, + isTargetRTL: false, tag_projection_languages: '{}', } mockIsReadonlySegment.mockReset() - setStateCalls = [] - - const segment = makeSegment() - instance = new Segment({ - segment, - segImmutable: segment, - isReview: false, - guessTagActive: false, - speechToTextActive: false, - files: {}, - }) - // Override setState to capture calls since React's updater is a no-op on unmounted instances - instance.setState = (arg) => setStateCalls.push(arg) }) - test('calls setState with readonly=true when segment changes and becomes disabled', () => { - const prevSegment = makeSegment() - const newSegment = makeSegment({ + test('renders with readonly class when segment is disabled', () => { + const segment = makeSegment({ metadata: [{meta_key: 'translation_disabled', meta_value: '1'}], }) - - instance.props = {...instance.props, segment: newSegment} - instance.state = {...instance.state, readonly: false} mockIsReadonlySegment.mockReturnValue(true) - instance.componentDidUpdate({...instance.props, segment: prevSegment}) + const {container} = renderSegment(segment) - expect(mockIsReadonlySegment).toHaveBeenCalledWith(newSegment) - expect(setStateCalls).toContainEqual({readonly: true}) + expect(mockIsReadonlySegment).toHaveBeenCalledWith(segment) + const section = container.querySelector('section') + expect(section.className).toContain('readonly') }) - test('calls setState with readonly=false when segment changes and becomes enabled', () => { - const prevSegment = makeSegment({ - metadata: [{meta_key: 'translation_disabled', meta_value: '1'}], - }) - const newSegment = makeSegment({metadata: []}) - - instance.props = {...instance.props, segment: newSegment} - instance.state = {...instance.state, readonly: true} + test('renders without readonly class when segment is enabled', () => { + const segment = makeSegment() mockIsReadonlySegment.mockReturnValue(false) - instance.componentDidUpdate({...instance.props, segment: prevSegment}) + const {container} = renderSegment(segment) - expect(mockIsReadonlySegment).toHaveBeenCalledWith(newSegment) - expect(setStateCalls).toContainEqual({readonly: false}) + expect(mockIsReadonlySegment).toHaveBeenCalledWith(segment) + const section = container.querySelector('section') + expect(section.className).not.toContain('readonly') }) - test('does not call setState when segment prop is unchanged', () => { + test('updates readonly class when segment prop changes', () => { const segment = makeSegment() - - instance.props = {...instance.props, segment} - instance.state = {...instance.state, readonly: false} mockIsReadonlySegment.mockReturnValue(false) - instance.componentDidUpdate({...instance.props, segment}) + const {container, rerender} = renderSegment(segment) + const section = container.querySelector('section') + expect(section.className).not.toContain('readonly') - const readonlyCalls = setStateCalls.filter((call) => 'readonly' in call) - expect(readonlyCalls).toHaveLength(0) - }) + const disabledSegment = makeSegment({ + metadata: [{meta_key: 'translation_disabled', meta_value: '1'}], + }) + mockIsReadonlySegment.mockReturnValue(true) - test('does not call setState when readonly value has not changed', () => { - const prevSegment = makeSegment() - const newSegment = makeSegment({translation: 'Different translation'}) + rerender( + , + ) + + expect(section.className).toContain('readonly') + }) - instance.props = {...instance.props, segment: newSegment} - instance.state = {...instance.state, readonly: false} + test('does not add readonly class when segment changes but readonly stays false', () => { + const segment = makeSegment() mockIsReadonlySegment.mockReturnValue(false) - instance.componentDidUpdate({...instance.props, segment: prevSegment}) + const {container, rerender} = renderSegment(segment) + const section = container.querySelector('section') + expect(section.className).not.toContain('readonly') + + const updatedSegment = makeSegment({translation: 'Different translation'}) + mockIsReadonlySegment.mockReturnValue(false) - expect(mockIsReadonlySegment).toHaveBeenCalledWith(newSegment) - const readonlyCalls = setStateCalls.filter((call) => 'readonly' in call) - expect(readonlyCalls).toHaveLength(0) + rerender( + , + ) + + expect(mockIsReadonlySegment).toHaveBeenCalledWith(updatedSegment) + expect(section.className).not.toContain('readonly') }) }) diff --git a/public/js/components/segments/SegmentsContainer.js b/public/js/components/segments/SegmentsContainer.js index c3785b70b3..fa8b9db35b 100644 --- a/public/js/components/segments/SegmentsContainer.js +++ b/public/js/components/segments/SegmentsContainer.js @@ -27,6 +27,7 @@ import SegmentUtils from '../../utils/segmentUtils' import CommentsStore from '../../stores/CommentsStore' import DraftMatecatUtils from './utils/DraftMatecatUtils' import {ApplicationWrapperContext} from '../common/ApplicationWrapper/ApplicationWrapperContext' +import ContextPreviewChannel from '../../utils/contextPreviewChannel' const ROW_MARGIN = 3 const ROW_HEIGHT = 90 @@ -177,7 +178,6 @@ function SegmentsContainer({isReview, startSegmentId, firstJobSegment}) { const rowsRenderedHeight = useRef(new Map()) const cachedRowsHeightMap = useRef(new Map()) const cachedSegmentsToJS = useRef(new Map()) - const {guess_tags: guessTagActive, dictation: speechToTextActive} = userInfo?.metadata ?? {} @@ -414,19 +414,33 @@ function SegmentsContainer({isReview, startSegmentId, firstJobSegment}) { // set width and height of area useEffect(() => { - const onWindowResize = () => { + const recalcHeight = () => { const headerHeight = document.getElementsByTagName('header')[0].offsetHeight const footerHeight = document.getElementsByTagName('footer')[0].offsetHeight + const wrapperEl = document.getElementById('context-preview-wrapper') + const wrapperHeight = wrapperEl ? wrapperEl.offsetHeight : 0 - setHeightArea(window.innerHeight - (headerHeight + footerHeight)) + setHeightArea( + window.innerHeight - (headerHeight + footerHeight + wrapperHeight), + ) } - onWindowResize() - window.addEventListener('resize', onWindowResize) + recalcHeight() + window.addEventListener('resize', recalcHeight) + + const wrapperEl = document.getElementById('context-preview-wrapper') + let observer + if (wrapperEl) { + observer = new ResizeObserver(recalcHeight) + observer.observe(wrapperEl) + } - return () => window.removeEventListener('resize', onWindowResize) + return () => { + window.removeEventListener('resize', recalcHeight) + if (observer) observer.disconnect() + } }, []) // add actions listener @@ -447,6 +461,10 @@ function SegmentsContainer({isReview, startSegmentId, firstJobSegment}) { persistenceVariables.current.lastScrolled = sid setScrollToSid(sid) setScrollToSelected(false) + ContextPreviewChannel.sendMessage({ + type: 'highlight', + sid, + }) } const scrollToSelectedSegment = (sid) => { setScrollToSid(sid) diff --git a/public/js/components/segments/utils/DraftMatecatUtils/tagUtils.js b/public/js/components/segments/utils/DraftMatecatUtils/tagUtils.js index e6ec6ab93f..ec985aaec8 100644 --- a/public/js/components/segments/utils/DraftMatecatUtils/tagUtils.js +++ b/public/js/components/segments/utils/DraftMatecatUtils/tagUtils.js @@ -118,7 +118,7 @@ export const transformTagsToText = (text) => { export const excludeSomeTagsTransformToText = (text, excludeTags = []) => { try { for (let key in tagSignatures) { - const {placeholderRegex, decodeNeeded, placeholder, regex, type} = + const {placeholderRegex, decodeNeeded, encodedPlaceholder, regex, type} = tagSignatures[key] const shouldExcludeTag = excludeTags.some((value) => value === type) if (placeholderRegex) { @@ -142,7 +142,7 @@ export const excludeSomeTagsTransformToText = (text, excludeTags = []) => { globalRegex, !shouldExcludeTag ? (match) => { - return placeholder ? placeholder : match + return encodedPlaceholder ? encodedPlaceholder : match } : '', ) diff --git a/public/js/hooks/useContextDocument.js b/public/js/hooks/useContextDocument.js new file mode 100644 index 0000000000..a69a44fec0 --- /dev/null +++ b/public/js/hooks/useContextDocument.js @@ -0,0 +1,142 @@ +import {useState, useEffect} from 'react' + +const htmlCache = new Map() + +/** + * Resolves a potentially relative URL against a base URL string. + * @param {string} url + * @param {string} baseUrl + * @returns {string} + */ +const resolveUrl = (url, baseUrl) => { + if (!url || url.startsWith('data:') || url.startsWith('#')) return url + try { + return new URL(url, baseUrl).href + } catch { + return url + } +} + +/** + * Resolves all relative URLs inside a parsed DOM tree. + * @param {Document} doc + * @param {string} baseUrl + */ +const resolveRelativeUrls = (doc, baseUrl) => { + doc.querySelectorAll('[src]').forEach((el) => { + el.setAttribute('src', resolveUrl(el.getAttribute('src'), baseUrl)) + }) + doc.querySelectorAll('[href]').forEach((el) => { + el.setAttribute('href', resolveUrl(el.getAttribute('href'), baseUrl)) + }) + doc.querySelectorAll('[action]').forEach((el) => { + el.setAttribute('action', resolveUrl(el.getAttribute('action'), baseUrl)) + }) + doc.querySelectorAll('[style]').forEach((el) => { + const style = el.getAttribute('style') + if (style && style.includes('url(')) { + el.setAttribute( + 'style', + style.replace(/url\(["']?(.*?)["']?\)/g, (_match, p1) => { + return `url("${resolveUrl(p1, baseUrl)}")` + }), + ) + } + }) + doc.querySelectorAll('[srcset]').forEach((el) => { + const srcset = el.getAttribute('srcset') + const resolved = srcset + .split(',') + .map((entry) => { + const parts = entry.trim().split(/\s+/) + parts[0] = resolveUrl(parts[0], baseUrl) + return parts.join(' ') + }) + .join(', ') + el.setAttribute('srcset', resolved) + }) +} + +/** + * Parses the fetched HTML string and extracts head resources plus body content. + * @param {string} rawHtml + * @param {string} sourceUrl + * @returns {string} + */ +const parseHtmlContent = (rawHtml, sourceUrl) => { + const parser = new DOMParser() + const doc = parser.parseFromString(rawHtml, 'text/html') + resolveRelativeUrls(doc, sourceUrl) + let headHtml = '' + doc.querySelectorAll('head style').forEach((el) => { + headHtml += el.outerHTML + }) + doc.querySelectorAll('head link[rel="stylesheet"]').forEach((el) => { + headHtml += el.outerHTML + }) + doc.querySelectorAll('head script[src]').forEach((el) => { + headHtml += el.outerHTML + }) + const bodyHtml = doc.body ? doc.body.innerHTML : rawHtml + return headHtml + bodyHtml +} + +/** + * Fetches and parses an HTML document for the ContextPreview panel. + * Re-fetches when `url` changes. Does nothing when `url` is null. + * + * @param {string|null} url The URL to fetch, or null to skip fetching. + * @returns {{htmlContent: string, loading: boolean, error: string|null}} + */ +const useContextDocument = (url) => { + const [htmlContent, setHtmlContent] = useState('') + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + if (!url) return + let cancelled = false + + if (htmlCache.has(url)) { + setHtmlContent(htmlCache.get(url)) + setLoading(false) + setError(null) + return + } + + const fetchHtml = async () => { + try { + setLoading(true) + setError(null) + const response = await fetch(url) + if (!response.ok) { + throw new Error(`Failed to fetch document (${response.status})`) + } + const rawHtml = await response.text() + if (!cancelled) { + const parsed = parseHtmlContent(rawHtml, url) + htmlCache.set(url, parsed) + setHtmlContent(parsed) + } + } catch (e) { + if (!cancelled) { + setError(e.message) + } + } finally { + if (!cancelled) { + setLoading(false) + } + } + } + + fetchHtml() + + return () => { + cancelled = true + } + }, [url]) + + return {htmlContent, loading, error} +} + +export default useContextDocument diff --git a/public/js/hooks/useContextHighlight.js b/public/js/hooks/useContextHighlight.js new file mode 100644 index 0000000000..b2c9fc8ed6 --- /dev/null +++ b/public/js/hooks/useContextHighlight.js @@ -0,0 +1,151 @@ +import {useState, useRef, useCallback} from 'react' +import { + clearHighlights, + highlightBySid, + setActiveHighlight, + getSegmentNodeMap, +} from '../utils/contextPreviewUtils' +import ContextPreviewChannel from '../utils/contextPreviewChannel' + +/** + * Manages highlight state and occurrence navigation for the ContextPreview panels. + * + * @param {{sourceRef: React.RefObject, targetRef: React.RefObject}} params + * @returns {{ + * highlight: object|null, + * setHighlight: Function, + * highlightRef: React.RefObject, + * applyHighlightsForSegment: Function, + * applyHighlightsForNode: Function, + * navigateHighlight: Function, + * handlePrev: Function, + * handleNext: Function, + * }} + */ +const useContextHighlight = ({sourceRef, targetRef}) => { + const [highlight, setHighlightState] = useState(null) + const highlightRef = useRef(null) + + const setHighlight = useCallback((valueOrUpdater) => { + if (typeof valueOrUpdater !== 'function') { + highlightRef.current = valueOrUpdater + } + setHighlightState((prev) => { + const next = + typeof valueOrUpdater === 'function' + ? valueOrUpdater(prev) + : valueOrUpdater + highlightRef.current = next + return next + }) + }, []) + + const applyHighlightsForSegment = useCallback( + (sid, activeIndex, scroll) => { + let total = 0 + if (sourceRef.current) { + clearHighlights(sourceRef.current) + const res = highlightBySid(sourceRef.current, sid, activeIndex) + total = res.total + if (scroll && res.marks[activeIndex]) { + res.marks[activeIndex][0].scrollIntoView({ + behavior: 'smooth', + block: 'center', + }) + } + } + if (targetRef.current) { + clearHighlights(targetRef.current) + const res = highlightBySid(targetRef.current, sid, activeIndex) + if (!total) total = res.total + if (scroll && res.marks[activeIndex]) { + res.marks[activeIndex][0].scrollIntoView({ + behavior: 'smooth', + block: 'center', + }) + } + } + return total + }, + [sourceRef, targetRef], + ) + + const applyHighlightsForNode = useCallback( + (nodeIndex, activeSegIdx, scroll) => { + ;[sourceRef, targetRef].forEach((ref) => { + if (!ref.current) return + const map = getSegmentNodeMap(ref.current) + if (!map) return + const sids = map.nodeIndexToSids.get(nodeIndex) ?? [] + const activeSid = sids[activeSegIdx] ?? sids[0] + if (activeSid == null) return + clearHighlights(ref.current) + const res = highlightBySid(ref.current, activeSid, 0) + if (scroll && res.marks[0]?.[0]) { + res.marks[0][0].scrollIntoView({ + behavior: 'smooth', + block: 'center', + }) + } + }) + }, + [sourceRef, targetRef], + ) + + const navigateHighlight = useCallback( + (direction) => { + if (!highlight) return + + if (highlight.mode === 'segment') { + const nextIndex = + direction === 'next' + ? (highlight.activeIndex + 1) % highlight.total + : (highlight.activeIndex - 1 + highlight.total) % highlight.total + ;[sourceRef, targetRef].forEach((ref) => { + if (!ref.current) return + const mark = setActiveHighlight(ref.current, nextIndex) + if (mark) mark.scrollIntoView({behavior: 'smooth', block: 'center'}) + }) + setHighlight((prev) => ({...prev, activeIndex: nextIndex})) + return + } + + if (highlight.mode === 'node') { + const {sids, activeSegIdx, nodeIndex} = highlight + const nextSegIdx = + direction === 'next' + ? (activeSegIdx + 1) % sids.length + : (activeSegIdx - 1 + sids.length) % sids.length + ContextPreviewChannel.sendMessage({ + type: 'segmentClicked', + sid: sids[nextSegIdx], + }) + applyHighlightsForNode(nodeIndex, nextSegIdx, false) + setHighlight((prev) => ({...prev, activeSegIdx: nextSegIdx})) + } + }, + [highlight, sourceRef, targetRef, applyHighlightsForNode, setHighlight], + ) + + const handlePrev = useCallback( + () => navigateHighlight('prev'), + [navigateHighlight], + ) + const handleNext = useCallback( + () => navigateHighlight('next'), + [navigateHighlight], + ) + + return { + highlight, + setHighlight, + highlightRef, + applyHighlightsForSegment, + applyHighlightsForNode, + navigateHighlight, + handlePrev, + handleNext, + } +} + +export default useContextHighlight diff --git a/public/js/hooks/useContextPreviewMessages.js b/public/js/hooks/useContextPreviewMessages.js new file mode 100644 index 0000000000..fd3525be00 --- /dev/null +++ b/public/js/hooks/useContextPreviewMessages.js @@ -0,0 +1,111 @@ +import {useState, useEffect} from 'react' +import ContextPreviewChannel from '../utils/contextPreviewChannel' +import { + getSegmentNodeMap, + getSidsFromElement, + replaceTextContent, + stripSegmentTags, + updateNodeTranslation, +} from '../utils/contextPreviewUtils' + +/** + * Subscribes to ContextPreviewChannel and handles all incoming message types. + * + * @param {{ + * onHighlight: (numericSid: number, contextUrl: string|null) => void, + * onTranslationUpdate: (numericSid: number, target: string, updatedSegments: Array) => void, + * targetRef: React.RefObject, + * showNodeWarning: (el: HTMLElement) => void, + * clearNodeWarning: (el: HTMLElement) => void, + * }} params + * @returns {{segments: Array, setSegments: Function, currentContextUrl: string|null}} + */ +const useContextPreviewMessages = ({ + onHighlight, + onTranslationUpdate, + targetRef, + showNodeWarning, + clearNodeWarning, +}) => { + const [segments, setSegments] = useState([]) + const [currentContextUrl, setCurrentContextUrl] = useState(null) + + useEffect(() => { + const handleMessage = (message) => { + if (message.type === 'segments') { + const incoming = message.segments ?? [] + setSegments((prev) => { + const existingSids = new Set(prev.map((s) => s.sid)) + const newSegments = incoming.filter((s) => !existingSids.has(s.sid)) + return newSegments.length > 0 ? [...prev, ...newSegments] : prev + }) + } + + if (message.type === 'highlight') { + const numericSid = Number(message.sid) + setSegments((prev) => { + const seg = prev.find((s) => Number(s.sid) === numericSid) + const contextUrl = seg?.context_url ?? null + setCurrentContextUrl(contextUrl) + onHighlight(numericSid, contextUrl) + return prev + }) + } + + if (message.type === 'updateTranslation') { + const {sid, target} = message + const numericSid = Number(sid) + setSegments((prev) => { + const updated = prev.map((seg) => + Number(seg.sid) === numericSid ? {...seg, target} : seg, + ) + if (targetRef.current) { + const map = getSegmentNodeMap(targetRef.current) + const nodeIndices = map?.sidToNodeIndices.get(numericSid) ?? [] + nodeIndices.forEach((nodeIndex) => { + const el = map.nodes[nodeIndex] + if (!el) return + const result = updateNodeTranslation(el, updated) + if (result === 'mismatch') { + // Revert the node text to source so stale translation is removed + const sids = getSidsFromElement(el) + const sourceSeg = updated.find( + (s) => sids.includes(Number(s.sid)) && s.source, + ) + if (sourceSeg) { + replaceTextContent( + el, + stripSegmentTags(sourceSeg.source).trim(), + ) + } + showNodeWarning(el) + } else { + clearNodeWarning(el) + } + }) + } + onTranslationUpdate(numericSid, target, updated) + return updated + }) + } + } + + const off = ContextPreviewChannel.onMessage(handleMessage) + return off + }, [ + onHighlight, + onTranslationUpdate, + targetRef, + showNodeWarning, + clearNodeWarning, + ]) + + // Request segments from CatTool on mount + useEffect(() => { + ContextPreviewChannel.sendMessage({type: 'requestSegments'}) + }, []) + + return {segments, setSegments, currentContextUrl} +} + +export default useContextPreviewMessages diff --git a/public/js/hooks/useResizable.js b/public/js/hooks/useResizable.js new file mode 100644 index 0000000000..95bddd0a4b --- /dev/null +++ b/public/js/hooks/useResizable.js @@ -0,0 +1,58 @@ +import {useState, useRef, useCallback, useEffect} from 'react' + +const useResizable = ({initialHeight = 500, minHeight = 100, maxHeight}) => { + const [height, setHeight] = useState(initialHeight) + const [isDragging, setIsDragging] = useState(false) + const isDraggingRef = useRef(false) + const startYRef = useRef(0) + const startHeightRef = useRef(0) + + const handleMouseDown = useCallback((e) => { + e.preventDefault() + isDraggingRef.current = true + setIsDragging(true) + startYRef.current = e.clientY + startHeightRef.current = height + document.body.style.cursor = 'row-resize' + document.body.style.userSelect = 'none' + }, [height]) + + useEffect(() => { + const handleMouseMove = (e) => { + if (!isDraggingRef.current) return + const delta = startYRef.current - e.clientY + const computedMax = maxHeight || window.innerHeight - 200 + const newHeight = Math.min( + Math.max(startHeightRef.current + delta, minHeight), + computedMax, + ) + setHeight(newHeight) + } + + const handleMouseUp = () => { + if (!isDraggingRef.current) return + isDraggingRef.current = false + setIsDragging(false) + document.body.style.cursor = '' + document.body.style.userSelect = '' + } + + window.addEventListener('mousemove', handleMouseMove) + window.addEventListener('mouseup', handleMouseUp) + + return () => { + window.removeEventListener('mousemove', handleMouseMove) + window.removeEventListener('mouseup', handleMouseUp) + if (isDraggingRef.current) { + isDraggingRef.current = false + document.body.style.cursor = '' + document.body.style.userSelect = '' + } + } + }, [minHeight, maxHeight]) + + return {height, isDragging, handleMouseDown} +} + +export default useResizable + diff --git a/public/js/hooks/useSegmentsLoader.js b/public/js/hooks/useSegmentsLoader.js index 1fb985bd64..0aa36ddf60 100644 --- a/public/js/hooks/useSegmentsLoader.js +++ b/public/js/hooks/useSegmentsLoader.js @@ -3,7 +3,6 @@ import PropTypes from 'prop-types' import {getSegments} from '../api/getSegments' import SegmentActions from '../actions/SegmentActions' import SegmentStore from '../stores/SegmentStore' -import CommonUtils from '../utils/commonUtils' import {ApplicationWrapperContext} from '../components/common/ApplicationWrapper/ApplicationWrapperContext' const INIT_NUM_SEGMENTS = 40 diff --git a/public/js/pages/CatTool.js b/public/js/pages/CatTool.js index da116edf5d..5b5423cb5b 100644 --- a/public/js/pages/CatTool.js +++ b/public/js/pages/CatTool.js @@ -49,6 +49,13 @@ import {CatToolInterface} from './CatToolInterface' import CommentsActions from '../actions/CommentsActions' import ModalsActions from '../actions/ModalsActions' import FatalErrorModal from '../components/modals/FatalErrorModal' +import ContextPreviewChannel from '../utils/contextPreviewChannel' +import {extractSegmentContextFields} from '../utils/contextPreviewUtils' +import useResizable from '../hooks/useResizable' +import IconRedirect from '../components/icons/IconRedirect' +import IconDown from '../components/icons/IconDown' +import EyeIcon from '../../img/icons/EyeIcon' +import {Button} from '../components/common/Button/Button' const urlParams = new URLSearchParams(window.location.search) const initialStateIsOpenSettings = Boolean(urlParams.get('openTab')) @@ -79,7 +86,101 @@ function CatTool() { const startSegmentIdRef = useRef() const callbackAfterSegmentsResponseRef = useRef() + const { + height: contextPreviewHeight, + isDragging: isResizing, + handleMouseDown: onResizeMouseDown, + } = useResizable({initialHeight: 500, minHeight: 100}) + + const [isPreviewOpen, setIsPreviewOpen] = useState(false) + const [segmentHasPreview, setSegmentHasPreview] = useState(false) + const contextPreviewUrl = `${window.origin}/context-preview/${config.id_job}/${config.password}` + const popupWindowRef = useRef(null) + const previewDesiredOpenRef = useRef(false) + + const togglePreview = useCallback(() => { + setIsPreviewOpen((prev) => { + const next = !prev + previewDesiredOpenRef.current = next + if (!prev && popupWindowRef.current && !popupWindowRef.current.closed) { + popupWindowRef.current.close() + popupWindowRef.current = null + } + return next + }) + }, []) + + useHotkeys( + Shortcuts.cattol.events.toggleContextPreview.keystrokes[ + Shortcuts.shortCutsKeyType + ], + () => togglePreview(), + {enableOnContentEditable: true}, + ) + + const openPreviewInNewWindow = useCallback(() => { + if (popupWindowRef.current && !popupWindowRef.current.closed) { + popupWindowRef.current.focus() + } else { + const width = Math.round(window.screen.width * 0.8) + const height = Math.round(window.screen.height * 0.8) + const left = Math.round((window.screen.width - width) / 2) + const top = Math.round((window.screen.height - height) / 2) + popupWindowRef.current = window.open( + contextPreviewUrl, + 'contextPreviewWindow', + `width=${width},height=${height},left=${left},top=${top}`, + ) + } + setIsPreviewOpen(false) + }, [contextPreviewUrl]) + useEffect(() => { + return ContextPreviewChannel.onMessage((message) => { + if (message.type === 'segmentClicked' && message.sid) { + SegmentActions.openSegment(message.sid) + } + + if (message.type === 'requestSegments') { + const segments = SegmentStore.getAllSegments() + if (segments && segments.length) { + const segmentsList = [] + for (let i = 0; i < segments.length; i++) { + const seg = segments[i] + segmentsList.push({ + sid: seg.sid, + source: seg.segment, + target: seg.translation, + ...extractSegmentContextFields(seg), + }) + } + ContextPreviewChannel.sendMessage({ + type: 'segments', + segments: segmentsList, + }) + const currentSid = SegmentStore.getCurrentSegmentId() + if (currentSid) { + ContextPreviewChannel.sendMessage({ + type: 'highlight', + sid: currentSid, + }) + } + } + } + + if (message.type === 'loadMoreSegments' && message.where) { + const segmentId = + message.where === 'after' + ? SegmentStore.getLastSegmentId() + : SegmentStore.getFirstSegmentId() + setOptions((prevState) => ({ + ...prevState, + segmentId, + where: message.where, + })) + } + }) + }, []) const {isLoading: isLoadingSegments, result: segmentsResult} = useSegmentsLoader({ segmentId: options?.segmentId @@ -223,6 +324,37 @@ function CatTool() { setOptions((prevState) => ({...prevState, segmentId, where})) } + const onSegmentOpened = (sid) => { + const segFromById = SegmentStore.getSegmentById(sid) + const segment = + segFromById?.toJS?.() || + SegmentStore.getAllSegments().find((seg) => seg.sid == sid) + const {context_url, screenshot} = extractSegmentContextFields( + segment ?? {}, + ) + + const hasContent = Boolean(context_url || screenshot) + setSegmentHasPreview(hasContent) + if (hasContent) { + setIsPreviewOpen(previewDesiredOpenRef.current) + } else { + setIsPreviewOpen(false) + } + ContextPreviewChannel.sendMessage({ + type: 'highlight', + sid: Number(sid), + context_url: context_url ?? null, + }) + } + let lastOpenedSid = null + const onSegmentsRendered = () => { + const current = SegmentStore.getCurrentSegment() + if (!current) return + const sid = current.sid + if (sid === lastOpenedSid) return + lastOpenedSid = sid + onSegmentOpened(sid) + } const checkAnalysisState = ({analysis_complete}) => { setIsAnalysisCompleted(analysis_complete) @@ -266,6 +398,10 @@ function CatTool() { SegmentConstants.GET_MORE_SEGMENTS, getMoreSegments, ) + SegmentStore.addListener( + SegmentConstants.RENDER_SEGMENTS, + onSegmentsRendered, + ) CatToolStore.addListener(CatToolConstants.SET_PROGRESS, checkAnalysisState) const getJobMetadata = ({jobMetadata}) => setJobMetadata(jobMetadata) @@ -290,6 +426,10 @@ function CatTool() { SegmentConstants.GET_MORE_SEGMENTS, getMoreSegments, ) + SegmentStore.removeListener( + SegmentConstants.RENDER_SEGMENTS, + onSegmentsRendered, + ) CatToolStore.removeListener( CatToolConstants.SET_PROGRESS, checkAnalysisState, @@ -334,10 +474,6 @@ function CatTool() { const {segmentId, data} = segmentsResult if (where === 'center') { - // Init segments - // TODO: da verificare se serve: $(document).trigger('segments:load', data) - $(document).trigger('segments:load', data) - if ( !Object.entries(data.files) .map(([, value]) => value.segments) @@ -381,6 +517,23 @@ function CatTool() { // TODO: da verificare se serve: $(window).trigger('segmentsAdded', {resp: data.files}) CommonUtils.dispatchCustomEvent('segmentsAdded', {resp: data.files}) } + const segmentsFlat = Object.entries(data.files) + .map(([, value]) => value.segments) + .flat() + const segmentsList = [] + for (let i = 0; i < segmentsFlat.length; i++) { + const seg = segmentsFlat[i] + segmentsList.push({ + sid: seg.sid, + source: seg.segment, + target: seg.translation, + ...extractSegmentContextFields(seg), + }) + } + ContextPreviewChannel.sendMessage({ + type: 'segments', + segments: segmentsList, + }) if (config.isReview) { SegmentActions.addPreloadedIssuesToSegment() } @@ -537,6 +690,74 @@ function CatTool() {
{isFreezingSegments &&
}
+
+ {isPreviewOpen ? ( + <> +
+
+ + + Preview + +
+ + + +
+
+
+