From cdd93fe9e8a611b10ca2b0d1f825767ec08a79cf Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 21 Sep 2026 09:10:54 +0200 Subject: [PATCH] Abtrennung zu neuem Datenmodell --- .claude/skills/assessor-ui/README.md | 27 +- .claude/skills/assessor-ui/SKILL.md | 56 +- .../assessor-ui/references/page-archetypes.md | 8 + .../references/review-checklist.md | 26 + AGENTS.md | 109 +- SECURITY.md | 20 + docs/COMPARISON_ENGINE.md | 6 + docs/GPO_BASELINE_EVALUATION.md | 76 + docs/IMPLEMENTATION_PLAN.md | 358 + docs/REIMPORT_POLICY.md | 33 +- docs/REPORT_STRATEGY.md | 545 + docs/RISK_ACCEPTANCE.md | 63 + docs/SCORING_MODEL.md | 28 +- docs/TIMESLOT_COMPARISON_AUDIT.md | 38 + docs/TIMESLOT_COMPARISON_PLAN.md | 157 + .../policy-analyzer-comparison-contract.md | 6 +- ...0_Assessor_Cyber_Hygiene_KRITIS_Sales.docx | Bin 0 -> 50628 bytes .../client-build/assets/index-574eOw2u.js | 232 + .../client-build/assets/index-DLrW8Yip.css | 1 + ...er-cyrillic-ext-wght-normal-BOeWTOD4.woff2 | Bin 0 -> 25960 bytes .../inter-cyrillic-wght-normal-DqGufNeO.woff2 | Bin 0 -> 18748 bytes ...inter-greek-ext-wght-normal-DlzME5K_.woff2 | Bin 0 -> 11232 bytes .../inter-greek-wght-normal-CkhJZR-_.woff2 | Bin 0 -> 18996 bytes ...inter-latin-ext-wght-normal-DO1Apj_S.woff2 | Bin 0 -> 85068 bytes .../inter-latin-wght-normal-Dx4kXJAl.woff2 | Bin 0 -> 48256 bytes ...nter-vietnamese-wght-normal-CBcvBZtf.woff2 | Bin 0 -> 10252 bytes .../client-build/index.html | 18 + ...er-cyrillic-ext-wght-normal-IYF56FF6.woff2 | Bin 0 -> 25960 bytes .../inter-cyrillic-wght-normal-JEOLYBOO.woff2 | Bin 0 -> 18748 bytes ...inter-greek-ext-wght-normal-EOVOK2B5.woff2 | Bin 0 -> 11232 bytes .../inter-greek-wght-normal-IRE366VL.woff2 | Bin 0 -> 18996 bytes ...inter-latin-ext-wght-normal-HA22NDSG.woff2 | Bin 0 -> 85068 bytes .../inter-latin-wght-normal-NRMW37G5.woff2 | Bin 0 -> 48256 bytes ...nter-vietnamese-wght-normal-CE5GGD3W.woff2 | Bin 0 -> 10252 bytes outputs/client-info-design-check/preview.css | 12245 ++++++++ outputs/client-info-design-check/preview.js | 25649 ++++++++++++++++ outputs/dummy-policy-audit-2026-09-18.md | 202 + .../dummy-result-count-audit-2026-09-18.md | 77 + outputs/dummy-result-count-audit.mjs | 88 + outputs/dummy-work-export-audit-2026-09-18.md | 63 + outputs/dummy-work-export-audit.mjs | 49 + outputs/dummy-work-export-verification.mjs | 71 + server/artifacts/backend-artifact-store.ts | 46 +- server/assessor-http-server.ts | 19 +- server/gpo/gpo-artifact-reconciler.ts | 9 +- server/gpo/gpo-automatic-analysis-service.ts | 9 +- server/gpo/gpo-backup-job-processor.ts | 5 +- server/gpo/gpo-backup-management-service.ts | 5 + server/gpo/gpo-backup-status-service.ts | 57 +- server/gpo/gpo-backup-submission-service.ts | 37 +- .../gpo/gpo-policy-evaluation-rule-engine.ts | 139 - server/gpo/gpo-policy-evaluation-service.ts | 146 +- server/gpo/gpo-source-availability.ts | 18 + server/gpo/policy-target-resolver.ts | 9 +- server/gpo/security-template-parser.ts | 18 +- server/index.ts | 1 + server/node-import-runtime-adapters.ts | 11 +- .../postgres/postgres-assessor-repository.ts | 51 +- src/api/assessor-api-client.ts | 8 +- src/api/assessor-api-contract.ts | 17 +- src/app/App.tsx | 16 +- src/app/AppProvider.tsx | 80 +- src/app/app-state.ts | 4 +- src/comparison/timeslot-comparison-engine.ts | 252 + .../BackendConnectionDialog.tsx | 29 + src/components/Dialog/Dialog.tsx | 5 +- .../DonutMetricCard/DonutMetricCard.tsx | 8 +- src/components/FindingCard/FindingCard.tsx | 20 +- src/components/PathText/PathText.tsx | 4 + src/domain/canonical-model.ts | 2 + src/domain/finding.ts | 29 + .../microsoft-security-baseline-analysis.ts | 6 +- src/domain/policy-analysis-overview.ts | 130 +- src/domain/policy-comparison-disposition.ts | 13 + src/domain/policy-evaluation.ts | 62 +- src/domain/policy-status-labels.ts | 20 + src/domain/report-projection.ts | 655 + src/domain/review.ts | 4 + src/domain/risk-acceptance.ts | 136 + src/domain/timeslot-comparison.ts | 335 + src/domain/tool-profile-definition.ts | 65 + src/domain/unified-result.ts | 68 +- src/evaluation/policy-baseline-variants.ts | 102 + src/evaluation/policy-comparator.ts | 8 +- src/evaluation/policy-consistency-results.ts | 6 +- src/evaluation/policy-work-results.ts | 206 +- src/exports/management-overview-report.ts | 493 + src/exports/work-view-export.ts | 224 + .../actionlist/ActionlistControls.tsx | 80 +- src/features/dashboard/DashboardPanel.tsx | 466 +- .../dashboard/OperatingSystemInventory.tsx | 33 + src/features/dashboard/RiskRegister.tsx | 155 + .../dashboard/dashboard-result-state.ts | 93 + .../dashboard/operating-system-inventory.ts | 98 + src/features/dashboard/security-domains.ts | 54 + src/features/dataset-viewer/DatasetViewer.tsx | 41 +- .../db-structure/DbStructurePanel.tsx | 6 +- src/features/finding-reader/FindingReader.tsx | 105 +- .../finding-reader/PolicySourceEvidence.tsx | 42 + .../finding-reader/RiskAcceptanceDialog.tsx | 180 + .../linked-results/FloatingResultsWindow.tsx | 7 +- src/features/linked-results/record-results.ts | 15 + src/features/linked-results/result-message.ts | 20 +- src/features/mitre-graph/MitreGraphView.tsx | 10 +- .../mitre-graph/ObsidianGraphView.tsx | 10 +- src/features/project-import/DataHub.tsx | 147 +- .../project-import/DatahubHistoryOverview.tsx | 2 +- .../project-import/GpoFolderImport.tsx | 44 +- src/features/project-import/GpoStatusRow.tsx | 61 + .../project-import/PolicyAnalysisPanel.tsx | 43 +- .../datahub-processing-readiness.ts | 55 +- .../project-import/datahub-scan-analysis.ts | 23 + .../project-import/gpo-source-recovery.ts | 2 + .../load-canonical-project-workspace.ts | 17 +- .../policy-backup-impact-sources.ts | 19 + .../policy-observations-to-dataset.ts | 111 +- .../project-import/policy-work-row-rollup.ts | 93 + .../results-browser/ResultsBrowser.tsx | 28 +- .../results-browser/ResultsFilterPanel.tsx | 4 +- .../review-workspace/database-review.ts | 23 +- .../search-filter/DynamicFilterControls.tsx | 26 +- .../search-filter/SearchFilterBar.tsx | 13 +- .../search-filter/WorkTimeslotControl.tsx | 2 +- src/features/search-filter/dynamic-facets.ts | 200 +- src/features/search-filter/filter-records.ts | 13 +- src/features/search-filter/work-facets.ts | 13 +- .../sidebar/SidebarSecurityDomains.tsx | 110 + .../sidebar/SidebarSeverityMetrics.tsx | 117 - src/features/view-bookmarks/view-bookmarks.ts | 12 +- src/hooks/use-virtual-rows.ts | 6 +- src/importers/canonical-import.ts | 15 +- src/importers/status-normalization.ts | 4 + src/persistence/assessor-repository.ts | 4 +- src/persistence/local-assessor-repository.ts | 22 +- src/profiles/cis-cat/cis-cat-definition.ts | 21 + src/profiles/generic/generic-definition.ts | 13 + src/profiles/group-policy/categories.ts | 17 +- .../group-policy/conflict-presentation.ts | 7 +- src/profiles/group-policy/guidance.ts | 51 +- src/profiles/group-policy/presentation.ts | 11 + src/profiles/group-policy/source-evidence.ts | 158 + src/profiles/maester/maester-definition.ts | 16 + .../pingcastle/pingcastle-definition.ts | 21 + src/profiles/profile-factory.ts | 33 +- .../purple-knight/purple-knight-definition.ts | 16 + src/shared/json-text.ts | 28 + src/styles/components.css | 212 +- src/styles/datahub-redesign.css | 4 +- src/styles/datahub.css | 400 +- src/styles/dynamic-filters.css | 17 +- src/styles/import-workflow.css | 2 +- src/styles/layout.css | 22 +- src/styles/legacy-views.css | 39 +- src/styles/mitre-graph.css | 28 +- src/styles/obsidian-graph.css | 6 +- src/styles/policy-analysis.css | 2 +- src/styles/tile-contract.css | 6 +- src/styles/tokens.css | 9 +- src/styles/ui-components.css | 6 +- src/styles/ui-tokens.css | 132 +- tests/api/assessor-api-client.test.ts | 12 + tests/client-info-design-browser-check.mjs | 90 + .../timeslot-comparison-engine.test.ts | 126 + .../backend-connection-dialog.test.tsx | 33 + tests/components/dialog-layout.test.ts | 12 + tests/components/donut-metric-card.test.tsx | 30 +- tests/components/panel-loading-state.test.tsx | 6 +- tests/components/path-text.test.tsx | 13 + tests/design-language-check.mjs | 54 +- .../gpo-source-identity-projection.test.ts | 120 + tests/domain/policy-analysis-overview.test.ts | 145 + tests/domain/report-projection.test.ts | 300 + tests/domain/risk-acceptance-fixture.ts | 10 + tests/domain/risk-acceptance.test.ts | 57 + tests/domain/timeslot-comparison.test.ts | 185 + tests/evaluation/policy-comparator.test.ts | 21 + .../management-overview-report.test.ts | 237 + tests/exports/work-view-export.test.ts | 132 + ...is-cat-result-outcome-interaction.test.tsx | 77 + tests/features/cis-cat-results-window.test.ts | 35 + .../dashboard-environment-detail.test.ts | 38 +- tests/features/dashboard-layout.test.ts | 122 +- .../dashboard-posture-interaction.test.tsx | 67 + .../features/datahub-centered-layout.test.ts | 11 +- tests/features/datahub-client-open.test.ts | 2 +- tests/features/datahub-gpo-open.test.ts | 12 + .../datahub-gpo-report-visibility.test.ts | 14 +- .../datahub-processing-readiness.test.ts | 57 + tests/features/datahub-scan-analysis.test.ts | 39 +- tests/features/dynamic-facets.test.ts | 30 +- tests/features/finding-reader.test.ts | 36 +- .../features/finding-title-typography.test.ts | 8 + .../gpo-backup-impact-filter.test.tsx | 169 + tests/features/gpo-baseline-rollup.test.tsx | 266 + tests/features/gpo-category-badges.test.tsx | 49 + tests/features/gpo-conflict-results.test.tsx | 7 +- tests/features/gpo-duplicate-results.test.tsx | 12 +- .../gpo-evaluation-visibility.test.tsx | 170 + tests/features/gpo-filter-context.test.ts | 176 + .../gpo-folder-import-polling.test.tsx | 47 + .../gpo-operation-conflict-flags.test.ts | 155 + .../gpo-source-evidence-interaction.test.tsx | 165 + tests/features/gpo-source-evidence.test.tsx | 147 + tests/features/gpo-source-navigation.test.tsx | 125 + .../gpo-source-recovery-interaction.test.tsx | 103 + tests/features/gpo-status-row.test.tsx | 66 + tests/features/gpo-work-projection.test.ts | 221 +- .../load-canonical-project-workspace.test.ts | 38 + tests/features/navigation-performance.test.ts | 6 +- tests/features/obsidian-graph.test.ts | 11 +- .../operating-system-inventory.test.tsx | 104 + tests/features/policy-analysis-panel.test.tsx | 101 +- tests/features/policy-guidance.test.tsx | 26 +- tests/features/record-list-stability.test.tsx | 37 + .../results-browser-policy-filters.test.tsx | 128 + .../features/risk-acceptance-dialog.test.tsx | 107 + tests/features/risk-register.test.tsx | 100 + ...ecurity-domain-filter-interaction.test.tsx | 211 + .../sidebar-security-domains.test.tsx | 89 + .../sidebar-severity-metrics.test.tsx | 134 - .../source-selection-stays-in-view.test.tsx | 52 +- tests/features/tile-segment-grammar.test.ts | 10 +- .../view-bookmarks-interaction.test.tsx | 71 + tests/features/view-bookmarks.test.ts | 7 +- .../work-default-filter-navigation.test.tsx | 80 + tests/features/work-header-layout.test.ts | 5 +- tests/features/work-timeslot-control.test.ts | 2 +- tests/features/work-timeslot-state.test.ts | 8 +- .../work-view-export-interaction.test.tsx | 103 + tests/fixtures/client-info-design/preview.css | 2 + tests/fixtures/client-info-design/preview.tsx | 63 + tests/fixtures/policy-current-runs.ts | 26 + tests/importers/maester-coverage.test.ts | 16 + .../pingcastle-source-extractor.test.ts | 12 +- tests/local-only-check.mjs | 2 +- tests/persistence/assessor-repository.test.ts | 20 + .../ingestion-terminal-failure.test.ts | 30 + .../policy-current-run-selection.test.ts | 97 + .../risk-acceptance-transaction.test.ts | 35 + tests/profiles/declarative-profiles.test.ts | 53 + tests/server/backend-artifact-store.test.ts | 41 +- tests/server/gpo-backup-http.test.ts | 36 +- tests/server/gpo-backup-ingestion.test.ts | 2 +- tests/server/gpo-backup-job-processor.test.ts | 6 +- .../server/gpo-backup-status-service.test.ts | 12 +- .../gpo-policy-evaluation-service.test.ts | 285 +- tests/server/gpo-source-recovery.test.ts | 128 + tests/server/import-batch-http.test.ts | 74 + tests/server/import-worker-startup-check.mjs | 40 + ...microsoft-security-baseline-parser.test.ts | 2 +- .../microsoft-security-baseline.test.ts | 2 + tests/server/security-template-parser.test.ts | 6 +- 252 files changed, 52641 insertions(+), 1547 deletions(-) create mode 100644 docs/GPO_BASELINE_EVALUATION.md create mode 100644 docs/REPORT_STRATEGY.md create mode 100644 docs/RISK_ACCEPTANCE.md create mode 100644 docs/TIMESLOT_COMPARISON_AUDIT.md create mode 100644 docs/TIMESLOT_COMPARISON_PLAN.md create mode 100644 outputs/Exxeta_360_Assessor_Cyber_Hygiene_KRITIS_Sales.docx create mode 100644 outputs/client-info-design-check/client-build/assets/index-574eOw2u.js create mode 100644 outputs/client-info-design-check/client-build/assets/index-DLrW8Yip.css create mode 100644 outputs/client-info-design-check/client-build/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 create mode 100644 outputs/client-info-design-check/client-build/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 create mode 100644 outputs/client-info-design-check/client-build/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 create mode 100644 outputs/client-info-design-check/client-build/assets/inter-greek-wght-normal-CkhJZR-_.woff2 create mode 100644 outputs/client-info-design-check/client-build/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 create mode 100644 outputs/client-info-design-check/client-build/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 create mode 100644 outputs/client-info-design-check/client-build/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 create mode 100644 outputs/client-info-design-check/client-build/index.html create mode 100644 outputs/client-info-design-check/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 create mode 100644 outputs/client-info-design-check/inter-cyrillic-wght-normal-JEOLYBOO.woff2 create mode 100644 outputs/client-info-design-check/inter-greek-ext-wght-normal-EOVOK2B5.woff2 create mode 100644 outputs/client-info-design-check/inter-greek-wght-normal-IRE366VL.woff2 create mode 100644 outputs/client-info-design-check/inter-latin-ext-wght-normal-HA22NDSG.woff2 create mode 100644 outputs/client-info-design-check/inter-latin-wght-normal-NRMW37G5.woff2 create mode 100644 outputs/client-info-design-check/inter-vietnamese-wght-normal-CE5GGD3W.woff2 create mode 100644 outputs/client-info-design-check/preview.css create mode 100644 outputs/client-info-design-check/preview.js create mode 100644 outputs/dummy-policy-audit-2026-09-18.md create mode 100644 outputs/dummy-result-count-audit-2026-09-18.md create mode 100644 outputs/dummy-result-count-audit.mjs create mode 100644 outputs/dummy-work-export-audit-2026-09-18.md create mode 100644 outputs/dummy-work-export-audit.mjs create mode 100644 outputs/dummy-work-export-verification.mjs delete mode 100644 server/gpo/gpo-policy-evaluation-rule-engine.ts create mode 100644 server/gpo/gpo-source-availability.ts create mode 100644 src/comparison/timeslot-comparison-engine.ts create mode 100644 src/components/BackendConnectionDialog/BackendConnectionDialog.tsx create mode 100644 src/domain/policy-status-labels.ts create mode 100644 src/domain/report-projection.ts create mode 100644 src/domain/risk-acceptance.ts create mode 100644 src/domain/timeslot-comparison.ts create mode 100644 src/evaluation/policy-baseline-variants.ts create mode 100644 src/exports/management-overview-report.ts create mode 100644 src/exports/work-view-export.ts create mode 100644 src/features/dashboard/OperatingSystemInventory.tsx create mode 100644 src/features/dashboard/RiskRegister.tsx create mode 100644 src/features/dashboard/dashboard-result-state.ts create mode 100644 src/features/dashboard/operating-system-inventory.ts create mode 100644 src/features/dashboard/security-domains.ts create mode 100644 src/features/finding-reader/PolicySourceEvidence.tsx create mode 100644 src/features/finding-reader/RiskAcceptanceDialog.tsx create mode 100644 src/features/linked-results/record-results.ts create mode 100644 src/features/project-import/GpoStatusRow.tsx create mode 100644 src/features/project-import/gpo-source-recovery.ts create mode 100644 src/features/project-import/policy-backup-impact-sources.ts create mode 100644 src/features/project-import/policy-work-row-rollup.ts create mode 100644 src/features/sidebar/SidebarSecurityDomains.tsx delete mode 100644 src/features/sidebar/SidebarSeverityMetrics.tsx create mode 100644 src/profiles/group-policy/source-evidence.ts create mode 100644 src/shared/json-text.ts create mode 100644 tests/client-info-design-browser-check.mjs create mode 100644 tests/comparison/timeslot-comparison-engine.test.ts create mode 100644 tests/components/backend-connection-dialog.test.tsx create mode 100644 tests/domain/gpo-source-identity-projection.test.ts create mode 100644 tests/domain/report-projection.test.ts create mode 100644 tests/domain/risk-acceptance-fixture.ts create mode 100644 tests/domain/risk-acceptance.test.ts create mode 100644 tests/domain/timeslot-comparison.test.ts create mode 100644 tests/exports/management-overview-report.test.ts create mode 100644 tests/exports/work-view-export.test.ts create mode 100644 tests/features/cis-cat-result-outcome-interaction.test.tsx create mode 100644 tests/features/dashboard-posture-interaction.test.tsx create mode 100644 tests/features/gpo-backup-impact-filter.test.tsx create mode 100644 tests/features/gpo-baseline-rollup.test.tsx create mode 100644 tests/features/gpo-evaluation-visibility.test.tsx create mode 100644 tests/features/gpo-filter-context.test.ts create mode 100644 tests/features/gpo-folder-import-polling.test.tsx create mode 100644 tests/features/gpo-operation-conflict-flags.test.ts create mode 100644 tests/features/gpo-source-evidence-interaction.test.tsx create mode 100644 tests/features/gpo-source-evidence.test.tsx create mode 100644 tests/features/gpo-source-navigation.test.tsx create mode 100644 tests/features/gpo-source-recovery-interaction.test.tsx create mode 100644 tests/features/gpo-status-row.test.tsx create mode 100644 tests/features/operating-system-inventory.test.tsx create mode 100644 tests/features/record-list-stability.test.tsx create mode 100644 tests/features/results-browser-policy-filters.test.tsx create mode 100644 tests/features/risk-acceptance-dialog.test.tsx create mode 100644 tests/features/risk-register.test.tsx create mode 100644 tests/features/security-domain-filter-interaction.test.tsx create mode 100644 tests/features/sidebar-security-domains.test.tsx delete mode 100644 tests/features/sidebar-severity-metrics.test.tsx create mode 100644 tests/features/view-bookmarks-interaction.test.tsx create mode 100644 tests/features/work-default-filter-navigation.test.tsx create mode 100644 tests/features/work-view-export-interaction.test.tsx create mode 100644 tests/fixtures/client-info-design/preview.css create mode 100644 tests/fixtures/client-info-design/preview.tsx create mode 100644 tests/fixtures/policy-current-runs.ts create mode 100644 tests/postgres/ingestion-terminal-failure.test.ts create mode 100644 tests/postgres/policy-current-run-selection.test.ts create mode 100644 tests/postgres/risk-acceptance-transaction.test.ts create mode 100644 tests/server/gpo-source-recovery.test.ts create mode 100644 tests/server/import-worker-startup-check.mjs diff --git a/.claude/skills/assessor-ui/README.md b/.claude/skills/assessor-ui/README.md index 75c991e..0008f80 100644 --- a/.claude/skills/assessor-ui/README.md +++ b/.claude/skills/assessor-ui/README.md @@ -20,23 +20,14 @@ cp -r assessor-ui ~/.claude/skills/ ## Einbindung im Projekt -Die Token- und Komponentendateien sind nicht nur Dokumentation, sondern die Implementierungsbasis: - -```bash -cp .claude/skills/assessor-ui/assets/tokens.css src/styles/tokens.css -cp .claude/skills/assessor-ui/assets/components.css src/styles/components.css -``` - -Einstiegspunkt des Stylesheets: - -```css -@layer tokens, base, shell, components, utilities; - -@import "./styles/tokens.css"; -@import "./styles/base.css"; -@import "./styles/shell.css"; -@import "./styles/components.css"; -``` +Nutzerkorrektur 2026-09-18: Data Hub, Work und Pathfinder sind die verbindlichen +Ableton-inspirierten Referenzen, auch fuer Client Info, Mockups und Prototypen. +Zuerst [AGENTS.md](../../../AGENTS.md#binding-assessor-design-language) und den +Vorrangabschnitt in `SKILL.md` lesen. Die aktuellen Projekt-Tokens liegen in +`src/styles/ui-tokens.css`; bestehende Komponenten und Styles werden weiterverwendet. +Die Dateien unter `assets/` und aeltere Referenzskizzen sind historische Beispiele. +Sie duerfen nicht ueber die aktuellen Styles kopiert oder erneut in den Build +eingebunden werden. Die fruehere Kopieranleitung ist hiermit ausdruecklich aufgehoben. Theme und Dichte am Wurzelelement: @@ -63,7 +54,7 @@ Erlaubte Werte: `data-theme` = `dark` oder `light`, `data-density` = `compact`, Der Skill triggert automatisch bei UI-Aufgaben an ASSESSOR. Erzwingen laesst er sich mit: ```text -Nutze den Skill assessor-ui. Baue die Datahub-Uebersicht auf Archetyp D um. +Nutze den Skill assessor-ui. Gestalte Client Info mit der bestehenden Designsprache von Data Hub, Work und Pathfinder. ``` Vor dem Abschluss einer Aenderung: diff --git a/.claude/skills/assessor-ui/SKILL.md b/.claude/skills/assessor-ui/SKILL.md index 973ed4e..d59f536 100644 --- a/.claude/skills/assessor-ui/SKILL.md +++ b/.claude/skills/assessor-ui/SKILL.md @@ -16,6 +16,36 @@ description: >- Verbindliches Designsystem fuer ASSESSOR. Keine Empfehlung, keine Inspiration: Vorschrift. +## Verbindliche Referenzen und Vorrang, Nutzerkorrektur 2026-09-18 + +Die aktuell vom Nutzer freigegebenen Ansichten **Data Hub, Work und Pathfinder** +sind die konkrete Ableton-inspirierte ASSESSOR-Referenz. Sie gelten ausdruecklich +auch fuer **Client Info**, einschliesslich Source Overview, Environment Detail und +Accepted Risks, sowie fuer Bildentwuerfe und Prototypen. Die drei am 2026-09-18 +verworfenen generischen Client-Info-Mockups sind keine freigegebenen Vorlagen. + +Massgeblich sind [AGENTS.md](../../../AGENTS.md#binding-assessor-design-language), +die aktuellen Komponenten und [ui-tokens.css](../../../src/styles/ui-tokens.css). +Die fruehere Client-Info-Designausnahme ist aufgehoben. Fachliche Inhalte, +Scoresemantik und Drilldowns bleiben erhalten; ihre Darstellung folgt denselben +Flächen-, Tile-, Button-, Typografie-, Abstands- und Zustandsregeln wie die Referenzen. + +Diese datierte Festlegung hat Vorrang vor allen aelteren Beispielen und Tabellen +in diesem Skill, seinen `references/` und `assets/`. Insbesondere sind eine violette +Auswahl/Primaeraktion, kleine Fliesstextrollen, starre gekuerzte Tiles, dekorative +Donutschatten/Verlaeufe, ein erzwungener Tabellenumbau von Data Hub und eine neue +Shell keine aktuellen Vorgaben. Die aktuelle gelb/bernsteinfarbene Markierung und +Aktionsfarbe, der blaue Tastaturfokus, Inter, die 16px-Lese- und 14px-Datenrolle, +20px Panel-Inset sowie flache Tiles und volle 360-Grad-Donuts sind verbindlich. +Bestehende runde Hauptpanels behalten ihre gemeinsame Geometrie; die Tiles darin +bleiben eckig. Historische Skill-Assets niemals ueber die aktuellen Styles kopieren. + +Vor jeder Abnahme ist der Entwurf bei normalem App-Zoom direkt mit Data Hub, Work +und Pathfinder abzugleichen: Er muss auch ohne Logo wie dieselbe Anwendung wirken. +Mockups verwenden nur eindeutig synthetische Beispieldaten und die echten +Referenzansichten als Stilvorlage; sie erfinden weder Kennzahlen noch eine neue +Navigation. Verankerung, Vorschlag und tatsaechliche UI-Umsetzung getrennt benennen. + ## Zweck ASSESSOR ist ein Analysewerkzeug fuer Active-Directory-Sicherheitsbefunde aus PingCastle, @@ -28,17 +58,17 @@ Loesung erfindet. Genau das hat den heutigen Zustand erzeugt: `Work` sieht ander ## Ablauf bei jeder UI-Aufgabe -1. `assets/tokens.css` und `assets/components.css` lesen. Beide sind die Implementierungsbasis. -2. Betroffenen Seitenarchetyp bestimmen (siehe `references/page-archetypes.md`). +1. Die aktuellen UI-Vereinbarungen in `AGENTS.md`, `src/styles/ui-tokens.css` und die betroffenen bestehenden Komponenten lesen. Die Skill-Assets sind historische Referenzen, keine zu kopierende Implementierungsbasis. +2. Die freigegebene Referenzansicht und das bestehende Layout bestimmen. `references/page-archetypes.md` nur ergaenzend unter dem Vorrang der Nutzerkorrektur vom 2026-09-18 verwenden. 3. Pruefen, ob eine bestehende Komponente ausreicht. Neue Komponente nur, wenn keine Variante passt. 4. Implementieren, ausschliesslich mit Tokens und bestehenden Klassen. -5. Gegen `references/review-checklist.md` pruefen, in Dark UND Light. +5. Direkt gegen Data Hub, Work und Pathfinder sowie die aktuellen AGENTS-Regeln pruefen; fuer Implementierungen in Dark UND Light. `references/review-checklist.md` unter ihrem datierten Vorranghinweis verwenden. 6. Abweichungen benennen, nicht stillschweigend loesen. ## Referenzdateien -- `assets/tokens.css` — alle Farben, Masse, Radien, Schatten, Typografie. Einzige Quelle. -- `assets/components.css` — Referenzimplementierung aller Kernkomponenten. +- `src/styles/ui-tokens.css` (Projektwurzel) — aktuelle Farben, Masse und Typografierollen. +- `assets/tokens.css` und `assets/components.css` — historische Beispiele; bei Abweichungen gelten ausschliesslich die aktuellen Projektvertraege und Implementierungen. - `references/state-model.md` — Zustandsdimensionen und ihre Darstellung. Vor jeder Badge-/Statusarbeit lesen. - `references/components.md` — Komponentenvertraege mit festen Massen und Aufbau. - `references/page-archetypes.md` — Shell und die vier erlaubten Seitenlayouts. @@ -93,7 +123,9 @@ Diese Regeln gelten ohne Ausnahme. Ein Verstoss ist ein Fehler, keine Stilfrage. - Buttonform ist verbindlich und ueberall dieselbe, unabhaengig von der Farbe: `--btn-radius` (abgerundete Ecken), `--btn-h` als Hoehe, `--btn-pad-x` als waagerechtes Polster, senkrecht kein eigenes Polster. Keine Ansicht setzt eine eigene Buttonhoehe, einen eigenen Radius oder - ein eigenes Polster. Ausgenommen sind nur zusammengesetzte Reiter (View-Tabs, Sidebar). + ein eigenes Polster. Auch zusammengesetzte Reiter, Sidebar-Aktionen, Icon-, Disclosure- und + Segment-Schaltflaechen verwenden den gemeinsamen Radius. Echte Kreis-/Donut-Interaktionen und + quadratische Inhaltskacheln behalten ihre semantische Geometrie. - Traegt eine Schaltflaeche Farbe, ist es `--button-accent` (Standardgelb `#E9A63C`, in beiden Skins gleich) mit `--button-accent-text`. Nie ein anderes Gelb, nie der Ton des Command Bands. - Rahmen: 1 px. 2 px ausschliesslich fuer Auswahl- und Fokusrahmen. @@ -103,8 +135,16 @@ Diese Regeln gelten ohne Ausnahme. Ein Verstoss ist ein Fehler, keine Stilfrage. - Schatten: nur `--shadow-overlay` und `--shadow-popover`, nur an echten Overlays. Kein Schatten an Panels, Tiles, Zeilen, Buttons, Tabellen. - Kein Glassmorphism, kein Neumorphismus, kein Farbverlauf als Flaeche, kein Hover-Lift, kein Scale-Effekt. -- Der Akzent (Violett) bedeutet ausschliesslich: Primaeraktion, aktive Ansicht, Auswahl. - Nie Severity, nie Erfolg, nie Markierung, nie Dekoration. +- Violett ist als UI-Rolle vollstaendig entfernt (Nutzerentscheidung 2026-09-20, AGENTS.md `UI segments and tiles`). + Aktive Ansicht, Primaeraktion und Auswahl sind `--marking-color` (Gelb/Bernstein), Tastaturfokus ist + `--focus-ring` (Blau). Kein Token, keine Komponente und kein Graph-/Chart-Ton darf violett aufloesen + oder `--accent*` fuer Auswahl oder Fokus lesen. Eine Tool-/Kategoriefarbe (z. B. ein Chart-Ton) braucht + bei Bedarf einen eigenen, dediziert nicht-violetten Tokenwert statt der fruesheren `--accent`-Wiederverwendung. +- Jeder Farbtoken hat genau eine semantische Rolle (Markierung, Fokus, Severity, Kategorie/Chart-Ton, ...). + Ein Token wird nie in einer Komponente fuer seine dokumentierte Rolle und in einer anderen Komponente + fuer eine zweite Rolle gelesen — das ist exakt der Fehler, der die violette Auswahl/Fokus-Verwechslung + von 2026-09-20 verursacht hat. Vor dem Wiederverwenden eines bestehenden Tokens dessen dokumentierte + Rolle in `ui-tokens.css` und in diesem Skill pruefen. ### Zustaende diff --git a/.claude/skills/assessor-ui/references/page-archetypes.md b/.claude/skills/assessor-ui/references/page-archetypes.md index 903aa15..2aa6f69 100644 --- a/.claude/skills/assessor-ui/references/page-archetypes.md +++ b/.claude/skills/assessor-ui/references/page-archetypes.md @@ -1,5 +1,13 @@ # Shell und Seitenarchetypen +> Nutzerkorrektur 2026-09-18: Dieses Dokument beschreibt historische Layoutbeispiele. +> Massgeblich sind die heute freigegebenen Data-Hub-, Work- und Pathfinder-Ansichten +> und [AGENTS.md](../../../../AGENTS.md#binding-assessor-design-language), auch fuer +> Client Info. Weder die nachfolgende 18px-Topbar-Skizze noch Archetyp D autorisieren +> einen Umbau der aktuellen Shell oder den Ersatz der freigegebenen Data-Hub-Tiles +> durch eine Tabelle. Client Info verwendet dieselbe vorhandene Shell und dieselben +> Komponentenregeln; seine fachliche Anordnung darf innerhalb dieser Sprache variieren. + Es gibt eine Shell und vier Archetypen. Jede Seite von ASSESSOR ist genau einem Archetyp zugeordnet. Eine fuenfte Seitenform wird nicht erfunden. diff --git a/.claude/skills/assessor-ui/references/review-checklist.md b/.claude/skills/assessor-ui/references/review-checklist.md index f139da4..67e36cd 100644 --- a/.claude/skills/assessor-ui/references/review-checklist.md +++ b/.claude/skills/assessor-ui/references/review-checklist.md @@ -1,5 +1,31 @@ # Abnahme und Korrekturliste +## Verbindlicher Abgleich seit 2026-09-18 + +Die Nutzerreferenzen Data Hub, Work und Pathfinder sowie +[AGENTS.md](../../../../AGENTS.md#binding-assessor-design-language) haben Vorrang +vor der historischen Checkliste unten. Das gilt auch fuer Client Info und Mockups. +Insbesondere sind die frueheren Donutschatten-/Radiusausnahmen, der Tabellenumbau +von Data Hub, gekuerzte Tile-Inhalte, die alte Titelskala und violette Auswahl keine +gueltigen Abnahmekriterien. Bewusst freie Restflaeche in einer unvollstaendigen +Tile-Reihe ist zulaessig; Tiles werden nicht zum Fuellen der Breite gestreckt. + +- Ist die Ansicht ohne Logo als dieselbe Anwendung wie alle drei Referenzen erkennbar? +- Entsprechen neutrale Flaechen, eckige Tiles, transparente Segmente, Linien, Controls, + Inter-Typografie und 20px Panel-Inset den gemeinsamen aktuellen Tokens? +- Bleiben gelb/bernsteinfarbene Auswahl/Aktionen, blauer Tastaturfokus und fachliche + Statusfarben unterscheidbar? Keine neue Palette oder neue Shell fuer Client Info. +- Verwenden Donuts volle 360 Grad, flache Bogenenden und korrekt zentrierte Zahlen? +- Sind Lesetext und strukturierte Daten bei normalem Zoom in ihren 16px-/14px-Rollen + lesbar, ohne Clamping, Ellipsen, Ueberlagerung oder eine Wand aus Mikroschrift? +- Behalten Kennzahlen, Source Overview und Drilldowns ihre dokumentierte Bedeutung? + Mockups kennzeichnen synthetische Daten; verworfene Bilder sind keine Stilreferenz. +- Bei Umsetzung: beide Themes, responsive Umbrueche und betroffene Interaktionen + pruefen. Reine Dokumentationsverankerung ist keine visuelle Laufzeitabnahme. + +Die folgenden Abschnitte bleiben als historische Referenz erhalten; widersprechende +Punkte werden durch die obigen Kriterien und AGENTS.md ausdruecklich ersetzt. + ## Inhaltsverzeichnis 1. Automatisierbare Pruefungen diff --git a/AGENTS.md b/AGENTS.md index a08414e..4c83d92 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,6 +9,13 @@ - After a material, verified implementation step, update the plan's status, decisions, risks, and change log in the same change. Do not rewrite historical decisions silently. - If the requested implementation conflicts with the plan, explain the conflict and update the plan only with the user's agreement or when the request explicitly supersedes it. +## Binding agreements and rule conflicts + +- Treat documented user decisions, this file, and the implementation plan as binding acceptance criteria. Before changing an affected behavior, identify and preserve every relevant agreement; later work must not silently weaken, replace, or bypass it. +- If a requested change conflicts with a binding project rule, security boundary, or documented decision, stop that conflicting part and tell the user which rule blocks it and why. Do not implement a quiet approximation. Change the governing rule only after the user explicitly agrees, or when the request explicitly supersedes it. +- Every regression fix for a documented agreement must add a synthetic behavioral test for the exact user interaction that regressed, not only a lower-level helper or adjacent route. Keep that test as a permanent acceptance check. +- When requirements appear ambiguous, distinguish the supported interaction paths explicitly. Do not claim an agreement is fulfilled when only one path satisfies it and another normal path exposes different behavior. + ## Architectural boundaries - Keep format parsing, structural analysis, semantic mapping, normalization, comparison, persistence, and presentation separated. @@ -27,14 +34,25 @@ - `docker-compose.postgres.yml` must keep the canonical Compose project name and external volume binding. Never delete, replace, recreate, or initialize the canonical volume as an empty datastore. - Before an approved persistence migration or destructive database operation, create and verify a backup. Unrelated Docker applications, containers, and volumes remain out of scope. +## Binding ASSESSOR design language + +- Explicit user correction 2026-09-18: the current, user-approved Data Hub, Work, and Pathfinder screens are the binding visual references for ASSESSOR's Ableton-inspired design language. This applies to every view, explicitly including Client Info, and to proposals, generated images, prototypes, and production implementation. +- Before any visual task, read `.claude/skills/assessor-ui/SKILL.md` and the relevant current components and `src/styles/ui-tokens.css`. The approved views and these current project agreements take precedence over older skill examples, copied asset templates, and superseded Client Info exceptions. +- Use Data Hub for flat square tiles, full-circle donuts, compact action buttons and branding; Work for list/detail hierarchy, typography, badges and reading surfaces; Pathfinder for stable filter/work/detail zones and compact controls. Preserve these approved views as references; do not redesign them as a side effect of Client Info work. +- Keep the current neutral theme surfaces, transparent segments, flat tiles, subtle separators, local Inter typography, shared 20px panel inset and shared control geometry. Reuse existing tokens and components. Do not reinterpret Ableton as a new palette, a literal copy of another application, or a return to obsolete UI dimensions. +- Use the shared yellow/amber roles for primary actions and persistent selection, blue for keyboard focus, and semantic status colors for the established status and data-visualization roles. A tool or graph-category color does not authorize a new selection or button color. No gradients, decorative shadows, glass effects, hover lift, generic rounded dashboard cards, new navigation shell, new logo, or Client-Info-only visual theme. +- Improve quick comprehension through grouping, alignment, readable labels, a small set of relevant overview values and existing detail/disclosure patterns. Never shrink body text or structured data below their agreed roles to fit more content, stretch sparse tiles across unused space, or invent metrics to populate a layout. +- All mockups must use the approved views as actual visual references, preserve the existing shell and metric meanings, and clearly identify synthetic example data. A rejected generated image is not a design reference. The three generic Client Info mockups rejected on 2026-09-18 are explicitly not approved. +- Visual acceptance: a Client Info proposal or implementation must be recognizable as the same application as Data Hub, Work and Pathfinder even without its logo. Check the shared surfaces, typography, buttons, selection, spacing and donut geometry at normal application zoom; inspect both themes for implementation. Distinguish a documented rule, a proposal and an implemented/verified UI change. + ## UI typography - Use the locally bundled Inter variable font as the application typeface. Do not introduce view-specific display, condensed or serif families; hierarchy comes from size and weight. Explicit user exception: paths use the shared technical-path textbox and local system monospace stack; other content remains Inter. Do not download additional fonts. - Use only the visual weights Regular 400, Semibold 600, and Bold 700. Bold is reserved for branding and exceptional emphasis. -- Use the semantic typography roles: H1 56px/600, H2 32px/600, H3 18px/600, detail titles 20px/600, H4 16px/600, continuous prose 16px/400, structured table/Grid/Raw Data content 14px/400, labels and table headers 12px/600, metadata 12px, badges 11px, and buttons/controls 13px/600. +- Use the semantic typography roles: H1 56px/600, H2 32px/600, H3 18px/600, detail titles 20px/600, H4 16px/600, continuous prose and readable tile values 16px/400, structured table/Grid/Raw Data content and informational field labels 14px/400, compact control labels and metadata 12px, badges 11px, and buttons/controls 13px/600. - Preserve normal title case for H1-H4, field labels, and buttons. Uppercase is limited to compact table headers, badges/categories, and the ASSESSOR wordmark. -- Render continuous prose such as finding and report text at no less than `16px`. Structured data in tables, Grid, and Raw Data uses the dedicated compact 14px role. -- Compact interface text such as button captions, field labels, metadata, badges, and comparable control annotations may use a smaller type size. +- Explicit user decision 2026-09-20: the smallest text intended to communicate application information is `14px`; this includes table cells, table headings, tile content and informational field labels. Readable values and continuous prose use `16px`. For example, the Client Info Directory tile renders `Domain` at 14px and `sevenkingdoms.local` at 16px. Do not demote either role to a metadata or compact-control token merely to fit more content. +- Compact interface text such as button captions, technical metadata, badges and comparable control annotations may use a smaller type size. These exceptions must not carry primary table, tile, field-label or prose information. - When adding or changing styles, preserve this distinction instead of reducing content text to a compact UI-label token. ## UI panel spacing @@ -44,36 +62,105 @@ - Apply the inset exactly once on the view's root content container. Split panes and edge-to-edge structures belong inside that inset and must not add a second outer inset. - Keep the 20px outer inset at responsive breakpoints unless the user explicitly changes this standard. +## UI Work filter context + +- Explicit user extension 2026-09-18: the Work toolbar's `CSV`, `MD` and `HTML` buttons export the complete current filtered/sorted Work record set, including the same linked and embedded Results used by the Results window. Marking alone does not select export rows; `My Workspace` restricts them only when active, alongside ordinary filters and drilldowns. Use exactly two content columns, `Soll-Zustand` and `Abweichungen`, with source-backed remediation/verification, original technical facts, scoped GPO provenance, and explicit missing-evidence notices. Preserve neutral verdicts and review-versus-rescan boundaries. Build the frozen projection only on export, not on navigation. Oversized CSV cells use explicitly identified continuation rows of the same finding without truncation. This view snapshot is separate from the curated Arbeitsgrundlage in `docs/REPORT_STRATEGY.md`. + +- A unique `Source: Scan` selection is a semantic tool context even when Work remains on the project-wide `All Records` sheet. Visible and active facets must follow the selected tool context rather than the aggregate sheet profile. +- For a GPO-only Work context, whether reached through the dedicated GPO sheet or `Source: Scan = GPOs`, show only `Result Status`, the available GPO facets `Baseline`, `Comparison`, `Conflict`, `Description source`, `Diagnostics`, `Duplicates`, `Imported`, `Policy section`, `Policy type`, and the permanent final `Source: Scan` control. Do not show CIS, severity, category, MITRE, target, result-message, review, or scanner-specific facets. +- Explicit user correction 2026-09-17 supersedes only the category exclusion in the preceding GPO-context rule: `Category` is a permanent GPO Work filter in both supported entry paths, including when its only current value is `GPOs`. Keep it directly after `Result Status`. Severity, CIS, MITRE, target, result-message, review and scanner-specific facets remain excluded from the GPO-only context; `Source: Scan` remains last. +- Explicit user extension 2026-09-17: Work also exposes a distinct `Security Domain` facet immediately after `Category`. It must use the exact shared Client Info security-domain catalog and record assignment, never a second filter-only categorization. It is available in mixed Work and both GPO entry paths; a pure GPO scope maps to `GPO & Baseline`. Domain selection and Client Info drilldown must therefore select the same record identities, while ordinary active Work filters continue to apply. `Source: Scan` remains last. +- Explicit user correction 2026-09-18: `Security Domain` always offers all eight Client Info catalog entries in catalog order, including selectable zero-hit domains in mixed Work and both GPO entry paths. `Unclassified` remains an additional option only when present in the loaded sheet. Counts respect the other active filters; a zero-hit selection must not silently remove itself, the active status, or another still-valid facet selection. A Client Info domain-deviation drilldown uses this visible domain facet rather than a fixed record-ID path, so the user can change domains in Work. Explicit review-only and individual-finding paths retain their separate scope semantics. +- Explicit user decision 2026-09-17 supersedes the previous six-value list: the GPO `Result Status` choices are exactly `All`, `Deviation`, `Passed`, `Not configured`, `No baseline rule`, `Not comparable`, `Conflicts`, and `Duplicates`. Keep the seven non-All choices selectable at zero hits; never merge scanner-only status vocabularies into a GPO-only context. `Deviation`, `Passed`, `Not configured`, `No baseline rule` and `Not comparable` match the authoritative rolled-up policy verdict; `Conflicts` and `Duplicates` match the corresponding diagnostic category flags. One policy setting may therefore belong to both `Deviation` and `Conflicts` or `Duplicates`. +- Explicit user decision 2026-09-17: `No baseline rule` is the score-neutral verdict for a retained customer setting whose resolved technical identity has no applicable Microsoft baseline recommendation in the compared baseline set. Every aggregated customer state must reach Work under exactly one verdict: an evaluated verdict where a baseline rule exists, otherwise `No baseline rule`. It is distinct from `Not configured`, which is a recommended baseline setting absent from the analyzed backup set, and it must never be presented as a deviation, remediation obligation or score input. A diagnostic `Conflicts`/`Duplicates` flag marks such a setting without replacing its verdict; unresolved identities stay out of this verdict and take `Not comparable` instead. +- Explicit user decision 2026-09-17: `Not comparable` is the score-neutral verdict for a retained customer setting whose delivery mechanism has no comparable technical policy identity. Today this is always a Group Policy Preference. Never resolve a preference into a policy identity and never compare it with a Microsoft baseline recommendation: its action, item-level targeting and apply-once semantics differ from a policy setting, so a baseline verdict over it would be invented. Keep the retained CSE, action and item-level targeting readable in the agreed GPO columns; do not add a GPO Work column or facet for them. Identical or differing preference instructions are not proven duplicates or conflicts, so `Not comparable` carries no diagnostic flag. The observation-level unresolved-identity gap reporting stays in place and must report each observation once with its authoritative resolver reason, never restated a second time by snapshot aggregation. +- Never infer a GPO verdict from comparison prose, historical results, baseline text, guidance or evidence. Use only the authoritative rolled-up policy verdict and explicit conflict/duplicate flags. A foreign `Pass` string must not make a not-configured, review or failed policy setting match `Passed`. +- When the selected tool context makes an existing facet filter invalid, remove that incompatible filter so it cannot remain invisibly active. Removing the tool restriction restores the appropriate aggregate facets without changing source data. +- Explicit user extension 2026-09-17: also offer `GPO backups with failing settings` in the GPO Work context. Its all-counted and individual-backup selections use the Processing tile's exact project/assessment/backup-instance identity and select source-linked Fail comparisons, not inferred per-backup verdicts. Keep all contributing evidence, conflict/duplicate flags and historical evaluation readiness intact; Source: Scan remains last. This extends the facet list above. + +## UI Result DB filter consistency + +- Explicit user correction 2026-09-20: in linked CIS-CAT Results evidence, an evaluated source row must follow the actual finding outcome. Highlight the confirmed configured row with the shared green match treatment when the finding outcome is `Pass`, and use the red violation treatment only when the outcome is `Fail`; unknown, neutral or unavailable outcomes must not be guessed into either state. The criterion row remains the separately identified expected state. +- Explicit user correction 2026-09-18: Result DB uses the shared Work vocabulary for its GPO `Result Status` filter and details: `Deviation`, `Passed`, `Not configured`, `Conflicts`, and `Duplicates`; `Review required` remains an independent unresolved result. Stored classification/query values stay unchanged. Status facet counts must honor all other active filters, including Deviation; only their own status selection is excluded to keep alternatives reachable. Selecting or clearing a status must never silently reset Deviation. Selected zero-hit values stay visible and removable. This supersedes the earlier Result DB exception that ignored and automatically cleared Deviation. Result DB still counts individual comparisons, while Work counts rolled-up settings; no extra public observation types or invented statuses are introduced. + +## GPO Registry baseline comparison + +- Treat retained `Registry.pol` `delete-value`, `delete-all-values`, and `create-key` instructions as explicit, comparable target states rather than unavailable baseline values. The comparison remains scoped to imported backup configuration and must never claim effective endpoint registry state. +- A delete-value requirement passes when that value is absent from the analyzed backup set or explicitly deleted, and fails when the value is set. A delete-all-values requirement passes only when no value is configured below that key or the delete-all instruction is explicit; any retained configured child value fails it. A create-key requirement passes when the key is explicitly created or a retained configured child proves its presence, and fails when the key is absent. +- A typed empty `REG_SZ` or `REG_EXPAND_SZ` is a present value. Compare its registry type and exact empty content; never convert it to missing/unavailable. Missing required presence is Fail, while ordinary missing value recommendations remain score-neutral `Not configured`. +- Preserve contributing child-state IDs and observation provenance for key-level comparisons. Unsupported Registry.pol special operations remain `Review required`; do not guess their semantics. + +## GPO analysis and scoring scope + +- Explicit user decision 2026-09-17: the Finding Reader must immediately show contributing GPO backup instances and attribute every retained operation/value to its source, including deletion instructions. Group by exact project/assessment/backup-instance identity, not title, registry value or observation count; retain source-local sequence and never present different GPOs as one execution chain. Show retained native GPO/backup IDs; do not infer missing friendly names from paths. This inline source attribution supersedes any earlier Results-only hiding of these sources, while Results remains available for variant comparisons. +- Explicit user decision 2026-09-17: render that inline attribution as one flat table with the columns `GPO source`, `Operation`, `Data`, `Type`, and `Evidence`, one row per exact backup identity, a compact status marker, and expandable `Show source details`. The expansion retains full GPO/backup identity, source-local sequence, safe evidence reference, key, value name and every original instruction. Bold Operation and Data. Mark `Conflicting contribution` only when the retained current baseline variants independently prove that single source member differs; mark alignment only when every retained variant independently matches. Do not derive source markers from historical evaluations, multiple instructions inside one backup, GPO precedence or endpoint effectiveness. +- Explicit user correction 2026-09-17 supersedes the flat table presentation above: show each exact GPO backup identity again as a complete, vertically stacked source section with Evidence, source-local sequence and every original instruction immediately visible. Use a restrained red background and red leading accent for a source section only when the retained current baseline variants independently prove that single source member differs. Keep aligned, unassessed and ambiguous sections neutral; retain the same historical, precedence and endpoint-effectiveness boundaries. +- Explicit user correction 2026-09-17 supersedes the whole-section red treatment above: keep every GPO source section neutral and apply the restrained red background only to the exact displayed field value proven different from every retained current baseline variant. Highlight `Operation` for an operation mismatch, `Data` for a data mismatch and `Type code` for a registry-type mismatch; several fields may be marked only when each is independently proven. Do not highlight a whole source, heading, path, key, value name or conflict badge, and do not guess a field when variants disagree about the cause. +- Explicit user extension 2026-09-17: every proven GPO source-value deviation must receive the same restrained red value treatment. Keep registry-policy differences field-specific for `Operation`, `Data` and `Type code`, including simultaneous differences. For other comparable GPO value kinds, or when all retained variants prove a difference but no one field is the common cause, mark the displayed source value as a whole without asserting a narrower cause. Review-required, unassessed and aligned values remain neutral; never color the whole source section, heading, evidence path or diagnostic badge. +- Explicit user correction 2026-09-17: a principal-set is a collection comparison, not one indivisible value block. Mark only configured principals absent from every retained current baseline variant. A principal also present in the expected baseline remains neutral even when neighboring principals deviate. If the deviation consists only of a missing expected principal, do not color an existing configured principal as its substitute; the expected-baseline block remains the evidence for that absence. +- For versioned member comparisons, derive the Conflict flag from the retained authoritative customer state, not from a set-value-only subset of original instructions. Reduced-identical contributions from multiple backups may be Duplicate; multiple earlier instructions inside a single backup are not duplicate GPOs or independent current conflicts. Keep these diagnostic flags separate from the policy verdict and preserve historical evaluation readiness. +- An additional indeterminate GPO must not hide an independently proven difference between other GPO backups. Retain that diagnostic only when distinct, unambiguous backup contributions of the same technical setting prove different supported signatures also present in retained compared values. Exclude the whole uncertain backup from that proof; its earlier writes may remain in retained values and must not be mistaken for separate GPOs. The overall verdict remains Review required. + +- The operational GPO assessment is misconfiguration-first and limited to customer settings that are actually configured, technically comparable and in the explicitly applicable Microsoft-baseline scope. Do not turn every recommended but absent baseline setting into an operational finding, remediation obligation or score penalty. A complete-baseline rollout is a separate, explicitly commissioned hardening track. +- `Not configured` remains a score-neutral policy verdict. `Duplicates` and `Conflicts` remain visible, mutually distinct diagnostic categories on a policy setting; they are not alternative verdicts that can suppress `Passed`, `Fail` or `Review required`. +- Roll member comparisons up once per technical policy-setting identity. If at least one independently comparable, in-scope configured member value is a valid `Fail`, the whole policy setting verdict is `Fail`, while its conflict/duplicate flags remain visible. If every applicable member passes, the policy verdict is `Passed`. If member applicability, precedence or comparison is unresolved, use `Review required` rather than inventing a fail. Source multiplicity, duplicate rows and diagnostic flags must never multiply the setting's score weight. +- Label the GPO score as conformance of configured, comparable in-scope settings. Never describe it as full Microsoft-baseline compliance, baseline coverage or proof that all recommended settings are implemented. +- Keep absent recommended settings available under `Not configured` for transparent inspection, but exclude them from Priority Findings, default remediation scope and score unless the user explicitly starts a separate baseline-hardening scope. +- `Not configured` is scoped to the analyzed GPO backup set: if an applicable baseline recommendation has no observed configured value in that set, keep it filterable as `Not configured` even when the import is a selected subset. Retain a scope-limit diagnostic and never turn this into a domain-wide or effective-device absence claim without complete collection evidence or RSoP/GP Results. + ## UI segments and tiles - Treat segments and tiles as a binding two-level visual grammar independent of their content. A segment is a transparent grouped layout; a tile is a flat, square-cornered surface inside it. - Use only the shared `--segment-*` and `--tile-*` tokens for segment surfaces, borders, radii, insets, gaps, tile surfaces, shadows, widths, hover states, and selected contours. Do not create view-local substitute geometry. - Segments are visually transparent and have no visible border or shadow. They retain `--segment-radius`, one uniform inset, and one uniform gap as shared layout geometry. - Tiles use the common white or theme-equivalent surface without a visible normal-state border, radius, or shadow. Hover changes the surface only and must not add a decorative contour, lift, or translation. +- Explicit user correction 2026-09-20: in the light theme, tile surfaces use the shared neutral gray `--tile-surface` instead of pure or near white to reduce glare; the current approved value is `#F5F5F7`. Keep the surrounding app surface, input surface and established hierarchy distinct; do not reproduce this with view-local overrides. - Status color belongs only in a small accent line, marker, data visualization, or selected contour. Never fill the complete tile with a status color. - Keyboard focus and selected tiles use the shared functional focus or selected outline. Action tiles and add tiles use the same flat geometry as content tiles. +- Explicit user correction 2026-09-20: the persistent yellow outline of the selected Data Hub tenant tile is one hairline thicker than the shared 2px selection outline, composed from `--bw-emphasis` plus `--bw-hairline`. This is a scoped Data Hub tenant-selection exception; keyboard focus remains the separate shared blue 2px outline, and no other tile-selection width changes. - The persistent marking and selection color is always the shared yellow `--marking-color` in both themes. Purple must not be used for selected contours or markers. Blue remains reserved for keyboard focus, while green, red, orange, and severity colors remain domain status signals rather than selection colors. - Keep unused segment space intentionally empty: lay tiles out from the start at their shared compact or content width and never stretch a partial final row merely to fill the container. +- Explicit user correction 2026-09-20: the Data Hub result-donut row and the client/add-tile row below share the exact same six-column track geometry at wide widths. Every column start, width and gap must align vertically without cumulative horizontal offset; all six result donuts remain on one line. At narrower widths both rows return to the same compact responsive tile contract. - Tile content must never cross the tile boundary or cover a neighboring tile. Nothing may be clipped, clamped, truncated, or replaced by an ellipsis. Text and actions reflow inside the tile; media scales within the available inner area. If content does not fit, enlarge or reflow the tile. - Avoid line breaks in compact tile labels where practical. If wrapping is necessary, wrap only at word boundaries: never split ordinary words or numeric values across lines. Use a wider or responsive tile whenever a complete word or value cannot fit. +- Explicit user decision 2026-09-20: purple/violet is removed as a UI role entirely, not only as a selection color. The `--accent`/`--accent-hover`/`--accent-active`/`--accent-on`/`--accent-subtle` tokens in `src/styles/ui-tokens.css` must not resolve to a violet value and must not be read wherever the consuming rule means keyboard focus (use `--focus-ring`) or active/selected state (use `--marking-color` and its existing selection/marker roles). A tool- or graph-category tone (for example the PKI chart tone) that previously reused `--accent` gets its own dedicated, non-violet, non-focus, non-marking category color instead of being retargeted onto focus or marking roles. This closes the drift documented in Client Info/Work/Pathfinder screenshots reviewed 2026-09-20, where the same segmented-tab-selection component rendered amber in one view and violet in another because `--accent` was simultaneously documented (superseded `assessor-ui` skill text) as meaning both "primary action / active view / selection" and used in code for `:focus-visible`, conflicting with the yellow-marking/blue-focus rule above. ## UI donut charts - Every donut chart uses the same full 360-degree geometry: a continuous neutral-gray track and a colored clockwise value arc starting at 12 o'clock. - Donut arcs use flat ends and the shared `--donut-ring-stroke`, `--donut-track`, value, and typography tokens. Do not introduce 270-degree gauges, open gaps, rounded arc caps, or local substitute geometry. -- Place the primary numeric value itself on the exact visual center of the ring. Append a percent sign or other short unit to its right on the same baseline in the smaller shared UI size without letting that unit shift the number away from the center. Supporting counts may remain as subdued secondary text inside the ring, but every text element must stay fully within the clear inner area and must never touch or overlap the ring at any supported value width. +- Explicit user correction 2026-09-20: every count/percentage donut places the absolute count as the bold first line and the percentage as a regular-weight second line below it. Every donut readout, including score rings, keeps a visible safety gap from the inner edge of the ring at every supported ring size and value width. A score ring such as Overall Score retains its score-specific `/100` semantics instead of inventing an absolute count. +- Center the complete two-line readout as one unit inside the ring without letting either line shift horizontally. Keep every text element fully within the clear inner area and never let it touch or overlap the ring at any supported value width. - Multi-segment distributions retain their categorical segments, but use the same track, stroke proportion, start position, centered value treatment, and shared tokens as single-value donuts. ## UI Client Info dashboard -- The loaded Client Info view is an explicitly scoped exception to the generic tile composition: `.client-command-center` uses the connected command-center treatment and dedicated accent roles defined by `--client-info-*`, while both its outer page background and every dashboard tile inherit the active theme exactly like Work via `--surface-app`, `--tile-surface`, `--tile-surface-hover`, and the corresponding shared text/line roles. This exception supersedes generic card composition only inside that root; it must never leak into Data Hub, Work, Result DB, Pathfinder, dialogs, or the application shell. +- Explicit user correction 2026-09-20: the former Client Info `Priority Findings` tile is named `Data`, sits to the left of `Domain Information`, and shows the total `Deviations` value plus the separate additional-result-state row only. Do not show duplicate `Critical` or `High` summary values in that tile. The remaining deviation value occupies the full header width and is a keyboard-accessible button that opens Work with the standard `Deviation` filter. +- Explicit user correction 2026-09-18 supersedes the previous Client Info visual exception: `.client-command-center` follows the same Ableton-inspired ASSESSOR language as the approved Data Hub, Work and Pathfinder. Client Info may organize its own domain content, but has no exception for palette, surfaces, tiles, typography, controls, selection, branding, spacing or chart geometry. Existing `--client-info-*` roles are legacy implementation details, not authority for a separate visual theme; reuse the shared roles when bringing this view into conformity. - Treat Client Info as one connected executive security-posture canvas, not as a collection of unrelated report cards or a spreadsheet. Its stable reading order is environment facts, overall posture, security domains, priority findings and assessment gaps, then source evidence. -- Keep environment facts in one compact, single-row evidence rail of icon-led dark tiles. They may be visually separated like the approved Client Info reference, but must remain substantially smaller than the posture and action areas below. +- Keep environment facts in a compact evidence rail, using the same neutral theme-aware tiles as Data Hub. Wrap at readable widths instead of forcing one tiny-text row. The former mandatory dark-tile treatment is superseded by the 2026-09-18 correction. +- Explicit user correction 2026-09-20 supersedes the separate evidence rail above: AD Domains, Entra Tenant, User Accounts, Computer Objects, Domain Controllers and GPOs live inside the `Data` tile as one flat 3-by-2 fact grid, retaining their existing glyphs. Do not render a separate top-level Environment Facts tile row. The six facts are not nested tiles; use transparent cells and subtle separators inside `Data`. - Present Overall Score and Security Domains together on one shared posture surface. Overall Score is the dominant visual anchor; domain scores form a visibly connected branch or spine beside it and must not look like a conventional data table. +- Explicit user correction 2026-09-20: at wide desktop widths, the posture surface and action rail each use exactly one half of the available row width. This supersedes the earlier two-to-one proportion. Every tile aligned in one row must always share the same height and bottom edge; never use intrinsic-height staggering within a row. This also supersedes the earlier instruction to keep the posture surface shorter than the action rail. +- Explicit user correction 2026-09-20: the top of the Client Info action rail is an exact 50/50 row. `Domain Information` sits on the left and `Priority Findings` on the right with identical height; `Assessment Gaps` spans the full action-rail width below. Domain Information contains every fact from the Environment Detail `Directory` group—Domain, NetBIOS name, Forest, Domains, domain functional level, forest functional level, schema version, domain created and Entra ID—plus the separately requested domain-controller count. All values come only from the same normalized Environment Snapshot. Missing facts remain an em dash and must never be inferred as zero. +- Explicit user correction 2026-09-20: the Overall Score block does not repeat a textual score status below the ring and does not repeat the critical-finding count already present in Priority Findings. Assessment Coverage uses at most 70% of the Overall zone and never exceeds the shared compact tile-content width; it must end before the curved domain connectors, which may never cross its label, bar or supporting count. +- Explicit user correction 2026-09-20: the Overall Score block also omits the secondary `Unassessed` and `Lowest domain pass rate` fields completely, including their divider container. `Unassessed controls` remains visible only in Assessment Gaps; domain pass rates remain visible on their individual Security Domain nodes. +- Explicit user decision 2026-09-18: preserve the thin curved fan connections from Overall Score to every displayed Security Domain during the Ableton-style alignment. They are a binding visual feature, not optional decoration. Derive their endpoints from the rendered ring and domain nodes and remeasure on resize/content changes. Preserve the existing stacked narrow-screen fallback; never keep desktop coordinates on a stacked layout. +- Explicit user correction 2026-09-20: Security Domain rows show the domain name in the shared detail-title role without the former passed/not-configured/duplicate/conflict/review metadata line underneath. The score node and right-hand deviation or review count remain. The Overall Score ring is a keyboard-accessible entry to Work's clean remediation default: clear prior search, source, domain, severity, record-ID and workspace filters, select `Deviation`, and open the standard Work overview. +- Explicit user correction 2026-09-20: Every displayed Security Domain row carries a subtle amount bar in its own shared grid column between the longest rendered domain label and the widest rendered amount. Keep the shared gap on both sides so a bar can never grow into text or behind a number. All bars share one right edge and extend left from that edge. The later color correction supersedes the preceding categorical-color decision: every amount bar uses the exact current semantic color of the Overall Score donut and changes with that score's critical, medium, passed, or unknown tone. Do not use selection, focus, per-domain score, or a separate palette. Bar width is that row's displayed deviation amount divided by the sum of the displayed domain amounts; review-only rows use their already-displayed review amount. Keep the exact right-aligned number visible as the authoritative value, make the bar decorative and hidden from assistive technology, and never change counts, scoring, classification, or drilldown semantics to produce the visualization. +- Explicit user correction 2026-09-20 supersedes the transparent Client-Info donut treatment above: the total `Deviations` donut in Client Info's `Data` tile uses the exact Data Hub `datahub-reference-knob` visual variant, including its tile surface, dimensions, spacing, title and hover state. Data Hub and Client Info derive its count and percentage denominator from the same selected mixed-timeslot project sheet, including assessment-bound GPO/policy observations as well as scanner records; never calculate the Data Hub value from scanner run IDs alone. The complete donut remains a keyboard-accessible action to Work with the `Deviation` filter. +- Explicit user extension 2026-09-20: Client Info's Operating systems table shows PingCastle's row-bound `Nb Active`, `Nb Inactive`, `Nb Enabled` and `Nb Disabled` counts beside `Nb OS`. Join each value only to the exact retained report, source table and row of that operating-system entry; never derive one state from another, borrow a value from a different row or add overlapping inventories. Missing values render as an em dash. Other scanners and older imports remain visible without invented state counts. +- Keep Client Info immediately scannable: Environment Detail starts collapsed with its evidence/restriction counts visible; the Accepted Risks master/detail summary remains visible, while its complete context, controls, approval, evidence and decision history are individually expandable. Disclosure must remain keyboard accessible and must not change source data, scoring, risk decisions or drilldown identity. +- Explicit user correction 2026-09-20: every Environment Detail tile heading, including Source Overview and Operating systems, carries one restrained existing ASSESSOR line glyph before its title. All fact groups reuse Source Overview's list spacing and row padding for one consistent, airy rhythm; fixed tile heights, the four-column grid and internal scrolling remain unchanged. +- Explicit user correction 2026-09-20: Accepted Risks adopts the Data Hub `Manage Client` master/detail interaction and geometry. The fixed-width, independently scrolling navigation on the left owns the register heading, count, selection and compact state/date rows; the equally tall information pane on the right owns the selected risk, summary and expandable detail groups. Yellow marks persistent selection, risk state remains a separate text-and-dot signal, Arrow Up/Down/Home/End move the selected risk, and `Open finding` opens that exact record in Work. At narrow widths the panes stack without horizontal overflow. +- Explicit user correction 2026-09-20: Accepted Risks adopts the Data Hub `Manage Client` master/detail interaction and geometry. The fixed-width, independently scrolling navigation on the left owns the register heading, count, selection and compact state/date rows; the equally tall information pane on the right owns the selected risk, summary and expandable detail groups. Yellow marks persistent selection, risk state remains a separate text-and-dot signal, Arrow Up/Down/Home/End move the selected risk, and `Open finding` opens that exact record in Work. At narrow widths the panes stack without horizontal overflow. +- Explicit user correction 2026-09-20: Accepted Risks reuses the Data Hub client-detail geometry one-to-one: a fixed compact selection rail at the left using `clamp(420px, 27vw, 520px)`, the information surface at the right, and the established stacked narrow-screen fallback. Do not reintroduce a proportional wide list column. - Keep Priority Findings and Assessment Gaps in a dedicated action rail. Use status color only for finding markers, score arcs, score nodes, and progress bars; avoid large colored fills and nested card stacks. -- Source Overview is the final evidence rail. Explicit user decision 2026-09-10: show the actual versioned ASSESSOR score contribution as the primary number, using a run/file-bound native score when supported and a pass-rate fallback otherwise. Label the method; PingCastle uses the explicit `100 - native risk` convention and retains the raw risk as secondary context. Never insert a raw lower-is-better risk value directly into the overall scale. Follow `docs/SCORING_MODEL.md`; Security Domain values are pass rates, not a decomposition of the mixed-method index. +- Explicit user correction 2026-09-20 supersedes the standalone Source Overview rail: source scores live inside the expanded `Environment Detail` as one compact plain list with separators, never as tiles. Preserve every source's actual versioned ASSESSOR score contribution, method label, native context and Work drilldown. A run/file-bound native score takes priority when supported and pass rate is the fallback; PingCastle uses the explicit `100 - native risk` convention and retains raw risk as secondary context. Never insert a raw lower-is-better risk value directly into the overall scale. Follow `docs/SCORING_MODEL.md`; Security Domain values are pass rates, not a decomposition of the mixed-method index. +- Explicit user extension 2026-09-20 supersedes only the preceding container geometry: all expanded Environment Detail groups form an equal four-column tile grid. `Source Overview` occupies one group tile while its individual source entries remain the agreed plain separated list, never individual source tiles. The six fact groups and Operating systems each occupy one tile. Every tile is exactly three quarters of the currently rendered Overall Score tile height; derive that height from the rendered element and keep overflow inside the affected tile with a scrollbar. Preserve four columns on narrow layouts through horizontal grid scrolling rather than changing tile width or column count. +- Explicit user correction 2026-09-20: Source Overview never renders a `Tabular Data` tile. Generic tabular imports remain available through their supported data and filter paths, but they are not a security-scoring source tile. - Unknown or unavailable facts render as an em dash and never as an inferred zero. Keep the dashboard English-only and omit explanatory prose that does not support an immediate first-meeting statement or action. -- The Client Info composition still obeys the shared Inter typography roles, donut geometry, marking semantics, and panel inset. Its dedicated palette, connected geometry, and compact briefing surfaces are isolated Client Info primitives rather than application-wide tile replacements. +- The content hierarchy, score semantics, source provenance and drilldowns remain binding. Their layout must use the shared ASSESSOR components and tokens; a connected briefing layout does not permit a dedicated palette or geometry. Source Overview, Environment Detail and Accepted Risks obey this same rule, including their collapsed, expanded and selected states. ## UI branding position @@ -81,6 +168,12 @@ - Keep the brand container geometry identical across every application view; do not add area- or view-specific brand padding, margin, alignment, height, or transforms. - Switching views must never move the logo, wordmark, or version. +## UI backend connection state + +- Data Hub, Result DB and DB Structure must present a checking or unavailable local backend through the shared ASSESSOR dialog rather than an embedded page banner. +- Keep that dialog dismissible so the user can inspect the underlying view. The application continues its existing automatic health checks; reconnecting removes the offline branch without requiring a reload. +- Keep the copy limited to the affected capability and the automatic connection check. Do not expose response bodies, project data or imported content in this technical connection state. + ## Navigation and rendering performance - Treat area switches as a performance-sensitive path. Measure the first visit and repeated visits separately after the workspace has loaded; distinguish main-thread rendering from asynchronous API readiness. Use the local procedure in `docs/architecture/navigation-performance.md`. diff --git a/SECURITY.md b/SECURITY.md index 00c0cde..8d27bd5 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,5 +1,25 @@ # Sicherheitsmodell +## Accepted Risk: dokumentierte externe Entscheidung + +Ergaenzung 2026-09-10: Der lokale Accepted-Risk-Dialog speichert begruendete, +befristete Entscheidungen mit Verantwortlichen, separater Freigabedokumentation, +Massnahmen, Wiedervorlage und vollstaendiger Versionshistorie im bestehenden +Review-JSONB. Der eigene Same-Origin-Endpunkt prueft Projektzugehoerigkeit, +Pflichtangaben und erwartete Revision; die Repository-Transaktion haengt eine +serverdatierte Version an. Allgemeine Reviewaenderungen duerfen die vorhandene +Historie nicht ersetzen. Originalbefunde und technische Bewertungen bleiben erhalten. + +Namen und Freigabereferenzen sind Angaben zu einer externen Entscheidung, keine +authentifizierten Signaturen. Das Formular verifiziert weder Personen noch +Nachweisinhalte oder Freigabeberechtigungen. Referenzen bleiben inerter Text; +es gibt keine neuen Uploads, Netzfreigaben oder externen Dienste. JSONB-Historie +und Revisionsschutz sind kein Schutz gegen Datenbankadministratoren und kein +unabhaengiges Aufbewahrungsarchiv. Bestehende Loeschregeln bleiben anwendbar. +SSO, Rollen, verbindliche Freigaberegeln und manipulationsnachweisbare Aufbewahrung +bleiben Voraussetzungen fuer den Firmenbetrieb in Phase 14. Details und die +geplante normalisierte Ablage stehen in [RISK_ACCEPTANCE.md](docs/RISK_ACCEPTANCE.md). + ## Lokale Datenverarbeitung HTML-Parser-Nachhaertung 2026-09-09: Attributnamen und -werte werden linear diff --git a/docs/COMPARISON_ENGINE.md b/docs/COMPARISON_ENGINE.md index 0012f9a..9520e39 100644 --- a/docs/COMPARISON_ENGINE.md +++ b/docs/COMPARISON_ENGINE.md @@ -3,6 +3,12 @@ Stand: 2026-07-17 Zugehörige Planphase: Phase 8 +## Statusklarstellung 2026-09-11 + +Der folgende Text dokumentiert den historischen Stand, nicht die Abnahme eines belastbaren objektgenauen Timeslotvergleichs. Insbesondere ist die unten beschriebene Regel `resolved = im Ziellauf nicht mehr vorhanden` kein ausreichender Behebungsnachweis. Die aktuelle Timeslot-Projektion kann Quell-/Verarbeitungsprüfungen umgehen; die automatisch verwendeten Regel-/Definitionsmatches garantieren keine gemeinsame Objektidentität. Die hier historisch genannten Regel-/Asset- und Merkmalsstufen sind kein Nachweis ihrer aktuellen automatischen Verdrahtung. + +Die Erweiterung in [TIMESLOT_COMPARISON_PLAN.md](TIMESLOT_COMPARISON_PLAN.md) definiert den Gegenprüfungs-, Identitäts- und Fortschreibungsvertrag sowie P0-P6 mit Abnahmetests. P0 ist abgeschlossen; P1/P2 sind in Arbeit. Der additive Domänenvertrag und `compareProjectTimeslotEvidence` arbeiten bereits profilgebunden mit echten Scannerläufen, Dateiprovenienz, Processingkompatibilität, eindeutigem Scope und neuerer Reportzeit. Abwesenheit bleibt konservativ ungeklärt. Dieser sichere Pfad ist noch nicht an Persistenz/API oder Oberfläche angebunden und ersetzt daher die unten dokumentierte Legacyengine im Produkt noch nicht; die frühere Beschreibung bleibt zur Nachvollziehbarkeit erhalten. + ## Zweck Die Vergleichsengine ordnet Finding-Vorkommen aus zwei Scan-Läufen reproduzierbar ein. Sie arbeitet ausschließlich auf dem kanonischen Assessment-Modell und benötigt weder React noch Browser-, Tauri- oder Datenbankfunktionen. diff --git a/docs/GPO_BASELINE_EVALUATION.md b/docs/GPO_BASELINE_EVALUATION.md new file mode 100644 index 0000000..cb9ced5 --- /dev/null +++ b/docs/GPO_BASELINE_EVALUATION.md @@ -0,0 +1,76 @@ +# GPO-Backup-Vergleich mit Baselinevarianten + +Stand: 2026-09-16 · Phase 7/13B · Evaluator `policy-baseline-evaluation@1.9.0` + +## Prüfgegenstand + +Geprüft wird die importierte GPO-Backup-Konfiguration gegen die ausdrücklich referenzierten Microsoft-Baselineanalysen. Das ist kein Nachweis der effektiv angewendeten Gerätekonfiguration, der Erreichbarkeit eines Dienstes oder einer tatsächlich ausnutzbaren Überprivilegierung. Baselinepakete bleiben getrennte Prüfungen; ein Ergebnis gilt nicht automatisch für andere Pakete, Betriebssysteme oder Rollen. + +Ein PingCastle-Scan ist keine Voraussetzung. OS-Inventar und Domain Functional Level dürfen eine einzelne GPO weder automatisch einer Zielrolle zuordnen noch ihre Anwendung beweisen. Die vorhandene Vorlagenauswahl akzeptiert nur einen eindeutigen, expliziten Vergleichskontext; beobachtungsgebundene Inventarkontexte wählen keine Rolle aus. Unbekannte Vorlagen bleiben Kandidaten. Eine explizite Auswahl ohne passende Vorlage bleibt ungeklärt. + +## Operativer Scope und Score + +Die normale GPO-Analyse ist auf Fehlkonfigurationen innerhalb des tatsächlich konfigurierten, technisch vergleichbaren und ausdrücklich anwendbaren Kundenscopes begrenzt. Eine fehlende Microsoft-Empfehlung bleibt als `Not configured` transparent sichtbar, erzeugt aber weder ein operatives Finding noch eine Standard-Remediation oder einen Scoreabzug. Die vollständige Einführung einer Microsoft-Baseline ist ein eigener, ausdrücklich beauftragter Hardening-Scope. + +Präzisierung vom selben Tag: `Not configured` bleibt ein score-neutrales Policy-Urteil. `Duplicates` und `Conflicts` bleiben eigenständige Diagnosekategorien der technischen Policy-Einstellung, sind aber keine alternativen Urteile, die Pass, Fail oder Review required verdecken. Die Mitgliedsvergleiche werden genau einmal je technischer Policy-Identität zusammengeführt: Weicht mindestens ein konfigurierter, eindeutig vergleichbarer In-Scope-Wert nachweislich ab, lautet das Gesamturteil der Policy-Einstellung `Fail`; Conflict-/Duplicate-Merkmale bleiben zusätzlich sichtbar. Bestehen alle anwendbaren Mitglieder, lautet das Urteil `Pass`. Sind Anwendbarkeit, Vorrang oder Vergleich ungeklärt, bleibt das Urteil `Review required`. Mehrere Quellzeilen, doppelte Vorkommen und Diagnosemarker vervielfachen den Scorebeitrag nicht. + +Der GPO-Score ist deshalb ausschließlich als Konformität der konfigurierten, vergleichbaren In-Scope-Einstellungen zu bezeichnen. Er ist kein Nachweis vollständiger Microsoft-Baseline-Umsetzung oder -Abdeckung. + +## Entscheidungsvertrag + +Jede berücksichtigte Vorlage wird für dieselbe aufgelöste technische Einstellung einschließlich Computer-/Benutzerbereich einzeln verglichen. Der neutrale Vergleich verwendet exakte, typisierte Gleichheit. Bei Kontenlisten ist die Reihenfolge unerheblich; Originalwerte bleiben erhalten. Registrytypen und die Reihenfolge von REG_MULTI_SZ bleiben relevant. Abweichend bedeutet hier nicht automatisch schwächer: Eine gesonderte fachliche Regel wäre nötig, um eine strengere Einstellung als zulässig zu behandeln. + +| Nachgewiesener Zustand | Ergebnis in Work | +| --- | --- | +| Konfiguriertes IST erfüllt jede berücksichtigte Variante | Pass | +| Konfiguriertes IST weicht von jeder berücksichtigten Variante ab | Fail / Filter Deviation | +| Einzelurteile widersprechen sich | Review required | +| Wertvergleich, Kandidatenabdeckung oder explizite Anwendbarkeit ist ungeklärt | Review required | +| Empfohlenes Setting besitzt im analysierten Backupsatz keinen beobachteten konfigurierten Wert | Not configured; score-neutral | +| Der analysierte Backupsatz ist nur ein ausgewählter Teilbestand | Not configured mit Scope-Diagnose; keine behauptete Abwesenheit in Domäne oder effektivem Gerätezustand | +| Für die technische Einstellung existiert überhaupt kein Baselinewert | Kein erfundener Pass-/Fail-Vergleich | + +### Verbindliche Registry-Zustandsregeln + +Registry.pol-Anweisungen sind Sollzustände und keine fehlenden Baselinewerte. Innerhalb des analysierten Backup-Sets gelten deshalb folgende Regeln; sie behaupten weiterhin keinen effektiven Registry-Zustand auf einem Gerät: + +| Baseline-Sollzustand | Zustand im analysierten Kunden-Backup | Urteil | +| --- | --- | --- | +| Einzelnen Wert löschen | Zielwert nicht konfiguriert oder ausdrücklich gelöscht | Pass | +| Einzelnen Wert löschen | Zielwert wird gesetzt | Fail | +| Alle Werte eines Schlüssels löschen | Kein Wert für das Schlüsselziel konfiguriert oder ausdrückliche Delete-all-Anweisung | Pass | +| Alle Werte eines Schlüssels löschen | Ein Wert für das Schlüsselziel wird gesetzt | Fail | +| Schlüssel anlegen | Schlüsselanlage ist konfiguriert | Pass | +| Schlüssel anlegen | Schlüsselanlage fehlt | Fail | +| Typisierten leeren Text setzen | Wert existiert mit identischem Registrytyp und Inhalt `""` | Pass | +| Typisierten leeren Text setzen | Wert fehlt, besitzt einen anderen Typ oder ist nicht leer | Fail | + +Ein leerer `REG_SZ`- oder `REG_EXPAND_SZ`-Inhalt ist damit ein expliziter Wert und niemals allein wegen seiner Länge „Baselinewert nicht verfügbar“. Delete-, Delete-all- und Create-key-Anweisungen erhalten einen typisierten Registry-Zustand (`absent`, `key-empty`, `key-present`) in der gespeicherten Vergleichsevidenz. Andere Sonderoperationen bleiben fail-closed `Review required`, bis ihre Semantik separat vereinbart und getestet ist. + +Einträge außerhalb der Vereinigung aller erlaubten Kontenlisten weichen zwangsläufig von jeder dieser Varianten ab. Die Vereinigung ist dennoch **kein neuer Sollwert**. Auch innerhalb der Vereinigung ist bei exaktem Vergleich ein Fail möglich, wenn keine einzelne Variante vollständig erfüllt wird. Ein Treffer bei nur einer von mehreren widersprüchlichen Varianten ist kein Gesamt-Pass. + +Eine fehlende oder unlesbare Variante neben vorhandenen Empfehlungen wird nicht herausgefiltert, um Einigkeit herzustellen. Strukturell unvollständige oder nicht erklärbar partielle Baselineanalysen blockieren das Gesamturteil. Partielle Diagnosen werden auf den betroffenen Bereitstellungsmechanismus begrenzt: Eine fehlerhafte Security-Template-Zeile blockiert keinen separat technisch aufgelösten Registry-Policy-Vergleich. Für eine Security-Template-Einstellung bleibt dieselbe Diagnose dagegen ein Blocker. Nicht unterstützte Sektionen besitzen keine vergleichbare Identität und bleiben als Abdeckungslücke am Lauf sichtbar, ohne einen unabhängigen aufgelösten Wert zu entwerten. Ausschließlich fehlende/mehrdeutige ADMX-Metadaten blockieren ebenfalls keine bereits technisch aufgelösten nativen Werte; die Diagnose bleibt erhalten. + +Dasselbe gilt für explizit bekannte, wertunabhängige Metadatenlücken der Baseline: fehlende Domäne, Backupzeit oder Zeitzone. Diese Angaben belegen keine Gerätezielrolle und verändern den gelesenen Sollwert nicht. Unbekannte Diagnosen, fehlerhafte Metadatenstruktur und Identitätskonflikte werden nicht pauschal freigegeben. + +Mehrere widersprüchliche Einträge derselben Einstellung innerhalb derselben Baseline-GPO sind keine unabhängigen Rollenvarianten. Ohne eindeutig reduzierte Empfehlung bleibt dieser Fall Review required, auch wenn das IST von sämtlichen Einzelwerten abweicht. + +Unterschiedliche Baselineempfehlungen sind kein Kunden-GPO-Konflikt. Die bestehende Kundenquellenprüfung für Conflicts und Duplicates wird durch diese Änderung nicht neu definiert. Ihr Nachweis behauptet ebenfalls keine effektive Anwendung. Review required bleibt in Work unter All sichtbar; das verbindliche GPO-Statusmenü bleibt unverändert bei All, Deviation, Passed, Not configured, Conflicts und Duplicates. Eine Risikoakzeptanz verändert dieses technische Urteil nicht. + +Die spätere Nutzerpräzisierung vom 2026-09-16 ersetzt ausschließlich die frühere Interpretation score-neutraler Conflict-/Duplicate-Container: Der Container ist seit Evaluator 1.7.0 ein Diagnosemerkmal, das Policy-Gesamturteil wird separat aufgerollt. Work speichert das Urteil im Status und Conflict/Duplicate zusätzlich in den eigenen Feldern; die Statusfilter lesen diese Achsen getrennt. Dadurch kann dieselbe Zeile sowohl `Deviation` als auch `Conflicts` beziehungsweise `Duplicates` erfüllen, ohne einen zweiten Scorebeitrag zu erzeugen. Historische Evaluationen werden nicht rückwirkend umgedeutet. + +## Nachweis und Historie + +Praezisierung 2026-09-18 (Work-Zeilen): Mehrere Baselinepakete fuer dieselbe technische Einstellung werden in Work zu genau einer Zeile je Projekt, Snapshotaggregation und Computer-/Benutzerbereich zusammengefasst. Diese Zeile verwendet dieselbe Urteilprioritaet wie die bestehenden Policy-Zaehler (Fail, Review required, Pass, Not configured). Die innerhalb eines Pakets gespeicherte Variantenentscheidung bleibt unveraendert; ein dort gemischter Vergleich bleibt Review required. Der Baselinefilter waehlt Mitgliedschaften dieser gemeinsamen Zeile und berechnet ihr Gesamturteil nicht aus der Filterauswahl neu. Einzelne Paketvergleiche, Settingreferenzen und unterschiedliche Sollwerte bleiben im Reader und in Result DB nachvollziehbar; es entsteht kein synthetischer gemeinsamer Sollwert. Quellen werden anhand ihrer exakten Beobachtungsidentitaet dedupliziert, rote Markierungen muessen gegen alle erhaltenen aktuellen Varianten belegt sein. Historische oder nicht verfuegbare Bewertungen erlauben keine solche Markierung. + +Bestehende lokale Notizen zu frueheren Baselinezeilen bleiben im Reader unter `Previous baseline-specific reviews` lesbar. Uebereinstimmende Notizen werden fuer die gemeinsame Work-Zeile uebernommen; unterschiedliche Notizen werden nicht willkuerlich vereinigt. Risikoakzeptanzen werden niemals automatisch auf die gemeinsame Zeile umgehaengt. Die Projektion benoetigt weder Reimport noch Neuauswertung; gespeicherte Vergleiche und Datenbankschema bleiben unveraendert. + +Jedes neue Ergebnis speichert `baselineVariantAssessment` Version 1 mit Prüfgrenze `backup-configuration`, unveränderten Kunden-/Baselinewerten, Baseline-Settingreferenzen, typisierten Einzelvergleichen, Blockierungsdiagnosen und Gesamtentscheidung. Ausgewählte Settingreferenzen und sämtliche Auswahlkandidaten bleiben getrennt; die vorhandenen Evidenzreferenzen führen zu Analyse, Datei-/Hash-/Zeilenherkunft und Kundenbeobachtungen. Die Schreibvalidierung prüft Referenzabdeckung und Konsistenz von Einzelurteilen, Gesamturteil und Klassifikation. + +Ein einzelner aggregierter Baselinewert wird nur bei tatsächlich gemeinsamem Quellwert ausgegeben. Bei unterschiedlichen Werten zeigen Work, Result DB und der JSONL-Export die Einzelvarianten. Empfehlungen kombinieren niemals die Alternativen; vor einer konkreten Änderung muss die passende Vorlage feststehen. + +Evaluator 1.5.0 ersetzte die pauschale Sperre aus 1.4.0 bei unterschiedlichen Baselinewerten. Evaluator 1.6.0 begrenzt globale Parserdiagnosen auf den tatsächlich betroffenen Bereitstellungsmechanismus. Evaluator 1.7.0 vergleicht die erhaltenen Mitgliedswerte eines Kundenkonflikts einzeln und rollt einen nachgewiesenen Fail auf die technische Policy-Einstellung hoch. Evaluator 1.8.0 hält gewöhnliche fehlende Empfehlungen auch in einem ausgewählten analysierten Backupsatz als `Not configured` filterbar und markiert die begrenzte Aussage mit `policy-evaluation-customer-absence-scope-limited`; eine Domänen- oder Geräteabwesenheit wird nicht behauptet. Evaluator 1.9.0 behandelt die oben vereinbarten Delete-, Delete-all-, Create-key- und typisierten Leerwert-Sollzustände als vergleichbare Baselineevidenz. Alte Läufe werden nicht umgeschrieben. 1.3.3 bis 1.8.0 bleiben historisch lesbar; die aktuelle Version hat Vorrang. Data Hub fordert über den bestehenden Versionsvergleich eine explizite Re-evaluation der erhaltenen Eingaben an. Kein Scanner-Reimport, erneuter Upload oder SQL-Schemawechsel allein wegen dieses Bewertungswechsels; fehlende/unlesbare Ursprungsevidenz bleibt gesondert zu klären. + +## Verifikation und Grenzen + +Synthetische Regressionen prüfen zusätzliche und fehlende Konten, Treffer nur einer Variante, Übereinstimmung aller Varianten, vertauschte Kontenreihenfolge, Typunterschiede, unbekannte/fehlende/unlesbare Varianten, explizite und inventarbasierte Kontexte, fehlende Einstellungen bei vollständiger und partieller Erfassung, die vier Registry-Zustandsregeln einschließlich ihrer Work-Urteile, unveränderte Eingaben, serialisierte Evidenz, Schreibvalidierung, historische Versionsauswahl sowie Work-Filter, Guidance und gerenderte Result-DB-Details. Historische Kundendaten werden nicht automatisch neu bewertet. Die Standardprüfung ersetzt keine freigegebene Integration gegen den kanonischen PostgreSQL-Bestand und keinen RSoP-/GP-Results-Nachweis. diff --git a/docs/IMPLEMENTATION_PLAN.md b/docs/IMPLEMENTATION_PLAN.md index 3205767..55860f0 100644 --- a/docs/IMPLEMENTATION_PLAN.md +++ b/docs/IMPLEMENTATION_PLAN.md @@ -2,6 +2,210 @@ Status: lebendes Projektdokument +Maester-Unicode-Null-Import 2026-09-20 (Phase 13A/13C, Nutzerfehlerbericht, umgesetzt und verifiziert): Ein nativer Maester-Fehlertext enthielt `U+0000`. Vorschau und Mapping waren erfolgreich, der atomare PostgreSQL-Abschluss scheiterte jedoch, weil `jsonb` dieses Zeichen nicht repraesentieren kann; die bisherige Auto-Import-Fehlerbehandlung ersetzte danach die erfolgreiche Vorschau irrefuehrend durch `0 of 0 files selected`. Die gemeinsame kanonische Importgrenze stellt jedes solche Zeichen nun explizit als lesbares `\\u0000` dar, behaelt den gesamten umgebenden Quellwert, Hash und Locator und erzeugt die Diagnose `unicode-null-escaped`. Andere Steuerzeichen, Parsing, Profilwahl, Normalisierung und Bewertung bleiben unveraendert. Nach einem Abschlussfehler bleibt die vorbereitete Dateizeile samt Wiederholungsmoeglichkeit sichtbar. Ein synthetischer Maester-XLSX-Test und der vollstaendige HTTP-Pfad Vorschau -> bestaetigte Zuordnung -> Import in vorhandenen Timeslot sichern genau die Regression; 26 fokussierte Tests, Client-/Server-Produktionsbuild, Local-only- und Designpruefung bestehen. Der optionale PostgreSQL-Testlauf wurde gemaess kanonischer-Datastore-Regel nicht gegen die bestehende Kundendatenbank ausgefuehrt. Keine Migration, Schema- oder Bestandsdatenaenderung; Phase 13A bleibt abgeschlossen, Phase 13C in Arbeit. + +Client-Info-Security-Domain-Mengenbalken 2026-09-20 (Phase 7, ausdrueckliche Nutzerentscheidung und nachfolgende Ausrichtungs-/Farbkorrekturen, umgesetzt und verifiziert): Jede angezeigte Security-Domain-Zeile traegt einen dezenten Mengenbalken in einer eigenen gemeinsamen Rasterspalte zwischen dem laengsten gerenderten Domainnamen und der breitesten gerenderten Mengenspalte. Dadurch liegen beidseitig 12 px Abstand; kein Balken kann in Schrift oder hinter eine Zahl wachsen. Alle Balken enden an derselben Kante und wachsen von dort nach links. Seine Breite entspricht dem sichtbaren Abweichungs- beziehungsweise Review-only-Wert der Zeile geteilt durch die Summe aller angezeigten Domainwerte; die exakte rechtsbuendige Zahl bleibt die autoritative sichtbare Angabe. Die spaetere Nutzerkorrektur ersetzt die kurzzeitig gewaehlte kategoriale `--viz-*`-Folge: Jeder Balken liest nun exakt denselben aktuellen semantischen Farbwert wie der Overall-Score-Donut und wechselt gemeinsam mit dessen Critical-, Medium-, Passed- oder Unknown-Tone. Die Balken sind rein dekorativ und fuer assistive Technik verborgen. Vier fokussierte Suites mit 23 Tests, die Designsprachpruefung sowie Client-/Server-Produktionsbuild bestehen. Die Live-Pruefung am freigegebenen Dummy bestaetigt fuer alle neun Zeilen getrennte Text-/Balken-/Zahlenspalten, beide 12-px-Abstaende, identische Donut-/Balkenfarbe `rgb(232, 33, 79)` und keinen horizontalen Ueberlauf in Light und Dark; Light wurde wiederhergestellt. Keine Daten-, Klassifikations-, Score-, Drilldown-, API- oder Persistenzaenderung. + +Client-Info-Lesetypografie 2026-09-20 (Phase 7, ausdrueckliche Nutzerentscheidung, umgesetzt und verifiziert): Informationstragende Beschriftungen und strukturierte Tabellen-/Kachelinhalte verwenden mindestens die 14-px-Datenrolle; eigentliche Lesewerte und Fliesstext verwenden die 16-px-Leserolle. Kompakte Controls, technische Metadaten und Badges bleiben getrennte Ausnahmen. Environment Detail setzt den Vertrag fuer Fakten, Source Overview und Operating systems um; `Domain` rendert mit 14 px/700 und `sevenkingdoms.local` mit 16 px/400. Drei fokussierte Suites mit 23 Tests, Designsprachpruefung und Client-/Server-Build bestehen. Die Live-Pruefung bestaetigt dieselben Groessen in Light und Dark ohne horizontalen Kachelueberlauf; Light wurde wiederhergestellt. + +Client-Info-PingCastle-OS-Zustaende 2026-09-20 (Phase 7, ausdrueckliche Nutzererweiterung, umgesetzt und verifiziert): Die Operating-systems-Tabelle zeigt neben `Devices` nun die von PingCastle je Betriebssystemzeile gelieferten Werte `Active`, `Inactive`, `Enabled` und `Disabled`. Die Projektion verbindet diese Werte ausschliesslich ueber identischen Scanlauf, Importdatei, Abschnitt, Quelltabelle und Quellzeile; sie berechnet keinen Zustand aus einem anderen und addiert weiterhin keine ueberlappenden Inventare. Fehlende Werte aus aelteren oder anderen Quellen bleiben `—`. Die read-only-Pruefung am freigegebenen Dummy bestaetigt fuer `Windows Server 2019 1809` die Quellwerte `1 / 1 / 0 / 1 / 0`; die zweite unquantifizierte Quelle bleibt in allen fuenf Spalten unbekannt. Drei fokussierte Suites mit 28 Tests, Client-/Server-Build, Designsprachen- und Local-only-Sicherheitspruefung bestehen. Light und Dark wurden live geprueft; alle Spalten passen bei 568 px Kachelbreite ohne horizontalen Ueberlauf, Light wurde wiederhergestellt. + +Data-Hub-/Client-Info-Deviation-Abgleich 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Data Hub berechnet seine Ergebnisdonuts nicht mehr nur aus scannergebundenen Run-IDs, sondern aus demselben ausgewaehlten gemischten Timeslot-Projektblatt wie Client Info. Assessmentgebundene GPO-/Policy-Ergebnisse bleiben dadurch enthalten; der freigegebene Dummy zeigt in beiden Ansichten `477` Deviations bei `1.833` Gesamtdatensaetzen beziehungsweise `26 %`. Beide Ansichten verwenden dieselbe zentrale autoritative Ergebniszustandsklassifikation. Der Client-Info-Donut uebernimmt zudem exakt die Data-Hub-Referenzvariante samt Kachelflaeche, Groesse, Padding, Titeltypografie, Ringgeometrie, Farben und Hover. Beim Mandantenwechsel wird die vorige Kennzahl sofort geleert, damit waehrend der asynchronen Projektion keine Zahl eines anderen Mandanten sichtbar bleibt. Vier fokussierte Suites mit 32 Tests, Client-/Server-Build, Designsprachen- und Local-only-Sicherheitspruefung bestehen. Die laufende Dummy-Ansicht bestaetigt `477 / 1.833 / 26 %` in beiden Bereichen; berechnete Light- und Dark-Styles sind identisch und Light wurde wiederhergestellt. + +Data-Hub-Mandantenauswahlkontur 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Die persistente gelbe Kontur der ausgewaehlten Mandantenkachel ist gezielt von 2 px auf 3 px verstaerkt. Die Breite wird aus den bestehenden Linienrollen `--bw-emphasis` und `--bw-hairline` zusammengesetzt; Farbe, Innenversatz, Kachelgroesse und Layout bleiben stabil. Diese Ausnahme gilt nur fuer die ausgewaehlte Data-Hub-Mandantenkachel. Der getrennte blaue 2-px-Tastaturfokus, Hover, nicht ausgewaehlte Kacheln und alle anderen Auswahlkonturen bleiben unveraendert. Zwei fokussierte Suites mit 10 Tests, Client-/Server-Build, Designsprachen- und Local-only-Sicherheitspruefung bestehen. Die laufende Data-Hub-Ansicht bestaetigt die staerkere gelbe Kontur und `aria-pressed=true` in Light und Dark; Light wurde anschliessend wiederhergestellt. + +Light-Mode-Kachelflaeche-Nachschaerfung 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Die gemeinsame Light-Mode-Kachelflaeche wird von dem weiterhin zu hellen `#FAFAFC` auf das dezentere Neutralgrau `#F5F5F7` abgesenkt. Die Aenderung bleibt auf `--tile-surface` begrenzt und gilt damit konsistent fuer Data Hub, Work, Client Info, DB Structure und Pathfinder. Die Kacheln bleiben heller als der App-Hintergrund `#F1F1F4`; Hover-, Auswahl-, Fokus-, Status- und Dark-Mode-Rollen bleiben unveraendert. Vier fokussierte Suites mit 24 Tests, Client-/Server-Build, Designsprachen- und Local-only-Sicherheitspruefung bestehen. Die laufende Client-Info-Ansicht bestaetigt `rgb(245, 245, 247)` im Light Mode und den unveraenderten Dark-Mode-Wert `rgb(50, 50, 56)`; Light wurde anschliessend wiederhergestellt. + +Client-Info-Deviations-Donut 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Die Gesamtzahl `Deviations` in der Kachel `Data` wird nun mit der bestehenden gemeinsamen `DonutMetricCard` als vollstaendiger 360-Grad-Ring dargestellt. Die absolute Anzahl steht fett und zentriert, darunter der Anteil an allen Datensaetzen des aktuellen Client-Info-Projekts; beim freigegebenen Dummy sind das `477` und `26 %` aus `477 / 1.833`. Der Donut liegt transparent in der vorhandenen Kachel, erzeugt keine verschachtelte Kachelflaeche und bleibt vollstaendig per Maus und Tastatur als Drilldown nach Work mit `Deviation` bedienbar. Vier fokussierte Suites mit 27 Tests, Client-Build, Designsprachen- und Local-only-Sicherheitspruefung bestehen. Die laufende Browseransicht wurde in Light und Dark geprueft; Ring, Innenabstand, Ausrichtung, Beschriftung und zugaenglicher Name `Deviations: 477, 26%` sind korrekt, der urspruengliche Light Mode wurde wiederhergestellt. + +Client-Info-Environment-Detail-Icons-and-Spacing 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Alle acht Kachelueberschriften in Environment Detail, einschliesslich `Source Overview` und `Operating systems`, tragen nun genau ein bestehendes dezentes ASSESSOR-Liniensymbol in der abgesetzten Textfarbe. Die Faktengruppen uebernehmen den Listenabstand und das Zeilenpolster von Source Overview (`12px 0 16px` beziehungsweise `12px 8px`) und wirken dadurch luftiger und einheitlich. Vierer-Raster, feste Kachelhoehen und internes Scrollen bleiben erhalten. Verifiziert wurden 28 fokussierte Vitest-Faelle, Client- und Server-Build, Designsprachen- und Local-only-Sicherheitspruefung sowie die laufende Browseransicht in Dark und Light mit acht Ueberschriften und acht Symbolen. + +Client-Info-Environment-Facts-in-Data 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Die separate obere Environment-Facts-Kachelreihe wurde entfernt. AD Domains, Entra Tenant, User Accounts, Computer Objects, Domain Controllers und GPOs stehen nun samt ihrer bestehenden Symbole innerhalb der `Data`-Kachel unter den zusaetzlichen Ergebniszustaenden. Dort bilden sie ein flaches 3-mal-2-Raster mit transparenten Zellen und dezenten Trennlinien statt verschachtelter Kacheln. Werte, unbekannt-Semantik und Datenherkunft bleiben unveraendert. Ein synthetischer Interaktionstest sichert alle sechs Fakten, Symbole und die Abwesenheit der frueheren oberen Reihe dauerhaft ab. Verifiziert wurden 29 fokussierte Vitest-Faelle, Client- und Server-Build, Designsprachen- und Local-only-Sicherheitspruefung sowie die laufende Browseransicht mit exakt sechs Fakten und Symbolen, drei gleich breiten Spalten, entfernter alter Faktenleiste und ausgerichteten Unterkanten von `Data` und `Domain Information`. + +Client-Info-Environment-Detail-Kachelraster 2026-09-20 (Phase 7, ausdrueckliche Nutzererweiterung, umgesetzt und verifiziert): Der gesamte aufgeklappte Environment-Detail-Inhalt ist als achtteiliges Raster organisiert: Source Overview, sechs fachliche Faktengruppen und Operating systems. Das Raster behaelt immer vier gleich breite Kacheln pro Reihe. Ein `ResizeObserver` leitet die einheitliche Kachelhoehe aus 75 Prozent der tatsaechlich gerenderten Overall-Score-Kachel ab; ueberlange Inhalte scrollen innerhalb ihrer Kachel. Auf schmalen Ansichten bleiben Spaltenzahl und Kachelbreite durch horizontalen Raster-Scroll stabil. Die Source-Overview-Kachel behaelt innen die vereinbarte schlichte Quellenliste und alle Drilldowns. Die Live-Pruefung bestaetigt acht Kacheln, vier gleich breite Spalten zu rund 578 px und 504,4 px Kachelhoehe bei 672,6 px Overall-Score-Hoehe; Source Overview und Source metrics scrollen intern. 29 fokussierte Dashboard-/Environment-/Interaktionstests, Designsprachpruefung, Client-/Server-Produktionsbuild und Local-only-Sicherheitspruefung bestehen. + +Client-Info-dominante-Abweichungszahl 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Die klickbare Gesamtzahl `Deviations` in der Kachel `Data` verwendet nun die vorhandene 56-px-H1-Rolle mit kompakter Zeilenhoehe und groesserem vertikalem Abstand. Die Beschriftung bleibt direkt darunter und ist als semibold Feldlabel klar lesbar; die vier zusaetzlichen Ergebniszustaende bleiben bewusst kleiner. Farbe, Datenwert, Kachelgeometrie und der bestehende Work-Drilldown bleiben unveraendert. Die Live-Pruefung bestaetigt `477` mit 56 px/600 sowie `Deviations` mit 12 px/600 ohne Hintergrund oder Schatten. 18 fokussierte Dashboard-/Interaktionstests, Designsprachpruefung, Client-/Server-Produktionsbuild und Local-only-Sicherheitspruefung bestehen. + +Client-Info-Quellenliste-im-Environment-Detail 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Der separate Bereich `Source Overview` wurde aus der Hauptansicht entfernt. Dieselben Quelleninformationen stehen nun im aufgeklappten `Environment Detail` als kompakte Aufzaehlung mit Trennlinien und transparenten Zeilen statt Kacheln. ASSESSOR-Score, Bewertungsmethode, native Kontextwerte, Provisional-Hinweis, Scoring-Methodology-Dialog und die bestehenden Work-Drilldowns bleiben erhalten. Die sechs fachlichen Environment-Gruppen und der initial eingeklappte Zustand bleiben unveraendert. Die Live-Pruefung bestaetigt fuenf Quellenzeilen innerhalb von `Environment Detail`, keinen eigenstaendigen Source-Overview-Bereich sowie transparente, schattenfreie Darstellung in Light und Dark. 29 fokussierte Dashboard-, Environment- und Interaktionstests, Designpruefung, Client-/Server-Build und Local-only-Sicherheitspruefung bestehen. + +Client-Info-Data-Kachel 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Die ehemalige Kachel `Priority Findings` heisst nun `Data` und tauscht mit `Domain Information` die Position, sodass `Data` links und die Domaininformationen rechts stehen. Die doppelten Kennzahlen `Critical` und `High` sind entfernt; Gesamtzahl `Deviations` und die getrennte Zeile der zusaetzlichen Ergebniszustaende bleiben erhalten. Der Kopf verwendet eine einzige volle Rasterspalte ohne Versatz. Die Abweichungszahl ist eine tastaturbedienbare Schaltflaeche und oeffnet Work mit dem Standardfilter `Deviation`. Der nicht mehr benoetigte Severity-Zaehler wurde entfernt; ein synthetischer Interaktionstest sichert Beschriftung, Reihenfolge, reduzierte Kennzahlen und den Drilldown ab. Die Live-Pruefung bestaetigt `Data`, `477 Deviations`, die Reihenfolge Data/Domain Information/Assessment Gaps sowie die gemeinsame 4-px-Buttongeometrie; Light und Dark bleiben lesbar. 18 fokussierte Dashboardtests, Designpruefung, Client-/Server-Build und Local-only-Sicherheitspruefung bestehen. + +CIS-CAT-Result-Belegfarbe 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Ausgewertete Quellzeilen in verknuepften CIS-CAT-Results werden nicht mehr pauschal rot dargestellt. Das tatsaechliche Finding-Outcome wird in das Results-Fenster weitergereicht: `Pass` verwendet die eigene gruene Match-Rolle, `Fail` die rote Violation-Rolle; fuer unbekannte oder neutrale Outcomes wird keine Aussage erfunden. Erwartungskriterium und bestaetigter Ist-Wert bleiben semantisch getrennte Rollen. Ein synthetischer Interaktionstest sichert den Pass-Fall mit `Type = reg_dword` und `Value = 0` sowie den unveraenderten Fail-Fall ab. Die 22 fokussierten Results-/Layout-Tests, Designpruefung, Client-/Server-Build und Local-only-Sicherheitspruefung bestehen; die Theme-Pruefung bestaetigt die Match-Rollen im Light Mode (`#CBEFD9` / `#10261A`) und Dark Mode (`#176B46` / `#FFFFFF`). + +Light-Mode-Kachelflaeche 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt und verifiziert): Die gemeinsame Kachelflaeche verwendet im hellen Theme statt Reinweiss nun das sehr dezente Neutralgrau `#FAFAFC`. Die Aenderung erfolgt ausschliesslich ueber `--tile-surface` und wirkt damit konsistent in Data Hub, Work, Client Info, DB Structure und Pathfinder; App-Hintergrund, Eingabeflaechen, Hover, Auswahl, Statusfarben und Dark Mode bleiben unveraendert. Die Live-Pruefung bestaetigt `rgb(250, 250, 252)` in Data Hub, Work und Client Info sowie den unveraenderten Dark-Mode-Wert `rgb(50, 50, 56)`; fokussierte Tile-/Layout-Tests, Design-Token-Pruefung, Client-/Server-Build und Local-only-Sicherheitspruefung bestehen. + +Client-Info-Environment-Feldueberschriften 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Die Feldueberschriften in den aufgeklappten Environment-Detail-Gruppen, einschliesslich `Directory`, verwenden nun dieselbe Bold-Stufe 700 wie die kompakte Kachel `Domain Information`. Werte bleiben regulaer; Daten, Reihenfolge, Abstaende und Kachelgeometrie sind unveraendert. + +Accepted-Risk-Draft-Markierung 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Die Kopfaktion `Accepted Risk` verwendet ausschliesslich im vorhandenen Zustand `Draft` eine blaue Flaeche mit weisser Schrift. Dafuer besitzt der Entscheidungsentwurf eine eigene semantische Farbrolle, getrennt von Auswahl, Severity und Tastaturfokus; der sichtbare Text `Draft` bleibt als zweites Zustandssignal erhalten. Leerer Zustand, angenommene, faellige, abgelaufene und widerrufene Entscheidungen bleiben unveraendert. + +Client-Info-Kachelflucht 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): In der breiten 1:1-Hauptzeile fuellt die rechte Aktionsspalte wieder exakt die Hoehe der Posture-Kachel. `Domain Information` und `Priority Findings` bleiben als gleich hohe obere Zeile erhalten; `Assessment Gaps` nimmt den verbleibenden Platz ein, sodass beide Hauptkacheln dieselbe Unterkante besitzen. Im gestapelten schmalen Layout bleiben alle Bereiche auf ihrer natuerlichen Inhaltshoehe. Inhalte, Daten und Aktionen sind unveraendert. + +Accepted-Risk-Leerzustand 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Solange fuer ein Finding keine Risikoakzeptanz erfasst ist, zeigt die bestehende Kopfaktion `Accepted Risk ?`. Sobald ein Eintrag vorhanden ist, ersetzt weiterhin dessen bestehender Entscheidungsstatus das Fragezeichen. Dialog, Risikoentscheidung, Persistenz und Findingdaten bleiben unveraendert. + +Client-Info-Domain-Information-Typografie 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): In der Kachel `Domain Information` sind der Kacheltitel und alle Feldueberschriften fett gesetzt. Die Werte behalten ihre regulaere Datenrolle, damit Ueberschrift und Inhalt eindeutig unterscheidbar bleiben; Daten, Reihenfolge und Kachelgeometrie sind unveraendert. + +Work-Sidebar-Security-Domains 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Die bisherige Severity-Donut-Leiste in Work entfaellt vollstaendig. An ihrer Stelle stehen die acht gemeinsamen Client-Info-Security-Domains in Katalogreihenfolge untereinander; `Unclassified` erscheint nur, wenn es im geladenen Scope vorkommt. Jeder Eintrag zeigt die gegen alle anderen aktiven Work-Filter selbst-ausschliessend nachgezaehlten Treffer und setzt exakt dieselbe sichtbare `Security Domain`-Facette wie die Toolbar. Ein erneuter Klick auf die aktive Domain hebt die Auswahl auf, ein Klick auf eine andere Domain ersetzt sie; Nulltreffer bleiben gemaess Work-Vertrag anklickbar. Auswahl verwendet ausschliesslich die gemeinsame gelbe Markierung, Tastaturfokus bleibt blau. Quelldaten, Domainzuordnung und andere Filter bleiben unveraendert. + +Abnahme der Work-Sidebar-Security-Domains: 26 fokussierte Domain-, Interaktions-, Navigations-, Donut- und Designvertragstests sowie Client-/Server-Produktionsbuild und Designsprachpruefung bestanden. Die Live-Pruefung am freigegebenen Dummy bestaetigt in Light und Dark die vollstaendige Entfernung der Severity-Donuts, die gemeinsame Domainreihenfolge mit aktuellen Trefferzahlen, die gelbe aktive Auswahl und die bidirektionale Synchronisierung mit der sichtbaren Toolbar-Facette. `Identity & Account Hygiene` reduziert den Scope reproduzierbar von 477 auf 221 Treffer; erneuter Klick stellt `Security Domain: All` und 477 Treffer wieder her. Light und der ungefilterte Domainzustand wurden wiederhergestellt. Der bestehende Bundlegroessenhinweis bleibt unveraendert; Phase 7 bleibt in Arbeit. + +Client-Info-Posture-Reduktion 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Der wiederholte Hinweis `Pass rates · … total deviations` entfaellt aus dem Security-Domains-Kopf. Die Domainzeilen behalten ihre klickbaren Scoreknoten und den numerischen Deviation-/Review-Zaehler, zeigen darunter jedoch keine wiederholte Bezeichnung mehr; die Bedeutung bleibt als Tooltip erhalten. Die komplette dreizeilige Finding-Vorschau und die Aktion `View findings` in Priority Findings entfallen. Die autoritativen Summen und klickbaren zusaetzlichen Ergebniszustaende bleiben erhalten; Findingdaten und die verbleibenden fachlichen Drilldowns bleiben unveraendert. + +Abnahme der Client-Info-Posture-Reduktion: Ein synthetischer Dashboard-Vertrag prueft dauerhaft die Abwesenheit des Gesamthinweises, aller sichtbaren Domain-Zaehler-Unterzeilen, der Finding-Vorschauliste und der Aktion `View findings`. 20 fokussierte Dashboard-/Posture-/Domainfiltertests, Client-/Server-Produktionsbuild sowie Designsprach- und Local-only-Pruefung bestanden. Die Live-Pruefung am freigegebenen Dummy bestaetigt in Light und Dark die reduzierte Darstellung, unveraenderte Kennzahlen und die gemeinsame Unterkante von Domain Information und Priority Findings; Light wurde als Ausgangsthema wiederhergestellt. Der bestehende Bundlegroessenhinweis bleibt unveraendert; Phase 7 bleibt in Arbeit. + +Globale Button-Abrundung 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Alle rechteckigen klickbaren Bedienelemente verwenden jetzt den gemeinsamen leichten `--btn-radius` von 4 px. Das umfasst Work-Aktionen wie `Snapshot` und `Reset`, View-Tabs, Sidebar-, Theme-, Icon-, Disclosure-, Segment-, Dialog- und Pathfinder-Schaltflaechen; eingebettete Randaktionen runden ihre sichtbaren Aussenkanten mit demselben Token. Echte Kreis-/Donut-Interaktionen und quadratische Inhaltskacheln behalten ihre fachliche Geometrie. Farben, Aktionen, Navigation und Datenlogik bleiben unveraendert. + +Abnahme der globalen Button-Abrundung: Der Designsprachtest sichert den gemeinsamen Basisvertrag, die zuvor abweichenden spaet geladenen View-Regeln sowie die beiden semantischen Ausnahmen dauerhaft ab. Client-/Server-Produktionsbuild, Designsprach- und Local-only-Pruefung bestanden. Die visuelle Live-Pruefung am freigegebenen Dummy bestaetigt Snapshot, Reset, View-Tabs, Export-, Icon- und Sidebar-Aktionen in Light und Dark; Light wurde als Ausgangsthema wiederhergestellt. Gesamtsuite: 1.419 bestanden, 13 optionale PostgreSQL-Tests uebersprungen; zwei fachfremde bestehende Quelltextannahmen zu einem erlaubten `code`-Element und der inzwischen erweiterten `openProject`-Signatur bleiben fehlgeschlagen. Der bestehende Bundlegroessenhinweis bleibt unveraendert; Phase 7 bleibt in Arbeit. + +Client-Info-Domainzeilen-und-Score-Einstieg 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Die Security-Domain-Zeilen zeigen den Domaenennamen jetzt in der 20-px-Detailtitelrolle und entfernen die bisherige Meta-Unterzeile mit Passed/Not configured/Duplicates/Conflicts/Review. Scoreknoten sowie rechter Deviation-/Review-Zaehler bleiben erhalten. Der Overall-Score-Ring ist nun eine per Maus und Tastatur bedienbare Aktion: Er oeffnet Work mit dem sauberen Remediation-Standard `Deviation`, entfernt vorherige Source-, Domain-, Severity-, Such-, Workspace- und Record-ID-Filter und zeigt die regulaere Work-Uebersicht. Score-, Domaenen- und Findingdaten bleiben unveraendert. + +Abnahme der Domainzeilen und des Score-Einstiegs: 26 fokussierte Dashboard-/Posture-/Domainfilter-/Navigationstests, Designsprach- und Local-only-Pruefung sowie Client-/Server-Produktionsbuild bestanden. Die Live-Pruefung am freigegebenen Dummy bestaetigt die vergroesserten Domaenennamen ohne Meta-Unterzeilen in Light und Dark; der Score-Klick oeffnet Work mit `Deviation · 477` und allen Source-, Domain- und Severity-Filtern auf `All`. Der bestehende Bundlegroessenhinweis bleibt unveraendert; Phase 7 bleibt in Arbeit. + +Client-Ladehinweis 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Der generische Text `Loading saved client …` ist durch `Loading Client: [Clientname]` ersetzt. Der Name wird beim Oeffnen direkt aus der ausgewaehlten Data-Hub-Projektidentitaet uebergeben und fuer nachfolgende Timeslot-/Refresh-Ladevorgaenge desselben Clients stabil wiederverwendet; der deaktivierte Sheet-Selector zeigt denselben dynamischen Status. Keine Lade-, Scope-, Daten- oder Persistenzlogik wurde geaendert. + +Abnahme des Client-Ladehinweises: Fuenf fokussierte Ladezustands-/Data-Hub-/Timeslot-Tests und Client-/Server-Produktionsbuild bestanden. Die Live-Pruefung beim Oeffnen des freigegebenen Dummy bestaetigt sichtbar `Loading Client: Dummy`; der bestehende Bundlegroessenhinweis bleibt unveraendert. Phase 7 bleibt in Arbeit. + +Donut-Innenhierarchie 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Alle Anzahl-/Prozent-Donuts zeigen jetzt die absolute Anzahl fett in der ersten Zeile und den Prozentwert mit regulaerem Gewicht darunter. Ein gemeinsamer tokenbasierter Sicherheitsabstand haelt den vollstaendigen Readout bei grossen Data-Hub-, kompakten Sidebar-, Dashboard-Status-, Risk-Severity- und Client-Info-Verteilungsringen vom inneren Ringrand fern. Der Overall Score behaelt als Score-Ring seine fachlich abweichende `/100`-Semantik. Werte, Prozente, Filteraktionen und Scorelogik bleiben unveraendert. + +Abnahme der Donut-Innenhierarchie: 16 fokussierte Donut-/Data-Hub-/Sidebar-/Disclosure-/Tile-Vertragstests, Designsprach- und Local-only-Pruefung sowie Client-/Server-Produktionsbuild bestanden. Die Live-Pruefung mit dem freigegebenen Dummy bestaetigt Anzahl oben, Prozent darunter sowie sichtbaren Innenabstand bei realen Werten in Light und Dark. Der bestehende Bundlegroessenhinweis bleibt unveraendert; Phase 7 bleibt in Arbeit. + +Client-Info-vollstaendiger-Directory-Kontext 2026-09-20 (Phase 7, ausdrueckliche Nutzererweiterung, umgesetzt): `Domain Information` zeigt jetzt alle neun Fakten der Environment-Detail-Gruppe `Directory`: Domain, NetBIOS Name, Forest, Domains, Domain Functional Level, Forest Functional Level, Schema Version, Domain Created und Entra ID. Die zuvor gewuenschte Domain-Controller-Zahl bleibt als zusaetzlicher zehnter Fakt erhalten. Werte und Unbekanntbehandlung stammen unveraendert aus dem normalisierten Environment Snapshot; die 50/50-Geometrie und gleiche Kachelhoehe zu Priority Findings bleiben bestehen. + +Abnahme des vollstaendigen Directory-Kontexts: 22 fokussierte Dashboard-/Environment-/Quellenauswahltests, Designsprach- und Local-only-Pruefung sowie Client-/Server-Produktionsbuild bestanden. Die Live-Pruefung am freigegebenen Dummy bestaetigt alle zehn Fakten ohne Abschneiden oder Ueberhang und die gemeinsame Unterkante mit Priority Findings in Light und Dark. Der bestehende Bundlegroessenhinweis bleibt unveraendert; Phase 7 bleibt in Arbeit. + +Data-Hub-Kachelflucht 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Ergebnis-Donuts und Mandanten-/Add-Kacheln verwenden auf breiten Flaechen jetzt dasselbe Sechs-Spalten-Raster. Spaltenstart, Spaltenbreite und Gap sind identisch; dadurch entfaellt der zuvor mit jeder Mandantenkachel anwachsende horizontale Versatz, waehrend alle sechs Donuts in einer Zeile bleiben. Unterhalb des Wide-Breakpoints gilt fuer beide Reihen wieder derselbe kompakte responsive Tile-Vertrag. Inhalte, Auswahl, Status und Navigation bleiben unveraendert. + +Abnahme der Data-Hub-Kachelflucht: 14 fokussierte Donut-/Data-Hub-/Tile-Vertragstests, Designsprach- und Local-only-Pruefung sowie Client- und Server-Produktionsbuild bestanden. Die Live-Pruefung in Light und Dark bestaetigt durchgehend fluchtende Kanten fuer alle sechs Donuts sowie Dummy, Maester Test, LSW und die Add-Kachel. Der bestehende Bundlegroessenhinweis bleibt unveraendert; Phase 7 bleibt in Arbeit. + +Client-Info-Domainkontext 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Die obere Aktionsrail ist jetzt eine exakte 50/50-Zeile mit `Domain Information` links und `Priority Findings` rechts. Beide Kacheln besitzen dieselbe Hoehe und Unterkante; `Assessment Gaps` nutzt darunter wieder die komplette Railbreite. Domain, Domain Functional Level, Domain Controllers, Forest, Forest Functional Level und Schema Version stammen aus denselben normalisierten Environment-Snapshot-Beobachtungen wie Environment Detail. Fehlende Werte bleiben `—`; Score-, Finding-, Filter-, Drilldown- und Persistenzlogik sind unveraendert. + +Abnahme des Client-Info-Domainkontexts: 17 fokussierte Dashboard-/Quellenauswahltests, Designsprach- und Local-only-Pruefung sowie Client-/Server-Produktionsbuild bestanden. Die Live-Pruefung mit dem ausdruecklich freigegebenen Dummy bestaetigt die gleich breite und gleich hohe obere Kachelzeile, die vollbreiten Assessment Gaps, quellengestuetzte Werte fuer DFL, DC, Forest, FFL und Schema sowie lesbare Umbrueche in Light und Dark. Der bestehende Bundlegroessenhinweis bleibt unveraendert; Phase 7 bleibt in Arbeit. + +Client-Info-Posture-/Risikoregister-Korrektur 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Die breite Client-Info-Hauptzeile teilt die verfuegbare Breite jetzt exakt zur Haelfte zwischen Posture und Aktionsrail; diese spaetere Korrektur ersetzt die kurzzeitig verwendete 2:1-Aufteilung. Kacheln derselben Zeile besitzen ausnahmslos dieselbe Hoehe und Unterkante. Accepted Risks uebernimmt die bestehende Data-Hub-Clientgeometrie mit fester linker Auswahl `clamp(420px, 27vw, 520px)`, rechter Informationsflaeche und gestapeltem schmalem Fallback. Risiko-, Score-, Quellen-, Filter-, Drilldown- und Persistenzdaten bleiben unveraendert. + +Overall-Score-Verdichtung 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Die wiederholte Statuszeile unter dem Donut und der dort doppelt gezeigte Critical-Findings-Zaehler entfallen vollstaendig; Priority Findings bleibt der autoritative sichtbare Ort fuer diesen Zaehler. Assessment Coverage ist auf hoechstens 70 Prozent der Overall-Zone und zusaetzlich auf die gemeinsame kompakte Inhaltsbreite begrenzt, damit Label, Balken und Zaehler nicht von den gebogenen Domaenenverbindungen ueberlagert werden. Daten, Score, Statusableitung, Filter und Drilldowns bleiben unveraendert. + +Abnahme der Overall-Score-Verdichtung: 19 fokussierte Dashboard-Tests, Designsprachpruefung sowie Client-/Server-Produktionsbuild bestanden. Die Live-Messung am Dummy ergibt 354,15 px Coverage-Breite innerhalb einer 537,92-px-Overall-Zone und null Schnittpunkte mit allen neun Verbindungskurven. Posture und Aktionsrail bleiben mit jeweils 1.324,02 px exakt gleich breit und besitzen dieselbe Unterkante. + +Source-Overview-Korrektur 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Die generische Quelle `Tabular Data` wird nicht mehr als Source-Overview-Kachel dargestellt. Ihre importierten Daten und unterstuetzten Filterpfade bleiben erhalten; sie ist jedoch keine eigenstaendige Security-Scoring-Quelle. Ein synthetischer Render-Test sichert die Abwesenheit der Kachel bei gleichzeitig sichtbarer erkannter Scannerquelle. + +Abnahme der Source-Overview-Korrektur: 16 fokussierte Dashboard-/Quellenauswahltests, Designsprachpruefung sowie Client-/Server-Produktionsbuild bestanden. Die Live-Pruefung am Dummy bestaetigt in Light und Dark null `Tabular Data`-Kacheln und weiterhin fuenf erkannte Security-Scoring-Quellen; Dark wurde als Ausgangsthema wiederhergestellt. + +Accepted-Risks-Manage-Client-Uebernahme 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): Accepted Risks verwendet nun die Data-Hub-Manage-Client-Logik als feste Master-/Detail-Flaeche. Links liegen Ueberschrift, Zaehler, eigenstaendig scrollende Risikoauswahl, gelbe persistente Auswahlmarkierung sowie getrennte Status-/Reviewangaben; rechts liegen `Risk Information`, der vollstaendige ausgewaehlte Datensatz, die einzeln aufklappbaren Detailgruppen und die Aktion `Open finding`. Pfeil hoch/runter sowie Home/End wechseln Auswahl und Fokus gemeinsam; schmale Breiten stapeln beide Bereiche ohne horizontalen Ueberhang. Risikodaten, Historie und Governance-Zustaende bleiben unveraendert. + +Abnahme der Accepted-Risks-Uebernahme: 18 fokussierte Dashboard-/Risk-Register-/Quellenauswahltests, Designsprachpruefung sowie Client-/Server-Produktionsbuild bestanden. Am Dummy messen Navigation und Information dieselbe 557,50-px-Hoehe; die Navigation verwendet die freigegebene 520-px-Obergrenze. `Open finding` wurde live gegen den richtigen Work-Datensatz geprueft. Light und Dark sind visuell geprueft; Client Info und Dark wurden danach wiederhergestellt. + +Overall-Score-Sekundaerwerte 2026-09-20 (Phase 7, ausdrueckliche Nutzerkorrektur, umgesetzt): `Unassessed` und `Lowest domain pass rate` sowie ihr kompletter Trenn-/Layoutblock entfallen aus Overall Score. Die autoritativen Darstellungen bleiben unveraendert in Assessment Gaps beziehungsweise an den einzelnen Security-Domain-Knoten; Daten, Scoreberechnung und Drilldowns werden nicht geaendert. + +Abnahme der Sekundaerwert-Entfernung: 19 fokussierte Dashboardtests, Designsprachpruefung sowie Client-/Server-Produktionsbuild bestanden. Die Live-Pruefung am Dummy bestaetigt in Light und Dark null Sekundaercontainer und keine beiden Labels im Overall-Bereich; `Unassessed controls` bleibt in Assessment Gaps sichtbar. Dark wurde als Ausgangsthema wiederhergestellt. + +Abnahme dieser Korrektur: 12 fokussierte synthetische Dashboard-/Risikoregistertests, Client-/Server-Produktionsbuild sowie Local-only-/Designpruefung bestanden. Gesamtsuite: 1.416 bestanden, 13 optionale PostgreSQL-Tests uebersprungen; der bekannte fachfremde XML-Reader-Test mit seiner zu breiten `code`-Element-Annahme bleibt unveraendert fehlgeschlagen. Die abschliessende Breitenmessung am ausdruecklich freigegebenen Dummy bestaetigt fuer Posture und Aktionsrail exakt 1324,02 px bei 2660,02 px Gesamtbreite sowie dieselbe 744,80-px-Hoehe und Unterkante. Accepted Risks verwendet 520 px fuer die Auswahl und die restliche Breite fuer die Informationsflaeche. Light und Dark sind visuell geprueft; bei 700 px stapelt das Register ohne horizontalen Ueberhang. Bestehender Bundlegroessenhinweis und Phasenstatus bleiben unveraendert. + +Client-Info-Designangleichung 2026-09-18 (Phase 7, ausdruecklicher Nutzerauftrag, umgesetzt): Die Oberflaeche verwendet nun gemeinsame Theme-/Statusrollen, eckige flache Tiles, kompakte Controls und lesbare Inter-Rollen entsprechend Data Hub, Work und Pathfinder. Die ausdruecklich gewuenschten dynamischen Kurven vom Overall Score zu den Security Domains bleiben als verbindliches Merkmal erhalten. Source Overview nutzt nicht gestreckte Kachelbreiten; seine Methodik-Schaltflaeche erbt nicht mehr versehentlich die Geometrie einer Quellenkachel. Environment Detail startet als aufklappbare Evidenzzeile; das Accepted-Risks-Register behaelt seine sichtbare Auswahl/Zusammenfassung und bietet einzeln aufklappbare vollstaendige Details. Wiederholte Null-Kontextangaben an Domaenen entfallen, positive Diagnose-/Reviewzahlen bleiben sichtbar. Daten, Scoreberechnung, Provenienz, Filter-/Drilldownidentitaeten und Risikoentscheidungen bleiben unveraendert. + +Abnahme dieser Designangleichung: 47 fokussierte synthetische Dashboard-, Risk-Register-, Inventar- und Domain-Interaktionstests bestanden. Client-/Server-Typechecks, isolierter Client-Produktionsbuild und Design-/Local-only-Pruefung bestanden. Zusaetzlicher synthetischer Edge-Browsercheck in Light/Dark bei 1600, 1100, 860 und 390 px: kein horizontaler Ueberhang, eckige Tiles, exakt zentrierte Scorezahl, 28px Methodik-Control, acht Kurven mit weniger als 1px Zielabweichung in der nebeneinanderstehenden Darstellung sowie Auf-/Zuklappen per Tastatur und Reset beim Risikowechsel. Schmale Ansichten behalten den bisherigen gestapelten Fallback ohne waagerechte Kurven. Screenshots sind ausschliesslich synthetisch. Keine Kundendaten, laufenden Dienste oder regulaeren Build-Verzeichnisse veraendert; keine gesamte Projektsuite behauptet. Bestehender Bundlegroessenhinweis und Phasenstatus bleiben unveraendert. + +Work-Ansichtsexport 2026-09-18 (Phase 7, ausdruecklicher Nutzerauftrag, verifiziert): Die bestehenden CSV-/MD-/HTML-Buttons exportieren jetzt alle aktuell gefilterten/sortierten Work-Treffer einschliesslich verknuepfter und eingebetteter Results statt aller markierten Eintraege ueber mehrere Blaetter. Eine gemeinsame klickzeitgebundene Projektion liefert genau zwei Inhaltsspalten, Soll-Zustand und Abweichungen, mit nativen Anleitungen, Pruefnachweisen, Originalwerten, Baselinevarianten, GPO-Quellbelegen und offen ausgewiesenen Evidenzluecken. Aktives My Workspace, Timeslot, Suche, Facetten und Drilldown bleiben wirksam. HTML ist skriptfrei, offline mit eingebettetem lokalem Inter; lange CSV-Zellen erhalten verlustfreie Fortsetzungszeilen derselben Finding-ID. Dies ist ein Ansichtssnapshot, kein Ersatz fuer die kuratierte Arbeitsgrundlage oder die vier Artefakte der Reportstrategie. Keine Daten-/Schema-/Scoring-/Importaenderung. + +Abnahme und Risiko Work-Ansichtsexport: 53 fokussierte Export-/Results-Tests bestanden; nach finaler Inter-Einbettung nochmals alle 16 neuen Export-/Interaktionstests bestanden. Gesamtsuite: 1.412 bestanden, 13 optionale PostgreSQL-Tests uebersprungen, ein bekannter fachfremder XML-Reader-Test unveraendert fehlgeschlagen; keine vollstaendig gruene Gesamtabnahme behauptet. Client-/Server-Produktionsbuild sowie Local-only-/Designpruefung bestanden; App HTTP 200, Backend ok. Nur der ausdruecklich freigegebene Dummy wurde lesend geprueft, einschliesslich seiner referenzierten oeffentlichen Baseline-Anleitungen: All 1.833 Work-Treffer / 9.917 Results-Zeilen / 27.059 gepruefte Zellen / 708 Textabschnitte; Deviation 477 Treffer / 7.599 Results-Zeilen. CSV-Roundtrip vollstaendig, keine Zelle ueber Excel-Limit und keine fehlenden Result-Referenzen im Dummy. Synthetischer Browsercheck bei normaler Breite und 390 px ohne horizontalen Ueberhang. Bestehender Bundlegroessenhinweis bleibt; sehr grosse Ansichten erzeugen entsprechend grosse statische Dokumente. Phasenstatus unveraendert. + +Designverankerung 2026-09-18 (Phase 7, ausdrueckliche Nutzerkorrektur): Die aktuell freigegebenen Ansichten Data Hub, Work und Pathfinder sind die verbindlichen Referenzen der Ableton-inspirierten ASSESSOR-Designsprache, ausdruecklich auch fuer Client Info, Bildentwuerfe und Prototypen. Die bisherige visuelle Client-Info-Ausnahme ist aufgehoben; fachliche Inhalte, Scoresemantik, Provenienz und Drilldowns bleiben bindend. AGENTS.md, lokaler assessor-ui-Skill, Referenzvorrang und veraltete Asset-Kopieranleitung wurden auf diesen Vertrag ausgerichtet. Status: Designvertrag verankert; die drei verworfenen generischen Mockups sind nicht freigegeben, eine entsprechende Client-Info-UI-Neugestaltung ist damit noch nicht umgesetzt oder visuell abgenommen. Bestehende Phasenstatus unveraendert; keine App-, Daten-, API- oder Persistenzaenderung in diesem Dokumentationsschritt. + +Security-Domain-Korrektur 2026-09-18 (Phase 7, ausdruecklicher Nutzerauftrag): Work bietet alle acht unveraenderten Client-Info-Security-Domains in Katalogreihenfolge dauerhaft an, einschliesslich null Treffern in gemischtem Scope und beiden GPO-Einstiegen. Vorhandenes Unclassified bleibt zusaetzlich erhalten. Die Zaehler beachten andere aktive Filter; ausgewaehlte Nulltreffer bleiben sichtbar, ohne Status oder weitere gueltige Filter automatisch zu entfernen. Ein Client-Info-Domain-Deviation-Klick setzt den sichtbaren Domainfilter statt einer festen Record-ID-Auswahl, sodass nach dem Wechsel weitere Domains gewaehlt werden koennen. Vier neue synthetische UI-Interaktionstests sichern den Ein-Domain-Fall, beide GPO-Einstiege, Nulltrefferauswahl, Status-/Severity-Erhalt und Client-Info-Wechsel mit Quellfilter. 40 fokussierte Tests bestanden; abschliessende Build-/Gesamtabnahme folgt unten. Keine Klassifikations-, Score-, API-, Import- oder Persistenzaenderung; keine Mandantendaten gelesen. Phasenstatus unveraendert. + +Abnahme Security-Domain-Korrektur 2026-09-18: 40 fokussierte Tests, Client-/Server-Produktionsbuild, Local-only-/Designpruefung und technische App-/Backend-Erreichbarkeit bestanden. Gesamtsuite: 1.381 bestanden, 13 optionale PostgreSQL-Tests uebersprungen; zwei Fehler (bekannte fachfremde XML-Reader-Testannahme und Timeout des allgemeinen Node-Importtests). Der isolierte Wiederholungslauf des Node-Importtests bestand mit allen fuenf Tests; Timeouts wurden nicht angehoben. Der unveraenderte XML-Test bleibt offen. Keine Kunden-/Dummy-Dateninspektion; kein Reimport, keine Neuauswertung, kein Schema-/Datenbankeingriff. Phasenstatus unveraendert. + +Abschliessender Gesamtlauf zum GPO-Zaehlerfix 2026-09-18: 1.358 Tests bestanden, 13 optionale PostgreSQL-Tests uebersprungen, ein unveraenderter fachfremder XML-Reader-Test fehlgeschlagen; keine Timeout-/RPC-Fehler im Wiederholungslauf. Die fuenf neuen optionalen PostgreSQL-Paritaetstests wurden separat tatsaechlich ausgefuehrt und bestanden. Local-only-/Designpruefung separat gruen. Keine vollstaendig gruene Gesamtsuite behauptet. + +Verifiziert 2026-09-18 (Phase 7/13B, Result-DB-/Work-Zaehlerabgleich): PostgreSQL waehlt aktuelle Policy-Evaluationen jetzt nach der Anzahl verschiedener tatsaechlich verglichener Baseline-Pakete, mit Analyseverweisen nur als Fallback bei fehlenden Baseline-IDs und danach Zeit/ID als Tie-Breaker, entsprechend dem bestehenden Work-Selektor. Wiederholte Analysegenerationen desselben Pakets verdraengen damit keinen neueren gleich breit abdeckenden Lauf. Work-Deviation folgt dem autoritativen Fail-Urteil, auch bei explizit erforderlicher, aber fehlender Registry-Praesenz; gewoehnliche fehlende Empfehlungen bleiben Not configured. 50 fokussierte Tests inklusive fuenf direkt in PostgreSQL ausgefuehrter rein synthetischer SELECT/CTE-Paritaetsfaelle bestanden; Client-/Server-Produktionsbuild sowie Local-only-/Designpruefung erfolgreich. Ausdruecklich freigegebener Dummy lesend geprueft: 127 aktuelle Fail-Vergleiche, exakt dieselben 25 technischen Identitaeten in Work, Deviation 25, keine ausgeblendeten Fail-Urteile und keine zusaetzlichen Vergleichspaare. Keine Bestandsmutation, Migration, Reimport oder Neuauswertung; Fremdkunden nicht gelesen. Die Gesamtsuite ist wegen einer unabhaengigen bestehenden XML-Reader-Testannahme nicht vollstaendig gruen; Details im Abnahmebericht. Phasenstatus unveraendert. + +Verifiziert 2026-09-18 (Phase 7/13B, konsistente Result-DB-Statusfilter): Result DB und Work verwenden denselben Bezeichnungskatalog; Match wird Passed, Misconfigured wird Deviation, Conflict/Duplicate werden Conflicts/Duplicates und die Result-DB-Gruppe heisst Result Status. Auch Resultdetails verwenden diese Labels. Die Statuszaehler beachten Deviation und alle anderen aktiven Filter; nur die eigene Auswahl wird fuer erreichbare Alternativen ausgenommen. Statusauswahl und Abwahl setzen Deviation nicht mehr automatisch zurueck. Ausgewaehlte Status- und boolesche Nulltrefferfilter bleiben sichtbar und abwaehlbar. Zwei neue synthetische Result-DB-Interaktionstests sichern reine GPO- und gemischte Timeslots, Yes/No/All, Mehrfachauswahl, Nulltreffer, Detailbezeichnung und Scope; 45 fokussierte Tests, Local-only-/Designpruefung und Client-/Server-Produktionsbuild bestanden. Gespeicherte Klassen, Einzelvergleichszaehlung und Datenschutzgrenze bleiben erhalten; keine Kunden-/Dummy-Dateninspektion. Phasenstatus unveraendert. + +Verifiziert 2026-09-18 (Phase 7/13B, langer Security-Template-Registrytitel): Der vorherige Ueberhangfix erfasste nur Titel mit `registry ·`, waehrend Security-Template-Findings den Vertrag `Registry Values · MACHINE\\...` verwenden. `PathText` erkennt nun auch diesen exakten Titelvertrag und behandelt `MACHINE\\`/`USER\\` nur in diesem Registry-Values-Kontext als technischen Pfad. Dadurch umbrechen Reader-Heading und Summary innerhalb ihrer Minmax-Spalte und bleiben vor `Accepted Risk`; allgemeine AppLocker-/User-group-Texte werden nicht als Pfad umklassifiziert. Zwei synthetische Regressionen sichern den konkreten langen Titel, Suchmarkierung, beide Readerpositionen und den bewusst unveraenderten allgemeinen `MACHINE\\`-Fall. Gesamtsuite: 1.351 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Produktionsbuild erfolgreich. Keine Kunden-/Dummy-Daten gelesen oder geaendert, keine API-, SQL-, Persistenz- oder Fachlogikaenderung. Phasenstatus bleibt in Arbeit. + +Verifiziert 2026-09-18 (Phase 7/13B, eine Work-Zeile je GPO-Einstellung): Mehrere Baseline-Paketvergleiche derselben technischen Identitaet werden innerhalb desselben Projekts, Aggregationslaufs und Scopes zu einer Work-Zeile zusammengefuehrt. Der bestehende Policy-Zaehler und die Zeile teilen dieselbe Urteilprioritaet. Individuelle Baselinefilter, alle Empfehlungen/Settingreferenzen, Quellprovenienz, historische Readiness sowie echte Conflict-/Duplicate-Merkmale bleiben erhalten. Wertmarkierungen pruefen alle beteiligten aktuellen Varianten; unbekannte/historische Varianten werden nicht aus dem Beweis entfernt. Alte lokale Baseline-Notizen bleiben lesbar; nur uebereinstimmende Notizen werden uebernommen, keine Risikoakzeptanz wird umgehaengt. Zehn neue synthetische Tests sichern den Neun-Pakete-Fall in beiden Work-Einstiegen, Filter, unterschiedliche Sollwerte, Historie, Scopegrenzen und Review-Erhalt. Gesamtsuite: 1.349 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und Client-/Serverbuild erfolgreich. Keine Kunden-/Dummy-Daten gelesen oder geaendert, keine API-/SQL-/Persistenz-/Evaluatoraenderung. Phasenstatus bleibt in Arbeit. + +GPO-Quellwiederherstellung 2026-09-17 (Phase 13B, Nutzerauftrag, verifiziert): Fehlende GPO-Artefaktdateien ergeben jetzt bereits beim Statuslesen Upload required mit gezieltem ZIP-/Ordnerupload; Zugriffsprobleme bleiben separat Storage unavailable. Reconciler, Retry und Reprocess pruefen vor dem Einreihen, nachtraeglich fehlende Quellen beenden einen bereits gestarteten Job nach einem Versuch. Der Originalupload prueft Projekt/Artefakt/Timeslot, Groesse und SHA-256, repariert auch den normalen Dublettenpfad und stellt nur fehlende Bytes atomar unter derselben Speicher-ID wieder her. Aktuelle Analysen, Originalzeitpunkte und Historie bleiben erhalten; reine Re-evaluation ueber erhaltene Eingaben bleibt erreichbar. 16 neue synthetische Regressionen sichern Service, HTTP, API-Client, beide Oberflaechen mit ZIP/Ordner, automatische Reparatur, ersten Fehler, Zugriffsfehler, falsche Quelle, fremde Scopes, Wiederherstellung ohne Revisionswechsel sowie Local-/PostgreSQL-Jobverhalten und konkurrierende Dateiwiederherstellung. npm test: 1.336 bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Kein Parser-/Analyzer-/Manifestbump, keine SQL-Migration, kein Zugriff auf Kundeninhalte, keine Live-Datenmutation und kein Backendneustart. Bestehender Bundlegroessenhinweis bleibt; Phase 13B bleibt in Arbeit. + +Principal-Abweichungen mitgliedsgenau markiert 2026-09-17 (Phase 7/13B, Nutzerfehlerbericht, zielgerichtet verifiziert): Die Ursache der falschen roten Flaeche war der zuvor eingefuehrte Ganzwert-Fallback fuer nicht-Registry-GPO-Werte. Ein Principal-Set wurde dadurch trotz eines mit der Baseline uebereinstimmenden Mitglieds vollstaendig rot dargestellt. Principal-Sets werden jetzt auf Mitgliedsebene verglichen: Nur konfigurierte Principals, die in keiner aktuellen Baselinevariante erwartet werden, erhalten die rote Wertmarkierung; gemeinsame Principals bleiben neutral. Besteht die Abweichung ausschliesslich in einem fehlenden Soll-Principal, wird kein vorhandener korrekter Principal ersatzweise rot markiert. Synthetische Regressionen sichern zwei zusaetzliche, einen gemeinsamen und einen ausschliesslich fehlenden Principal sowie Suche, Filter und Navigation. 26 fokussierte GPO-Quellen-/Conflict-/Duplicate-Tests und beide Produktionsbuilds erfolgreich. Der parallele Gesamtlauf war nicht vollstaendig gruen: 1.312 Tests bestanden, acht optionale PostgreSQL-Tests wurden uebersprungen und fuenf fachlich unabhaengige Servertests trafen waehrend gleichzeitiger Security-Template-Aenderungen auf geaenderte Section-Casing-/Parser-/Analyzer-Versionen; ein aktueller fokussierter Wiederholungslauf bestaetigte den Principal-Fix und zeigte noch drei fremde Versionsannahmen (`1.1.0`/`2.2.3` gegen `1.2.0`/`2.2.4`). Reine Read-/Praesentationskorrektur ohne Reimport, Neuauswertung, API-, Persistenz-, Schema- oder Kundendatenzugriff; Phasenstatus unveraendert. + +Alle belegten GPO-Wertabweichungen rot markiert 2026-09-17 (Phase 7/13B, ausdrueckliche Nutzererweiterung, verifiziert): Die rote wertgenaue Markierung ist nicht mehr auf einzelne Data-Faelle beschraenkt. Registry.pol-Quellen markieren jetzt jede belegte abweichende Operation, Data und jeden abweichenden Type code, auch mehrere Felder gleichzeitig. Vergleichbare andere GPO-Wertarten erhalten dieselbe rote Wertmarkierung. Wenn jede aktuelle Baselinevariante eine Abweichung belegt, aber keine einzelne Feldursache allen Varianten gemeinsam ist, wird sicher der dargestellte Wert als Ganzes markiert, ohne eine spezifische Ursache zu erfinden. Review-required, unbewertete und passende Werte sowie Quellenabschnitt, Heading, Evidence-Pfad und Diagnose-Badges bleiben neutral. Synthetische Regressionen sichern Operation, Data, Type code, kombinierte Feldabweichungen, skalare GPO-Werte, Suche, Filter und Navigation. 1.317 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; beide TypeScript-Ziele, Local-only-, Design- sowie Client-/Server-Produktionsbuild erfolgreich. Reine aktuelle Read-/Praesentationsprojektion ohne Reimport, Neuauswertung, API-, Persistenz-, Schema- oder Kundendatenzugriff; Phasenstatus unveraendert. Bestehender Bundlegroessenhinweis bleibt. + +Backend-Verbindungsstatus als ASSESSOR-Popup 2026-09-17 (Phase 7, ausdrueckliche Nutzerkorrektur, verifiziert): Die bisherige eingebettete Warnflaeche fuer `Backend is unreachable` ist in Data Hub, Result DB und DB Structure durch einen gemeinsamen ASSESSOR-Standarddialog ersetzt. Titel, Warnmarker, bereichsspezifische Auswirkung und der Hinweis auf die automatische Verbindungspruefung bleiben sichtbar; der Dialog ist schliessbar, waehrend die zugrunde liegende Ansicht erhalten bleibt. Die bestehende Health-Pruefung laeuft unveraendert weiter und entfernt den Offline-Zweig nach erfolgreicher Verbindung automatisch. Permanente synthetische Regressionen pruefen Portal-/Dialogstil, Meldung, Schliessen und alle drei Einstiegspfade. 1.313 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; beide TypeScript-Ziele, Local-only-, Design- sowie Client-/Server-Produktionsbuild erfolgreich. Reine Praesentationsaenderung ohne API-, Import-, Persistenz-, Schema-, Reimport- oder Kundendatenzugriff; Phasenstatus unveraendert. Bestehender Bundlegroessenhinweis bleibt. + +Client-Info-Security-Domains als Work-Filter 2026-09-17 (Phase 7, ausdrueckliche Nutzererweiterung, verifiziert): Work besitzt jetzt direkt nach `Category` die eigene Facette `Security Domain`. Sie verwendet denselben extrahierten Katalog und dieselbe gecachte Datensatzzuordnung wie die acht Security Domains in Client Info; es existiert keine zweite Filterklassifikation. Damit filtern unter anderem `Identity & Account Hygiene`, `System Hardening`, `GPO & Baseline` und `Monitoring & Recovery` exakt die von Client Info derselben Domain zugeordneten Datensaetze. Die Facette ist im gemischten Work-Kontext sowie in beiden GPO-Einstiegen sichtbar; ein reiner GPO-Scope zeigt `GPO & Baseline`. `Source: Scan` bleibt der letzte Filter und bestehende aktive Work-Filter gelten weiter. Permanente synthetische Regressionen sichern gemeinsamen Katalog, identische Record-Identitaeten, Filterwirkung, GPO-Einwertscope, Reihenfolge, Zaehler und Kontextwechsel. 1.307 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; beide TypeScript-Ziele, Local-only-, Design- sowie Client-/Server-Produktionsbuild erfolgreich. Reine gemeinsame Ableitungs-/Facettenkorrektur ohne Import-, Persistenz-, Schema-, Reimport- oder Kundendatenzugriff; Phasenstatus unveraendert. Bestehender Bundlegroessenhinweis bleibt. + +GPO-Category-Filter wiederhergestellt 2026-09-17 (Phase 7/13B, Nutzerfehlerbericht und ausdrueckliche Korrektur, verifiziert): Die Ursache war die fruehere GPO-Kontext-Sonderregel, die `Category` sowohl bei `Source: Scan = GPOs` als auch auf dem dedizierten GPO-Blatt aktiv ausblendete. `Category` ist jetzt in beiden unterstuetzten GPO-Einstiegen wieder der permanente zweite Filter direkt hinter `Result Status`; er bleibt auch sichtbar, wenn `GPOs` der einzige aktuelle Kategorienwert ist. Im gemischten Work-Kontext bleibt die bisherige Category-Facette unveraendert. Andere im reinen GPO-Kontext ausgeschlossene Scannerfacetten bleiben ausgeschlossen und `Source: Scan` bleibt der letzte Filter. Permanente synthetische Regressionen sichern beide GPO-Einstiege, die exakte Reihenfolge, GPO-exklusive Zaehler, die Einwertkategorie, Kontextwechsel und Filterwirkung. 1.306 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; TypeScript-, Local-only-, Design- sowie Client-/Server-Produktionsbuild erfolgreich. Reine Facetten-/Praesentationskorrektur ohne Import-, Bewertungs-, Persistenz-, Schema-, Reimport- oder Kundendatenzugriff; Phasenstatus unveraendert. Bestehender Bundlegroessenhinweis bleibt. + +GPO-Abweichung nur am Wert 2026-09-17 (Phase 7/13B, ausdrueckliche Nutzerkorrektur, verifiziert): Die rote Flaeche und Akzentlinie am gesamten GPO-Quellenabschnitt sind entfernt. Jeder Quellenabschnitt bleibt neutral; rot hinterlegt wird ausschliesslich die konkrete dargestellte Zeile, deren Feld gegen jede gespeicherte aktuelle Baselinevariante eindeutig abweicht: `Operation` bei einer Operationsabweichung, `Data` bei einer Datenabweichung und `Type code` bei einer Typabweichung. Mehrere Felder werden nur markiert, wenn jedes unabhaengig belegt ist; bei uneinheitlicher Variantenursache wird kein Feld geraten. Conflict-Badge, Heading, Evidence, Key und Value name erhalten keine rote Hinterlegung. Synthetische Regressionen pruefen `Operation: delete-value`, `Data: 0`, einen reinen Typfehler, exakt eine Markierung im Finding sowie Suche, Filter und Navigation. 1.305 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; TypeScript-, Local-only-, Design- sowie Client-/Server-Produktionsbuild erfolgreich. Reine aktuelle Read-/Praesentationsprojektion ohne Reimport, automatische Neuauswertung, Migration oder Kundendateninspektion; Phasenstatus unveraendert. Bestehender Bundlegroessenhinweis bleibt. + +GPO-Quellenabschnitte mit roter Abweichung 2026-09-17 (Phase 7/13B, ausdrueckliche Nutzerkorrektur, verifiziert): Die unmittelbar zuvor gewaehlte flache Tabelle ist ausdruecklich wieder durch vollstaendige, untereinanderliegende GPO-Quellenabschnitte ersetzt. Evidence, quelllokale Sequenz sowie Operation, Key, Value name, Data und Type code sind ohne Aufklappen sichtbar; Operation und Data bleiben fett. Nur ein durch die gespeicherten aktuellen Baselinevarianten fuer diesen einzelnen Quellwert eindeutig belegter abweichender Abschnitt erhaelt eine dezente rote Flaeche, eine rote linke Akzentlinie und `Conflicting contribution`. Passende, historische, mehrdeutige oder innerhalb eines Backups aus mehreren Anweisungen bestehende Quellen bleiben neutral; GPO-Praezedenz und effektiver Endgeraetewert werden nicht erfunden. Permanente synthetische Regressionen sichern Darstellung, rote Quellenklasse, vollstaendige Fakten, beide Work-Einstiege, Deviation/Conflicts, Suche, Navigation und unveraenderte Originale. 1.305 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; TypeScript-, Local-only-, Design- sowie Client-/Server-Produktionsbuild erfolgreich. Reine aktuelle Read-/Praesentationsprojektion ohne Reimport, automatische Neuauswertung, Migration oder Kundendateninspektion; Phasenstatus unveraendert. Bestehender Bundlegroessenhinweis bleibt. + +GPO-Quellenzuordnung als Tabelle 2026-09-17 (Phase 7/13B, ausdrueckliche Nutzerentscheidung, verifiziert): Die zuvor gestapelten Quellenabschnitte sind im Finding Reader durch die gewaehlte flache Tabelle mit exakt `GPO source`, `Operation`, `Data`, `Type` und `Evidence` ersetzt. Jede exakte Backupidentitaet belegt eine Zeile; Operation und Data bleiben fett, Data und Typ stehen in kompakten Feldern, und der sichere Evidence-Pfad bleibt unmittelbar sichtbar. `Show source details` erhaelt vollstaendige native GPO-/Backupidentitaet, quelllokale Sequenz, Evidence, Key, Value name und jede Originalanweisung. Ein roter Marker und `Conflicting contribution` erscheinen nur, wenn die gespeicherten aktuellen Baselinevarianten den einzelnen Quellwert unabhaengig als abweichend belegen; Gruen nur bei Uebereinstimmung mit allen Varianten. Historische Auswertungen, mehrere Anweisungen innerhalb desselben Backups, GPO-Praezedenz und effektiver Endgeraetewert werden nicht als Einzelquellenurteil erfunden. Permanenter synthetischer Interaktionstest sichert beide Work-Einstiege, Deviation/Conflicts, Suche, Navigation, die fuenf Spalten, Details und unveraenderte Originale. 1.305 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; TypeScript-, Local-only-, Design- sowie Client-/Server-Produktionsbuild erfolgreich. Reine aktuelle Read-/Praesentationsprojektion ueber erhaltene Fakten, ohne Reimport, automatische Neuauswertung, Migration oder Kundendateninspektion; Phasenstatus unveraendert. Bestehender Bundlegroessenhinweis bleibt. + +GPO-Quellenzuordnung 2026-09-17 (Phase 7/13B, ausdruecklicher Nutzerauftrag, verifiziert): Der Finding Reader zeigt Originalanweisungen sofort getrennt nach exakter Projekt-/Assessment-/Backupinstanzidentitaet, mit Quellenzahl, erhaltenen nativen GPO-/Backup-IDs, internem Quellpfad und quelllokaler Sequenz. Operation und Data bleiben fett; Loeschung, leerer String, Leerzeichen und 0 bleiben unterscheidbar. Mehrere GPOs werden nicht als Ausfuehrungskette oder wirksamer Endgeraetewert dargestellt. Die unmittelbare Quellenzuordnung ersetzt die bisherige Results-only-Verbergung; Results bleibt fuer Varianten erhalten. Die gemeinsame Local-/PostgreSQL-Readprojektion reicht nur bereits gespeicherte Identitaeten/Sequenzen additiv weiter; lesbare GPO-Namen sind nicht gespeichert und werden nicht erfunden. Fehlerursache der fehlenden Conflict-Kennzeichnung: Die alte Ableitung beruecksichtigte nur set-value-Beobachtungen. Versionierte Vergleiche verwenden jetzt den erhaltenen autoritativen customerState; fruehere Anweisungen derselben GPO erzeugen keine zusaetzliche Konfliktzeile und reduzierte identische Beitraege mehrerer Backups bleiben Duplicate. Bei indeterminate bleiben nur durch verschiedene eindeutige Backups und erhaltene Vergleichswerte belegte Unterschiede als Conflict sichtbar; unsichere Backups liefern dafuer keine Einzelwertbeweise. Urteil, Score und historische Re-evaluation-Grenze bleiben erhalten. 20 neue synthetische Regressionen sichern beide Work-Einstiege, Deviation/Conflicts, Suche, Quellenzuordnung, Datensatzwechsel, Identitaeten, Sequenz 0, partielle Konfliktbeweise und unveraenderte Originale. 1.304 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und Client-/Serverbuild erfolgreich. App und Backend inhaltsfrei gesund geprueft. Kein Reimport, keine automatische Neuauswertung, Datenmigration oder Kundendateninspektion; Projekt zum erneuten Laden der Readprojektion neu oeffnen. Restrisiko: GPO-Namen fehlen weiterhin, Geltungsbereich/Praezedenz und effektiver Endgeraetewert bleiben unbelegt; bestehender Bundlegroessenhinweis. Phasenstatus unveraendert. + +GPO-Wertdarstellung 2026-09-17 (Phase 7, Nutzerwunsch, verifiziert): Operation und Data samt Werten werden im Policy-Vergleich des Finding Readers mit dem gemeinsamen Bold-Token 700 hervorgehoben. Pfadtextboxen, Suchmarkierung, Originaltext und Bewertungslogik bleiben erhalten. Bestehende synthetische Readerregression erweitert; 1.284 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen, Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Reine Darstellung ohne Reimport oder Neuauswertung; kein neuer fachlicher Risikoeingriff und Phasenstatus unveraendert. Die Reihenfolge dargestellter Quellen ist weiterhin kein Nachweis einer GPO-uebergreifenden Ausfuehrungsreihenfolge. + +GPO-Quellenfilter 2026-09-17 (Phase 7/13B, ausdruecklicher Nutzerauftrag, verifiziert): Work ergaenzt im GPO-Blatt und bei Source: Scan = GPOs den Filter `GPO backups with failing settings`, mit Gesamtauswahl und einzelnen GPO-Backupinstanzen. Entscheidung: Filter und Processing-Kachel verwenden denselben exakten Projekt-/Assessment-/Backupinstanzschluessel und dieselben Quellen der Fail-Vergleiche; es werden keine Einzel-GPO-Urteile erfunden. Die Auswahl setzt Result Status explizit auf All, damit historische Fail-Vergleiche trotz ihres erhaltenen Review-required-Status sichtbar bleiben; weitere Filter gelten weiter. Source: Scan bleibt zuletzt, inkompatible Filter verschwinden beim Kontextwechsel, native Optionen werden erst vor Pointer-/Tastaturzugriff vollstaendig montiert. Vier neue synthetische Tests sichern 26 Quellen jenseits des allgemeinen Kategorienlimits, Einzel-/Gesamtauswahl, den passenden Mitgliedswert eines gemeinsamen Fail, beide Work-Einstiege, Historie, Statuskombination, Reset, Kontextwechsel, exakte Identitaeten und Cacheinvalidierung. 1.284 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Restrisiko/Lesart: Quellenbeteiligung ist kein eigener Fail jeder GPO; Work ist auf den geladenen Scope begrenzt, die Processing-Kachel bleibt projektweit. Reine Darstellung ueber erhaltene Fakten, kein Reimport, keine Neuauswertung, Migration oder Kundendateninspektion. Phasenstatus bleibt unveraendert; bestehender Bundlegroessenhinweis bleibt. + +GPO-Registry-Zustandsvergleich 2026-09-16 (Phase 7/13B, ausdrueckliche Nutzerentscheidung): Evaluator 1.9.0 behandelt `delete-value`, `delete-all-values`, `create-key` und typisierte leere Zeichenfolgen als ausdrueckliche Sollzustaende statt als `Baselinewert nicht verfuegbar`. Delete-Anforderungen bestehen bei Abwesenheit beziehungsweise passender Delete-Instruktion und schlagen bei einem gesetzten Ziel fehl; Delete-all beruecksichtigt konfigurierte Kindwerte desselben Schluessels. Create-key besteht bei expliziter Anlage oder durch konfigurierte Kindwerte belegter Schluesselanwesenheit und schlaegt bei Abwesenheit fehl. Leere REG_SZ/REG_EXPAND_SZ bleiben vorhandene, typisierte Werte. Schluesselvergleiche speichern alle beitragenden Aggregationszustands- und Beobachtungsreferenzen. Die Regeln gelten nur fuer die analysierte Backup-Konfiguration, nicht fuer effektiven Geraetezustand. Historische Laeufe bis 1.8.0 bleiben unveraendert und benoetigen eine ausdrueckliche Re-evaluation; kein Quelldatei-Reimport, Processing-Manifest- oder SQL-Schemawechsel. 32 fokussierte Comparator-/Evaluatorregressionen sowie exakte Work-Statuspruefungen bestanden; Gesamtlauf mit 1.280 bestandenen Tests und acht uebersprungenen optionalen PostgreSQL-Integrationstests, Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Phasenstatus bleibt in Arbeit. + +GPO-Not-configured im analysierten Backup-Scope 2026-09-16 (Phase 7/13B, Nutzerfehlerbericht): Der Result-Status-Filter war vorhanden, erhielt jedoch fuer einen ausgewaehlten beziehungsweise technisch partiellen GPO-Backupsatz keine Treffer, weil Evaluator 1.7.0 jede dort nicht beobachtete anwendbare Empfehlung pauschal als `Review required` sperrte. Evaluator 1.8.0 klassifiziert diese Abwesenheit jetzt als score-neutrales `Not configured` innerhalb genau des analysierten Backupsatzes und erhaelt `policy-evaluation-customer-absence-scope-limited` als sichtbare Diagnose. Das ist weder eine Aussage ueber die gesamte Domaene noch ueber den effektiven Geraetezustand. Work projiziert das Urteil in den autoritativen Status; die direkte Nutzerinteraktion `Result Status = Not configured` liefert die Zeile und `Deviation` nicht. Historische Evaluationen bis 1.7.0 werden nicht still umgedeutet: Data Hub bietet dafuer die bestehende ausdrueckliche Re-evaluation der erhaltenen Eingaben an; kein Quelldatei-Reimport, Processing-Manifest- oder Schemawechsel. 56 fokussierte GPO-Bewertungs-, Projektions-, Filter- und Panelregressionen sowie die exakte Work-Interaktion bestanden. Vollstaendiger Lauf mit 1.277 bestandenen Tests und acht uebersprungenen optionalen PostgreSQL-Integrationstests, Local-only-/Designpruefung sowie Client-/Server-Produktionsbuild erfolgreich. Phasenstatus bleibt in Arbeit. + +GPO-Analyse-Zaehlebenen bereinigt 2026-09-16 (Phase 7/13B, Nutzerfehlerbericht): Die Data-Hub-GPO-Analyse mischt keine Analyse-Laeufe, Baseline-Vergleichszeilen, technischen Einstellungen, Backups und Diagnoseereignisse mehr in einer scheinbar addierbaren Ergebnisgruppe. `Policy verdicts` zaehlt je Aggregation/Timeslot und technischer Policy-Identitaet genau ein Urteil mit der Prioritaet Fail vor Review required vor Pass vor Not configured; damit koennen mehrere Baseline-Vergleiche derselben Einstellung die fachliche Zahl nicht mehr vervielfachen. Conflict und Duplicate stehen separat als ueberlappende, score-neutrale `Diagnostic flags`. `Analysis gaps` trennt Unresolved identity, Comparison not supported und Baseline mapping unavailable. Die irrefuehrende Bezeichnung `GPO sources` fuer einen Analyse-Lauf sowie der zusammengeworfene Wert `Unsupported settings` wurden entfernt; GPO-Backups mit fehlgeschlagenen Einstellungen stehen als eigene Provenienzkennzahl. Technische Einzelereignisse bleiben in Review Queue und Evaluation History nachvollziehbar, ohne als Findings ausgegeben zu werden. 28 fokussierte GPO-Panel-, Rollup-, Overview- und Statusregressionen, vollstaendiger Lauf mit 1.275 bestandenen Tests und acht uebersprungenen optionalen PostgreSQL-Integrationstests, Local-only-/Designpruefung sowie Client-/Server-Produktionsbuild erfolgreich. Reine Read-/Praesentationsableitung ueber erhaltene Fakten; kein Reimport, keine Bestandsmutation, Schema- oder Manifestaenderung. Phasenstatus bleibt in Arbeit. + +GPO-Verdict mit Diagnose-Badge 2026-09-16 (Phase 7/13B, Nutzerpraezisierung): Work zeigt das fachliche Policy-Urteil weiterhin als primaeren Status und ergaenzt Conflict/Duplicate additiv. Ein fehlgeschlagener Eintrag bleibt deshalb in Status, Filter und Score `Fail`/`Deviation`; in der linken Trefferliste und im geoeffneten Finding steht daneben das sichtbare Badge `CONFLICT` beziehungsweise `DUPLICATE`. Die Diagnose ersetzt das Urteil nicht und erzeugt keinen zweiten Scorebeitrag. Explizit negative Diagnosefelder wie `No`, `None`, `false` oder `0` erzeugen kein Badge. 61 fokussierte Finding-, Reader-, Badge- und GPO-Work-Regressionen sowie Client-/Server-Produktionsbuild erfolgreich; reine Darstellung ueber bereits projizierte Felder, daher kein Reimport, keine Neuauswertung, Schema- oder Manifestaenderung. Phasenstatus bleibt in Arbeit. + +GPO-Policy-Rollup bei Conflicts/Duplicates 2026-09-16 (Phase 7/13B, ausdrueckliche Nutzerpraezisierung, umgesetzt): Mit `Endpunkt` ist die zusammengefasste technische Policy-Einstellung gemeint, nicht ein Server oder Client. Evaluator 1.7.0 vergleicht die erhaltenen konfigurierten Mitgliedswerte eines Kundenkonflikts einzeln. Mindestens ein unabhaengig vergleichbarer In-Scope-Mitgliedswert mit belastbarem Fail macht die gesamte Policy-Einstellung einmalig zu Fail; ein ungeklaertes Mitglied blockiert nur, wenn kein belastbarer Fail vorliegt. Work fuehrt Verdict und Conflict-/Duplicate-Flags getrennt, projiziert keine zweite Diagnosezeile fuer dieselbe ausgewertete Einstellung und laesst dieselbe Zeile zugleich auf Deviation und Conflict/Duplicate filtern. Dashboard-Score und Policy-Impact zaehlen nur das Verdict; Diagnosezaehler werden je technischer Identitaet dedupliziert. `Not configured` bleibt score-neutral. Historische Laeufe bis 1.6.0 bleiben unveraendert und werden ueber den bestehenden Data-Hub-Pfad zur ausdruecklichen Re-evaluation angeboten; kein Scanner-Reimport, Schema- oder Processing-Manifestwechsel. 51 fokussierte Bewertungs-, Work-, Filter- und Duplicate-Regressionen sowie Client-/Server-Produktionsbuild, Local-only- und Designpruefung erfolgreich. Im Gesamtlauf bestanden 1.270 Tests unmittelbar; die eine geaenderte Duplicate-Regression und der bekannte lastabhaengige Node-Import-Timeout bestanden danach isoliert (14/14), acht optionale PostgreSQL-Integrationstests blieben uebersprungen. App und Backend wurden anschliessend gegen den gesunden kanonischen PostgreSQL-Datastore gestartet und antworten auf 5173/4173 mit HTTP 200. Phasenstatus bleibt in Arbeit. + +GPO-Misconfiguration-Scope und score-neutrale Kontextkategorien 2026-09-16 (Phase 7/13B, ausdrueckliche Nutzerentscheidung): Die normale GPO-Analyse bewertet ausschliesslich tatsaechlich konfigurierte, technisch vergleichbare Kundeneinstellungen im ausdruecklich anwendbaren Microsoft-Baseline-Scope. Eine empfohlene, aber fehlende Einstellung bleibt als `Not configured` sichtbar, erzeugt jedoch weder operatives Finding, Standard-Remediation noch Scoreabzug; eine vollstaendige Baseline-Einfuehrung ist ein separat beauftragter Hardening-Track. `Not configured`, `Duplicates` und `Conflicts` bleiben eigenstaendige score-neutrale Kategorien ausserhalb von Pass und Fail. Ausnahme: Ein konfigurierter Einzelwert innerhalb eines Duplicate-/Conflict-Containers, der bei eindeutiger Identitaet und Baseline fuer sich belastbar fehlschlaegt, zaehlt genau einmal als Fail; Quellmultiplikation und Containerstatus erzeugen oder vervielfachen keinen Fail. Der GPO-Score ist als Konformitaet der konfigurierten, vergleichbaren In-Scope-Einstellungen zu bezeichnen, niemals als vollstaendige Microsoft-Baseline-Compliance. Diese Festlegung ist in AGENTS.md, SCORING_MODEL.md und GPO_BASELINE_EVALUATION.md bindend dokumentiert. Dokumentations-/Vertragsentscheidung ohne Laufzeit-, Daten-, Persistenz-, Schema- oder Bestandsneuauswertung; die Einzel-Fail-Ausnahme muss vor Implementierungsabnahme durch deduplizierte Ergebnisidentitaet, synthetische Conflict-/Duplicate-Fixtures und gegebenenfalls neue Evaluator-/Scoringversion verifiziert werden. Phasenstatus bleibt in Arbeit. + +Work-Filter bei Source All 2026-09-16 (Phase 7, Nutzerfehlerbericht): `Source: Scan = All` zeigt wieder den gemischten Scannerkontext. GPO-exklusive Facetten wie Baseline, Comparison, Conflict, Description source, Diagnostics, Duplicates, Imported, Policy section und Policy type werden dort nicht mehr in die allgemeine Zehnerauswahl aufgenommen und koennen deshalb die Scannerfacetten nicht mehr verdraengen. Der vollstaendige GPO-Filtersatz bleibt unveraendert auf dem GPO-Blatt und bei einer eindeutigen GPO-Quellenauswahl verfuegbar. Beim Wechsel von GPOs zurueck zu All werden nicht mehr sichtbare kontextspezifische Auswahlen entfernt, sodass kein GPO-Filter unsichtbar weiterwirkt. Ein permanenter synthetischer Interaktionstest sichert den exakten Nutzerpfad `Source: Scan = GPOs` -> `Source: Scan = All`; 22 fokussierte Filter-/Interaktionstests, 1.272 Gesamttests, acht uebersprungene optionale PostgreSQL-Integrationstests, Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Reine Praesentations-/Filterzustandskorrektur ohne Daten-, Import-, Bewertungs-, API-, Persistenz-, Schema-, Manifest- oder Reimportaenderung; Phasenstatus unveraendert. + +Work-Ansichtssnapshots 2026-09-16 (Phase 7, Nutzerfehlerbericht): Ein Work-Snapshot speichert wieder die vollstaendig wirksame, gerade angezeigte Ansicht. Neben Blatt, Darstellungsmodus, Suche, Sortierung, Result Status, Facetten, My Workspace und aktueller Auswahl gehoert nun auch der durch Client-Info-/Pathfinder-Drilldowns gesetzte Finding-Scope zum gespeicherten Ansichtsstand; beim Oeffnen wird eine unabhaengige Kopie dieses Scopes atomar wiederhergestellt. Vorhandene Snapshots ohne Scopefeld bleiben lesbar und bedeuten wie bisher keine zusaetzliche Finding-Einschraenkung. Ein permanenter synthetischer Interaktionstest sichert den exakten Nutzerpfad Snapshot -> Name -> Save -> gespeicherten Snapshot oeffnen. Acht fokussierte Tests und Client-/Server-Produktionsbuild erfolgreich. Im Gesamtlauf bestanden 1.270 Tests, acht optionale PostgreSQL-Integrationstests wurden uebersprungen; der bekannte kombinierte Node-Importtest ueberschritt unter Gesamtlast einmal sein unveraendertes Fuenf-Sekunden-Limit und bestand isoliert mit 5/5 Tests in 4.709 ms. Local-only-/Designpruefung erfolgreich. Reine lokale Ansichtsstatuskorrektur ohne Daten-, Import-, Bewertungs-, Backend-, Persistenzschema-, Processing-Manifest- oder Reimportaenderung; Phasenstatus unveraendert. + +Work-Standardfilter 2026-09-15 (Phase 7, ausdrueckliche Nutzerentscheidung): `Result Status` startet beim normalen Einstieg in Work, beim Projekt-/Timeslot-/Blattwechsel, nach Importabschluss und nach Reset immer mit `Deviation`. Der bisherige GPO-Sonderfall mit automatischem `All` ist damit ausdruecklich ersetzt. Kommt der Einstieg dagegen aus Client Info, Pathfinder oder einem anderen Drilldown mit bereits gesetztem Such-, Facetten-, Pfad- oder Action-Filter, bleibt dieser Kontext einschliesslich eines dort bewusst gesetzten Status erhalten. Die normale Work-Navigation unterscheidet diese beiden Pfade jetzt explizit; eine GPO-Quellenauswahl setzt den Status nicht mehr eigenmaechtig auf `All`. Permanente synthetische Interaktionstests sichern normalen Einstieg, Client-Info-Filteruebergabe, GPO-Quelle, GPO-Blatt und expliziten GPO-Drilldown. Verifiziert mit 1.270 bestandenen Tests und acht uebersprungenen optionalen PostgreSQL-Integrationstests, Local-only-/Designpruefung sowie erfolgreichem Client-/Server-Produktionsbuild. Reine Zustands-/Navigationskorrektur ohne Daten-, Import-, Bewertungs-, Persistenz-, Schema-, Manifest- oder Reimportaenderung. + +GPO-Importstatus ohne manuelle Review-Aufforderung 2026-09-15 (Phase 7/13B, ausdrueckliche Nutzerkorrektur): Ein technisch partieller GPO-Verarbeitungslauf wird im Timeslot wieder als `Limited analysis` dargestellt. Er fordert weder zur manuellen Einzelpruefung hunderter GPOs auf noch erzeugt er daraus eine automatische Arbeitsaufgabe. Damit gilt die bereits am 2026-09-06 festgelegte Trennung zwischen gelber technischer Analysegrenze und echtem Handlungsbedarf erneut; die zwischenzeitliche Beschriftung `Partial · review required` war eine irrefuehrende UI-Regression und ist durch diese Entscheidung ersetzt. Die fail-closed Fachgrenze bleibt unveraendert: Nicht vollstaendig automatisch auswertbare Bereiche werden nicht als vollstaendig bewertet, aber auch nicht als manuelle Pflicht dargestellt. Exakte synthetische Renderregression prueft `Limited analysis` sowie die Abwesenheit von `review required` und `Imported`; 17 fokussierte Status-/Readiness-Tests, Gesamtlauf mit 1.268 bestandenen und acht uebersprungenen optionalen PostgreSQL-Tests, Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Keine Daten-, Import-, Bewertungs-, Persistenz-, Schema-, Manifest- oder Reimportaenderung. + +GPO-Analysezaehler 2026-09-15 (Phase 7/13B, Nutzerfehlerbericht): Die Ergebniszusammenfassung in Data Hub bindet ihre Vergleichsprojektion nun wie der Timeslot-Workspace an die vom Backend als aktuell ausgewiesenen Aggregationslaeufe. Ein historisch aufbewahrter Evaluationslauf aus einer ueberholten Aggregation kann dadurch nicht mehr gleichzeitig mit dem aktuellen Lauf in Misconfigured, Pass oder Not configured eingehen; die Historie bleibt ausschliesslich unter den technischen Evaluationsdetails sichtbar. `Review required` wird in der Baseline-Zusammenfassung explizit ausgewiesen, damit ein partieller GPO-Backupsatz und nicht belegte Abwesenheit nicht als bestaetigtes Not configured erscheinen. Permanente synthetische Komponentenregression bildet exakt einen Timeslot mit aktueller und historischer Aggregation ab. 26 fokussierte GPO-/Workspace-Tests und Client-/Server-Produktionsbuild erfolgreich. Gesamtlauf: 1.267 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; der bekannte kombinierte Node-Importtest ueberschritt unter Gesamtlast einmal sein unveraendertes Fuenf-Sekunden-Limit und bestand isoliert mit 5/5 Tests in 3.885 ms. Bestehender Bundlegroessenhinweis. Reine Read-/Praesentationskorrektur ohne Persistenz-, Bewertungs-, Import-, Schema-, Manifest- oder Reimportaenderung; keine Kundendatenmutation. + +Timeslot-Importlast 2026-09-15 (Phase 13 sowie Persistenz aus Phase 9-11): Ein gemeldeter Scannerimport wurde ausschliesslich ueber technische Audit-, Laufzeit- und Prozesssignale untersucht. Die Vorschau war nach 4,4 Sekunden abgeschlossen, waehrend der atomare Abschluss 200,3 Sekunden benoetigte. Gleichzeitig erzeugten dauerhaft montierte Data-Hub-Steuerelemente in fuenf Minuten 270 vollstaendige Result-Facettenabfragen und 326 GPO-Statusabfragen; auch reine Timeslot-Importknopfe mit `showStatus=false` pollten alle zwei Sekunden, und der globale Fuenf-Sekunden-Poll berechnete die Oeffnungsbereitschaft fuer alle Timeslots ohne Zustandsaenderung neu. Inaktive Importsteuerelemente fragen nun keinen Status ab, sichtbare Statusbereiche pollen nur bei queued/running, der Data Hub pollt nur Projekte mit laufenden GPO-Jobs und behaelt unveraenderte Status-/Readiness-Objekte. Teure Facetten werden erst nach einer wirklichen GPO-Statusrevision neu berechnet. Der PostgreSQL-Commit verwendet zusaetzlich einmalig aufgebaute Datei-/Definitionsindizes statt wiederholter linearer Suchen je Finding; Transaktion, Originalwerte, Klassifikation und Schema bleiben unveraendert. Permanente synthetische Interaktionstests sichern null Statusabfragen eines inaktiven Timeslot-Importknopfs und genau einen Abruf eines sichtbaren abgeschlossenen Status. 30 fokussierte Import-/Persistenz-/UI-Tests und beide TypeScript-Pruefungen erfolgreich. Gesamtlauf: 1.266 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; der bekannte kombinierte Node-Importtest ueberschritt unter Gesamtlast einmal sein unveraendertes Fuenf-Sekunden-Limit und bestand isoliert in 3.887 ms. Local-only-/Designpruefung sowie Client-/Server-Produktionsbuild erfolgreich. Keine Kundendateninspektion, Datenmutation, Migration, Processing-Manifest- oder Reimportaenderung. Restrisiko: Die relationale Persistenz sendet Datensaetze weiterhin einzeln an PostgreSQL; falls ein ruhiger synthetischer Lasttest nach dieser Lastkorrektur noch einen relevanten Commitanteil zeigt, ist gebuendeltes Schreiben ein eigener vertragserhaltender Folgeschritt. + +Verifikation GPO-Verarbeitungskorrektur 2026-09-15: 1.265 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; Local-only-Sicherheitspruefung, Designpruefung sowie Client-/Server-Produktionsbuild erfolgreich. Die fokussierten Tests sichern 65 Bewertungs-, Versions-, Work- und Statusfaelle. Das laufende Backend meldet fuer den betroffenen 184-GPO-Lauf technisch `partial` und bietet nach dem Enginewechsel genau ein Update von 1.5.0 auf 1.6.0. Read-only-Browserpruefung zeigt im betroffenen Timeslot `Re-evaluation required` mit dem vorhandenen `Re-evaluate`-Bedienelement. Es wurde nicht ausgeloest; keine Kundendatenmutation. + +GPO-Verarbeitung statt globalem Review 2026-09-15 (Phase 7/13B): Der gemeldete Clientzustand wurde ausschliesslich ueber technische Status-, Zaehler- und Diagnosecodes untersucht. Der GPO-Import enthielt 184 Backupinstanzen und stand serverseitig auf partial, waehrend Data Hub irrefuehrend nur Imported anzeigte. Evaluator 1.5.0 versah alle aktuellen Vergleiche mit `policy-evaluation-baseline-incomplete`, weil globale Baselineparser-Diagnosen aus Security Templates auch separat aufgeloeste Registry-Policy-Kandidaten blockierten. Evaluator 1.6.0 begrenzt partielle Parserdiagnosen auf den betroffenen Bereitstellungsmechanismus: korrekt gelesene Registry-Werte bleiben vergleichbar, Security-Template-Lesefehler blockieren weiterhin Security-Template-Kandidaten, und unbekannte Diagnosen bleiben fail-closed. Fehlende Kundenwerte bleiben ohne nachgewiesenen vollstaendigen Backupsatz Review required; es werden keine Abwesenheit oder Abweichung erfunden. Data Hub bezeichnet einen partiellen GPO-Lauf jetzt sichtbar als `Partial · review required` statt `Imported`. Permanente synthetische Regressionen sichern Pass und Deviation fuer den unabhaengigen Registry-Pfad, die bestehenden Sicherheitsgrenzen und den gerenderten partiellen Status. Historische 1.5.0-Laeufe bleiben unveraendert und werden durch den bestehenden Data-Hub-Versionspfad zur ausdruecklichen Re-evaluation angeboten. Keine automatische Bestandsneuauswertung, Datenmutation, Quelldateiinspektion, SQL-Migration oder Scanner-Reimportaenderung; Phasenstatus unveraendert. + +Verifikation Dummy-Anzeigekorrektur 2026-09-14: Abschliessend `npm test` mit 1.263 bestandenen und acht optional uebersprungenen PostgreSQL-Tests; Local-only-/Designpruefung sowie `npm run build` fuer Client und Server erfolgreich. Zwei zuvor fehlgeschlagene Quelltext-Strukturpruefungen wurden an die durch Verhaltenstests gesicherte neue GPO-Navigation angepasst; ein Import-Test-Timeout im ersten Gesamtlauf bestand isoliert und im unveraenderten abschliessenden Gesamtlauf. App, Entwicklungsserver und Backend antworten mit HTTP 200; die App liefert das neu gebaute Frontend aus. Live-Browserkontrolle ausschliesslich am freigegebenen Dummy, keine anderen Clientinhalte gelesen; temporaerer Prueftab geschlossen. + +GPO-Anzeige am freigegebenen Dummy 2026-09-14 (erneute Nachkorrektur, Phase 7/13B): Die vorherige Anzeige-Nachkorrektur erfasste nur die GPO-Quellkachel, nicht den normalen Source-Dropdown. Der ausdruecklich freigegebene Dummy bestaetigte den verbleibenden Fehler: Client Source GPOs -> Work behielt Deviation und zeigte null Treffer. Die gemeinsame App-Zustandsgrenze initialisiert eine neue eindeutige GPO-Source-Auswahl sowie ein GPO-Blatt jetzt mit All; spaetere ausdrueckliche Statusauswahlen bleiben auch bei null Treffern erhalten. Eine Domain mit ausschliesslichem Pruefbedarf zeigt dessen Anzahl und oeffnet genau diese gespeicherten Ergebnisse; vorhandene Deviation-Drilldowns bleiben unveraendert. Live am Dummy verifiziert: beide Source-Auswahlwege zeigen 3.873 GPO-Datensaetze; der Domain-Link oeffnet 3.872 Review-Ergebnisse; Passed bleibt gezielt mit null Treffern waehlbar. Die gespeicherte aktuelle Evaluation 1.5.0 enthaelt selbst Review-required-Urteile mit unvollstaendiger Baseline-Evidenz, nicht nur historische Urteile. Daher werden weder aktuelle Pass-/Fail-Urteile noch ein Score aus alten Laeufen rekonstruiert. Vier permanente synthetische Interaktionstests mit echtem AppProvider sichern Client-Dropdown, Work-Dropdown, GPO-Blatt und Domain-Link einschliesslich expliziter Nulltreffer-Auswahl. Nur Praesentation/Navigation; keine Neuauswertung, Datenmutation, Import-/Reimport- oder Bewertungsregel-Aenderung. Die bisherigen Verifikationsaussagen waren fuer den normalen Dropdown-Pfad unzureichend; Phasenstatus unveraendert. + +GPO-Anzeige nach Evaluatorwechsel 2026-09-14 (Nachkorrektur, Phase 7/13B): Der anschliessende Nutzer-Screenshot widerlegte die vorherige Aussage, die Timeslotkorrektur habe den gemeldeten Anzeigeausfall vollstaendig behoben. Geladene historische GPO-Vergleiche wurden als Review required zurueckgehalten, im Dashboard aber als fehlende Evidenz gezaehlt; der Source-Drilldown setzte Deviation und fuehrte damit in eine leere Work-Ansicht. Client Info unterscheidet jetzt ausstehende Neuauswertung, aktuellen manuellen Pruefbedarf und fehlende Evidenz. Die GPO-Quellkachel oeffnet All; explizite Statusaktionen behalten ihre Filter. Work zeigt bei null Filtertreffern den vorhandenen Datenbestand und bietet eine Aktion zum Anzeigen aller Ergebnisse unter Beibehaltung der gewaehlten Quelle. Die verbindlichen sechs GPO-Statusoptionen bleiben erhalten. Sieben synthetische Interaktionstests sichern die historischen Versionen 1.3.3/1.4.0, den aktuellen Pruefzustand und den Auswahl-/Wiederherstellungspfad in allen vier Work-Ansichten. Explizite Nutzerentscheidung dieses Schritts: nur Anzeige korrigieren, keine reale Neuauswertung. Historische Werte werden nicht als aktuelle Pass-/Fail-Urteile oder Scores ausgegeben; keine Persistenz-, Import- oder Reimportaenderung. Phasenstatus unveraendert. + +Verifikation der Anzeige-Nachkorrektur: 1.258 Tests im Gesamtlauf bestanden, acht optionale PostgreSQL-Tests uebersprungen. Ein bestehender Blattauswahl-Performance-Test ueberschritt unter Gesamtlast sein unveraendertes Fuenf-Sekunden-Limit und bestand isoliert in 2.409 ms. Alle sieben neuen Interaktionstests, Local-only-/Designpruefung und Client-/Serverbuild erfolgreich. Der laufende Entwicklungsserver liefert beide korrigierten UI-Module mit HTTP 200; ihre Auslieferung wurde anhand von Code-Markern ohne Domaininhalte bestaetigt. Keine reale Neuauswertung oder Datenmutation. + +GPO-Anzeige im gemischten Timeslot 2026-09-14 (Phase 7/13B, Nutzerfehlerbericht): Beim Oeffnen eines Timeslots mit Scannerlaeufen und separat assessmentgebundenen GPO-Ergebnissen bleibt der vollstaendige Assessment-Scope jetzt neben dem eingeschraenkten Scanner-Run-Scope erhalten. Data Hub und die automatische Work-Timeslotauswahl reichen beide Identitaeten weiter; der gemeinsame Workspace-Loader verwendet die ausdruecklich gewaehlten Assessments fuer Policy-Beobachtungen. Dadurch erscheinen dieselben GPO-Ergebnisse wieder in Client Info und Work, ohne fremde Scannerlaeufe einzubeziehen. Synthetische Interaktions- und Loaderregression fuer den zuvor defekten Mischpfad sowie 27 fokussierte GPO-/Navigationstests und Client-/Serverbuild erfolgreich; Gesamtlauf mit 1.252 bestandenen und acht uebersprungenen Tests sowie Local-only-/Designpruefung erfolgreich. Reine Lade-/Praesentationskorrektur ohne Import-, Persistenz-, Score-, Schema- oder Reimportaenderung; Phasenstatus unveraendert. + +GPO-Baselinevarianten 2026-09-14 (Phase 7/13B, ausdruecklicher Nutzerauftrag): Evaluator 1.5.0 ersetzt die pauschale Sperre bei unterschiedlichen Sollwerten durch unabhaengige, typisierte Einzelvergleiche. Alle Varianten bestanden ergibt Pass; konfiguriertes IST gegen alle Varianten abweichend ergibt Fail; gemischte, unlesbare oder unvollstaendige Evidenz bleibt Review required. Fehlende Einstellungen ergeben nur bei belegter Satzvollstaendigkeit Not configured. Kein PingCastle erforderlich; OS-/DFL-Inventar waehlt keine GPO-Zielrolle. Widerspruechliche Werte derselben Baseline-GPO sind keine Rollenalternativen. Versionierte Originalwerte, Einzelurteile und Settingreferenzen bleiben in Ergebnis-JSON/JSONB erhalten; Work, Result DB und Export zeigen keine erfundene Baselinevereinigung. Die bestehenden fuenf GPO-Statusfilter bleiben unveraendert; Review required ist unter All sichtbar. Historische Runs 1.3.3/1.4.0 bleiben lesbar und verlangen die vorhandene explizite Data-Hub-Neuauswertung. Keine SQL-Migration, Scanner-Manifestversion, Kundendateninspektion oder reale Neuauswertung. Vertrag und Grenzen: [GPO_BASELINE_EVALUATION.md](GPO_BASELINE_EVALUATION.md). Verifikation siehe datierter Protokolleintrag; Phase 13B bleibt in Arbeit. + +GPO-Work-Filterkontext 2026-09-14 (Phase 7/13B, Nutzerkorrektur und verbindliche Vorgaben): Eine eindeutige Auswahl `Source: Scan = GPOs` gilt nun auch auf dem projektweiten All-Records-Blatt als reiner GPO-Werkzeugkontext. Facetten werden vor allgemeiner Priorisierung und Zehnerlimit auf den GPO-Vertrag reduziert: Result Status, die verfuegbaren neun GPO-Fachfacetten und der dauerhaft letzte workspaceweite Source-Filter. Das Statusmenue wird aus dem festen GPO-Vertrag erzeugt und enthaelt auch dann ausschliesslich All, Deviation, Passed, Not configured, Conflicts und Duplicates, wenn kein separates GPO-Blatt geladen ist; die fuenf fachlichen Werte bleiben bei null Treffern waehlbar. GPO-Statusfilter lesen ausschliesslich das aktuelle Feld `Status`; ein `Pass` in Comparison, Historical result, Baseline, Guidance oder Evidence darf niemals einen aktuell als Not configured, Conflict, Duplicate oder Deviation klassifizierten Datensatz unter Passed aufnehmen. Scanner-, CIS-, Severity-, Category-, MITRE-, Target-, Result-message- und Reviewfacetten sowie deren Statusvokabular erscheinen nicht. Bereits gesetzte, im GPO-Kontext ungueltige Facetten werden entfernt, damit kein unsichtbarer Fremdfilter weiterwirkt; nach Aufhebung der Quelle kehrt der Mischkontext zurueck. Die synthetischen Regressionen pruefen den zuvor defekten Auswahlweg ohne separates GPO-Blatt, die Wirksamkeit eines zuvor vom Mischlimit verdraengten GPO-Filters, einen Not-configured-Datensatz mit fremdem Pass-Vergleichswert und die Rueckkehr; 51 fokussierte Filter-/Profil-/GPO-Pruefungen sowie der Gesamtlauf mit 1.243 bestandenen und acht uebersprungenen Tests, Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Reine Praesentations- und Filterkontextkorrektur ohne Import-, Persistenz-, API-, Score- oder Reimportaenderung. Die Projektvorgaben behandeln dokumentierte Nutzerentscheidungen jetzt ausdruecklich als bindende Abnahmekriterien: spaetere Arbeiten duerfen sie nicht still abschwaechen; Konflikte mit Regeln sind vor einer Umsetzung transparent zu melden und Regelanpassungen benoetigen Nutzerzustimmung. Phasenstatus unveraendert. + +GPO-Neuauswertung und OS-Inventar 2026-09-11 (Phase 7/13B/13C, Nutzerauftrag): Data Hub erhaelt einen vom Scanner-Reimport getrennten Hinweis und eine explizite Re-evaluate-Aktion fuer gespeicherte GPO-Vergleiche mit alter Engine. Die Zuordnung folgt ausschliesslich aktiven Profil-/Snapshot-/Identity-/Artefaktreferenzen; ueberholte Verarbeitungsketten erzeugen keinen falschen Hinweis. Der bestehende API-Aufruf wertet gespeicherte Eingaben aus und behaelt historische Runs. Die abgeleitete Bereitschaft ist je Repository revisionsgebunden und auf 128 Projekte begrenzt gecacht; unveraenderte Statusabrufe lesen keine Evaluationen erneut. Work zeigt alte Ergebnisse als Review required mit separatem Historical result, prominentem Versionshinweis und neutralen gespeicherten Ist-/Sollwerten. Fehlende Beschreibung und Ladefehler sind getrennt. Client Info ersetzt die kommagetrennte OS-Zeile durch Servers, Clients und Other / unclassified mit OS-Anzahlen und nur bei eindeutiger Datenbasis einer Gruppensumme. PingCastle-Name und Nb OS werden ueber exakten Lauf, Datei, Sektion, gespeicherten Quelltabellenindex und Zeile verbunden; ueberlappende Inventare werden nicht addiert, unbekannte Anzahlen bleiben ein Gedankenstrich. Originalwerte, Importprofile, Scores und Persistenzschema bleiben unveraendert; kein neuer Processing-Vertrag oder Reimport fuer diese Darstellung erforderlich. Verifiziert: 1.238 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Zusaetzlich synthetischer Import-bis-OS-Anzahl-Test und Browserpruefung bei 640/320 Pixeln ohne Inventarueberlauf sowie Statusaktionswechsel/historische Neutraldarstellung; temporaere Vorschau entfernt. Zwischenzeitliche Buildfehler im parallel bearbeiteten Timeslot-Vertrag waren beim abschliessenden Build behoben, ohne diese fremden Aenderungen zu bearbeiten. Keine Realdateninspektion, Neuauswertung oder Datenmutation; laufendes Backend nur technisch auf HTTP 200 geprueft und nicht neu gestartet. Fuer den neuen Backend-Statusvertrag ist dessen Neustart erforderlich. Phasenstatus unveraendert. + +Timeslot-Vergleich P0-P2 2026-09-11 (Phase 8, Nutzerauftrag): P0 ist abgeschlossen. Der additive Vertrag `timeslot-comparison` 1.0.0 trennt Regeldefinition, scope-/objektbezogene Vergleichsidentitaet, Reportzeit, Gegenpruefung und Verpflichtung. Jedes registrierte Profil deklariert nun Scope, Zeitquelle, Ergebnisart und Negativnachweis; die aktuellen Scanner bleiben scopeweit, Generic ist nicht automatisch vergleichbar und Abwesenheit beweist nirgends automatisch Behebung. P2 ist mit einer sicheren Scannerpaarung begonnen: echte Tool-/Run-/File-Provenienz, Processingvertrag, eindeutiger Scope, neue Reportzeit und Diagnosen werden vor Fail-to-Pass geprüft; fehlende Quelle, bloße Abwesenheit und Reimportzeit bleiben ungeklärt oder nicht vergleichbar. 23 fokussierte synthetische Tests sowie Client-/Serverbuild erfolgreich. Der ausdrücklich freigegebene Mandant Dummy wurde ergänzend nur lesend geprüft und bestätigt die konservativen Grenzen; keine Datenmutation. P1 bleibt wegen Persistenz/API/Übergang offen, P2 wegen GPO/Historie/Integration offen, P3-P6 offen. Kein Processing-Manifest oder Reimport, da keine importierten Fakten geändert werden; bisherige Produktengine und UI sind noch nicht umgestellt. + +Verifikation dieses Schnitts: Projektweiter Lauf mit 1.240 bestandenen Tests und acht übersprungenen optionalen PostgreSQL-Tests. Der bekannte fachfremde kombinierte Node-Importtest überschritt unter Gesamtlast einmal sein unverändertes Fünf-Sekunden-Limit und bestand isoliert mit 5/5 Tests in 3.661 ms. Local-only-, Designsprache-, Client- und Serverprüfung sind erfolgreich; kein Testlimit wurde erhöht. + +Client-Info-Risikoregister 2026-09-11 (Phase 7, Nutzerauftrag): Client Info zeigt unter den bestehenden Informationsbereichen eine eigene Accepted-Risks-Kachel. Das Register dedupliziert dieselbe kanonische Finding-Vorkommnis ueber mehrere Blattprojektionen, listet links alle gespeicherten Risikentscheidungen mit Quelle, abgeleitetem Zustand und Wiedervorlage und zeigt nach Auswahl rechts den vollstaendigen aktuellen Entscheidungsinhalt sowie die unveraenderte Versionshistorie. Accepted, Scheduled, Review due, Review required, Draft, Expired und Revoked bleiben unterscheidbar; lange Inhalte werden nicht gekuerzt. Breite Ansichten verwenden die verlangte Liste-/Detailteilung, schmale Ansichten stapeln beide Bereiche. Die Darstellung liest ausschliesslich bereits geladene Reviewdaten; keine API-, Persistenz-, Scanner-, Score- oder Reimportaenderung. Zwei neue synthetische Registertests, 18 fokussierte Dashboard-/Accepted-Risk-Tests, Local-only-/Designpruefung und Client-/Serverbuild erfolgreich. Gesamtlauf: 1.218 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen; ein kombinierter Node-Importtest ueberschritt unter paralleler Last einmal sein unveraendertes Fuenf-Sekunden-Limit und bestand isoliert in 4.971 ms. Synthetische Browserpruefung bestaetigt Auswahlwechsel, vollstaendige Detailanzeige, Umbruch und schmale Stapelung; temporaere Vorschau entfernt. Keine Realdateninspektion oder Datenmutation; Phasenstatus unveraendert. + +Mehrdatei-Reimportstatus 2026-09-11 (Phase 7, Nutzerfehlerbericht): Die Bereitschaftsanzeige bewertet gespeicherte Verarbeitungskontrakte gemeinsam je exaktem Scanlauf. Generische Begleitdateien neben genau einem erkannten Scannerprofil erzeugen bei gueltigen Vertraegen keinen falschen Pruefstatus mehr; andere Laeufe, echte Versions-/Kompatibilitaetsfehler und nicht eindeutig uebertragene Kundenreviews bleiben getrennt beruecksichtigt. Reine Pruefhinweise bieten keinen wirkungslosen erneuten Reimport an. Keine Umklassifizierung, Extraktions-/Mappingaenderung oder Datenmutation; kein neuer Processing-Vertrag und kein Reimport erforderlich. Synthetischer 22-CSV-Import samt erneutem Import und serialisierten Dateirecords sowie Schutzfaelle bestehen in 13 fokussierten Tests. Gesamtpruefung: 1.216 bestanden, acht optionale DB-Tests uebersprungen, ein fachfremder Auswahllisten-Test am Zeitlimit gescheitert; isolierte Wiederholung besteht in 1.838 ms ohne Limitaenderung. Local-only-/Designchecks und Client-/Serverbuild erfolgreich. Laufende App liefert das korrigierte Statusmodul mit HTTP 200; keine Live-Inhaltsinspektion. Phasenstatus unveraendert. + +CSV-Workerstart 2026-09-11 (Phase 13, Nutzerfehlerbericht): Der isolierte Importworker initialisierte fuer jede CSV auch die vollstaendige jsdom-Abhaengigkeit innerhalb seines 30-Sekunden-Budgets. Der Node-Markupadapter laedt die fest benannte lokale Bibliothek jetzt erst beim tatsaechlichen DOM-Bedarf; CSV/JSON/Excel und begrenzte lexikalische HTML-Verarbeitung vermeiden diese Startlast. Parsergrammatik, Extraktion, Mapping und gespeicherte Fakten bleiben identisch; deshalb kein neuer Processing-Vertrag oder pauschaler Reimportbedarf. Der konkrete gemeldete Timeout wurde ohne Realdatenzugriff nicht reproduziert; die unnoetige DOM-Initialisierung wurde im gebauten Worker vor dem Fix durch einen fehlschlagenden Kostentest nachgewiesen. Nach dem Fix verarbeitet `node tests/server/import-worker-startup-check.mjs` 22 synthetische Domain-CSVs mit vollstaendigem Originalwertabgleich in beobachteten 14.170 ms ohne DOM-Laden, bei unveraenderten Zeit-/Speicherlimits. Laufendes Backend: synthetischer Parse-only-Aufruf HTTP 200 in 515 ms, Repositoryrevision unveraendert. 1.214 Tests bestanden, acht optionale DB-Tests uebersprungen; Local-only-/Designchecks und beide Builds erfolgreich. Kein Backendneustart, keine Realdatenmutation; Phasenstatus unveraendert. + +Accepted-Risk-Speicherpruefung 2026-09-11 (Phase 7 mit bestehender Persistenz aus Phase 9-11, Nutzerpraezisierung): `Save draft`, `Record acceptance` und `Revoke acceptance` speichern nicht mehr unmittelbar nach der Formularvalidierung, sondern zeigen zuerst einen kompakten ASSESSOR-Pruefbericht der tatsaechlich ausgefuellten Angaben. `Change` kehrt ohne Eingabeverlust in die Maske zurueck; `OK` fuehrt erst dann die bestehende geschuetzte Speicheroperation aus. Fehler erhalten alle Eingaben, erfolgreiche Speicherung wird im Formular ausdruecklich bestaetigt. Keine Aenderung an Review-JSONB, API, Validierung, Reimportvertrag oder Datenbankschema. Verifikation: sechs fokussierte Domain-/Dialogtests, 1.214 Gesamttests, acht optionale PostgreSQL-Integrationstests uebersprungen; Local-only-/Designpruefung sowie Client-/Serverbuild erfolgreich. Phasenstatus unveraendert. + +Accepted Risk 2026-09-10 (Phase 7 mit Persistenz/API aus Phase 9-11 und Sicherheit aus Phase 13, Nutzerauftrag): Button im Findingheader und strukturierter Dialog fuer Scope, Risikoszenario, Begruendung/Alternativen, initiales und verbleibendes Risiko, kompensierende Kontrollen, Verantwortliche, getrennte externe Freigabedokumentation, Nachweise, Befristung, Wiedervorlage und Ausstieg implementiert. Entwurf, Annahme und Widerruf erzeugen vollstaendige Versionen im bestehenden Review-JSONB; Same-Origin-API mit Projektpruefung, serverseitiger Validierung und atomarer Revisionspruefung. Native Befunde und Scores bleiben erhalten. Reimport erhaelt die Historie, fordert fuer einen anderen Zielbefund aber erneute Pruefung. Ablagevertrag und geplanter Ausbau in `docs/RISK_ACCEPTANCE.md`; keine SQL-Migration oder Realdatenmutation. Verifikation: 1.214 Tests bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; Local-only-/Designpruefung und Client-/Serverbuild erfolgreich. Synthetische Browserpruefung bestaetigt Dialog, Pflichtfeldsperre und fehlerfreie Breite; temporaere Vorschau entfernt. Frontend und Backend-Health antworten HTTP 200. Keine reale Datenbank-Schreibprobe. Phasenstatus unveraendert. + Reimport-Schutz 2026-09-10 (Phase 6/8/9/13C mit Phase-7-Hinweis, ausdruecklicher Nutzerauftrag): Verarbeitungsrelevante Aenderungen an Formaterkennung, Parser/Extractor, Scannerprofil, stabiler Identitaet, Mapping, Normalisierung, Status-/Evidenzvertrag oder nativer Scoregewinnung muessen ueber append-only Processing-Manifeste versioniert und fuer bestehende Importe als Reimportbedarf sichtbar werden; reine Darstellungsaenderungen auf bereits gespeicherten Daten benoetigen keinen Reimport. Generische/tabellarische Importe ohne belastbares Profil erscheinen vorsorglich als gelber Pruefstatus. Direkter Reimport und die Uebernahme eines bereits importierten Ersatzlaufs uebertragen kundenbezogene Finding-Reviews atomar in lokaler und PostgreSQL-Persistenz. Die Zuordnung verwendet ausschliesslich die eindeutige stabile Identitaet aus Scannerwerkzeug, nativer Regel-ID und betroffenem Asset; bei fehlender oder mehrdeutiger Zuordnung wird nicht nach Titel oder Position geraten. Der vollstaendige Reviewvertrag wird kopiert und erhaelt dadurch Status, Prioritaet, Action-Plan-Zuordnung, Owner, Termin, Kommentar, Voraussetzungen, Zugriffe, naechsten Schritt, Akzeptanzevidenz, Marker/Accepted Risk sowie spaetere additive JSON-Felder. Bereits vorhandene Angaben am Ersatzlauf haben Vorrang. Nicht eindeutig uebertragbare Angaben bleiben am auditierbar erhaltenen Ursprungslauf gespeichert; Anzahl und dauerhafter `Review required`-Hinweis werden am Ersatzimport persistiert. Original-SHA, Vorgaengerbezug und Uebertragungsherkunft bleiben nachvollziehbar. Regeln und Szenarien stehen in `docs/REIMPORT_POLICY.md`. Verifikation: 1.205 Tests bestanden, acht optionale Tests uebersprungen; Local-only- und Designpruefung erfolgreich. Keine SQL-Migration, Realdateninspektion oder kanonische Datenmutation; Phasenstatus unveraendert. Purple-Knight-Scorezuordnung 2026-09-10 (Phase 7/13C, Nutzerkorrektur): Eine native score-only Assessment Summary und die eindeutige Findings-Datei desselben Scanlaufs werden nun ueber Assessment, Werkzeug, Scanlauf und Verarbeitungskontrakt verbunden. Der native Wert bleibt der Scorebeitrag; Passed-/Deviation-Zahlen stammen aus der Findings-Datei. Die Zuordnung scheitert geschlossen bei mehreren nativen Traegern oder mehrdeutigen Ergebnispopulationen. Die synthetische Regression mit nativ 65, 96 Passed und 19 Deviations liefert in der Dashboardprojektion 65 Native score statt Pass rate 83 und behaelt 19 Deviations. 1.199 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designchecks sowie Client-/Serverbuild erfolgreich. Keine Datenmutation, Migration, Realdateninspektion oder Backendneustart; Phasenstatus unveraendert. @@ -232,6 +436,7 @@ Die heutige Tauri-Anwendung bleibt zunächst eine lokale Laufzeitumgebung. Das | 6 | Deklarative Toolprofile und generischer Fallback | abgeschlossen | | 7 | Automatische Filter- und Darstellungslogik | abgeschlossen | | 8 | Vergleichsengine für Assessment-Läufe | abgeschlossen | +| 8 (Erweiterung 2026-09-11) | Belastbarer A/B-Timeslotvergleich und offene Verpflichtungen; P0 abgeschlossen, P1/P2 in Arbeit, P3-P6 offen | in Arbeit | | 9 | Fachliche Persistenzschnittstelle | abgeschlossen | | 10 | Lokales Backend über `localhost` | abgeschlossen | | 11 | PostgreSQL und Datenbankmigrationen | abgeschlossen | @@ -937,6 +1142,8 @@ Abnahmekriterien: #### Geplantes Arbeitspaket: faire Vergleiche bei fehlenden Folgequellen +Statusklarstellung 2026-09-11: Der oben dokumentierte Abschluss betrifft den historischen Vergleichskern, nicht die nachfolgende Erweiterung. P0 ist abgeschlossen, P1 in Arbeit und P2-P6 sind offen. Der verbindliche Detailplan steht in [TIMESLOT_COMPARISON_PLAN.md](TIMESLOT_COMPARISON_PLAN.md): getrennte Regel-/Vorkommensidentitaet, profilgebundene Gegenpruefung, Erhaltung jeder offenen Verpflichtung bei Teilabdeckung, reparierte Quell-/Versionspruefungen und expliziter A/B-Bericht. Die nachfolgenden Festlegungen vom 2026-09-06 bleiben als Ausgangspunkt erhalten; ihre pauschale Abloesung durch einen neuen Quelllauf wird durch den verpflichtungsbezogenen Nachweisvertrag praezisiert. Alte UI-Abschlussnotizen sind kein Beleg fuer die heutige Produktanbindung. + Ziel ist eine belastbare Fortschrittsaussage, auch wenn ein Kunde beim naechsten Timeslot nicht mehr alle bisherigen Scanner- oder GPO-Quellen liefert. Fehlende Evidenz darf weder als Verbesserung noch als Behebung erscheinen. Verbindliches Fachmodell: @@ -1402,6 +1609,8 @@ Abnahmekriterien: ### Phase 13B – GPO-Backup- und Microsoft-Baseline-Analyse +Verifizierter Zwischenstand 2026-09-18 (stabile Work-Liste und technische Pfadtitel): Die Datensatzwahl startet keine zweite kartenlokale `scrollIntoView`-Animation mehr; nur der virtuelle Listencontainer positioniert eine ausserhalb des Viewports liegende Auswahl und tut dies ohne Smooth-Animation. Die Trefferliste reserviert ihre schmale Scrollbarspur dauerhaft, sodass das Ein- und Ausblenden des Balkens die Textbreite und damit den Zeilenumbruch nicht verschiebt. Lange GPO-Registrytitel werden im Readerkopf und in der Finding-Ueberschrift ueber die gemeinsame `technical-path`-Darstellung mit Pfadschrift, vollstaendigem Inhalt und Umbruch innerhalb der Lesespalte ausgegeben; Accepted Risk und Kopfaktionen behalten ihre eigene Gridspalte. Die genaue Auswahlinteraktion und der lange Registrytitel sind synthetisch regressionsgesichert. 1.339 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Keine Parser-, Bewertungs-, API-, SQL-, Persistenz- oder Bestandsdatenaenderung; Phase 13B bleibt in Arbeit. + Verifizierter Zwischenstand 2026-09-06 (Benchmark-Semantik): Evaluator 1.3.3 erzeugt `Passed` oder `Failed` ausschliesslich aus einer zur beobachteten Umgebung passend ausgewaehlten Microsoft-Security-Baseline mit vorhandenem, technisch vergleichbarem Sollwert. Ein vorhandener Sollwert ohne Kundenwert ist `Failed`; identische Werte sind `Passed`, abweichende Werte `Failed`. Leere Baselinezeilen werden nicht bewertet, nicht unterstuetzte Werte bleiben Review/Warning und werden nie zu Pass/Fail umgedeutet. Security-Template-Registrywerte behalten Typ und Wert im Vergleich. Ausschliesslich Dummy wurde neu ausgewertet: 363 Failed, 13 Passed und 8 Review/Warning; 0 Pass/Fail-Zeilen ohne Baselinewert. 831 Tests bestanden, 8 optionale PostgreSQL-Tests uebersprungen; Local-only-, Designpruefung sowie Client-/Server-Produktionsbuild erfolgreich. Phase 13B bleibt in Arbeit. Status: in Arbeit @@ -1588,6 +1797,8 @@ Abnahmekriterien: ## 8. Aktuell empfohlene Umsetzungsetappe +Ergaenzung 2026-09-11 fuer den Timeslotvergleich: Nach dem jetzt dokumentierten Planauftrag beginnt eine spaeter beauftragte Implementierung mit P0/P1 aus [TIMESLOT_COMPARISON_PLAN.md](TIMESLOT_COMPARISON_PLAN.md), danach folgen P2-P6 in Abhaengigkeitsreihenfolge. Zuerst Vergleichsidentitaet und Gegenpruefung absichern, dann offene Verpflichtungen und A/B-Scorebasis, zuletzt die Oberflaeche. Dieser Dokumentationsauftrag startet keine Umsetzung und unterbricht keine unabhaengigen Phase-13B-Arbeiten. Die folgenden aelteren Empfehlungen bleiben als Projektkontext erhalten. + Die naechste Umsetzung fuehrt Phase 13B auf dem konsolidierten Import-, Policy-Analyse- und Orchestrierungsunterbau fort: 1. Phase 13A ist abgeschlossen: Erkennung, technische Dokumenttypen, Source Extractors, Mappingprofile, Finding-Identität sowie allgemeine Artefakt-, Processing- und Jobgrenzen sind konsolidiert und die Scannerpersistenz verwendet den Candidate-Pfad. @@ -1607,6 +1818,41 @@ Aktualisierung nach der Katalog-Ladegrenze vom 2026-09-03: Fachlich freigegebene ## 9. Bereits getroffene Architekturentscheidungen +**Security-Domain-Mengenbalken (2026-09-20):** Die Verteilung innerhalb der sichtbaren Client-Info-Security-Domains wird als dezenter Balken in einer eigenen Subgrid-Spalte dargestellt. Das gemeinsame Raster bemisst links den laengsten Domainnamen und rechts die breiteste Mengenzahl; der Balken bleibt mit gemeinsamem Abstand vollstaendig dazwischen, endet bei allen Zeilen an derselben Kante und waechst nach links. Alle Balken erben exakt den gemeinsam am Posture-Bereich gesetzten Tone des Overall Scores; dadurch stimmen sie immer mit der aktuellen Donutfarbe ueberein, waehrend die einzelnen Domainknoten weiterhin ihre eigene Pass-Rate-Farbe besitzen. Bezugsmenge ist die Summe exakt der angezeigten Domainmengen; eine Zeile verwendet denselben Wert, den ihre rechte Zahl bereits zeigt, einschliesslich des bestehenden Review-only-Falls. Der Balken ergaenzt die Zahl nur visuell, ist `aria-hidden` und darf weder fachliche Mengen noch Bewertung, Klassifikation oder Navigation beeinflussen. + +- 2026-09-20, Mindestgroessen fuer Information und Lesetext: Primaere Information in Tabellen, Kacheln und Feldbeschriftungen darf nicht unter 14 px fallen; zu lesende Werte und fortlaufender Text verwenden 16 px. Kleinere Rollen sind ausschliesslich fuer kompakte Controls, technische Metadaten und Badges zulaessig und duerfen nicht zum Verdichten primaerer Information missbraucht werden. Bestehende semantische 14-/16-px-Tokens bleiben die Quelle; keine lokale Literal- oder View-Sondergroesse. +- 2026-09-20, PingCastle-OS-Zustandsprojektion: `Nb OS`, `Nb Active`, `Nb Inactive`, `Nb Enabled` und `Nb Disabled` sind voneinander unabhaengige, native Werte derselben retained source row. Die UI darf sie gemeinsam anzeigen, aber weder Differenzen berechnen noch Werte ueber Quellzeilen oder Inventare hinweg zusammenfuehren. Die vorhandene generische Umgebungsextraktion bleibt die Quelle; keine neue Parser- oder Persistenzsemantik ist erforderlich. +- 2026-09-20, gemeinsamer Deviation-Scope: Data Hub und Client Info verwenden fuer Ergebnisanzahl und Prozentnenner dasselbe gemischte, timeslotgebundene Projektblatt sowie dieselbe zentrale Zustandsklassifikation. Scanner-Run-IDs allein sind keine vollstaendige Ergebnisgrenze, weil aktuelle GPO-/Policy-Ergebnisse assessmentgebunden vorliegen. Der Data-Hub-Donut bleibt eine Statusprojektion und macht ein GPO-Backup nicht zu einem Scanner-Run. +- 2026-09-18, Client-Info-Praesentation: Die freigegebene Ableton-Designsprache gilt auch fuer Client Info. Der Nutzer verlangt ausdruecklich den Erhalt der gemessenen gebogenen Overall-zu-Domaenen-Verbindungen. Zusammenfassung vor aufklappbaren Evidenz-/Governancedetails; keine Aenderung der fachlichen Daten- und Scorevertraege. Der exakte Resize-/Disclosure-/Risikowechselpfad ist synthetisch abgesichert. +- 2026-09-20, Client-Info-Breiten- und Zeilenvertrag: Posture und Aktionsrail verwenden auf breiten Ansichten exakt 1:1 und teilen die verfuegbare Zeilenbreite zur Haelfte. Diese spaetere Nutzerkorrektur ersetzt die kurzzeitig dokumentierte 2:1-Aufteilung. Jede gemeinsame Kachelzeile behaelt identische Hoehe und Unterkante. Accepted Risks uebernimmt die feste linke Client-/Timeslot-Auswahlbreite `clamp(420px, 27vw, 520px)` und die rechte Informationsflaeche; unterhalb des bestehenden schmalen Breakpoints bleibt die Stapelung erhalten. +- 2026-09-20, Overall-Score-Inhaltsvertrag: Unter dem Score-Donut erscheinen weder eine textuelle Statuswiederholung noch ein zweiter Critical-Findings-Zaehler. Assessment Coverage bleibt auf die kompakte Inhaltsbreite begrenzt und darf die gebogenen Domaenenlinien nicht beruehren oder ueberlagern. + +**Verbindliche Ableton-Designreferenzen einschliesslich Client Info (2026-09-18):** Die ausdrueckliche Nutzerkorrektur ersetzt die bisherige Client-Info-Sonderpalette/-Geometrie durch denselben visuellen Vertrag wie Data Hub, Work und Pathfinder. Die drei bestehenden, freigegebenen Ansichten bleiben Referenzen; sie werden nicht an neue Entwuerfe angepasst. Aktuelle Projekt-Tokens und AGENTS.md haben Vorrang vor historischen Skill-Assets, Archetypen und verworfenen Bildentwuerfen. Der Vertrag gilt bereits fuer Designvorschlaege: gemeinsame neutrale Flaechen, transparente Segmente, flache eckige Tiles, vorhandene Controls, Inter, gelbe/bernsteinfarbene Auswahl und Aktionen, blauer Fokus, semantische Statusfarben, 20px Inset und volle 360-Grad-Donuts. Fachliche Client-Info-Hierarchie, Scoremodelle und Quelle-/Work-Drilldowns bleiben erhalten. Aeltere abweichende Entscheidungen im Verlauf sind historische Eintraege und durch diese Korrektur nur hinsichtlich der visuellen Ausnahme supersediert. + +**Vollstaendiger Security-Domain-Katalog im Work-Filter (2026-09-18):** Der unveraenderte gemeinsame Client-Info-Katalog ist der Optionsvertrag, nicht die aktuell gefilterte Treffermenge. Alle acht Domains bleiben bei null Treffern auswaehlbar; Unclassified wird nur bei vorhandenen unklassifizierten Datensaetzen ergaenzt. Eigene Auswahl bleibt bei der Facettenzaehlung ausgenommen; andere aktive Filter gelten weiter. Noch gueltige aktive Kategorie-/Statusauswahlen verschwinden bei null Treffern nicht automatisch. Der normale Domain-Deviation-Drilldown aus Client Info verwendet denselben sichtbaren Filter statt pathFindingIds; ausdrueckliche Review-only- und Einzelbefundpfade bleiben separat begrenzt. Quellen-/Timeslotgrenzen und Domainzuordnung werden nicht erweitert. + +**Aktuelle GPO-Laufauswahl und autoritative Statusfilter (2026-09-18, beauftragter Fehlerfix):** Work und PostgreSQL-Result-DB messen Laufabdeckung an verschiedenen Baseline-IDs in den erhaltenen Ergebnissen; mehrere Analyseversionen eines Pakets sind keine zusaetzliche Abdeckung. Fehlen solche IDs vollstaendig, bleiben deklarierte Analyseverweise der Fallback. Bei gleicher Abdeckung gewinnt der neuere Lauf, bei gleichem Zeitpunkt die ID. Historie bleibt unveraendert. Deviation darf ein autoritatives Fail nicht aufgrund des angezeigten Configured Value verwerfen; die vereinbarten Sonderfaelle fuer erforderliche Schluessel-/Leerstringpraesenz bleiben Fail, das gewoehnliche Not-configured-Urteil bleibt neutral. Result DB zaehlt weiterhin Vergleiche, Work Einstellungen. Synthetische Interaktionstests sichern beide GPO-Work-Einstiege sowie die Result-DB-Auswahl; optionale PostgreSQL-Paritaetstests verwenden ausschliesslich synthetische CTEs in einer read-only-Verbindung ohne Schema-/Tabellenanlage. + +**Result-DB-Statusfilterkorrektur (2026-09-18, ausdruecklicher Nutzerauftrag):** Die fruehere Ausnahme vom 2026-09-07, GPO-Klassifikationen unabhaengig von Deviation zu zaehlen und Deviation bei Auswahl zu entfernen, ist abgeloest. Result Status beachtet wie andere Facetten jeden fremden aktiven Filter und nimmt nur die eigene Auswahl aus seiner Alternativzaehlung aus. Ausgewaehlte Nulltreffer bleiben sichtbar. Gemeinsame Labels mit Work sind reine Praesentation; Result DB behaelt Einzelvergleiche, Work seinen technischen Setting-Rollup. Review required bleibt fachlich eigenstaendig; No baseline rule und Not comparable werden nicht durch Freigabe interner Beobachtungen fuer Result DB erfunden. + +**Work rollt Baselinepakete auf die technische Einstellung auf (2026-09-18):** Persistierte Paketvergleiche bleiben eigenstaendige Evidenz; Work zeigt je Projekt/Aggregation/Scope/Identitaet genau eine Zeile mit dem vorhandenen Zaehlerurteil. Baselineauswahl filtert die Mitgliedschaft, nicht das Urteil. Abweichende Sollwerte bleiben paketbezogen; Quellenmarkierungen benoetigen Evidenz gegen alle aktuellen Varianten. Alte lokale Review-Identitaeten werden fuer lesbaren Erhalt mitgefuehrt; widerspruechliche Reviews und Risikoakzeptanzen werden nicht automatisch vereinigt. Details siehe GPO_BASELINE_EVALUATION.md. + +**Work-Listenstabilitaet und technische Pfade (2026-09-18):** Eine Auswahl darf nicht gleichzeitig vom virtuellen Listencontainer und vom einzelnen Listenelement animiert werden. Der Container ist die einzige Scrollautoritaet und positioniert eine notwendige Auswahl deterministisch ohne Smooth-Animation; sichtbare Karten loesen keinen eigenen Scroll aus. Scrollbare Datensatzlisten reservieren ihre Scrollbarspur. Vollstaendige Registrypfade in Titeln verwenden dieselbe inerte `technical-path`-Darstellung wie Pfadfelder, bleiben vollstaendig lesbar und duerfen Kopfaktionen nicht ueberlagern. Der Titelvertrag umfasst `registry · ` sowie `Registry Values · MACHINE\\...`/`USER\\...`; nackte `MACHINE\\`-/`USER\\`-Texte ausserhalb dieses Vertrags werden nicht umklassifiziert. Diese Darstellungsentscheidung aendert weder Originaltitel noch Datensatzidentitaet. + +Festlegung 2026-09-17 (Phase 13B, GPO-Quellwiederherstellung): Die persistierte backend-controlled-Referenz bleibt als Provenienz erhalten; die aktuelle Dateiverfuegbarkeit wird separat und ohne Repository-Revisionscache gelesen. Nur ENOENT bedeutet fehlende Bytes und Upload required; Zugriffs-, Konfigurations- oder ungueltige Objektpfade ergeben Storage unavailable. Automatische Reparatur, Retry und Reprocess duerfen ohne verfuegbare Quelle keinen Job erzeugen; verschwindet sie nach dem Einreihen, endet der erste fehlgeschlagene Versuch ohne automatische Wiederholung. Der gezielte Originalupload bindet an Projekt/Artefakt und gegebenenfalls Timeslot, prueft Groesse und SHA-256 und stellt die urspruengliche Speicher-ID atomar ohne Ueberschreiben wieder her. Gespeicherte Analysen bleiben erhalten. Reine Neuauswertung erhaltener Eingaben bleibt moeglich; veraltete Analyzer benoetigen weiterhin zuerst Reprocessing. Kein Analyzerbump, keine neue Interpretation und keine Bestandsmutation allein durch die Verfuegbarkeitsanzeige. + +Festlegung 2026-09-16 (Phase 7/13B, Policy-Rollup-Praezisierung): Diese Entscheidung ersetzt die am selben Tag dokumentierte Interpretation, nach der Conflict-/Duplicate-Container trotz eines belegten Mitglieds-Fails score-neutral bleiben koennten. Verdict und Diagnose sind getrennte Achsen. Ein belegter Fail eines konfigurierten, vergleichbaren In-Scope-Mitglieds macht die technische Policy-Einstellung insgesamt genau einmal zu Fail; Conflict/Duplicate bleibt als zusaetzliches Merkmal. Ohne belegten Fail ergeben ausschliesslich Pass-Mitglieder einen Policy-Pass, waehrend ungeklaerte Anwendbarkeit oder Prioritaet Review required bleibt. Ein konkretes Geraet wird ohne Effective-State-/RSoP-Evidenz weiterhin nicht als verwundbar behauptet. + +Festlegung 2026-09-16 (Phase 7/13B, GPO-Bewertungsscope): Die operative GPO-Analyse ist misconfiguration-first. Scorefaehig sind nur konfigurierte, technisch eindeutig vergleichbare Kundeneinstellungen im anwendbaren Microsoft-Baseline-Scope. `Not configured`, `Duplicates` und `Conflicts` bleiben sichtbare, eigenstaendige und score-neutrale Containerkategorien. Ein unabhaengig belegter Fail eines darin enthaltenen konfigurierten Werts bleibt genau einmal scorewirksam; weder Containerstatus noch Quellanzahl erzeugen zusaetzliches Gewicht. Vollstaendige Baseline-Adoption ist ein eigener Hardening-Auftrag und darf aus dem normalen GPO-Score nicht behauptet werden. Diese Nutzerentscheidung ersetzt jede Lesart, nach der fehlende Microsoft-Empfehlungen ueber Coverage oder einen impliziten Nenner den operativen Score mindern. + +Festlegung 2026-09-16 (Phase 7, gemischter Work-Filterkontext): GPO-spezifische Facetten gehoeren ausschliesslich zum eindeutigen Werkzeugkontext `group-policy`, der durch das GPO-Blatt oder eine eindeutige GPO-Quellenauswahl entsteht. `Source: Scan = All` ist ein gemischter Kontext; dort bleiben Result Status, allgemeine Scannerfacetten und der permanente Source-Filter sichtbar, waehrend GPO-exklusive Felder nicht am allgemeinen Facettenlimit teilnehmen. Jeder Kontextwechsel entfernt gespeicherte Facettenauswahlen, die im neuen sichtbaren Vertrag nicht mehr gueltig sind. + +Festlegung 2026-09-16 (Phase 7, Work-Snapshots): Die vollstaendig wirksame Work-Projektion ist der Snapshotvertrag. Ein gespeicherter Ansichtsstand umfasst deshalb auch den Finding-Scope eines Drilldowns und darf ihn beim Wiederherstellen nicht pauschal leeren. Der Scope wird als Datensatz-ID-Liste lokal und timeslotgebunden gespeichert; alte Eintraege ohne Feld werden abwaertskompatibel als uneingeschraenkte Ansicht gelesen. Pathfinder-Snapshots behalten zusaetzlich ihre Graphknoten und wenden daraus weiterhin ihren exakten Finding-Scope an. + +Festlegung 2026-09-14 (GPO-Varianten, Nutzerfreigabe): Unbekannte Zielrolle verhindert kein eindeutiges Urteil ueber alle beruecksichtigten Baselinevarianten. Die Vereinigung von Kontenlisten ist kein neuer Sollwert; jede Variante behaelt ihr eigenes Einzelurteil. Dies ersetzt fuer neue Evaluationen die pauschale Review-/Konfliktsperre bei abweichenden Baselinewerten aus dem GPO-Vorlagenkontext vom 2026-09-09, nicht die historische Evidenz. Explizite Rollenwahl, Originalherkunft, fehlende Wirksamkeitsevidenz und strikte Trennung von Baselinealternativen und Kunden-GPO-Konflikten bleiben bestehen. Bewertungswechsel verlangt Evaluator 1.5.0 und explizite Neuauswertung, nicht automatisch einen Scanner-Reimport. + +Festlegung 2026-09-11 (Phase-8-Planergaenzung): Regeldefinition, objekt-/scopebezogene Vergleichsidentitaet und zeitgebundene Beobachtung bleiben getrennt. Abwesenheit ohne belastbare Gegenpruefung ist keine Behebung. Scorevergleich und Behebungsfreigabe erhalten unterschiedliche fachliche Bedingungen; teilweise neue Evidenz ersetzt nicht pauschal alle alten Verpflichtungen. A und B bleiben die ausdrueckliche Messbasis, aeltere Historie dient getrennt der Verpflichtungs-/Lifecycleverfolgung. Die Festlegung praezisiert das Quellenmodell vom 2026-09-06 und ersetzt fuer die kuenftige Implementierung die historische Regel `abwesend = resolved`; keine historischen Daten oder Ergebnisse werden umgeschrieben. Details und Grenzen: [TIMESLOT_COMPARISON_PLAN.md](TIMESLOT_COMPARISON_PLAN.md). + Festlegung 2026-09-10 (Purple-Knight-Begleitdateien): Ein nativer Score darf aus einer separaten Summary auf die Findings desselben Scanlaufs uebertragen werden, wenn genau ein nativer Traeger und eine eindeutige Ergebnispopulation denselben Werkzeug- und Verarbeitungskontrakt teilen. Datei- und Vorkommensherkunft bleiben gemeinsam erhalten; Mehrdeutigkeit verhindert die Verbindung. Festlegung 2026-09-10 (weitere Scanner): Native Gesamtwerte werden bei jeder Profilerweiterung zuerst geprueft und deklarativ mit ihrer Bedeutung erfasst. Die Scoredefinition ist Pflicht, die Berechnung gemeinsam; ihre Version gehoert zur Vergleichskompatibilitaet. Extraktion und Originalherkunft bleiben im generischen Importpfad. AGENTS.md und docs/SCORING_MODEL.md halten die Erweiterungsregel fest. @@ -1644,6 +1890,7 @@ Festlegung vom 2026-09-06 (Phase 11, lokaler Persistenzbetrieb): Der vorhandene | Datum | Entscheidung | Begründung | | 2026-09-07 | Die geladene Client Info ist innerhalb der Wurzelklasse `.client-command-center` eine feste dunkle Command-Center-Ausnahme von der allgemeinen Kachelkomposition. Die genehmigte Hierarchie ist Client/Assessment/Source, sechs Icon-Fakten, Overall Score mit acht visuell verbundenen Security Domains, Priority Findings plus Assessment Gaps und abschliessend fuenf werkzeugspezifische Source-Flaechen. | Die ausdruecklich genehmigte Referenz ist ein zusammenhaengendes Erstgespraechs-Dashboard und keine Sammlung allgemeiner Anwendungskacheln. Eine eng begrenzte Ausnahme bildet diese Hierarchie originalgetreu ab, ohne Data Hub, Work, Result DB, Pathfinder oder Shell visuell zu veraendern. | | 2026-09-07 | Die Nutzerpraezisierung erweitert die unmittelbar folgende Positionsentscheidung: `Source: Scan` ist eine workspaceweite Navigationsfacette mit stabiler ID und vollstaendiger Optionsliste aus dem projektweiten All-Records-Blatt. Eine Auswahl aus einem dedizierten GPO-/Fachblatt wechselt auf dieses Aggregat und aktiviert dort direkt den ausgewaehlten Scan; lokale Facettennachzaehlung darf die Liste nicht reduzieren. | Der Filter soll nicht nur die aktuell sichtbaren Records einschraenken, sondern jederzeit den direkten Wechsel zu jedem geoeffneten Scan ermoeglichen. Nur die projektweite Quelle und ein positionsunabhaengiger Identifikator verhindern, dass ein Fachblatt alle anderen Scanner aus der Auswahl verliert oder der gesetzte Filter beim Blattwechsel unbrauchbar wird. | +| 2026-09-14 | Eine eindeutige `Source: Scan`-Auswahl ist auf dem projektweiten All-Records-Blatt ein bindender Werkzeugkontext. Fuer GPOs gelten dort derselbe Facetten- und Statusvertrag wie auf dem dedizierten GPO-Blatt; die Kontextreduktion geschieht vor allgemeiner Priorisierung und Facettenlimit, ungueltige Altfilter werden entfernt. Dokumentierte Nutzerentscheidungen sind Abnahmekriterien; ein Konflikt mit Projektregeln ist vor der Umsetzung zu melden und darf nicht still umgangen werden. | Eine reine Datensatzfilterung bei unveraendertem Mischprofil zeigt fachfremde Scannerfilter und kann unsichtbare Fremdfilter aktiv lassen. Der Kontext muss deshalb die angebotene und wirksame Filtermenge bestimmen. Transparente Konfliktmeldung erhaelt die Nachvollziehbarkeit bindender Vereinbarungen. | | 2026-09-07 | `Source: Scan` ist ein permanenter Provenienzfilter jeder Work-/Graph-Ansicht und steht stets als letzter Filter ganz rechts. In der reinen GPO-Ansicht ruecken die fachlichen Filter linksbuendig zusammen; deren sichtbares Limit betraegt elf statt zehn, damit Status, neun GPO-Fachfacetten und die Source-Facette gleichzeitig erhalten bleiben. Ein fehlendes explizites Source-Feld wird praesentativ aus Scan-/Profilmetadaten ergaenzt. | Die Quellenherkunft muss unabhaengig vom aktiven Werkzeug jederzeit auffindbar und an einer stabilen Position bedienbar sein. Einwertige Source-Werte sind fuer Provenienz weiterhin relevant und duerfen weder durch die allgemeine Nuetzlichkeitspruefung noch durch das Facettenlimit verschwinden. | | 2026-09-07 | Kunden sichtbare GPO-Quellen zeigen ausschliesslich die interne Referenz ab GPO-GUID beziehungsweise `DomainSysvol/GPO`; jeder lokale oder artefaktbezogene Praefix wird in der Praesentationsschicht entfernt. Quellen stehen unmittelbar als technische Pfadzeilen in der Evidence-Zelle, ohne aufklappbaren `Show source`-Zwischenschritt und ohne doppelte Textueberschrift. Nicht eindeutig sanitisierbare Pfade werden nicht teilweise angezeigt. | Lokale Ablage- und Backupordner sind fuer die fachliche Kundenbewertung irrelevant und koennen interne Namen offenlegen. Die GPO-GUID plus interner Policy-/Datei-Locator reicht fuer eindeutige, kundenfaehige Evidenz; fail-closed Reduktion verhindert versehentliche Preisgabe bei unbekannten Pfadformen. | | 2026-09-07 | GPO-Duplicates folgen derselben vierstufigen Results-Lesepipeline wie Conflicts, verwenden aber `Observed value` mit genau einer gemeinsamen Wertzeile und einen informativen Duplicate-Hinweis. Dieser Hinweis behauptet weder Fehler noch Unbedenklichkeit, sondern ausschliesslich: identische Quellenbelegung und fuer sich allein keine Baselineabweichung. | Gleiche Informationsarchitektur macht Conflict und Duplicate vorhersehbar bedienbar. Die getrennte Semantik verhindert zugleich, dass reine Quellenredundanz als Fehlkonfiguration erscheint oder eine gegebenenfalls separate Baselineauswertung verdeckt. | @@ -1923,6 +2170,10 @@ Abnahme 2026-08-23: 677 Standardtests bestanden, 8 optionale PostgreSQL-Integrat ## 10. Offene Entscheidungen +Timeslotvergleich 2026-09-11: P0/P1 muessen pro Scanner/Format/GPO die belastbaren Objekt-/Scopefelder, Vergleichsgranularitaet und Negativnachweisfaehigkeit sowie die konkrete Reimportbetroffenheit bestimmen. Speicher-/API-Vertrag und Uebergang fuer offene Verpflichtungen und auditierte Scopeentscheidungen sind vor Migration festzulegen. Native Teilpopulationen duerfen nur mit separat belegten Beitraegen verglichen werden; ein zusaetzlicher risikogewichteter Expositionsindex ist nicht freigegeben. Siehe Detailentscheidungen in [TIMESLOT_COMPARISON_PLAN.md](TIMESLOT_COMPARISON_PLAN.md). + +Accepted-Risk-Entscheidung 2026-09-10: Der Nutzer hat keine bestehenden Freigaberegeln und beauftragt einen Best-Practice-Ausgangspunkt. Getrennter Risk Owner/Genehmiger, belegte externe Zustimmung, Befristung und Wiedervorlage sind Pflicht fuer eine Annahme. Es wird keine unbelegte allgemeingueltige Hoechstlaufzeit vorgegeben. Die lokale Ablage erfolgt additiv in `assessor_reviews.data.riskAcceptance` mit append-only Versionssnapshots. Fuer Phase 14 sind SSO-gebundene Akteure, kundengebundene Rollen, normalisierte Entscheidungs-/Versions-/Freigabe-/Evidenztabellen, manipulationsnachweisbare Aufbewahrung und serverseitige Fristenueberwachung vorgesehen; Umsetzungskriterien stehen in `docs/RISK_ACCEPTANCE.md`. Keine organisatorische Freigabe oder rechtliche Wirksamkeit wird aus einem ausgefuellten Formular abgeleitet. + Festgelegte Versionsentscheidung vom 2026-09-06: Die sichtbare ASSESSOR-Version ist die eigenstaendige Produktversion und wird nicht aus Parser-, Mapping-, Processing- oder GPO-Evaluatorversionen abgeleitet. `2.5.1` bezeichnet den aktuellen Produktstand; technische Komponentenstaende bleiben im About-Popup und in der Ergebnisprovenienz getrennt sichtbar. Produktversionen folgen Semantic Versioning: Patch fuer kompatible Korrekturen, Minor fuer neue kompatible Funktionen, Major fuer bewusst inkompatible Produkt- oder Datenvertragswechsel. Festgelegte Fachentscheidung vom 2026-09-06: Ein GPO-Benchmark darf nur dann `Passed` oder `Failed` liefern, wenn die passend ausgewaehlte Microsoft-Security-Baseline einen vorhandenen und technisch vergleichbaren Sollwert vorgibt. Kundenwerte ohne Microsoft-Sollwert werden nicht als Abweichung gewertet; leere Sollwerte entfallen, nicht unterstuetzte Sollwerte bleiben Review/Warning. Die spaetere optionale Darstellung reiner Kundenkonfigurationen als Info bleibt offen. @@ -1944,6 +2195,42 @@ Diese Entscheidungen werden erst getroffen, wenn die jeweilige Phase ansteht ode ## 11. Risiken +| Ein flaechenfuellender Mengenbalken kann in Domainnamen hineinwachsen, hinter unterschiedlich breiten Zahlen enden oder durch eine vom Overall Score abweichende Farbe eine zweite Bedeutung suggerieren. Eine Maximalwert-Normalisierung wuerde zudem keine Anteile an der Gesamtverteilung zeigen. | Ein gemeinsames Vier-Spalten-Subgrid fuer Score, laengsten Namen, Balken und breiteste Zahl verwenden. Balken bleiben mit gemeinsamem Abstand ausschliesslich in ihrer dritten Spalte, erben den am Posture-Bereich gesetzten Overall-Tone und werden gegen die Summe der angezeigten Domainmengen skaliert. Exakte Zahlen bleiben rechtsbuendig sichtbar und autoritativ; `aria-hidden`, synthetische 75/25-Regression sowie Light-/Dark-, Donutfarb-, Kanten- und Ueberlaufpruefung sichern die Grenze. | + +- 2026-09-20, Lesetypografie: Groessere 14-/16-px-Rollen koennen bei langen Werten mehr Zeilen und vertikalen Scrollbedarf erzeugen. Inhalte duerfen deshalb umbrechen oder in den bereits dafuer vorgesehenen Kacheln scrollen, aber niemals gekuerzt, ellipsiert oder wieder auf kleinere Schrift reduziert werden. Kompakte Metadatenrollen bleiben nur fuer tatsaechlich sekundaere technische Angaben zulaessig; ihre Verwendung fuer Primaerinformation waere eine Regression. +- 2026-09-20, PingCastle-OS-Zustaende: Active/Inactive und Enabled/Disabled sind getrennte Quellachsen und muessen nicht dieselbe Verteilung ausdruecken. ASSESSOR zeigt deshalb alle vier Werte unveraendert und behauptet weder eine Partition noch eine Konsistenzbeziehung zu `Devices`. Mehrere PingCastle-Berichte koennen dieselben Systeme ueberlappend inventarisieren; sie bleiben getrennte `Inventory n`-Zeilen ohne Summierung. Schmalere oder umfangreichere Tabellen duerfen innerhalb der bereits scrollbaren Kachel scrollen, aber keine Spalte abschneiden oder Werte aus Platzgruenden entfernen. +- 2026-09-20, gemischte Data-Hub-Metrikprojektion: Das vollstaendige Projektblatt kann bei grossen Timeslots merklich spaeter als die Mandantenliste bereitstehen, weil aktuelle Policy-Evaluationen und ihre autoritative Rollup-Projektion einbezogen werden. Die Statuszeile bleibt deshalb waehrend des Ladens `aria-busy`, verwirft verspätete Antworten nach einem weiteren Auswahlwechsel und zeigt niemals die vorherige Mandantenkennzahl weiter. Eine kuenftige Beschleunigung darf nur cachen oder denselben serverseitigen Projektionsvertrag bereitstellen; ein Rueckfall auf Scanner-only-Zaehlen waere fachlich falsch. Die aktuelle Live-Abnahme belegt Dummy und LSW, nicht jede denkbare Datenmenge. +- 2026-09-18, Client-Info-Designangleichung: synthetisch visuell und interaktiv in beiden Themes verifiziert, nicht als Abnahme jedes realen Datenumfangs auszugeben. Sehr lange Quellwerte muessen weiterhin umbrechen; aufklappbare Inhalte duerfen nicht zu Verlust oder Umdeutung von Evidenz fuehren. Der bestehende schmale Stapelmodus zeichnet keine waagerechten Kurven. Keine produktiven Daten oder laufenden App-/Backendprozesse wurden fuer diese Abnahme angefasst. +- 2026-09-20, Client-Info-Breitenkorrektur: Die breite Dummy-Ansicht und der gestapelte 700-px-Fallback sind verifiziert. Gleiche Zeilenhoehen koennen innerhalb der kuerzeren Kachel bewusst freie Flaeche erzeugen; ein Hoehenversatz ist jedoch ausdruecklich verboten und darf nicht erneut als Deadspace-Loesung verwendet werden. Sehr lange Accepted-Risk-Titel oder eine deutlich groessere Risikoliste koennen die linke Rail weiterhin vertikal verlaengern; Inhalte duerfen deshalb weder gekuerzt noch durch eine kleinere Schrift in die feste Breite gezwungen werden. Die Aenderung ist reine Praesentation und nimmt keine Score-, Risiko- oder Persistenzmutation vor. + +Designkonsistenz (2026-09-18): Historische assessor-ui-Assets und Archetyp-/Abnahmeskizzen enthalten ueberholte Farben, Schriftgroessen und Layoutvorschlaege. Ihre ausdrueckliche Unterordnung unter die freigegebenen Referenzen sowie das Entfernen der Kopieranleitung verhindert, dass sie erneut als aktuelle Implementierungsbasis behandelt werden. Die Verankerung allein korrigiert noch keine bestehende Client-Info-Darstellung. Deren spaetere Umsetzung benoetigt einen direkten Referenzabgleich bei normalem Zoom und eine Light-/Dark-Abnahme mit synthetischen Daten; generierte Mockups sind kein Nachweis fuer richtige Kennzahlen, Runtime-Verhalten oder bereits implementiertes Design. + +Security-Domain-Filter (2026-09-18): Die vollstaendige Auswahlliste behauptet keine vorhandenen Befunde in jeder Domain. Eine Domain mit null Treffern ergibt bewusst eine leere Ansicht; bestehende Quellen-, Status-, Such- und sonstige Filter muessen bei Bedarf vom Nutzer entfernt werden. Reine GPO-Datensaetze bleiben ausschliesslich GPO & Baseline zugeordnet. Review-only- und Einzelbefundpfade behalten ihre explizite Datensatzeinschraenkung; diese sind nicht mit dem jetzt frei wechselbaren Domain-Deviation-Drilldown gleichzusetzen. + +GPO-Zaehlerabgleich (2026-09-18): Unterschiedliche Zaehlobjekte bleiben beabsichtigt; bei unveraendertem Dummy entsprechen 127 Vergleiche genau 25 Einstellungen. Bereits geladene Ansichten koennen bis zum erneuten Laden ihren vorherigen Ergebnisbestand halten. Laufabdeckung bleibt eine Darstellungsauswahl und kein Nachweis von Baseline-Anwendbarkeit oder Endgeraetewirksamkeit. Die Gesamtsuite enthaelt eine fachfremde bestehende XML-Testannahme, die code-Tags im gesamten Reader verbietet und am vorhandenen Policy-Analyzer-Suchschluessel anschlaegt; dieser Fix veraendert weder den Reader noch diesen Test. + +Result-DB-Statusfilter (2026-09-18): Widerspruechliche explizite Kombinationen wie Passed mit Deviation Yes liefern bewusst null Treffer; beide Auswahlen bleiben sichtbar und koennen entfernt werden. Die Statusfacette zaehlt erreichbare Alternativen unter allen anderen Filtern, daher sind ihre Werte bei aktiver eigener Mehrfachauswahl keine additive Aufteilung der angezeigten Treffer. Result DB und Work behalten unterschiedliche Zaehlobjekte. Die synthetische Abnahme benoetigt keine Kundendaten. + +- Work-Baseline-Rollup (2026-09-18): Unterschiedliche fruehere lokale Bearbeitungsnotizen benoetigen eine bewusste Entscheidung fuer die gemeinsame Zeile; sie bleiben im Reader lesbar. Risikoakzeptanzen bleiben an ihrer Originalidentitaet. Der Fix ist ausschliesslich synthetisch geprueft; auf ausdruecklichen Nutzerwunsch wurden keine Kundendaten zur Laufzeit geoeffnet. Result DB behaelt absichtlich die einzelnen Paketvergleiche als Evidenz. + +Work-Listen- und Pfadtitel-Restgrenze 2026-09-18: Die Liste nutzt weiterhin eine geschaetzte Zeilenhoehe fuer die begrenzte Virtualisierung, waehrend sehr lange Titel hoeher umbrechen koennen. Der Overscan haelt die sichtbaren Knoten bereit; die beseitigten konkurrierenden Animationen und die reservierte Scrollbarspur verhindern den konkret beobachteten Auswahlversatz, sind aber noch kein gemessener variabel hoher Virtualizer. Bei kuenftig nachweisbarem Versatz waehrend rein manuellen Scrollens ist eine gemessene Hoehenkarte mit Ankerkorrektur erforderlich, ohne die verbindliche Begrenzung montierter Zeilen aufzugeben. Technische Pfade duerfen an beliebigen Zeichen umbrechen, werden jedoch nicht gekuerzt oder inhaltlich normalisiert. Der konkrete `Registry Values · MACHINE\\...`-Fall ist synthetisch im gerenderten Reader abgesichert; eine zusaetzliche Windows-UI-Sichtpruefung war in dieser Sitzung nicht verfuegbar. + +GPO-Quellverfuegbarkeit 2026-09-17: Der am selben Tag dokumentierte Drei-Versuche-/Dead-Letter-Nebenbefund ist fuer GPO-Quelldateien durch Livepruefung, Enqueue-Sperren und pruefsummengebundene Wiederherstellung adressiert. Die Statuspruefung belegt Erreichbarkeit, nicht Inhaltsintegritaet; die vollstaendige Hashpruefung bleibt am Lesen und Wiederherstellen. Ein Ordnerupload muss dasselbe unveraenderte Transportpaket reproduzieren; abweichende Bytes werden bewusst abgewiesen. Der Speicher kann zwischen Pruefung und Lesen verschwinden; deshalb bleibt der erste fehlgeschlagene Job als technischer Verlauf gespeichert, die UI zeigt Upload required. Zugriffsfehler werden nicht als Datenverlust bezeichnet. Keine automatische Suche in alternativen Speicherorten und kein Wechsel des konfigurierten Stores; PostgreSQL-Ausfuehrung hier synthetisch auf Transaktionsebene geprueft, kein Live-Datenbanktest oder Backendneustart. + +GPO-Policy-Rollup 2026-09-16: Ein konservatives Policy-Fail darf nicht mit der Behauptung verwechselt werden, ein bestimmter Server oder Client sei effektiv verwundbar; GPO-Backups belegen ohne RSoP/Effective State keine konkrete Anwendung. Umgekehrt darf ein Conflict-/Duplicate-Label keinen belegten Mitglieds-Fail verdecken. Die kuenftige Umsetzung muss Verdict und Diagnoseflags getrennt persistieren/projizieren, je technischer Policy-Identitaet exakt einmal zaehlen und mehrdeutige Anwendbarkeit als Review required halten. Bis diese Kriterien versioniert und synthetisch verifiziert sind, gilt die neue Regel als bindender Vertrag, nicht als abgenommene Laufzeitfunktion. + +GPO-Misconfiguration-Scope 2026-09-16: Der score-neutrale Ausschluss nicht konfigurierter Empfehlungen verhindert eine unbeherrschbare Baseline-Rolloutliste, bedeutet aber bewusst, dass der GPO-Score keine Aussage ueber vollstaendige Microsoft-Baseline-Abdeckung trifft. Diese Grenze muss in jeder Scoreanzeige und jedem Export sichtbar bleiben. Die Einzel-Fail-Ausnahme in Conflict-/Duplicate-Containern darf erst implementiert werden, wenn technische Identitaet und Ergebnisbeitrag dedupliziert sind; sonst koennten gleiche Quellwerte mehrfach zaehlen oder mehrdeutige Konflikte faelschlich als Fail erscheinen. Historische Evaluationen duerfen nach einer kuenftigen semantischen Umsetzung nicht ohne neue Vertragsversion und explizite Neuauswertung umgedeutet werden. + +Gemischter Work-Filterkontext 2026-09-16: GPO-spezifische Felder bleiben in den unveraenderten Datensaetzen des All-Records-Blatts vorhanden, werden bei Source All aber bewusst nicht als Facetten angeboten. Sie sind nach eindeutiger GPO-Auswahl vollstaendig verfuegbar. Neue GPO-Facetten muessen deshalb sowohl in den GPO-Vertrag als auch in die Liste der kontextgebundenen Facetten aufgenommen werden; ein fehlender Eintrag koennte sie im Mischkontext erneut sichtbar machen oder im GPO-Kontext ausblenden. Permanente Wechselregressionen begrenzen dieses Risiko. + +Work-Snapshots 2026-09-16: Gespeicherte Finding-IDs sind an den exakten Work-/Timeslot-Scope gebunden. Werden Ergebnisse in einem spaeter geladenen Verarbeitungsstand ersetzt, kann ein alter lokaler Snapshot auf nicht mehr vorhandene IDs zeigen und dadurch eine leere Ansicht ergeben; der Fix ordnet IDs nicht heuristisch neuen Findings zu. Die bestehende Scopebindung verhindert eine Anwendung auf einen anderen Timeslot. Eine kuenftige ueber Reimport stabile Snapshotmigration benoetigt eine ausdrueckliche Identitaets- und Konfliktregel. + +GPO-Varianten 2026-09-14: Pass/Fail gilt nur fuer die beruecksichtigte Baselineauswahl und importierte Backup-Konfiguration, nicht fuer einen unbekannten Geraetezielbestand oder effektive Sicherheit. Unvollstaendige Kandidatenerfassung und unbekannte strukturelle Teilanalysen verhindern belastbare Einigkeit. Bekannte wertunabhaengige ADMX-/Baseline-Domaenen-/Zeitmetadatenluecken bleiben diagnostiziert, blockieren aber technisch lesbare Werte nicht. Vor einer Aenderung bei unterschiedlichen Empfehlungen ist die passende Vorlage festzulegen. Historische Ergebnisse benoetigen nach Backendwechsel eine explizite Neuauswertung; keine reale Bestandsauswertung oder PostgreSQL-Integrationsabnahme in diesem Auftrag. + +Timeslotvergleich 2026-09-11: Der bisherige Zweilaufadapter kann Quellenidentitaet und Processingpruefungen umgehen; Regelmatches sind nicht objektgenau, und Abwesenheit wird teilweise als Behebung gewertet. Die Score-Pruefpopulation erkennt Assetwechsel nicht ausdruecklich. Teilweise Folgescans koennen alte Verpflichtungen aus der Anzeige verdraengen, ohne Originaldatensaetze zu loeschen. Deshalb keine Abnahme als belastbarer A/B-Bericht und keine blosse UI-Verdrahtung vor P2-P4. Das neue offene Arbeitspaket dokumentiert die Schutzregeln und Gegenbeispiele; alte Abschluss-/Testnotizen ersetzen diese Abnahme nicht. + +Accepted Risk 2026-09-10: Deklarierte Namen und Nachweisreferenzen sind keine authentifizierten Signaturen oder geprueften Berechtigungen. Bestehende Projektloeschung und Datenbankadministration begrenzen den Schutz der JSONB-Historie. Es gibt noch keinen unabhaengigen Archivierungs-/Legal-Hold-Vertrag und keinen Fristenbenachrichtigungsdienst. Diese Grenzen sind im Dialog und in `SECURITY.md` dokumentiert; der Ausbau bleibt Teil von Phase 14. Synthetische Repository-/SQL-Transaktionstests ersetzen keine freigegebene PostgreSQL-Integrationsabnahme. + Purple-Knight-Begleitdateien 2026-09-10: Alte Importe koennen den nativen Wert noch nicht als Kontextbeobachtung enthalten. Dann kann die neue Leseprojektion ihn nicht nachtraeglich aus Rohtext erfinden und die betroffenen Summary-/Findings-Dateien muessen gemeinsam neu importiert werden. Mehrere unterschiedliche Ergebnisberichte in demselben Scanlauf werden bewusst nicht automatisch mit einem einzelnen Summarywert verbunden. Weitere Scanner 2026-09-10: Unbekannte Formate und anders skalierte oder mehrdeutige Kennzahlen benoetigen eine belegte Profilzuordnung; beliebige Scorefelder werden nicht automatisch als Gesamtwert interpretiert. Pflichtdeklaration und synthetische Regressionen sichern den Vorrang unterstuetzter nativer Werte, ersetzen aber keine fachliche Pruefung neuer Herstellerformate. @@ -1968,6 +2255,8 @@ Festgelegtes Client-Info-Darstellungs- und Bewertungsrisiko vom 2026-09-07: Eine Festgelegtes Workspace-Navigationsrisiko vom 2026-09-07: Ein aus dem aktiven Fachblatt abgeleiteter oder gegen dessen Treffer nachgezaehlter Source-Filter kann alle anderen Scanner ausblenden; ein blosser Fremdwertfilter auf dem GPO-Blatt wuerde wiederum eine leere Ansicht statt des gewuenschten Scans erzeugen. Gegenmassnahme: Optionsliste ausschliesslich aus dem vorhandenen projektweiten Aggregat bilden, die stabile Provenienz-ID von Spaltenindizes entkoppeln, ihre Werte von lokaler Nachzaehlung ausnehmen und bei einer Auswahl aus einem Fachblatt zuerst auf dasselbe Aggregat wechseln. Regressionen pruefen drei unterschiedliche Scans, unveraenderte globale Optionen und das Navigationsziel. +Festgelegtes GPO-Kontextregressionsrisiko vom 2026-09-14: Eine GPO-Auswahl ueber den workspaceweiten Source-Filter kann auf dem All-Records-Blatt zwar die Datensaetze reduzieren, aber weiterhin das zusammengefuehrte Multiple-Tools-Profil und dessen bereits begrenzte Facetten anzeigen. Dadurch erscheinen fachfremde Statuswerte und Scannerfilter; ausgeblendete Altfilter koennen unbemerkt weiterwirken. Ein profilweiter Wertvergleich ueber alle Felder kann zudem `Pass` aus Comparison oder Historical result als aktuellen Passed-Status missverstehen. Gegenmassnahme: den eindeutigen Quellwert ueber Datensatzprovenienz als Werkzeugkontext aufloesen, den GPO-Facetten- und Statusvertrag vor Priorisierung und Limit anwenden, GPO-Status ausschliesslich aus dem aktuellen Statusfeld bestimmen, inkompatible gesetzte Facetten entfernen und den exakten Source-Auswahlweg samt fremdem Pass-Wert und Rueckkehr zum Mischkontext dauerhaft synthetisch pruefen. + Festgelegtes Facettenrisiko vom 2026-09-07: Die allgemeine Einwertigkeitspruefung oder ein kuenftiges Facettenlimit koennte `Source: Scan` erneut aus GPO- oder anderen Ansichten entfernen; flexible Gruppenbreite koennte den Filter ausserdem optisch zwischen Fachfacetten statt stabil ganz rechts platzieren. Gegenmassnahme: Source-Scan fachlich explizit erkennen beziehungsweise aus vorhandener Provenienz ableiten, von der Nuetzlichkeitsunterdrueckung ausnehmen, nach dem begrenzten Fachfacettensatz als letztes Element anfuegen und per eigener CSS-Klasse mit automatischem linken Rand an die rechte Kante setzen. Synthetische Tests pruefen GPO-Vollreihenfolge, Fallback, Klasse und Endposition. Festgelegtes GPO-Quellenpfadrisiko vom 2026-09-07: Source-Locators koennen lokale Laufwerke, Backupordner, Artefaktnamen oder kundenirrelevante Importstruktur vor der eigentlichen GPO-GUID enthalten; eine tolerante Teilanzeige koennte diese Informationen offenlegen. Gegenmassnahme: zentraler reiner Presenter mit geschlossener GUID-/`DomainSysvol/GPO`-Erkennung, Anzeige ausschliesslich ab dem erkannten internen Anker und fail-closed Platzhalter fuer jede andere Form. Originalprovenienz bleibt unveraendert gespeichert und wird nicht zur Navigation oder Dateiaufloesung verwendet. @@ -1999,6 +2288,7 @@ Festgelegtes Betriebsrisiko vom 2026-09-06: Verzeichnisabhaengige Compose-Projek | Ein lokal bereitgestellter Policy-Regelkatalog kann nach fachlicher Freigabe unbemerkt veraendert, nur teilweise konfiguriert, als Symlink umgebogen oder mit ungueltigen Runtime-Strukturen geladen werden und dadurch andere Findings erzeugen. | Pfad und SHA-256 als untrennbares Konfigurationspaar verlangen, nur regulaere Nicht-Symlink-Dateien bis 5 MiB lesen, Hash vor UTF-8-/JSON-Parsing vergleichen und danach den geschlossenen Katalogvertrag fail-closed validieren. Bei jedem Fehler vor Repository- und Serverstart abbrechen; Evaluation Runs bewahren weiterhin den vollstaendigen tatsaechlich verwendeten Katalog. | | Historische GPO-Reprocessing-Ketten koennen alte Konflikte, Reviewhinweise, Abweichungen und Findings mehrfach als aktuellen Zustand erscheinen lassen; wenn UI und Aktionsableitung unterschiedliche Auswahlregeln verwenden, bleiben ausserdem veraltete Evaluationen bedienbar. | Aktive Profile und nicht ersetzte Identity-Analysen je Artefakt als Wurzel einer gemeinsamen deterministischen Aktivkette verwenden; nur dazu passende Aggregationen, jeweils neueste Evaluationen und Finding-Runs in die aktuelle Sicht aufnehmen. Historie getrennt erhalten und dieselbe Auswahlfunktion fuer Summary, Review Queue sowie Evaluate-/Finding-Aktionen regressionspruefen. | |---|---| +| Scannertexte koennen `U+0000` enthalten: Browser und In-Memory-Vorschau akzeptieren den Wert, PostgreSQL `jsonb` weist ihn beim Abschluss ab. Eine nur an der Datenbank vorgenommene Bereinigung wuerde ausserdem Vorschau und gespeichertes Modell auseinanderlaufen lassen. | Das Zeichen einmal an der gemeinsamen kanonischen Importgrenze in die explizite Darstellung `\\u0000` ueberfuehren, Anzahl und Repraesentation diagnostizieren und Hash/Locator unveraendert erhalten. Maester-XLSX und kompletter Preview-/Complete-HTTP-Pfad bleiben permanente Regressionen; Abschlussfehler duerfen die erfolgreiche Vorschau nicht mehr verwerfen. | | Unterschiedlich hohe oder geschlossene Client-Info-Karten koennen in einem regulaeren Zeilenraster grosse Leerraeume hinterlassen; eine unbedingte JS-Masonry-Aktivierung koennte ohne Mess-API dagegen Karten ueberlagern. | Mit dem normalen Raster starten, Kartenhoehen inklusive gemeinsamem Segmentabstand messen und erst danach 1-px-Spannen mit `grid-auto-flow: row dense` aktivieren. Raster und jede Karte beobachten, nur geaenderte Spannen schreiben und bei fehlendem ResizeObserver im sicheren Standardraster bleiben. Synthetische DOM-Hoehen und Collapse werden regressionsgeprueft. | | Infrastruktur-Fakten koennten bei einer spaeteren Dashboardverdichtung erneut mit Risiko-Mengenwerten in einer ueberlangen Mischkarte zusammengefuehrt oder zwischen beiden Karten doppelt dargestellt werden. | `Infrastructure & Resilience` ausschliesslich mit `risk.slice(1)` speisen und den vollstaendigen Faktenblock genau einmal in `Infrastructure Details` rendern. Instanzzahl, beide Titel, Trennung und vollstaendige Snapshot-Faktenliste statisch regressionspruefen; beide Karten ueber den gemeinsamen Collapse-Test absichern. | | Maester-Fehlertexte koennen PowerShell-Kontext, HTTP-Antwort und verschachteltes JSON in einer langen Zeile mischen; eine aggressive Umformatierung koennte dabei Diagnosewerte verlieren oder normale Ergebnisprosa faelschlich als Fehler behandeln. | Nur die eindeutige Kombination aus Maester, Ausfuehrungsfehlerformulierung und `Invoke-MgGraphRequest` strukturiert parsen. Die Primaermeldung und bekannte technische Felder additiv extrahieren, den unveraenderten Rohtext stets einklappbar erhalten und bei jeder Nichterkennung auf den generischen Renderer zurueckfallen. Parser und Darstellung mit synthetischen Fehlern regressionspruefen. | @@ -2205,6 +2495,68 @@ Festgelegtes Betriebsrisiko vom 2026-09-06: Verzeichnisabhaengige Compose-Projek ## 12. Änderungsprotokoll +2026-09-20: Maester-Import mit nativem Unicode-Nullzeichen repariert (Phase 13A/13C). Die reale PostgreSQL-Fehlermeldung belegte `unsupported Unicode escape sequence` fuer `\\u0000` im Finding-JSONB. `escapeJsonUnicodeNulls` arbeitet rekursiv an der kanonischen Modellgrenze und repraesentiert jedes Vorkommen sichtbar als `\\u0000`; `unicode-null-escaped` dokumentiert Anzahl und Darstellung pro Importdatei. Der Auto-Import behaelt eine bereits erfolgreiche Vorschau bei einem Abschlussfehler, statt eine leere Fehler-Vorschau zu erzeugen. 26 fokussierte Maester-/HTTP-Tests, beide Produktionsbuilds, Local-only- und Designpruefung erfolgreich; der einmal parallel gestartete zusaetzliche npm-Testlauf traf einen Windows-`spawn EPERM`, die identischen fokussierten Tests liefen davor und danach erfolgreich. Keine Migration oder Bestandsdatenmutation; laufender Backendprozess benoetigt den aktualisierten Build. + +2026-09-20: Mengenbalken fuer die Security-Domain-Verteilung in Client Info umgesetzt und nach Nutzerkorrektur von Text und Zahl getrennt sowie mit dem Overall-Score-Donut farblich gekoppelt (Phase 7). `DashboardDomainRow` verwendet seinen ohnehin sichtbaren Abweichungs- oder Review-only-Wert; `DashboardPanel` bildet einmal die Summe der angezeigten Domains und uebergibt sie als Nenner. Ein gemeinsames Vier-Spalten-CSS-Subgrid bemisst Score, laengsten Domainnamen, Balkenflaeche und breiteste gerenderte Zahl. Das dekorative `aria-hidden` Balkenelement belegt ausschliesslich die dritte Spalte, endet bei jeder Zeile an derselben Kante und waechst nach links. `dashboardScoreTone` setzt denselben Overall-Tone am Posture-Bereich und am Donut; alle Balken lesen dessen `--chart-color` exakt, waehrend Domainknoten ihre eigene Tone-Klasse behalten. Ein synthetischer 3:1-Fall sichert exakt `75 %`/`25 %`, alle acht Katalogzeilen sowie Subgrid- und gemeinsame Tone-Geometrie. 23 fokussierte Tests, Designsprachpruefung und Client-/Server-Produktionsbuild bestanden. Live am Dummy: neun getrennte Zeilen, je rund 12 px zwischen Text/Balken und Balken/Zahl, Donut und alle Balken exakt `rgb(232, 33, 79)` in Light/Dark, keine Ueberlaeufe; Light wiederhergestellt. Keine Daten-, Import-, API-, Persistenz-, Schema-, Klassifikations-, Score- oder Drilldownmutation. + +2026-09-20: Verbindliche 14-/16-px-Lesetypografie in Client Info umgesetzt (Phase 7, Nutzerentscheidung). `AGENTS.md` unterscheidet nun primaere Informationslabels und strukturierte Tabellen-/Kachelinhalte mit mindestens 14 px von lesbaren Werten und Fliesstext mit 16 px; nur Controls, technische Metadaten und Badges duerfen kompakter bleiben. Environment Detail verwendet die Rollen fuer Faktlabels/-werte, Source-Overview-Metadaten, Operating-systems-Hinweis, Gruppen, Tabellenkoepfe und Quellspalten. Synthetische CSS-Vertragstests sichern die Rollen. 23 fokussierte Tests, Designsprachpruefung und Client-/Serverbuild erfolgreich. Live in Light und Dark: `Domain` 14 px/700, `sevenkingdoms.local` 16 px/400, Source-Information und OS-Tabelle 14 px, kein horizontaler Ueberlauf der Directory-Kachel; Light wiederhergestellt. Keine Daten-, Import-, API-, Persistenz-, Schema- oder Bewertungsmutation. + +2026-09-20: PingCastle-Zustandswerte in Client Info ergaenzt (Phase 7, Nutzererweiterung). Die bestehende Operating-systems-Tabelle fuehrt vier neue strukturierte Zahlenspalten `Active`, `Inactive`, `Enabled` und `Disabled`. `operatingSystemInventory` liest die bereits verlustfrei gespeicherten PingCastle-Labels nur aus exakt derselben Source Row wie Betriebssystem und `Nb OS`; mehrdeutige, fehlende, negative oder fremdzeilige Werte bleiben unbekannt. Ein synthetischer Extraktionsfall und zwei UI-/Joinregressionen sichern vollstaendige Darstellung sowie das Verbot quellenuebergreifender Uebernahme. 28 fokussierte Tests, Design-/Local-only-Pruefung und Client-/Serverbuild erfolgreich. Live read-only am Dummy bestaetigt `Windows Server 2019 1809` mit Devices/Active/Inactive/Enabled/Disabled `1/1/0/1/0`, getrennte unquantifizierte Quelle mit Gedankenstrichen, kein horizontaler Ueberlauf bei 568 px sowie lesbare Light-/Dark-Rollen; Light wiederhergestellt. Keine Import-, API-, Persistenz-, Schema- oder Datenmutation. + +2026-09-20: Deviation-Anzeige zwischen Data Hub und Client Info vereinheitlicht (Phase 7, Nutzerkorrektur). Die Data-Hub-Statuszeile laedt nun den explizit ausgewaehlten gemischten Timeslot inklusive assessmentgebundener GPO-/Policy-Beobachtungen und wertet dessen Projektblatt mit derselben aus React herausgezogenen Zustandsklassifikation wie Client Info aus. Die Timeslot-Auswahl traegt dafuer neben Run-IDs auch Assessment-IDs; GPO bleibt fachlich eine eigene Quelle und wird nicht in einen Scanner-Run umgedeutet. Client Info verwendet fuer `Deviations` dieselbe `datahub-reference-knob`-Variante ohne lokale Flaechen-/Typografieueberschreibung. Ein synthetischer Mischfall sichert Scanner- plus GPO-Deviations dauerhaft; weitere Quelltext- und Interaktionstests sichern Scope, Rendering und Work-Drilldown. 32 fokussierte Tests, Design-/Local-only-Pruefung und Client-/Serverbuild erfolgreich. Live am Dummy: Data Hub und Client Info jeweils `477 / 1.833 / 26 %`; Light-/Dark-Styles fuer Flaeche, Ring, Padding, Typografie und Farben identisch, Light wiederhergestellt. Keine Daten-, API-, Persistenz-, Schema- oder Bewertungsmutation. + +2026-09-20: Violett als UI-Rolle vollstaendig entfernt (Nutzerentscheidung 2026-09-20, AGENTS.md "UI segments and tiles", reiner Darstellungsfix ueber bereits aufbewahrten Fakten). Die violette Akzentfamilie `--accent`/`-hover`/`-active`/`-on`/`-subtle` ist aus `src/styles/ui-tokens.css` geloescht statt umgeleitet, weil jeder ehemalige Verbraucher direkt auf die passende Rolle umgestellt wurde: Tastaturfokus (Eingabefelder, `.segmented__item`) auf `--focus-ring`, Auswahl-/Aktivzustand (Segmented Tabs, Finding-Card-Auswahl, Checkboxen, Ergebnisfenster-Umriss, diverse Hoverzustaende) auf `--marking-color`/`--button-marked-bg`/`--button-marked-text`. Zusaetzlich identifiziert und behoben, weil dieselbe verbindliche Regel jeden violett aufloesenden Token verbietet: die violett getoente Auswahlflaeche `--surface-selected` (jetzt aus `--marking-color` gemischt, betraf u. a. generische `.row`/`.table`-Auswahl, Data-Hub-Verlaufszeilen und die Checkbox-Indeterminate-Flaeche), die violetten Pathfinder-Graph-Knoten-/Kantenfarbe `--graph-relation` sowie der violette Results-Action-Umriss `--border-results-action`/`--text-results-action`, beide neu auf einen dedizierten, nicht-violetten Ton bzw. auf `--marking-color` gestellt, der violette Donut-/Client-Info-Status `--donut-not-applicable` (inkl. der irrefuehrend benannten Alias-Rolle `--client-info-purple`) auf einen dedizierten Rosaton, der violette Diagrammton `--viz-1` auf Oliv-Gruen sowie der zu nah an Violett liegende Orchid-Ton `--viz-6` auf ein eindeutiges Pink. Ein neuer Token `--chart-tone-emphasis` (beide Themes) ersetzt die Wiederverwendung von `--accent` fuer Kategorie-/Chart-Flaechen (PKI-Chart-Ton `.tone-pki`/`.tone-accent`, IOE-Summenzahl, Bar-Track- und Ring-Fallback, `origin-pill.native`). Zwei hartkodierte Hex-Paletten fuer die Fensterunterscheidung gleichzeitig geoeffneter Result-Fenster (`DatasetViewer.tsx`, `MitreGraphView.tsx`, `ObsidianGraphView.tsx`) enthielten ebenfalls violette Eintraege und sind ersetzt. Reine Farbtoken-/CSS-Aenderung ohne Scoring-, Persistenz- oder API-Beruehrung, daher keine Reimport-Manifestversion. Eine bestehende Regression in `tests/features/obsidian-graph.test.ts` pruefte woertlich den alten violetten Hex-Wert und ist auf eine themenoffene, aber violett-ausschliessende Pruefung umgestellt. `npm test`: 1.416 bestanden, 13 uebersprungen, derselbe fachlich unabhaengige, durch isolierten Stash-Vergleich bestaetigte Vorbestand (`tests/features/gpo-xml-presentation.test.tsx`) faellt nachweislich auch ohne diese Aenderung; Client- und Serverbuild erfolgreich. Keine Live-Browserabnahme durchgefuehrt, Verifikation ausschliesslich ueber Tokenverfolgung, Build und Testlauf. + +2026-09-18: Client Info tatsaechlich an die freigegebene Ableton-Designsprache angeglichen (Phase 7, Folgeauftrag zur Designverankerung). Gemeinsame Theme-/Statusrollen, flache eckige Tiles, standardisierte Aktionen, kompakte Quellenkacheln, aufklappbare Environment-/Risiko-Details und ruhigere Domaenenzeilen. Die vom Nutzer ausdruecklich geschuetzten Overall-zu-Domaenen-Kurven bleiben dynamisch vermessen. 47 fokussierte synthetische Tests, Client-/Server-Typechecks, separater Client-Produktionsbuild, Design-/Local-only-Pruefung und synthetische Browserabnahme beider Themes bei vier Breiten bestanden. Keine Daten-, Scoring-, API-, Persistenz- oder Dienstenaenderung. Einschraenkungen und Messumfang im aktuellen Status und Risikoabschnitt dokumentiert; Phasenstatus unveraendert. + +2026-09-18: Ableton-Designvertrag auf ausdrueckliche Nutzerkorrektur verankert (Phase 7). AGENTS.md benennt die freigegebenen Data-Hub-, Work- und Pathfinder-Ansichten als verbindliche Referenzen fuer alle Ansichten und Designartefakte, einschliesslich Client Info. Die bisherige visuelle Client-Info-Ausnahme und der verpflichtende dunkle Faktenstreifen sind ausdruecklich supersediert. Lokaler assessor-ui-Skill und seine Referenzdokumente benennen den Vorrang der aktuellen Projektregeln; die README-Kopieranleitung fuer veraltete Skill-Assets wurde entfernt. Die drei generischen Client-Info-Mockups gelten als verworfen. Pruefumfang: Dokumentkonsistenz, relative Verweise und Patch-Whitespace; keine Runtime-, CSS-, Komponenten-, Daten- oder Persistenzaenderung, deshalb kein Build und keine behauptete visuelle Abnahme. Fachliche Client-Info-/Scorevertraege und vorhandene Phasenstatus bleiben erhalten. + +2026-09-18: Management-Overview-Renderer umgesetzt (Artefakt A der Berichtsstrecke, `docs/REPORT_STRATEGY.md`). `src/exports/management-overview-report.ts` erzeugt ein selbsttragendes, statisches HTML-Dokument in Deutsch: kein Script, kein Inline-Handler, keine externe URL, kein Link, kein `url()` und damit kein Netzwerkzugriff beim Oeffnen. Die Abschnittsfolge ist Assessment-Identitaet, Overall Posture mit Security Domains, Priority Findings, Remediation-Status, Abdeckung und Luecken, Source Overview. Priority Findings sind nach Security Domain gruppiert und innerhalb je Quelle nach deren deklariertem Maßstab geordnet, der im Dokument benannt wird; eine quellenuebergreifende Rangfolge entsteht nicht. GPO bleibt gleichgewichtig mit Verdiktzaehlern, getrennten Conflict-/Duplicate-Angaben, ausgewiesener Score-Neutralitaet und Scope-Hinweis. Der Remediation-Abschnitt entfaellt ohne Reviews und ist sonst ausdruecklich als Selbstauskunft ohne technischen Nachweis gekennzeichnet. Verbindliche Scoreformulierung uebernommen; `Baseline-Compliance` und `Baseline-Abdeckung` sind durch Tests ausgeschlossen. Unbekanntes rendert als Gedankenstrich, ein fehlender Score zeichnet keinen Nullbogen. Donutgeometrie entspricht dem Vertrag: volle 360 Grad, neutraler Track, Wertbogen im Uhrzeigersinn ab zwoelf Uhr, flache Enden, zentrierter Wert mit kleinerer Einheit; Bereichsueberschreitungen werden geklemmt. Ausschliesslich Tokenwerte aus `src/styles/ui-tokens.css`, Light als Dokumentstandard und Dark ueber `prefers-color-scheme` aus denselben Rollen, eigener Druckzweig. 17 synthetische Tests einschliesslich Struktur-, Escaping- und Donutgeometriepruefung bestanden; Client- und Serverbuild, Local-only- und Designpruefung erfolgreich; Gesamtlauf 1.399 bestanden, 13 uebersprungen, derselbe fachlich unabhaengige Vorbestand (`tests/features/gpo-xml-presentation.test.tsx`) faellt weiterhin auch ohne diese Aenderung. Abweichung benannt: Ein ausgeliefertes Dokument verwendet bewusst keine Applikationsshell (Sidebar, Topbar, Command Band) und keinen der vier Seitenarchetypen; Typografie-, Donut-, Tile-, Segment- und Statusregeln gelten unveraendert. Rein additiv, kein Reimport erforderlich. + +2026-09-18: Prioritaetsbasis als Profilpflicht deklariert (Berichtsstrecke, Festlegungen in `docs/REPORT_STRATEGY.md`). `ToolPriorityBasisDefinition` ist auf jeder `ToolProfileDefinition` verpflichtend und nennt exakte gemappte Eigenschaften, Skala, Richtung und Semantik oder einen ausdruecklichen Grund, warum keine belastbare Basis existiert. Purple Knight und Maester deklarieren native Severity, PingCastle deklariert Points, weil seine Severity abgeleitet und bauartbedingt bei `high` gedeckelt ist, CIS-CAT und Generic deklarieren `unavailable` mit Begruendung. Zusaetzlich werden ausgeschlossene Eigenschaften mit Grund festgehalten: CIS `Level 1`/`Level 2` ist eine Haertungsprofilstufe und darf nie zur Kritikalitaet befoerdert werden, PingCastles Punkteschema-Beschreibung und Domainrisiko sind keine Einzelfundraenge. `reportPriorityBasisFrom` macht aus einer `unavailable`-Deklaration eine ausdrueckliche `equal-weight`-Basis mit der Profilbegruendung, sodass ein Bericht die Unranked-Lage benennt statt eine fehlende Deklaration zu suggerieren. Zehn zusaetzliche synthetische Tests einschliesslich Vertragspruefung aller registrierten Profile bestanden; Client- und Serverbuild erfolgreich; Gesamtlauf 1.382 bestanden, 13 uebersprungen, derselbe fachlich unabhaengige Vorbestand (`tests/features/gpo-xml-presentation.test.tsx`) faellt weiterhin auch ohne diese Aenderung. Rein additive Profilfelder: keine Erkennung, Extraktion, Zuordnung, Normalisierung, Bewertung oder Persistenz veraendert, daher kein Reimport erforderlich. + +2026-09-18: Report-Projektion als plattformneutrales Domain-Modul umgesetzt (neue Berichtsstrecke, noch keiner Phase zugeordnet; Festlegungen in `docs/REPORT_STRATEGY.md`). `src/domain/report-projection.ts` liefert die gemeinsame Grundlage fuer Management Overview, Technical Report, Arbeitsgrundlage und Delta Report: sprachneutral, ohne Uhr, Speicher, Netzwerk oder Praesentationstypen. Prioritaet wird nie quellenuebergreifend gebildet; eine deklarierte Severity-Basis ohne Severity-Abdeckung faellt nachweisbar auf `undeclared` mit eigener Diagnose zurueck. GPO bleibt gleichgewichtig, selbstgemeldete Reviewstatus werden nie zu behobenen Findings, und ein Delta entsteht ausschliesslich aus einem gespeicherten Vergleich mit gewaehltem Referenzlauf. Die Sicherheitsdomaenen-Zuordnung wird injiziert, damit die Domaenenschicht nicht auf die Featureschicht zeigt. 14 neue synthetische Tests bestanden, Client- und Serverbuild erfolgreich; Gesamtlauf 1.372 bestanden, 13 uebersprungen, ein fachlich unabhaengiger Vorbestand (`tests/features/gpo-xml-presentation.test.tsx`) faellt auch ohne diese Aenderung. Rein additiv: keine bestehende Datei, kein Schema, keine Pipeline und keine Kundendaten beruehrt. + +2026-09-18: Vollstaendigen Client-Info-Security-Domain-Katalog fuer Work freigegeben (Phase 7, Nutzerkorrektur). Alle acht Domains bleiben mit exakten gemeinsamen Labels und auch bei null Treffern auswaehlbar; aktive Status-/Facettenauswahlen bleiben bei leeren Schnittmengen erhalten. Client-Info-Deviation-Domaindrilldown auf sichtbaren gemeinsamen Filter umgestellt, feste Record-ID-Einschraenkung dort entfernt. Vier permanente synthetische UI-Regressionen und 40 fokussierte Tests bestanden; keine Mandantendaten oder Klassifikations-/Persistenzlogik veraendert. + +2026-09-18: GPO-Zaehlerabgleich Result DB/Work (Phase 7/13B) umgesetzt: SQL-Laufauswahl auf verschiedene verglichene Baseline-Pakete angeglichen und anzeigewertbasierte Unterdrueckung autoritativer Fail-Urteile entfernt. 50 fokussierte Tests einschliesslich fuenf real ausgefuehrter synthetischer PostgreSQL-SELECT-Faelle, zwei Work-Einstiege und Result-DB-Interaktion gruen; beide Produktionsbuilds und Local-only-/Designpruefung bestanden. Dummy ausschliesslich lesend abgenommen: 127 Vergleiche zu 25 Einstellungen, gleiche aktuelle Run-ID, keine versteckten Fail-Eintraege oder zusaetzlichen Paare. Keine Migration oder Datenmutation. Bestehende fremde XML-Reader-Testabweichung bleibt dokumentiert; keine Phasenabnahme behauptet. + +2026-09-18: Result-DB-Filterbenennung mit Work vereinheitlicht und Deviation-Ausnahme entfernt (Phase 7/13B, Nutzerkorrektur). Gemeinsame Labels in Work, Result-DB-Facette und Details; Zaehler beachten Deviation, Statusaktionen erhalten die gesetzte Auswahl, Nulltrefferfilter bleiben abwaehlbar. Zwei permanente synthetische Browserkomponenten-Interaktionstests decken beide Timeslotarten ab. 45 fokussierte Tests, Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Keine Dateninspektion, Bestandsmutation, SQL-Migration oder Bewertungsveraenderung. + +2026-09-18: Ueberhang langer Security-Template-Registrytitel behoben (Phase 7/13B). `PathText` erkennt neben `registry ·` nun den tatsaechlich angezeigten Vertrag `Registry Values · MACHINE\\...`/`USER\\...`, ohne allgemeine Security-Template- oder AppLockertexte umzudeuten. Reader-Heading und Summary nutzen damit die begrenzte technische Pfaddarstellung und ueberlagern `Accepted Risk` nicht mehr. Zwei synthetische Regressionen ergaenzt; 1.351 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen, Produktionsbuild erfolgreich. Keine Dateninspektion, Bestandsmutation, Migration, Reimport oder Neuauswertung. + +2026-09-18: GPO-Mehrfachdarstellung in Work behoben (Phase 7/13B). Neun Baselinepakete derselben Einstellung ergeben eine Work-Zeile mit allen Einzelvergleichen und genau einer Quellanzeige. Gemeinsame Urteilprioritaet, individuelle Baselinefacette, paketbezogene Sollwerte, sichere Wertmarkierungen, historische Readiness und Erhalt frueherer lokaler Reviews implementiert. Zehn neue synthetische Regressionen; Gesamtsuite 1.349 bestanden, acht optionale PostgreSQL-Tests uebersprungen, Local-only-/Designpruefung und beide Builds erfolgreich. Keine Dateninspektion, Bestandsmutation, Migration, Reimport oder Neuauswertung; Result DB und gespeicherte Baselinevergleiche unveraendert. + +Verifiziert 2026-09-18 (Phase 13B, Work-Listenstabilitaet und lange Registrytitel): Die einzelne FindingCard fuehrt bei Auswahl kein eigenes glattes `scrollIntoView` mehr aus; der virtuelle Listencontainer bleibt alleinige Scrollautoritaet und springt nur bei ausserhalb liegenden Eintraegen ohne Animation. `scrollbar-gutter: stable` reserviert die Scrollbarspur der Datensatzliste und verhindert wechselnde Textbreite. `PathText` erkennt nun den bestehenden Titelvertrag `registry · ` und rendert den unveraenderten Registrypfad im Finding-Reader und in dessen Finding-Ueberschrift mit der gemeinsamen technischen Pfaddarstellung; volle Breite, `border-box` und bestehendes `overflow-wrap: anywhere` halten lange Pfade innerhalb der Lesespalte, ohne Accepted Risk oder Aktionen zu ueberlagern. Ein Interaktionstest waehlt eine sichtbare mehrzeilige Registrykarte und belegt null kartenlokale Scrollanimationen; Pfad-, Typografie- und GPO-Darstellungstests sichern den zweiten Screenshotfall. `npm test`: 1.339 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Bestehende Chunkgroessenwarnung unveraendert; die Laufzeitpruefung blieb auf den vom Nutzer gezeigten LSW-Kontext begrenzt, Bestandsdaten wurden nicht veraendert. Keine API-/SQL-/Persistenz-/Fachlogikaenderung. + +GPO-Quellwiederherstellung 2026-09-17 (Phase 13B, Nutzerauftrag, verifiziert): Fehlende GPO-Artefaktdateien ergeben jetzt bereits beim Statuslesen Upload required mit gezieltem ZIP-/Ordnerupload; Zugriffsprobleme bleiben separat Storage unavailable. Reconciler, Retry und Reprocess pruefen vor dem Einreihen, nachtraeglich fehlende Quellen beenden einen bereits gestarteten Job nach einem Versuch. Der Originalupload prueft Projekt/Artefakt/Timeslot, Groesse und SHA-256, repariert auch den normalen Dublettenpfad und stellt nur fehlende Bytes atomar unter derselben Speicher-ID wieder her. Aktuelle Analysen, Originalzeitpunkte und Historie bleiben erhalten; reine Re-evaluation ueber erhaltene Eingaben bleibt erreichbar. 16 neue synthetische Regressionen sichern Service, HTTP, API-Client, beide Oberflaechen mit ZIP/Ordner, automatische Reparatur, ersten Fehler, Zugriffsfehler, falsche Quelle, fremde Scopes, Wiederherstellung ohne Revisionswechsel sowie Local-/PostgreSQL-Jobverhalten und konkurrierende Dateiwiederherstellung. npm test: 1.336 bestanden, acht optionale PostgreSQL-Integrationstests uebersprungen; Local-only-/Designpruefung und Client-/Server-Produktionsbuild erfolgreich. Kein Parser-/Analyzer-/Manifestbump, keine SQL-Migration, kein Zugriff auf Kundeninhalte, keine Live-Datenmutation und kein Backendneustart. Bestehender Bundlegroessenhinweis bleibt; Phase 13B bleibt in Arbeit. + +Verifiziert 2026-09-17 (Phase 13B, Originalschreibweise durchgaengig bis Work): Der Parser-Fix allein reichte nicht. Der angezeigte Titel eines bewerteten Settings stammt aus der Baselineseite, deren Analysen mit dem alten Parser erzeugt worden waren; die Kundenbeobachtungen trugen die Originalform bereits, die Work-Zeile weiterhin nicht. Baselineanalyzer append-only auf 1.4.0 erhoeht, elf Baselinepakete neu analysiert, neu ausgewertet: 593 von 593 Security-Template-Zeilen tragen jetzt die geschriebene Form. Zwei Folgefehler derselben Klasse dabei behoben. Erstens waehlte die automatische Pipeline alle nicht abgeloesten Analysen und verglich vier Baselines doppelt, weshalb jeder frische Lauf sofort wieder als re-evaluierungsbeduerftig galt; die Auswahl kollabiert jetzt ausschliesslich Generationen desselben Pakets, wodurch die dokumentierte Vereinbarung zu unabhaengigen aktiven Analysen woertlich erhalten bleibt und ihr Vertragstest unveraendert besteht. Zweitens bevorzugte die Laufauswahl den Lauf mit mehr Analyse-Referenzen, wodurch der veraltete Lauf mit vier doppelten Generationen den korrigierten verdraengte; gemessen wird jetzt die Zahl tatsaechlich verglichener Baselines, mit Rueckfall auf die deklarierten Referenzen, wenn die Ergebnisse keine Baseline nennen. Ausserdem festgestellt und behoben: der konfigurierte Artefakt-Store war leer, weil die Quelldateien geschrieben wurden, als ASSESSOR in der Codex-App lief und Windows LOCALAPPDATA in den Paketcontainer umleitete; die dreizehn Objekte wurden pruefsummenverifiziert in den konfigurierten Store kopiert, das Original blieb unangetastet. Nebenbefund ohne Fix: die Persistenz behauptet `backend-controlled`-Aufbewahrung, ohne die Erreichbarkeit der Bytes zu pruefen, was sich erst nach drei verbrauchten Versuchen als Dead-Letter zeigt statt als `not-retained`. `npm test`: 1.320 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Work-Abdeckung unveraendert vollstaendig: 3.552 Beobachtungen, null ohne Zeile. Keine SQL-Migration, keine Evaluatoraenderung, keine Bestandsloeschung. + +Verifiziert 2026-09-17 (Phase 13B, Originalschreibweise nativer Policyeinstellungen): Der Security-Template-Parser schrieb den Abschnittsnamen beim Parsen klein und verwarf die Originalform; aus `[Privilege Rights]` wurde unwiderruflich `privilege rights`. Das verletzte die Regel, dass Normalisierung keine Quelldaten zerstoeren darf. Der Parser behaelt jetzt die geschriebene Form von Abschnitt und Schluessel; die case-gefalteten Formen bleiben intern fuer Grammatikauswahl, Gruppierung und Identitaetsdigest, wodurch bestehende Beobachtungs- und Identitaets-IDs stabil bleiben. Der native Target-Resolver legt die geschriebene Form im aufbewahrten Target ab, genau wie der Registry-Resolver es bereits tat; Work zeigt damit `Privilege Rights - SeCreateTokenPrivilege` und der Wert ist gegen Microsoft-Dokumentation und externe Tabellen suchbar. Die Resolverversion bleibt bewusst unveraendert, weil die Validierung persistierter Identitaeten exakt auf sie prueft und ein Bump historische Datensaetze ungueltig machen wuerde; die Provenienz traegt stattdessen die Analyzer- und Parserversion. Weil sich persistierte Parsingausgabe aendert, ist dies ein Verarbeitungsversions-Schritt: Parser 1.1.0 auf 1.2.0, GPO-Analyzer 2.2.3 auf 2.2.4, Jobprozessor 2.2.3 auf 2.2.4. Damit die Erhoehung nicht still bleibt, meldet der GPO-Status jetzt einen veralteten Analysestand: Data Hub zeigt `Reprocessing required` mit beiden Analyzerversionen und bietet die bestehende Reprocess-Aktion auf der gespeicherten Quelle an, ohne erneuten Upload; abgeloeste Analysen fordern keine Arbeit an. Reprocessing rangiert vor Re-Evaluation, auch in der Client-Readiness. Eine synthetische Abnahmepruefung deckt die exakte Nutzerinteraktion ab. `npm test`: 1.318 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Keine SQL-Migration, keine Evaluatoraenderung, keine Bestandsmutation; historische Werte bleiben unveraendert erhalten. + +Verifiziert 2026-09-17 (Phase 13B, Aufraeumen der Analyseluecken): Vor dem Aufraeumen nachgemessen statt der eigenen Annahme gefolgt. Die Behauptung des vorigen Eintrags, beide Gap-Kacheln seien strukturell leer, war fuer `parser-gap` falsch: `unsupported-setting` wird von jeder Engine 1.3.0 bis 1.8.0 erzeugt, zuletzt 141 Ergebnisse; die Null unter 1.9.0 entsteht erst durch die aufgeloesten Security-Template-Vergleiche gegen die aktuelle Baselineanalyse. Die Kachel `Comparison not supported` bleibt deshalb erhalten und ist mit einer synthetischen Abnahmepruefung gegen stille Entfernung gesichert. Entfernt wurde nur wirklich Totes: die Kachel `Baseline mapping unavailable`, deren `catalog-gap` ausschliesslich Engine 1.2.0 erzeugt hat und die aktive Engine nicht mehr setzen kann, sowie die nirgends importierte Datei `server/gpo/gpo-policy-evaluation-rule-engine.ts`. Die Review-Queue behaelt das Kategorielabel `Baseline mapping unavailable` fuer historische Laeufe; die abgeleiteten Zaehler `catalogGaps`/`parserGaps` bleiben im Domaenenvertrag, weil sie fuer aufbewahrte Historie weiterhin korrekt sind. Die Sektion nennt jetzt Beobachtungsdiagnostik statt eines fehlenden Pass/Fail-Urteils und verweist fuer unaufgeloeste Identitaeten auf das Work-Verdict `Not comparable`. `npm test`: 1.317 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Keine Evaluatorversion, SQL-Migration, Reimportpflicht oder Bestandsmutation. + +Verifiziert 2026-09-17 (Phase 13B, Verdict `Not comparable` und Gap-Entdopplung): Die 242 unaufgeloesten Beobachtungen des aktiven Laufs sind ausnahmslos Group Policy Preferences (145 Registry, 70 Drive Maps, 16 Local Users and Groups, 11 Services) und erschienen in Work bisher gar nicht. Auf ausdrueckliche Nutzerentscheidung erhalten sie das score-neutrale Verdict `Not comparable`; die verbindliche GPO-`Result Status`-Liste in AGENTS.md ist mit Zustimmung um diesen achten Wert erweitert und die Semantik dort als eigene Regel dokumentiert. Preferences werden bewusst nicht in Policy-Identitaeten aufgeloest und nicht mit Microsoft-Baselines verglichen: Aktion, Item-Level-Targeting und Apply-once-Semantik unterscheiden sich von einer Policy-Einstellung, ein Baselineurteil darueber waere erfunden. Die Leseprojektion zeigt zusaetzlich die bereits aufbewahrte CSE, Aktion und Targeting-Status; diese bleiben in den vereinbarten GPO-Spalten lesbar, ohne eine neue Spalte oder Facette einzufuehren. Gleiche oder abweichende Preference-Anweisungen sind keine belegten Duplikate oder Konflikte, deshalb traegt `Not comparable` kein Diagnoseflag. Zusaetzlich behoben: die Snapshot-Aggregation meldete jede unaufgeloeste Identitaet ihrer Quellanalysen ein zweites Mal, wodurch dieselben Beobachtungen einmal korrekt und einmal als namenloses `Review required` in der Review-Queue standen; der Kategoriematcher erkannte den Resolver-Code nicht. Beides ist korrigiert, die Gap-Zahl bleibt unveraendert. Zwei neue synthetische Abnahmepruefungen fuer die exakten Nutzerinteraktionen (`Result Status = Not comparable` waehlt die Preferences mit lesbarer CSE, Aktion und Targeting und liefert weder Deviation noch `No baseline rule`; unaufgeloeste Identitaet genau einmal mit autoritativem Grund) plus angepasste Vertragstests. `npm test`: 1.316 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Reine Leseprojektion ueber bereits aufbewahrte Fakten: keine Evaluatorversion, SQL-Migration, Reimportpflicht oder Bestandsmutation. Korrektur zum naechsten Eintrag: die hier als gemeinsam "strukturell leer" bezeichneten Gap-Kacheln sind nicht gleichwertig; `parser-gap` ist erreichbar und bleibt erhalten. + +Verifiziert 2026-09-17 (Phase 13B, Verdict `No baseline rule`): Die Evaluationsschleife laeuft ausschliesslich ueber Baselineeintraege; aggregierte Kundenzustaende ohne Gegenstueck fielen bisher lautlos heraus und erschienen in Work weder als Verdict noch als Analyseluecke. Auf ausdrueckliche Nutzerentscheidung erhaelt jeder aufgeloeste Kundenzustand jetzt genau ein Verdict: ein bewertetes Urteil, wo eine Baselineregel existiert, sonst das score-neutrale `No baseline rule`. Die verbindliche GPO-`Result Status`-Liste in AGENTS.md ist mit Zustimmung des Nutzers um diesen siebten Wert erweitert; die Semantik ist dort als eigene Regel dokumentiert und von `Not configured` abgegrenzt. `Conflicts`/`Duplicates` sind konsequent Diagnoseflags auf der Zeile des Settings und ersetzen dessen Verdict nicht mehr; Zaehlung, Facettenauswahl und Result-DB-Projektion folgen dem Flag statt dem Zeilenstatus. Der zuvor dokumentierte stille Abbruch fuer Vergleiche ohne sicheres Urteil ist beseitigt: solche Vergleiche bleiben `Review required`. Beobachtungen, die bereits einen bewerteten Vergleich belegen - einschliesslich Kindwerten einer Registry-Key-Anforderung - werden nicht doppelt gemeldet; unaufgeloeste Identitaeten bleiben ausserhalb des Verdicts und behalten ihre eigene Lueckenmeldung. Neue synthetische Abnahmepruefung fuer die exakte Nutzerinteraktion (`Result Status = No baseline rule` in Work waehlt das konfigurierte Setting mit erhaltenem Originalwert, nicht Deviation oder Not configured) plus angepasste Vertragstests. `npm test`: 1.313 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Reine Leseprojektion ueber bereits aufbewahrte Fakten: keine Evaluatorversion, SQL-Migration, Reimportpflicht oder Bestandsmutation. Offen bleiben die GPP-Kategorie und die strukturell leeren Gap-Kacheln `catalog-gap`/`parser-gap`. + +Verifiziert 2026-09-17 (Phase 13B, aktuelle Baselineanalyse-Generation): Die GPO-Re-Evaluation reichte bisher die `baselineAnalysisIds` des vorherigen Laufs unveraendert weiter. Dadurch blieb eine Evaluation dauerhaft an die Baselineanalyse-Generation ihres allerersten Laufs gebunden, auch nach jedem Engine-Upgrade. `gpoEvaluationUpdates` loest jetzt jede aufbewahrte Baselinereferenz auf ihre aktuelle, nicht abgeloeste Analyse auf und erweitert den bewerteten Baselinesatz nie: eine unbekannte Referenz und eine Baseline ohne neuere Generation behalten ihre eigene Analyse-ID. Die Readiness beruecksichtigt zusaetzlich zur Engineversion die Baselineanalyse; `reasons` benennt die Ursache, Data Hub und Client-Readiness zeigen sie getrennt an. Die Auswahl der aktuellen Generation ist mit `buildActions` zu einem gemeinsamen Helfer zusammengefasst. Vier neue synthetische Tests pruefen die exakte Nutzerinteraktion (Re-evaluate-Aktion sendet die neuere Generation, keine Erweiterung des Baselinesatzes, Ursachenanzeige bei reiner Baselineaenderung) und das Verstummen nach erfolgter Neuauswertung. `npm test`: 1.310 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Keine Engineversion, SQL-Migration, Bestandsmutation oder Reimportpflicht; bestehende Laeufe bleiben als Historie erhalten und werden erst durch die ausdrueckliche Re-evaluate-Aktion ersetzt. Abgrenzung in REIMPORT_POLICY.md ergaenzt. Phase 13B bleibt in Arbeit; die uebrigen dokumentierten GPO-Analyseluecken (Kundeneinstellungen ohne Baselineregel, GPP-Kategorie, immer leere Gap-Kacheln) bleiben offen. + +Verifiziert 2026-09-17 (Phase 7/13B, Quellenzuordnung): Originalanweisungen je GPO-Backup sofort im Reader sichtbar, native Identitaeten/Quellsequenz aus vorhandener Persistenz projiziert und fehlende Conflict-Kennzeichnung fuer delete-value durch autoritative Zustandsableitung korrigiert. Unabhaengig belegte Unterschiede bleiben bei zusaetzlichen indeterminate-Beitraegen sichtbar, ohne fruehere Einzelanweisungen unsicherer Backups als separate GPOs zu behandeln. Entscheidung und Ablosung der Results-only-Verbergung in AGENTS.md dokumentiert. 20 neue synthetische Tests einschliesslich exakter Work-Interaktion in GPO-Blatt und Source-Scan-Kontext; 1.304 Gesamttests, Local-only-/Designcheck und beide Builds erfolgreich, acht optionale PostgreSQL-Tests uebersprungen. Keine Bestandsmutation oder Reimportpflicht; fehlende GPO-Namen und unbelegte Wirksamkeit bleiben transparente Grenzen. + +Verifiziert 2026-09-17 (Phase 7/13B): Den ausdruecklich angeforderten Work-Filter `GPO backups with failing settings` mit Einzel-/Gesamtauswahl umgesetzt und den GPO-Facettenvertrag in AGENTS.md erweitert. Gemeinsame Quellenidentitaet mit der Processing-Kachel, additive Datensatzprovenienz, unveraenderte Vergleiche und historische Statusgrenze. Vier neue synthetische Regressionen; 1.284 Gesamttests, Local-only-/Designcheck und beide Produktionsbuilds erfolgreich, acht optionale PostgreSQL-Tests uebersprungen. Keine Kundeninhalte gelesen oder Bestandsdaten veraendert. + +Verifiziert 2026-09-14 (Phase 7/13B, GPO-Baselinevarianten): Evaluator 1.5.0 und additiven Variantenvertrag mit gespeicherten Originalwerten, Einzelurteilen und Quellenreferenzen implementiert. Eindeutiger Fail/Pass ohne PingCastle, Review bei gemischten/unlesbaren Varianten oder widerspruechlichen Eintraegen derselben Baseline-GPO, Not configured nur mit Abwesenheitsevidenz. Bestehende Rollenwahl bleibt explizit; ADMX-/wertunabhaengige Baseline-Metadatenluecken bleiben sichtbar. Work, Guidance, Result DB und JSONL behalten alle Varianten ohne synthetischen Gesamt-Sollwert; alte Runs 1.3.3/1.4.0 werden nicht umgeschrieben. Vertrag in GPO_BASELINE_EVALUATION.md und Re-evaluation-Abgrenzung in REIMPORT_POLICY.md. Synthetische Gesamtsuite: 1.250 bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung erfolgreich. Fokussierte Regressionen pruefen gespeicherte Evidenz, Kontenlisten, Typen, Metadaten, Historie, Work-Filter und gerenderte Result-DB-Details. Client-/Server-Produktionsbuild erfolgreich; bestehende Bundlegroessenwarnung bleibt. Keine Realdateninspektion, Datenmigration, Neuimport oder automatische Bestandsneuauswertung; laufendes Backend nicht neu gestartet. Phasenstatus unveraendert. + +Implementiert 2026-09-11 (Phase 8, Timeslotvergleich P0/P1): P0-Audit fuer Scanner/Format/GPO abgeschlossen und additiven P1-Domaenenvertrag 1.0.0 begonnen. Identitaet verlangt deklarierte Granularitaet, Scope und bei Objektvergleich Typ/Namespace/Schluessel; technische Behebung verlangt gleiche Identitaet, kompatible Verarbeitung und neuere belastbare Evidenz. Ungeklaerte Zwischenstaende erhalten Verpflichtungsherkunft, auditierter Scope-Ausstieg wird separat validiert. Sechs synthetische Domainregressionen, Local-only-/Designcheck und beide Builds erfolgreich. Gesamtlauf 1.224 bestanden, acht optionale DB-Tests uebersprungen; ein Node-Importtest lief unter Gesamtlast ueber sein unveraendertes 5-Sekunden-Limit und bestand isoliert 5/5 in 1.193 ms. Keine Anbindung an laufende Engine/Persistenz/API/UI, keine Importversion, Reimporte oder Datenmutation. P1 bleibt in Arbeit, P2-P6 offen. + +Geplant 2026-09-11 (Phase 8, ausdruecklicher Planauftrag): Detailplan fuer belastbare A/B-Vergleiche mit sieben offenen Umsetzungspaketen P0-P6, fachlichen Entscheidungsregeln, Reimport-/Neuberechnungsgrenze, Risiken und synthetischer Abnahmematrix angelegt. Phasenuebersicht und aktuelle Etappe unterscheiden historischen Abschluss von offener Erweiterung; Vergleichs- und Scoringdokumentation erhalten datierte Statushinweise. Neue lokale Dokumentationsverweise, Hauptplananbindung, Paketvollstaendigkeit und Patchformat geprueft. Keine Implementierung, Migration, Reimporte oder Laufzeittests; npm test/build wegen ausschliesslicher Dokumentationsaenderung nicht erneut ausgefuehrt. + +Verifiziert 2026-09-11 (Phase 7, Client-Info-Risikoregister): Zweigeteilte Accepted-Risks-Kachel unter den bestehenden Client-Informationen implementiert. Linke Auswahl zeigt Quelle, Zustand und Wiedervorlage; rechte Ansicht zeigt den vollstaendigen aktuellen Entscheidungsinhalt und alle Versionen. Kanonische Vorkommnisse werden blattuebergreifend dedupliziert, schmale Ansichten stapeln ohne Textverlust. Zwei neue Registertests und 18 fokussierte Tests erfolgreich; Gesamtlauf 1.218 bestanden und acht optionale DB-Tests uebersprungen, ein paralleler Fuenf-Sekunden-Ausreisser bestand isoliert in 4.971 ms. Local-only-/Designchecks, beide Builds und synthetische Browserpruefung erfolgreich. Keine API-, Persistenz-, Import-, Score-, Reimport- oder Datenmutation. + +Verifiziert 2026-09-10 (Phase 7/9-11/13, Accepted Risk): Findingheader-Button, vollstaendiger Entscheidungsdialog, Entwurf/Annahme/Widerruf und versionierte Review-JSONB-Ablage ueber geschuetzte API implementiert. Best-Practice-Ausgangspunkt gemaess Nutzerantwort, getrennte Freigabedokumentation und verbindliche Fristen; keine behauptete Signaturpruefung. Reimport erhaelt Originalentscheidungen mit erneuter Pruefung fuer den Ersatzbefund. 1.214 Tests, Local-only-/Designchecks, beide Builds und synthetische Browserpruefung erfolgreich; acht optionale DB-Integrationstests uebersprungen. Frontend/Backend HTTP 200. Keine Migration oder Realdatenmutation; Firmenfreigaben und unabhaengige Aufbewahrung bleiben in Phase 14 offen. + Verifiziert 2026-09-10 (Phase 7/13C, Purple-Knight-Scorezuordnung): Separate native Summary und eindeutige Findings desselben Scanlaufs werden sicher verbunden. Regression 65 native/96 Passed/19 Deviations ergibt 65 Native score in der Dashboardprojektion. 1.199 Tests, Sicherheits-/Designchecks und beide Produktionsbuilds erfolgreich. Keine Datenmutation oder Realdateninspektion. Verifiziert 2026-09-10 (Phase 6/13C/7, weitere Scanner): Native-first-Regel in verpflichtende Profildefinitionen und gemeinsamen Katalogpfad ueberfuehrt. Zehn neue Regressionen; 1.198 Tests, Sicherheits-/Designchecks und beide Produktionsbuilds erfolgreich. Keine Migration, Reimportmutation oder Backendneustart. @@ -2228,6 +2580,12 @@ Verifiziert 2026-09-09 (Phase 7): Bereichswechsel beschleunigt und Performance-V Verifiziert 2026-09-08 (Phase 7/13B): GPO-Quellenkorrektur fuer Work und Client Info. Aktuelle Evaluationen aus dem vorhandenen autoritativen Readmodell statt ergebnisabhaengiger Backupgruppierung; Import- und Auswertungszeit getrennt, Source-Scan-Provenienz auch auf GPO-only-Blaettern. 1.014 Tests bestanden, acht optionale PostgreSQL-Tests uebersprungen; Local-only-/Designpruefung und beide Builds erfolgreich. Dummy lesend bestaetigt: eine statt drei GPO-Quellenoptionen, 3.805 aktuelle Zeilen, elf historische Evaluationen unveraendert. Keine Persistenzmutation oder Neuanalyse. | Datum | Änderung | +| 2026-09-16 | Phase 7/13B: Registry.pol-Zustandsregeln persistent verankert und mit Evaluator 1.9.0 umgesetzt. Delete-value/Delete-all/Create-key und typisierte Leerwerte sind vergleichbar; Schluesselziele beziehen konfigurierte Kindwerte samt Evidenzreferenzen ein. Gewoehnliche fehlende Empfehlungen bleiben Not configured, waehrend fehlende ausdruecklich verlangte Schluessel- oder Leerwertpraesenz Fail ist. Historie bis 1.8.0 bleibt unveraendert und wird nur ausdruecklich neu ausgewertet. 32 fokussierte Tests und exakte Work-Statusregressionen, 1.280 bestandene Gesamttests, acht optionale PostgreSQL-Tests uebersprungen, Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Kein Reimport, Processing-Manifest- oder SQL-Schemawechsel; keine reale Bestandsneuauswertung. | +| 2026-09-15 | Phase 7: Work verwendet beim normalen Einstieg und bei neu initialisierten Projekt-, Timeslot-, Blatt-, Import- und Reset-Zustaenden immer `Deviation`. Die bisherige automatische GPO-Ausnahme `All` ist durch die ausdrueckliche Nutzerentscheidung ersetzt. Bereits gesetzte Filter aus Client Info, Pathfinder und anderen Drilldowns bleiben beim Wechsel nach Work erhalten; explizit gesetztes `All` bleibt damit ebenfalls moeglich. Permanente synthetische Navigations- und GPO-Regressionen, 1.270 bestandene Gesamttests, acht optionale PostgreSQL-Tests uebersprungen, Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich. Keine Daten-, Verarbeitungs- oder Reimportaenderung. | +| 2026-09-15 | Phase 7/13B: Irrefuehrende manuelle Aufforderung am partiellen GPO-Import entfernt. Der gelbe technische Zustand lautet wieder `Limited analysis`; er ist keine Aufgabe, kein automatisches Manage-Signal und keine Aufforderung zur Einzelvalidierung. Damit wird die bindende Produktentscheidung vom 2026-09-06 wiederhergestellt und die zwischenzeitliche Formulierung `Partial · review required` ausdruecklich ersetzt. Synthetischer Rendergegenfall, 17 fokussierte Tests, 1.268 bestandene Gesamttests, Local-only-/Designpruefung und beide Produktionsbuilds erfolgreich; acht optionale PostgreSQL-Tests uebersprungen. Keine Daten- oder Verarbeitungssemantikaenderung. | +| 2026-09-15 | Phase 7/13B: GPO Analysis verwendet fuer seine Baseline-Ergebniszaehler jetzt dieselben backendautoritativen aktuellen Aggregationslaeufe wie Work und Client Info. Historische Aggregationen bleiben in der Evaluationshistorie, werden aber nicht mehr zu aktuellen Pass-/Fail-/Not-configured-Zaehlern addiert. Review required ist in der Zusammenfassung sichtbar. Exakte synthetische Mehrlauf-/Ein-Timeslot-Komponentenregression, 26 fokussierte Tests, 1.267 bestandene Gesamttests plus isoliert bestandener bekannter Last-Timeout und beide Produktionsbuilds erfolgreich; acht optionale PostgreSQL-Tests uebersprungen. Keine Datenmutation, Neuauswertung, Import-, Persistenz-, Schema-, Manifest- oder Reimportaenderung. | +| 2026-09-15 | Phase 13/9-11: Timeslot-Importlast korrigiert. Inaktive GPO-Importsteuerelemente in Timeslotzeilen erzeugen keine eigenen Poller mehr; sichtbare Statusansichten und der Data Hub fragen nur waehrend queued/running ab, bewahren unveraenderte Zustandsobjekte und berechnen Result-Facetten nur bei einer echten Statusrevision neu. Datei- und Definitionszuordnung im PostgreSQL-Commit ist je Import vorindiziert. Gemessener Ausgangszustand: 4,4 s Vorschau, 200,3 s Commit unter 270 Facetten- und 326 Statusabfragen in fuenf Minuten. Synthetische Interaktionsregression, 30 fokussierte Tests, 1.266 bestandene Gesamttests plus isoliert bestandener bekannter Last-Timeout, Local-only-/Designpruefung und beide Builds erfolgreich; acht optionale PostgreSQL-Integrationstests uebersprungen. Keine Schema-, Daten-, Importsemantik-, Manifest- oder Reimportaenderung. Restrisiko serieller PostgreSQL-Einzelwrites dokumentiert. | +| 2026-09-14 | Phase 7/13B: Regression im Work-Filterkontext korrigiert. `Source: Scan = GPOs` reduziert auf dem All-Records-Blatt nun vor Priorisierung und Facettenlimit auf den GPO-Vertrag; das Statusmenue wird unabhaengig von einem separaten GPO-Blatt mit All, Deviation, Passed, Not configured, Conflicts und Duplicates vollstaendig erzeugt, fachliche Nullwerte bleiben waehlbar. GPO-Statuswerte werden ausschliesslich gegen das aktuelle Statusfeld geprueft; ein Pass-Vergleichswert kann einen Not-configured-Datensatz nicht mehr als Passed filtern. Fremde Scannerfacetten und ungueltige gesetzte Altfilter werden entfernt, `Source: Scan` bleibt vollstaendig und rechts; ohne Quellrestriktion kehrt der Mischkontext zurueck. Exakte synthetische Interaktionsregressionen pruefen Anzeige, tatsaechliche Filterwirkung und den gemeldeten Gegenfall; 51 fokussierte Tests sowie der Gesamtlauf mit 1.243 bestandenen und acht uebersprungenen Tests, Local-only-/Designpruefung und Client-/Serverbuild erfolgreich. `AGENTS.md` bindet dokumentierte Nutzerentscheidungen als Abnahmekriterien und verlangt transparente Meldung vor regelwidrigen Aenderungen. Keine Daten-, Import-, API-, Persistenz-, Score- oder Reimportaenderung; ausschliesslich synthetische Inhaltspruefung. | | 2026-09-08 | Phase 7: Verbindungskurven der Client Info treffen ihre Domainknoten wieder. Feste Zielkoordinaten in einem verzerrten SVG-Koordinatensystem durch eine aus dem Layout gemessene Geometrie ersetzt, Neumessung ueber Groessenbeobachter und Fensterereignis. Am Dummy bei drei Breiten geprueft: Abweichung 0 Pixel statt bis zu 80. Keine Aenderung an Werten oder Kachelgeometrie. 1.011 Tests, Local-only-/Designpruefung und Builds erfolgreich. | | 2026-09-08 | Phase 7: Aufbauzeit der Client Info von ueber vier Sekunden auf unter 100 Millisekunden gebracht. Ableitung je Datensatz einmal statt je Rendern, ein Durchlauf statt vierzehn Punkteberechnungen, Domainzuordnung mit einmaligem Klassifikationstext, schwache Verweise je Datensatz sowie ansichtsuebergreifender Zwischenspeicher fuer Facetten und Auswertung; Herkunftswerte je Datensatzliste einmal gezaehlt. Gemessen am freigegebenen Dummy mit 8.257 Datensaetzen: Ableitung 3.123 ms -> 0 ms, laengste blockierende Aufgabe > 4.000 ms -> < 100 ms. Keine Aenderung an Werten, Zaehlungen, Darstellung oder der geteilten Statuslogik. 1.007 Tests, Local-only-/Designpruefung und Builds erfolgreich. | | 2026-09-08 | Phase 7/13C: Dummy-Reimport abgeschlossen. Purple-Knight-Scan nach Backendneustart ueber den Importdialog ersetzt; alle aktiven Scans tragen den aktuellen Verarbeitungsstand (Purple Knight 1.2.0, CIS-CAT 1.4.0, PingCastle 1.4.0, Maester 1.0.0), Datahub meldet durchgehend `Ready`. Befunde und Umgebungskontext unveraendert; keine Code-, Schema- oder Persistenzaenderung. | diff --git a/docs/REIMPORT_POLICY.md b/docs/REIMPORT_POLICY.md index b7d3a9f..e45cb5e 100644 --- a/docs/REIMPORT_POLICY.md +++ b/docs/REIMPORT_POLICY.md @@ -15,7 +15,35 @@ A processing-profile version must be added and existing affected imports must be Presentation-only changes, labels, layout, filtering over already retained fields, and score-formula changes over already retained inputs do not require a source reimport. They must not be disguised as processing changes. -Every scanner profile, including future profiles, declares its current processing contract. Historical contracts remain append-only. A material import change increments the relevant parser, extractor, profile, mapping, normalization, or presentation version and records `reimportRequired` plus the affected dimensions in `PROCESSING_VERSION_MANIFESTS`. Data Hub derives its warning from that persisted contract. A generic fallback remains visibly review-required until a scanner-specific profile can interpret the source. +Every scanner profile, including future profiles, declares its current processing contract. Historical contracts remain append-only. A material import change increments the relevant parser, extractor, profile, mapping, normalization, or presentation version and records `reimportRequired` plus the affected dimensions in `PROCESSING_VERSION_MANIFESTS`. Data Hub derives its warning from that persisted contract. + +Clarification 2026-09-11: Data Hub assesses processing readiness per stored scan run. A generic-only run remains review-required. Generic companion files alongside exactly one recognized scanner profile in the same run do not independently require reimport when all file processing contracts are current or compatible. Every file retains its own profile, provenance and mapping; an inherited display label is not native recognition. A different run cannot supply the missing scanner context. Unknown/incompatible contracts, actual profile updates and unresolved client-review transfers remain actionable. A review-only state does not offer repeated reimport with unchanged processing as a remedy. This corrects status presentation over existing facts and requires no reimport or processing-version change. + +## GPO re-evaluation and presentation + +Clarification 2026-09-17 (missing retained GPO source): A persisted `backend-controlled` storage reference records custody and provenance; it does not prove that the file is currently accessible. The GPO status endpoint checks availability on each read, independently of repository revision, and distinguishes `Upload required` for missing bytes from `Storage unavailable` for an access/configuration failure. Automatic job repair, Retry and Reprocess check availability before enqueueing. A queued job that encounters a missing file stops after its first failed attempt instead of retrying three times. Data Hub and the GPO processing panel offer an artifact-bound original ZIP/folder upload; the project, optional timeslot, exact byte size and SHA-256 must match. Restoration atomically republishes only missing bytes under the original storage key, never overwrites an existing object and preserves original identities, timestamps and retained analysis history. Ordinary byte-identical resubmission repairs missing bytes as well. A missing-source job may resume after restoration; an already current analysis does not need another run just to restore its original file. Evaluation-only updates remain possible from retained inputs, while an analyzer update still requires the source before reprocessing. This is storage recovery, not a changed interpretation: no parser/analyzer/processing-manifest version bump, SQL migration or bulk reprocessing is required. + +Clarification 2026-09-14 (baseline variants): Evaluator 1.5.0 compares each retained candidate independently and requires unanimous supported outcomes for Pass/Fail. It stores the versioned per-variant assessment and original values in the existing result JSON/JSONB. Historical 1.3.3/1.4.0 runs remain unchanged and require explicit re-evaluation through Data Hub; no scanner processing-manifest change or source reimport is required for this evaluation-only change. Inventory context does not establish a GPO target role. See [GPO_BASELINE_EVALUATION.md](GPO_BASELINE_EVALUATION.md) for the decision and evidence contract. + +Clarification 2026-09-15 (mechanism-scoped baseline partiality): Evaluator 1.6.0 no longer lets a parser diagnostic from an unrelated delivery mechanism invalidate a separately resolved comparison. Diagnostics applicable to the candidate mechanism, unexplained partiality, ambiguous values and incomplete customer evidence remain review-only. Historical 1.5.0 results remain unchanged and require explicit re-evaluation in Data Hub; this evaluation-only change does not require a source reimport or processing-manifest update. + +Clarification 2026-09-16 (policy-setting conflict roll-up): Evaluator 1.7.0 compares each retained configured member value of a customer conflict independently. One valid failing member makes the technical policy-setting verdict Fail once, while conflict/duplicate remain separate diagnostic flags; unresolved evidence remains review-only when no independently valid fail exists. Historical results through 1.6.0 remain unchanged and require explicit re-evaluation in Data Hub. The inputs were already retained, so this evaluation/presentation change requires neither a source reimport nor a processing-manifest update. + +Clarification 2026-09-16 (analyzed-scope absence): Evaluator 1.8.0 reports an applicable recommendation with no observed configured value in the analyzed backup set as score-neutral `Not configured`, including for selected-subset imports. It retains a scope-limit diagnostic and does not claim domain-wide or effective-device absence. Historical results through 1.7.0 remain unchanged and require explicit re-evaluation in Data Hub; retained inputs are sufficient, so no source reimport or processing-manifest update is required. + +Clarification 2026-09-16 (Registry.pol state requirements): Evaluator 1.9.0 compares retained `delete-value`, `delete-all-values`, `create-key` and typed empty-string recommendations as explicit backup-configuration states. Historical results through 1.8.0 remain unchanged and require explicit re-evaluation in Data Hub. The required original Registry.pol instructions, types and values are already retained, so this evaluator-only change requires no source reimport, processing-manifest update or SQL migration. + +Clarification 2026-09-17 (baseline analyses of the written form): The Microsoft baseline analyzer consumes the same Security Template parser, so a baseline analysis produced before the parser change still carries the case-folded section. An evaluated setting takes its displayed identity from the baseline side, so the baseline packages must be re-analysed for the written form to reach Work. Append-only analyzer version `microsoft-baseline-gpo-settings` 1.3.0 -> 1.4.0; the accepted version list keeps every earlier value so historical analyses stay readable and are not rewritten. Two further selection rules were corrected in the same step. First, only analyses of the very same baseline package are one lineage: an interrupted supersession chain may leave several of its generations unsuperseded, and the newest analyzer version then wins, while independently analysed packages remain independent benchmarks. Second, the current run per aggregation is chosen by the distinct baselines actually compared rather than by the number of analysis references, so duplicated generations no longer outrank a narrower current run; where retained results name no baseline, the declared references stay the only measure. No source reimport, SQL migration or evaluator change; re-analysing a retained baseline package and re-evaluating is sufficient. + +Clarification 2026-09-17 (written security-template section and key): The Security Template parser folded the section name to lower case and discarded the written form, so `[Privilege Rights]` was retained only as `privilege rights`. The parser now keeps the written section and key; the case-folded forms stay internal to grammar selection, grouping and the identity digest, which keeps existing observation and identity IDs stable. The native target resolver stores the written section and key in the retained target, matching what the registry resolver already did, so Work shows `Privilege Rights - SeCreateTokenPrivilege` and the value stays searchable against Microsoft documentation and external tables. This changes persisted parsing output, so it is an append-only processing-version change, not a presentation change: `gpo-security-template-inf` 1.1.0 -> 1.2.0, `gpo-backup-policy-analysis` 2.2.3 -> 2.2.4 and the GPO job processor 2.2.3 -> 2.2.4. Historical imports keep their retained values unchanged and are marked for reprocessing: Data Hub reports an affected GPO backup as `Reprocessing required` with the analyzer versions and offers the existing reprocess action on the stored source, so no upload is needed. Reprocessing precedes re-evaluation, and prior runs remain retained as history. No SQL migration and no evaluator change. + +Clarification 2026-09-17 (Not comparable verdict): A retained customer setting whose delivery mechanism has no comparable technical policy identity - today always a Group Policy Preference - reaches Work under the score-neutral verdict `Not comparable` instead of being dropped. It is never resolved into a policy identity and never compared with a Microsoft baseline. The unified read projection additionally exposes the already retained preference CSE, action and item-level targeting status so that context stays readable in the agreed GPO columns; no new column, facet or persisted field is introduced. Snapshot-aggregation review hints that restate an unresolved identity already reported by their source analysis are no longer emitted a second time. All of this projects facts the importer already retained, so no processing-manifest version, source reimport, evaluator change or SQL migration is required. + +Clarification 2026-09-17 (No baseline rule verdict): Work now projects every retained customer policy state under exactly one verdict. A resolved technical identity with no applicable Microsoft baseline recommendation in the compared baseline set receives the score-neutral verdict `No baseline rule`; a retained comparison that yields no safe verdict stays `Review required` instead of being dropped. `Conflicts`/`Duplicates` remain diagnostic flags on the setting's own row and no longer replace its verdict, so their counts and the Result-DB consistency projection follow the flag rather than the row status. Observations that already evidence an evaluated comparison, including child values of a registry-key requirement, are never reported a second time; unresolved identities keep their separate analysis-gap reporting. This is a read-time projection over already retained observations, aggregations and evaluations: no evaluator version change, source reimport, processing-manifest update or SQL migration is required, and no persisted record is rewritten. + +Clarification 2026-09-17 (current baseline analysis generation): GPO evaluation readiness is no longer derived from the evaluator version alone. A retained evaluation stays pinned to the baseline analysis ids it was created with, so a newer Microsoft baseline analysis generation of the same baseline also marks it as requiring re-evaluation. The Re-evaluate action resolves every retained baseline reference to its current non-superseded analysis and never widens the evaluated baseline set: an unknown reference and a baseline without a newer generation keep their own analysis id. Prior runs remain retained and are not rewritten. Baseline packages, their analyses and the customer inputs are already persisted, so this readiness/selection change requires no source reimport, processing-manifest update or SQL migration. + +Clarification 2026-09-11 (GPO evaluation readiness): A saved baseline comparison from a previous evaluation engine requires re-evaluation of retained inputs, not automatically another upload. Data Hub reports this separately from scanner-profile reimport, scoped through active profile, snapshot, identity-analysis and artifact references. Its explicit Re-evaluate action uses the existing evaluation API; prior runs remain retained. Work labels readable previous-engine comparisons as historical and keeps their original outcomes in a separate Historical result field instead of presenting them as current Pass/Fail. Missing baseline description metadata and failed description loading are separate presentation states. OS grouping and row-bound native counts use already retained environment observations; these display changes introduce no processing manifest or source reimport requirement. ## Preservation contract @@ -30,7 +58,8 @@ Reimport replaces scanner-derived data only. The following client-owned values a The match uses scanner identity, native rule ID, and affected asset. It succeeds only for one old and one new occurrence. A stable definition-level review remains attached without copying. ASSESSOR never falls back to title-only or positional matching. +Structured Accepted Risk decisions retain every original revision and its target occurrence ID. A transferred acceptance displays `Review required` when the new occurrence differs from the approved target. Preservation does not silently renew approval, expiry or scope: recording acceptance for the replacement requires a new decision. See [RISK_ACCEPTANCE.md](RISK_ACCEPTANCE.md). + When a match is absent or ambiguous, the old review remains on the retained previous scan. The replacement records an unresolved count and Data Hub shows a persistent review-required state. The reimport is still auditable and does not silently discard or guess customer data. Both direct reimport and adoption of an already imported byte-identical replacement execute review transfer and scan supersession in the same repository transaction. The exact source SHA-256 multiset, assessment, and scanner must match before replacement is accepted. - diff --git a/docs/REPORT_STRATEGY.md b/docs/REPORT_STRATEGY.md new file mode 100644 index 0000000..320bda8 --- /dev/null +++ b/docs/REPORT_STRATEGY.md @@ -0,0 +1,545 @@ +# Assessment output strategy + +Decision: 2026-09-18, explicitly approved by the user. No implementation phase is +assigned yet; these outputs are a new deliverable that is not covered by an +existing plan phase. This document fixes *what is shown* before any renderer is +written. + +ASSESSOR produces **three** artifacts from one assessment: + +| Artifact | Audience | Nature | +| --- | --- | --- | +| A — Management Overview (HTML) | customer decision makers | frozen snapshot | +| B — Technical Report (HTML) | engineers reproducing a finding | frozen snapshot, complete | +| C — Arbeitsgrundlage (XLSX + HTML) | the people doing the work | living document, curated | +| D — Delta Report (HTML, management + technical cut) | both, after a rescan | frozen snapshot of the change | + +The dividing principle: **a report states the finding and its proof; the +Arbeitsgrundlage states the measure and who owns it.** + +Remediation progress is proven by rescans, never by self-reported status. See +*Progress is proven by rescan* below. + +## Approved delivery decisions + +| Decision | Choice | +| --- | --- | +| Delivery | Separate files per artifact | +| Design | ASSESSOR application look | +| Technical scope (B) | Deviations, diagnostics and score-neutral classes | +| Interaction | Static, print- and PDF-ready, no JavaScript | +| Language | German, all artifacts | +| Arbeitsgrundlage format | XLSX to work in, HTML as the frozen status view | +| Arbeitsgrundlage scope | Curated selection, plus the complete list on a second sheet | +| Progress evidence | Rescan only; planning fields stay but are marked unverified | +| Delta delivery | Own artifact, management and technical cut | + +Separate files keep the confidentiality boundary real: the Management file can be +forwarded without carrying registry keys, SIDs, evidence paths or parser +versions in its source. A single file with a hidden section would still contain +them. + +## Report language + +Both reports are written in German: headings, prose, labels, table headers, +legends and every explanatory sentence. + +This does not change the Client Info dashboard, which remains English-only by its +own decision. The reports are separate customer-facing artifacts; the two rules +stand side by side and neither overrides the other. + +German is the carrier language. **Established English technical terminology stays +English** and is not translated, not hyphenated into a German compound and not +replaced by an invented German equivalent. This is the general rule, not a list +of exceptions. It covers at least: + +- the agreed GPO verdicts `Deviation`, `Passed`, `Not configured`, + `No baseline rule`, `Not comparable`, `Conflicts`, `Duplicates` +- the security domain names from `src/features/dashboard/security-domains.ts` +- assessment vocabulary such as Finding, Baseline, Score, Scope, Severity, + Pass Rate, Review, Owner, Due Date, Remediation, Evidence +- platform vocabulary such as Group Policy, Registry, Domain Controller, + Privilege, Attack Path, Hardening + +Reason: these are the terms the readers already use, and most of them appear +verbatim in the application's Work filters and in the Client Info dashboard. A +reader must be able to match a line in the report to the view it came from, and a +translated second vocabulary would weaken the documented agreements. + +Where a term is not self-explanatory to a management reader, it is introduced once +with a short German explanation and then used in its canonical English form. +German prose carries the sentence; the term inside it stays English. + +Original source values, registry keys, value names, principals, evidence paths and +native identifiers are never translated or localized. Numbers and dates follow +German formatting. + +The shared projection stays language-neutral and carries data, not display +strings. All German wording lives in the renderers. + +## Shared report projection + +Implemented in `src/domain/report-projection.ts` +(`REPORT_PROJECTION_VERSION = '1.0.0'`), covered by +`tests/domain/report-projection.test.ts`. + +All artifacts read **one** projection built in the platform-neutral domain layer. +The projection is the single source of truth; the renderers only choose depth, +never content. Two consequences are binding: + +- A number that appears in both reports is the same number. The Management + Overview never rounds, re-derives or re-filters a value that the Technical + Report states differently. +- Renderers contain no source-specific parsing, no scoring arithmetic and no + database access. They receive the finished projection. + +The projection is built on export only. It is not part of the workspace load +path and must not derive presentation fields for records no report section +consumes. + +## Report A — Management Overview + +Implemented in `src/exports/management-overview-report.ts` +(`MANAGEMENT_OVERVIEW_RENDERER_VERSION = '1.0.0'`), covered by +`tests/exports/management-overview-report.test.ts`. + +Answers: how do we stand, what is most urgent, what is this based on, what do we +not know. Its reading order follows the agreed Client Info grammar. + +**Named deviation from the `assessor-ui` skill:** a delivered document uses no +application shell — no sidebar, topbar, command band or context strip — and none +of the four page archetypes, because it is read and printed outside the +application. Typography roles, donut geometry, tile and segment grammar, status +colour rules and the panel inset apply unchanged. Light is the document default +because a report is printed on white; dark renders from the same semantic roles +through `prefers-color-scheme`. + +The bundled Inter is referenced by family name with a system fallback. No font, +style, script or image is loaded when the file is opened. + +### 1. Assessment identity +Customer, environment (domain, forest, domain controller count from the +environment inventory), assessment period, report date, ASSESSOR product version. + +### 2. Overall posture +The single score as a donut using the shared donut geometry, with its method +label. Binding wording from `SCORING_MODEL.md`: + +- The GPO contribution is *conformance of configured, comparable in-scope + settings*. Binding German wording: „Konformität der konfigurierten, + vergleichbaren Einstellungen im Scope". It is never labelled baseline + compliance, baseline coverage or proof that recommended settings are + implemented — in German neither „Baseline-Compliance", „Baseline-Abdeckung" + nor any phrasing implying the baseline is fully rolled out. +- PingCastle enters as `100 − native risk`; the raw risk stays secondary context. +- A mixed-method index is named as such. Security Domain values are pass rates + and are not a decomposition of the index. + +### 3. Security Domains +The eight domains from `src/features/dashboard/security-domains.ts` as a +connected pass-rate spine beside the overall score. Not a table. + +### 4. Priority Findings +Grouped by security domain. **There is no global cross-tool ranking.** Inside a +domain, findings are ordered by the declared priority basis of their own source, +and that basis is named at the point of display. + +Per entry: title, domain, the source's own rank value with its basis, one +sentence of impact, plus owner and status when a review exists. + +GPO deviations form their own equal-weight block with their count, the affected +policy settings and the scope limit. They are never assigned an invented +criticality. + +No registry keys, no SIDs, no file paths, no raw values. + +See *Priority without a common severity* below for why. + +### 5. Remediation status +Open, in progress, accepted, overdue, and findings without an owner — derived +from the stored reviews including accepted-risk data. If no reviews are +maintained, the section is omitted rather than rendered empty. + +### 6. Coverage and gaps +What was assessed, what was not, unassessed controls, and every scope limit that +bounds a statement. A GPO import covering a subset of the domain is reported as +scope-limited and never presented as a domain-wide or effective-device claim. +This section is what makes the report defensible. + +### 7. Source overview +Per tool: run or file date, score contribution, and the method that produced it. + +### Excluded from Report A +Per-record tables, raw values, evidence paths, diagnostics, parser, analyzer and +manifest versions. + +## Report B — Technical Report + +Answers: what exactly is configured, what should it be, where does that stand, +how does ASSESSOR know, what do I do. + +### 1. Scope and provenance +Imported artifacts, processing, analyzer and manifest versions, reimport status, +aggregation and evaluation run identifiers. Enough to reproduce the result. + +### 2. Result inventory +Totals per status, severity, domain and tool, including the score-neutral +classes. Passed results appear here as a count. + +### 3. Findings in detail +Grouped by security domain, ordered by severity inside each group. Per finding: + +- technical identity and scope +- actual against expected value, with the field-specific deviation marking used + by the Finding Reader: `Operation`, `Data` and `Type code` for registry policy + differences, several fields only where each is independently proven +- principal sets compared per member: only configured principals absent from + every retained baseline variant are marked; a principal also present in the + expected baseline stays neutral +- GPO source attribution as vertically stacked sections per exact backup + identity, each with evidence reference, source-local sequence and every + original instruction immediately visible +- conflict and duplicate flags, kept separate from the policy verdict +- baseline variants where more than one exists +- the remediation step from the review + +### 4. GPO policy register +All seven verdicts in full: `Deviation`, `Passed`, `Not configured`, +`No baseline rule`, `Not comparable`, `Conflicts`, `Duplicates`. The +score-neutral verdicts are labelled as score-neutral at the point of display, so +that a reader cannot mistake `Not configured` for a remediation obligation. + +### 5. Diagnostics +Unresolved identities, parser gaps, scope limits, declared-against-counted +mismatches and incomplete backups. Each observation appears once with its +authoritative resolver reason and is not restated by snapshot aggregation. + +### 6. Appendix +Complete result index. + +## Artifact C — Arbeitsgrundlage + +Decision: 2026-09-18, explicitly approved by the user. + +Answers: what do we do, who owns it, by when, where does it stand. + +The measured volume makes this its own artifact: the stored data holds **1,806 +actual deviations** (CIS-CAT 969, Maester 350, PingCastle 277, Purple Knight 210) +plus the GPO deviations. Rendering each of those with full technical depth inside +Report B would produce a document nobody works with. + +Size is not the decisive reason, though. A report is a frozen snapshot that +proves what was found on a date and is archived unchanged. An Arbeitsgrundlage is +a living document that the customer edits for weeks: owner, due date, status, +comment. Forcing both into one file makes both worse. + +### Data model + +The Arbeitsgrundlage is the stored review model in `src/domain/review.ts`: +`status`, `priority`, `owner`, `due`, `prerequisites`, `access`, `nextStep`, +`evidence`, `comment`, the markers `quickwin`, `blocked`, `external`, `question` +and `notRelevant`, plus `riskAcceptance`. + +`include` is the curation switch. The consultant selects what reaches the +customer as a work item. Shipping 1,806 unfiltered items produces no action at +all. + +### Structure + +- **Sheet 1 — Maßnahmen.** Only the curated selection, with a stated selection + criterion. One row per work item. +- **Sheet 2 — Vollständige Abweichungen.** All deviations for reference, so the + customer can pull further items in without the working list overflowing. + +The HTML variant renders the same content as a frozen status view for status +meetings and filing. It is generated from the same projection, never maintained +separately. + +### No duplicated technical depth + +A work item carries its stable finding identifier, the measure, prerequisites, +required access and the owner — not the evidence, not the source attribution, not +the baseline variants. Those stay in Report B and are reached through the +identifier. + +One fact, one place. Repeating the technical detail would leave two diverging +versions after the first correction. + +## Progress is proven by rescan + +Decision: 2026-09-18, explicitly approved by the user: *"Den Fortschritt +dokumentiere ich durch Rescans — für mich zählt nur der technische Beweis."* + +Remediation progress is established by comparing scan runs, never by a status +somebody ticked. This follows `TIMESLOT_COMPARISON_PLAN.md`, which already +replaced the conclusion *absent equals remediated*. + +### Binding rules + +- No artifact presents a self-reported status as a resolved finding. A work item + marked done in the Arbeitsgrundlage stays an open deviation in every report + until a rescan proves otherwise. +- A delta uses the lifecycle vocabulary of the timeslot contract — demonstrably + remediated, still open, unresolved, not comparable — never a binary + done/open. *Unresolved* is a legitimate and frequent outcome and is shown as + such. +- Absence of a finding is not proof of remediation. Remediation is claimed only + where the profile-bound negative-proof contract is satisfied for exactly that + rule and object. +- Result presence and deviation lifecycle stay separate. A rule can still be + reported while its concrete deviation is fixed. +- No effective-endpoint claim is derived from a backup-configuration comparison. + +### Why the caveat is not theoretical + +The stored data shows how easily absence would be misread: Maester carries **845 +`not_run`** and 10 `execution_error`, Purple Knight 34 `not_applicable` and 10 +`not_run`. A check that did not run would otherwise turn into a success message — +the most dangerous false statement a progress report can make, because it errs in +the comfortable direction. + +### Artifact D — Delta Report + +An own artifact per rescan, in the same two cuts as the reports. The initial +report stays frozen and is never rewritten; the change is a separate document +with its own reporting date. + +**The comparison is against a chosen reference run, and that choice is made in +ASSESSOR — not at export time.** The export renders a comparison that already +exists; it contains no run-selection logic, no fallback to "the previous run" and +no implicit pairing of its own. Consequences: + +- The chosen reference run is part of the stored comparison, together with its + contract version, engine versions and input fingerprint. The export reads it + and never re-derives it. +- The document names both compared runs explicitly — reference and current, each + with its identity and date — so it stays self-describing once it is out of the + application. +- Without a stored comparison there is no Delta Report. The export is + unavailable rather than guessing a pairing. + +This keeps comparison a domain concern and presentation a separate one: the Delta +Report is a renderer, not a second comparison engine. + +- **Management cut:** score movement, what is demonstrably remediated, what + persists, what is newly found, and how much of the comparison is unresolved or + not comparable. The unresolved share is stated, not hidden. +- **Technical cut:** per finding the lifecycle verdict with its evidence — which + run, which identity match, which contract qualified it — plus the + disqualifying diagnostics where a comparison was not admissible. + +### Planning fields in the Arbeitsgrundlage + +`status`, `due`, `owner` and the markers stay in the XLSX as the customer's own +steering aid. They are labelled as unverified self-report at the point of display. +ASSESSOR never promotes them into a report as a result. + +The export therefore stays one-way by design, not by limitation: progress does not +need a return channel because it comes from the next scan. + +## Priority without a common severity + +Decision: 2026-09-18, explicitly approved by the user. + +Severity is not a property every scanner delivers. Measured against the stored +data: + +| Tool | Results | Severity coverage | Native ranking signal | +| --- | --- | --- | --- | +| CIS-CAT | 1,233 | none, all `unknown` | none | +| PingCastle | 277 | derived from Points | Points 0–50+ | +| Maester | 1,590 | 99.4 % | native severity | +| Purple Knight | 1,309 | 100 %, 187 `critical` | native severity | +| GPO / baseline | — | none | none | + +A severity-ranked global list would therefore drop CIS-CAT and GPO out of the +Priority Findings entirely, let Purple Knight dominate merely because it is the +only source that emits `critical` natively, and keep PingCastle permanently below +`critical` because `pingCastleSeverityFromPoints` caps at `high` by construction. +That ordering would describe the report formats, not the customer's risk. + +### Binding rules + +- Priority Findings are grouped by security domain. The eight domains are + tool-neutral and already exist. +- Within a domain, findings are ordered by the declared priority basis of their + own source. The basis is visible to the reader. +- No ranking is ever produced across sources with incomparable bases. A single + ordered list that mixes them is not permitted. +- GPO deviations are equal-weight. They get their own block with count, affected + policy settings and scope limit, and never an inferred criticality. +- A source without any defensible ranking basis lists its findings unranked and + says so. Unranked is an acceptable answer; an invented rank is not. + +### Profile obligation + +Implemented as `ToolPriorityBasisDefinition` in +`src/domain/tool-profile-definition.ts`, required on every `ToolProfileDefinition` +and enforced by `tests/profiles/declarative-profiles.test.ts`. + +Analogous to the existing `securityScoring` obligation, every tool profile +declares a **priority basis**: the exact mapped properties, scale, direction and +semantics of the value used to order its findings — or an explicit reason why no +usable basis exists. Never infer a priority from an arbitrary field named +severity, level, score or rank. + +A declaration may also list `excludedProperties`: fields that resemble a basis +but are not one, each with its reason. This is what stops a later change from +quietly promoting them. + +| Profile | Declared basis | +| --- | --- | +| Purple Knight | `severity` — native criticality, the only source reaching `critical` without derivation | +| Maester | `severity` — native per test | +| PingCastle | `numeric` on Points, `0-50+`, higher-is-worse | +| CIS-CAT | `unavailable` — benchmarks state no per-recommendation criticality | +| Generic | `unavailable` — unrecognized fields establish no scale or direction | + +PingCastle is declared on Points rather than severity on purpose: its canonical +severity is *derived* from Points by `pingcastle-severity-from-points` and is +capped at `high` by construction. Points keeps the granularity the capped +severity loses. + +`reportPriorityBasisFrom` turns an `unavailable` declaration into an explicit +`equal-weight` basis carrying the profile's own reason, so a report states why a +source is unranked instead of implying the declaration is missing. + +A derived, normalized cross-tool ASSESSOR priority is **not** approved. It would +require its own versioned rule and an explicit decision of its own. + +### Guarded mis-mapping risk + +`src/profiles/cis-cat/cis-cat-definition.ts` declares +`severityHeaders: /^(?:severity|level)$/i`. CIS `Level 1` / `Level 2` is a +hardening profile tier, not a criticality. It falls through to `unknown`, which +is harmless, and it is now recorded as an excluded property with its reason and +covered by a test. It must not be "corrected" into a severity, because that would +manufacture criticalities the benchmark never stated. + +## Guardrails for both reports + +- Score-neutral classes never appear in Priority Findings and never enter the + score. They remain fully inspectable in Report B. +- A GPO verdict is taken only from the authoritative rolled-up policy verdict and + the explicit conflict and duplicate flags. Never from comparison prose, + historical results, baseline text, guidance or evidence. +- Unknown or unavailable facts render as an em dash, never as an inferred zero. +- Both files are self-contained: inline styles, no CDN, no external fonts, + scripts or images, no network access when opened. A report leaves the building + and must not load anything. +- The bundled Inter variable font is embedded or a local system stack is used; + no font is downloaded at view time. +- Shared typography roles, donut geometry, marking semantics and panel inset + apply as in the application. Status colour stays in accent lines, markers, + arcs and score nodes, never as a full status fill. +- Static output: no JavaScript, printable to PDF without layout loss. + +## Relationship to the existing export + +### Current-view export — explicit user extension, 2026-09-18 + +The Work toolbar's CSV/MD/HTML buttons now export the current filtered and sorted +view, including Results, with exactly two content columns: `Soll-Zustand` and +`Abweichungen`. This supersedes their old marked-only selection. The user can +still restrict the view with `My Workspace`; that restriction combines with the +other active filters. A view export is a frozen, scoped inspection snapshot, +not the curated Arbeitsgrundlage C, a replacement for reports A/B, or a delta. + +`src/exports/work-view-export.ts` supplies one click-time presentation projection +for these three formats, consuming existing Work records and the shared Results +resolver without ranking, scoring, re-evaluation or database queries. The shared +`report-projection.ts` contract for artifacts A–D remains unchanged. Native +remediation, baseline variants, exact source attribution and verification gaps +stay visible. Review completion never becomes a technical resolution. Long CSV +cells are preserved in labelled continuation rows (same finding ID), keeping two +columns and avoiding Excel's cell-size truncation. HTML is self-contained, +script-free, with locally bundled Inter embedded and responsive wrapping. + +The following paragraph records the earlier strategy baseline; its description +of the toolbar's marked-only behaviour has been superseded by this extension. + +`src/exports/dashboard-export.ts` and `ActionlistControls` already export the +review model as CSV, Markdown and a minimal HTML page. That HTML knows nothing of +the score, the security domains, GPO verdicts or provenance and uses Segoe UI +with fixed colours. + +The existing action-list export is the seed of artifact C, not of the reports. +The reports are new; the action-list HTML is replaced by the artifact C renderer, +and the CSV path stays useful for ticket-system import. + +## Open decisions + +- How many findings each domain block shows before it is truncated, and how a tie + inside one source's ranking basis is broken. +- Whether the Microsoft baseline packages carry any per-setting classification + that could later give GPO deviations a defensible basis. Until proven, GPO + stays equal-weight. +- The selection criterion wording for the curated sheet, and whether it is fixed + or written per engagement. +- Which profiles can satisfy a negative-proof contract at all. Profiles that + cannot will never produce a *demonstrably remediated* verdict, and the Delta + Report must say so per source rather than leave the reader guessing. +- File naming convention across all artifacts, including how a delta names its + two compared runs. + +## Dependency + +Artifact D depends on the timeslot comparison actually producing stored results. +`assessor_timeslot_evidence_comparisons` exists with its contract version, engine +versions and input fingerprint, but currently holds no rows. Until the comparison +is implemented per `TIMESLOT_COMPARISON_PLAN.md`, artifacts A, B and C are +deliverable and D is not. + +## Change log + +- 2026-09-18: Strategy established. Delivery, design, technical scope and + interaction decided by the user; content inventory per report fixed. +- 2026-09-18: Report language decided by the user — German for both reports. The + agreed GPO verdict vocabulary and the security domain names stay canonical + English inside the German text; source values are never localized. The Client + Info English-only rule is unaffected. +- 2026-09-18: User correction — established English technical terminology stays + English as a general rule, not as an enumerated exception. German carries the + prose; technical terms are never translated or turned into German compounds. +- 2026-09-18: Priority model decided by the user after the user raised that not + every tool provides severity. Verified against stored data: CIS-CAT and GPO + have no severity at all, PingCastle cannot reach `critical` by construction. + Priority Findings are grouped by security domain with a per-source, declared + and visible ranking basis; no cross-tool ranking; GPO equal-weight in its own + block. Profiles must declare a priority basis. A normalized cross-tool + priority is explicitly not approved. +- 2026-09-18: Third artifact added on the user's proposal. The per-finding + working basis becomes its own deliverable — XLSX to work in plus an HTML status + view, curated through `include` with the complete deviation list on a second + sheet. Decisive reason is the differing lifecycle, not only the measured volume + of 1,806 deviations. Work items reference findings by identifier and never + repeat the technical depth of Report B. +- 2026-09-18: Progress model fixed by the user — progress is documented by + rescans, only technical proof counts. A fourth artifact is added: the Delta + Report, in a management and a technical cut, using the timeslot lifecycle + vocabulary. Self-reported status never becomes a reported result; planning + fields remain in the Arbeitsgrundlage marked as unverified. The earlier open + question about re-importing a maintained worklist is closed: the export is + one-way by design. +- 2026-09-18: Reference run decided by the user — a delta compares against a + chosen reference run, and the choice is made in ASSESSOR. The export renders a + stored comparison and carries no run-selection logic, no previous-run fallback + and no implicit pairing. Both runs are named in the document. +- 2026-09-18: Shared projection implemented as `src/domain/report-projection.ts`. + The security-domain assignment is injected by the caller so the domain layer + never points at the feature layer. Profiles do not yet declare a priority + basis, so the projection accepts one per source and falls back to `undeclared` + with its own diagnostic rather than guessing. Declaring the basis inside + `ToolProfileDefinition` is the follow-up step. +- 2026-09-18: Profile obligation implemented. `ToolPriorityBasisDefinition` is + required on every registered profile and enforced by a contract test. Purple + Knight and Maester declare native severity, PingCastle declares Points because + its severity is derived and capped, CIS-CAT and Generic declare unavailable + with a reason. CIS `Level` is recorded as an excluded property so it cannot be + promoted into a criticality later. +- 2026-09-18: Management Overview renderer implemented as + `src/exports/management-overview-report.ts`. Static, self-contained German + HTML with no script, inline handler, external URL or `url()`. Deviation from + the `assessor-ui` shell and page archetypes named above; all token, typography, + donut and status rules kept. An out-of-range score is clamped and a missing one + draws no arc at all. diff --git a/docs/RISK_ACCEPTANCE.md b/docs/RISK_ACCEPTANCE.md new file mode 100644 index 0000000..8174581 --- /dev/null +++ b/docs/RISK_ACCEPTANCE.md @@ -0,0 +1,63 @@ +# Accepted Risk: decision record and storage contract + +Status: implemented local documentation workflow; authenticated organizational approval remains a server-readiness requirement. + +## Purpose and basis + +Accepted Risk records an explicit, bounded business decision about a finding. It does not turn a failed scanner result into Passed, remove the finding, improve its technical score or waive a legal, contractual or policy obligation. + +The workflow follows the separation of assessment evidence, accountable risk decisions, authorization conditions and monitoring described in [NIST SP 800-37 Rev. 2](https://csrc.nist.gov/pubs/sp/800/37/r2/final) and the [NIST RMF Authorize step](https://csrc.nist.gov/Projects/risk-management/about-rmf/authorize-step). These are design references, not a claim of certification or a universally binding approval policy. No form can guarantee that a decision is legally or organizationally valid in every context. + +User decision, 2026-09-10: no existing organizational approval rules; provide a best-practice starting point. The application therefore requires a named risk owner and a different named approving authority with separate contacts, explicit approval evidence, a bounded validity period and a future review date. It does not invent a universal maximum acceptance duration or assume that a particular job title is authorized. Review frequency and acceptance duration must follow the documented exposure and business context. + +## Recorded information + +- Exact scope: affected assets/systems and exclusions, with the canonical finding occurrence linked automatically. +- Risk scenario, likelihood, business impact, initial risk, residual risk and justification for the remaining exposure. +- Business rationale, alternatives considered, and risk-register/ticket reference. +- Compensating controls, accountable control owner and effectiveness evidence; explicitly justify absent controls. +- Risk owner, role/team and contact; independent approving authority, role/decision authority and contact. +- External approval date and an attributable approval evidence reference covering scope, residual risk and validity. +- Validity start, expiry, next review, monitoring arrangements and review owner, escalation/reassessment triggers, and exit/remediation milestones. +- Applicable policy, regulatory and contractual considerations and any consulted specialists or restrictions. +- Additional evidence references, recorder name, revision reason, server recording timestamp and complete prior decision snapshots. + +Evidence references are stored as inert text. The form neither uploads documents nor verifies their contents, signatures or availability. Source finding values and scanner provenance remain in the existing canonical model. + +## States and rules + +`draft`, `accept` and `revoke` are persisted revision actions. A partial draft requires a recorder and revision reason. Recording acceptance requires all substantive fields except additional evidence references, distinct owner/approver identities as declared, valid dates, approval on or before the start, a non-retroactive start, future expiry, and a future review date within the validity period. Revocation requires a recorder, reason and a previous acceptance; it retains the accepted decision's original details. + +Displayed states are derived at read/render time: Not recorded, Draft, Scheduled, Accepted, Review due, Expired, Revoked and Review required. Expiry dates are inclusive UTC calendar dates; a review becomes due on its specified date. No scheduler or notification service is implied. A new draft becomes the current decision state; earlier approvals remain in history. Renewal or changed scope requires a new recorded acceptance, never editing an earlier snapshot. + +The existing review workflow (including the historical `Actionable` → `accepted` mapping) is separate and is not repurposed for risk acceptance. Ordinary review edits preserve the structured record. Accepted Risk does not automatically alter bookmarks, remediation status or technical dashboard numbers. + +## Implemented persistence + +The authoritative record is `FindingReview.riskAcceptance`, an additive version-1 JSON object stored in the existing `assessor_reviews.data` JSONB column. It contains an append-only `revisions` array. Each revision contains action, complete details, sequential revision number, recorder, reason, original target occurrence ID, server-generated timestamp and `approvalIdentityVerified: false`. + +No SQL migration is needed for this implementation. The canonical local datastore remains Docker project `assessor-2_0`, container `assessor-2_0-postgres-1`, database `assessor`, volume `assessor-2_0_assessor-postgres-data`, `127.0.0.1:5432`. The browser never accesses PostgreSQL directly. + +Writes use `POST /api/v1/projects/:projectId/risk-acceptances` with occurrence ID, command and expected review revision. The backend verifies project membership and validates the decision. PostgreSQL locks the occurrence and current review within the repository transaction, appends the snapshot and increments the review/repository revisions atomically. The local reference repository implements the same contract. General `/reviews` writes cannot introduce, replace, remove or retarget a risk acceptance history. Conflicts fail without overwriting the previous record. + +The UI reports successful storage only after the backend acknowledges the write. Disconnected/unsaved findings cannot record acceptance. Failed writes retain the dialog entries. Existing browser review caches and project snapshots can retain a copy; they are not the authority for acceptance. Exports include the complete structured review record. Existing project/scan deletion policies still apply: this is not an independent legal-hold archive. + +## Reimport and retention + +The existing stable-identity review transfer preserves the complete object and all original revision targets. It never matches by title or row position. If a replacement occurrence differs from the recorded target, the preserved acceptance displays Review required. A new decision can explicitly cover the replacement after reassessment. Failed or ambiguous matches retain the original review according to the reimport policy. + +This refines preservation in `docs/REIMPORT_POLICY.md`: preserving a prior decision is not proof that a changed finding or new assessment is within its approved scope. Previous approvals, expiry dates and decision evidence must never be silently renewed. + +## Security limits and planned server extension + +The current local-only application has no authenticated approver identity, organizational role registry, digital signing, independent evidence verification, trusted immutable storage or legal-hold enforcement. Distinct names/contact entries and an approval reference document an external decision; they do not prove authorization or enforce separation of duties between authenticated users. Same-origin protections and revision checks protect the application workflow, not against a database administrator. These limits remain visible in the dialog and prevent any claim of a tamper-proof or universally compliant approval. + +Before organization-wide approval in the browser/server target, add: + +1. SSO-bound actors and client-scoped authorization; configurable risk-owner/approver roles, thresholds, separation of duties and delegation rules. +2. Dedicated `risk_acceptances`, `risk_acceptance_revisions`, `risk_acceptance_approvals` and `risk_acceptance_evidence` tables with immutable event IDs, project/occurrence foreign keys, actor IDs and server timestamps. Migrate current JSON history without replacing historical declared identities with verified identities. +3. Evidence references with content hashes, access controls, immutable versions and an organization-approved retention/legal-hold policy. Do not add external storage or uploads without a security-model update. +4. Transactional approval/revocation endpoints, tamper-evident audit retention, server-side due/expiry queries and an explicitly configured notification/monitoring workflow. +5. Tests against a dedicated approved integration environment for concurrent approvals, permissions, clock boundaries, evidence retention and migration round-trips. An approved persistence migration requires a verified backup of the canonical datastore first. + +These are acceptance criteria for the future governance extension in phase 14, not completed features. Phase 7 covers the dialog, phases 9–11 cover its storage/API contract, and phase 13 covers security validation. Existing phases are not reopened or marked complete by this scoped implementation. diff --git a/docs/SCORING_MODEL.md b/docs/SCORING_MODEL.md index 7ca0006..a3e1ffd 100644 --- a/docs/SCORING_MODEL.md +++ b/docs/SCORING_MODEL.md @@ -4,6 +4,24 @@ Decision: 2026-09-10, explicitly approved by the user. Implementation belongs to Phase 7/13C (Client Info and scanner context), with score-comparison safeguards under Phase 8. This decision supersedes the display-only native-score policy. +## Comparison qualification, 2026-09-11 + +The numeric contribution policy below remains unchanged. Its comparison safeguards are not a completed acceptance of object-level remediation or an explicitly selected A/B report. Code review identified an evaluation-population key without asset identity, weaker pending-revalidation checks than score pairing, and last-known-source replacement that can omit unresolved obligations after partial intermediate scans. Original stored findings are not deleted. The current historical baseline is not necessarily the user's selected A. + +[TIMESLOT_COMPARISON_PLAN.md](TIMESLOT_COMPARISON_PLAN.md) defines the open Phase-8 follow-up: verified object/scope populations, an explicit A/B basis, obligation-level history and separate eligibility rules for score deltas and remediation evidence. Matching `assessed` and `eligible` counts alone does not prove coverage of absent objects. Native totals must not be recomputed for an arbitrary smaller scope without separately retained contributions. Missing historical risks stay visible separately; no historical score is relabelled as a current measurement and no new penalty formula is introduced. + +This is a planning clarification, not a runtime fix, processing-manifest change or completed verification. The earlier implementation/test notes below remain historical evidence for their stated scope; they do not satisfy the new follow-up's acceptance matrix. + +## GPO scoring scope, decision 2026-09-16 + +The GPO contribution measures conformance of customer settings that are actually configured, independently comparable and inside an explicitly applicable Microsoft-baseline scope. It is not a measurement of complete Microsoft-baseline adoption. Recommended settings that are absent from the customer GPO set remain visible as `Not configured`, but they do not create operational findings, remediation obligations or score penalties in the normal assessment. Full baseline deployment is a separate explicitly commissioned hardening scope. + +Clarification 2026-09-16: absence is reported within the analyzed backup scope. An applicable recommendation with no observed configured value in that imported set remains filterable as `Not configured`, including for a selected subset. This does not assert domain-wide absence or effective device state; the limited scope remains diagnostic evidence. The verdict remains excluded from the score. + +Clarification later on 2026-09-16: `Not configured` is a score-neutral policy verdict. `Duplicates` and `Conflicts` are distinct diagnostic categories on a technical policy setting, not alternative verdicts. Roll up member comparisons once per technical setting: one independently comparable, in-scope configured member value with a valid `Fail` makes the complete policy-setting verdict `Fail`; retain the conflict/duplicate flags beside it. All applicable members passing yields `Passed`. Unresolved applicability, precedence or comparison yields `Review required`. Duplicate source rows, alternative presentations and diagnostic flags never add score weight. + +This clarification supersedes only the earlier same-day interpretation that a conflict/duplicate container could remain score-neutral despite a proven member fail. It is binding for new GPO scoring work. Current runtime categories remain disjoint, so the rolled-up verdict plus diagnostic-flag model requires a dedicated result-population identity, synthetic conflict/duplicate fixtures and explicit verification before it may be claimed as implemented. If implementing it changes persisted evaluation semantics or score inputs, version the affected evaluator/scoring contract and follow the reimport/re-evaluation policy; do not reinterpret historical runs silently. + ## Scan contribution Use a valid native score from the exact import file and scan run. Otherwise use @@ -16,7 +34,7 @@ pass rate. Never combine the native score and the pass rate of the same scan. | CIS-CAT | Native benchmark score, 0–100 | Pass rate | | PingCastle Healthcheck | `100 - native risk`, bounded 0–100 | No pass rate from findings-only reports | | Maester | No native numeric score assumed | Pass rate | -| GPO Analysis | None | Existing context-aware pass rate | +| GPO Analysis | None | Pass rate of configured, independently comparable in-scope settings | | Additional registered scanners | Native overall score declared by their profile | Declared result-population fallback | | Unrecognized tabular sources | No native score inferred | Provisional pass rate only with evidence of passed results | @@ -32,8 +50,12 @@ integrity diagnostics are visible in the calculation details. Passed and deviations use normalized outcomes. Not applicable is excluded. Execution errors, not run and unknown results do not pass and do not add a security failure. They affect known-check coverage. GPO context states retain -their existing authoritative disposition; no severity or missing-setting -penalty is invented. Findings-only input cannot establish a pass denominator. +their existing authoritative disposition. `Not configured` does not enter the +GPO denominator. Conflict/duplicate flags do not enter independently; the +rolled-up policy verdict enters once and is `Fail` when any independently +comparable, in-scope configured member fails. No +severity or missing-setting penalty is invented. Findings-only input cannot +establish a pass denominator. ## Future scanner support diff --git a/docs/TIMESLOT_COMPARISON_AUDIT.md b/docs/TIMESLOT_COMPARISON_AUDIT.md new file mode 100644 index 0000000..cf7d2f7 --- /dev/null +++ b/docs/TIMESLOT_COMPARISON_AUDIT.md @@ -0,0 +1,38 @@ +# Timeslot comparison capability audit + +Stand: 2026-09-11. Phase 8, Paket P0/P1. Code- und synthetisches Fixture-Audit; ergänzend wurde der vom Nutzer ausdrücklich vollständig freigegebene Mandant `Dummy` ausschließlich lesend geprüft. Es gab keine Datenmutation. + +## Ergebnis + +Die aktuelle kanonische Persistenz bewahrt Tool-/Regel-ID, optional ein generisch gemapptes `affectedAsset`, Originalfelder und Provenienz. Sie bewahrt außerdem scannergebundene Ziel-/Benchmarkbeobachtungen für die Scoreprojektion. Diese Angaben reichen nicht pauschal für eine objektgenaue Gegenprüfung: Der Assetwert besitzt keinen deklarierten Typ oder Namensraum, Score-Scope und Finding-Vorkommen sind nicht allgemein über einen versionierten Vergleichsvertrag verbunden, und kein Profil deklariert derzeit eine vollständige Negativnachweissemantik je Regel/Objekt. + +| Quelle | Unterstützte Formate/Pfade | Erhaltener übergeordneter Scope | Ergebnispopulation | Objektgenaue Behebung aus heutigem Bestand | +|---|---|---|---|---| +| Purple Knight | CSV/Excel/HTML über generische Tabellen plus native Summary-/HTML-Extraktion | `forest.name`; AD-native Scorequelle | `complete` für Scoreberechnung | Nicht allgemein belegt. `asset` ist heuristisch gemappt; Typ/Namensraum und vollständige Objektpopulation fehlen | +| PingCastle | XML/HTML über Healthcheck-Extractor | `domain.fqdn` | `findings-only` | Abwesenheit beweist keine Behebung. Native Regel-ID ist erforderlich, aber Ergebnislisten enthalten nur ausgelöste Regeln | +| CIS-CAT | HTML sowie generische Tabellen/Objektpfade | `host.name` und `benchmark.name` | `complete` für Scoreberechnung | Scopevergleich grundsätzlich möglich; regel-/objektbezogener Negativnachweis und Namespaceregel noch nicht deklariert | +| Maester | Excel/CSV/HTML über generische Tabellen bzw. HTML-Extractor | `entra.tenant_id` | `complete` für Scoreberechnung | Tenant-/Regelvergleich grundsätzlich möglich; `asset` ist keine verpflichtende, typisierte Zielidentität und vollständige Negativsemantik fehlt | +| Generisch | CSV/Excel/JSON/XML/HTML über registrierte Formatadapter und generischen Extractor | kein verifizierter Zielscope | `unknown` | Nicht automatisch vergleichbar; Titel, Position oder untypisierter Assettext dürfen keine Behebung beweisen | +| GPO/Baseline | Eigener versionierter Ingestion-, Identity-, Snapshot-, Evaluation- und Finding-Pfad | Projekt, Environment Profile, Kontext/Baseline/Setting und Backupreferenzen | explizite Complete/Partial/Blocked- und Evidencezustände | Fachlich reichere Identitäten vorhanden, aber ohne RSoP/GP Results keine allgemeine Aussage über effektive Anwendung; eigener Policyvertrag bleibt maßgeblich | + +Die älteren `comparisonKeys` bleiben vorerst als Legacydeklaration vorhanden. Zusätzlich muss jetzt jedes Scannerprofil einen versionierten `timeslotComparison`-Vertrag besitzen. Purple Knight, PingCastle, CIS-CAT und Maester sind zunächst ausschließlich scopeweit freigegeben; das generische Profil ist nicht automatisch vergleichbar. Kein aktuelles Profil erlaubt Behebung durch bloße Abwesenheit. Die neue sichere Engine konsumiert diese Verträge; die bisherige Produktprojektion konsumiert sie noch nicht. + +## Ergänzende Bestandsvalidierung mit Dummy + +- Purple Knight besitzt im aktiven Bestand Regel-IDs und für jedes Ergebnis einen `affectedAsset`-Wert. Die Werte sind jedoch nur die Ergebnisbereiche `AD` beziehungsweise `Hybrid (AD)`, keine stabilen Host-/Objektidentitäten. Der Vertrag bleibt deshalb korrekt auf `forest.name` und Scopegranularität begrenzt. +- CIS-CAT besitzt `host.name`, `benchmark.name` und `report.generated_at`; PingCastle besitzt `domain.fqdn` und `report.generated_at`; Purple Knight besitzt `forest.name` und `report.generated_at`. Der aktive Maester-Excel-Lauf besitzt keinen gespeicherten `entra.tenant_id`- oder Reportzeitnachweis und ist nach dem neuen Vertrag aktuell nicht vergleichbar. +- Dummy enthält mehrere supersedierte Reimporte derselben Scannerquellen. Die Läufe besitzen weder `startedAt` noch `completedAt`; ihre Importzeiten unterscheiden sich. Diese Importzeiten dürfen und werden nicht als neue Sicherheitsbeobachtung verwendet. +- Die derzeit aktiven Dummy-Quellen liegen nicht als zwei vollständig vergleichbare A/B-Timeslots desselben Scanners vor. Dummy kann daher aktuell keinen realen Fortschrittswert abnehmen; er bestätigt stattdessen die Fail-closed-Grenzen für Scope, Reportzeit und Reimport. + +## Versionierungsentscheidung für den ersten Schnitt + +Der neue Domänenvertrag in `src/domain/timeslot-comparison.ts` ist additiv und wird noch nicht von Import, Persistenz, bestehender Vergleichsengine oder UI verwendet. Er verändert keine gespeicherten Fakten und benötigt deshalb für diesen ersten Schnitt weder Processing-Manifest noch Reimport. + +Sobald ein Profil Objekt-/Scopefelder neu extrahiert, anders mappt oder eine neue Vollständigkeits-/Negativnachweisaussage aus dem Quellformat ableitet, gilt `REIMPORT_POLICY.md`: append-only Parser-/Extractor-/Profil-/Mappingversion und Reimportmarkierung nur für die betroffenen historischen Verträge. Bereits vollständig gespeicherte, verifizierbare Fakten dürfen später über eine getrennt versionierte Vergleichsprojektion neu ausgewertet werden; fehlende Evidenz darf nicht rekonstruiert werden. + +## P1-Profilstand und offene Entscheidungen + +- Scopegranularität, notwendige Scopeeigenschaften, Reportzeitquellen, Ergebnisart und Diagnosepolitik sind für alle registrierten Profile deklariert und synthetisch validiert. Objektgranularität bleibt für alle aktuellen Scannerprofile gesperrt. +- `complete` trägt bei keinem aktuellen Profil automatisch eine negative Regel-/Objektaussage. Abwesenheit bleibt `unverified-absent`, bis ein formatspezifischer vollständiger Negativnachweis synthetisch belegt und versioniert ist. +- Scannerdiagnosen nach Einfluss auf Identität, Einzelresultat, Abdeckung und Gesamtscore klassifizieren. +- GPO-Vergleichsvertrag getrennt auf vorhandene Policy-Identitäten und Wirksamkeitsgrenzen abbilden; keine Scanner-Sonderlogik in React. diff --git a/docs/TIMESLOT_COMPARISON_PLAN.md b/docs/TIMESLOT_COMPARISON_PLAN.md new file mode 100644 index 0000000..fc86675 --- /dev/null +++ b/docs/TIMESLOT_COMPARISON_PLAN.md @@ -0,0 +1,157 @@ +# Belastbarer Timeslotvergleich: Umsetzungs- und Abnahmeplan + +Stand: 2026-09-11. Zugehörigkeit: Phase 8, mit UI aus Phase 7, Persistenz/API aus Phasen 9-11 und erforderlichen Profilverträgen aus Phasen 6/13A/13C; GPO-Anbindung über Phase 13B. + +Status: **in Arbeit, nicht fachlich abgenommen**. P0 ist abgeschlossen. P1 besitzt den additiven Domänenvertrag und verpflichtende profilgebundene Scope-/Zeit-/Evidenzdeklarationen; Persistenz/API und Übergangsvertrag bleiben offen. P2 ist begonnen: `compareProjectTimeslotEvidence` paart echte Scannerläufe je Werkzeug und bewertet Processing, Scope, Reportzeit, Diagnosen sowie Fail-zu-Pass konservativ. Die bisherige Engine und Oberfläche verwenden diesen Pfad noch nicht. P3-P6 sind offen. Der aktuelle Implementierungsschnitt führt keine Migration, Reimporte, Datenmutation oder Aktivierung einer Vergleichsoberfläche aus. Der historische Phase-8-Abschluss vom 2026-07-17 bleibt dokumentiert, ist aber keine Abnahme dieses Arbeitspakets. + +Dieser Plan präzisiert das Arbeitspaket „faire Vergleiche bei fehlenden Folgequellen“ in [IMPLEMENTATION_PLAN.md](IMPLEMENTATION_PLAN.md). Für die künftige Umsetzung ersetzt er ausdrücklich die ältere Schlussfolgerung „abwesend = behoben“ und die pauschale Ablösung offener Verpflichtungen durch einen neuen Lauf derselben Quelle. Historische Ergebnisse und Originaldaten werden dadurch nicht rückwirkend geändert. + +## 1. Ziel und Grenzen + +Zwei ausdrücklich gewählte Timeslots A und B desselben Kunden liefern drei getrennte Aussagen: + +1. **Nachweislich behoben:** zuvor bestätigte Abweichungen mit nachvollziehbarer aktueller Gegenprüfung. +2. **Weiterhin offen oder ungeklärt:** aktuell bestätigte sowie historische, noch nicht ausreichend erneut geprüfte Verpflichtungen; neue und wieder aufgetretene Abweichungen getrennt ausweisen. +3. **Vergleichbare Scoreveränderung:** A und B werden auf derselben belegten Prüfgrundlage berechnet; ausgeschlossene Bereiche, Evidenzabdeckung und Aktualität bleiben sichtbar. + +Der Overall Score bleibt der methodisch gemischte Index aus [SCORING_MODEL.md](SCORING_MODEL.md), kein Prozentsatz tatsächlicher Sicherheit. Keine neuen Risikogewichte, Scannerformeln oder automatische Übertragung nativer Gesamtwerte auf Security Domains. Fehlende Daten sind weder null noch bestanden. Unbekannte Prüfgrundlagen führen zu einer begrenzten oder nicht verfügbaren Aussage. + +## 2. Ausgangsbefund und Reparaturbedarf + +Codeprüfung vom 2026-09-11, keine neue Laufzeitabnahme: + +- `compareProjectTimeslots` in [datahub-scan-analysis.ts](../src/features/project-import/datahub-scan-analysis.ts) besitzt derzeit keinen Produktaufrufer. Mehrfachauswahl/Öffnen ist kein expliziter A/B-Bericht. +- Die Timeslot-Projektion ersetzt beide Laufwerkzeuge durch `multiple`, lässt `importFiles` aber an Original-Lauf-IDs. Dadurch kann `sameTool` fälschlich gelten und die dateigebundene Kompatibilitätsprüfung ausfallen. +- Die automatischen Matchingstufen der [comparison-engine.ts](../src/comparison/comparison-engine.ts) erzwingen keine objektgenaue Identität. Eine gemeinsame Regeldefinition ist kein Nachweis desselben betroffenen Objekts. Die Zwei-Lauf-Projektion entfernt außerdem frühere Beobachtungen, die zur Verifikation eines Wiederauftretens gebraucht werden. +- Abwesende Vorkommen können `resolved` werden, während zugeordnete Fail-zu-Pass-Ergebnisse `persistent` mit Statusänderung bleiben. Die lokale `isOpen`-Prüfung verwechselt fachliche Abweichungen mit technischen beziehungsweise ungeprüften Zuständen. +- Die Score-Paarbildung prüft viele Kompatibilitätsbedingungen. Ihr `evaluationScopeKey` enthält jedoch keine Asset-Identität; eine unveränderte Regelanzahl kann einen Objektwechsel verdecken. +- `awaitingRevalidation` verwendet schwächere Bedingungen als die Score-Paarbildung. Zusätzlich überschreibt `lastKnown` im [Workspace-Lader](../src/features/project-import/load-canonical-project-workspace.ts) ältere Quellstände, ohne jede offene Verpflichtung zu erhalten. Das kann Verpflichtungen aus der Anzeige verdrängen, löscht aber keine gespeicherten Originalfindings. +- Die derzeitige Score-Baseline ist ein historischer letzter Stand je Quellscope vor der geöffneten Auswahl, nicht zwingend der ausdrücklich gewünschte Timeslot A. + +## 3. Fachliche Verträge + +### 3.1 Regel, Vergleichsidentität und Beobachtung + +- `FindingDefinition` bleibt eine Regeldefinition. Kein pauschaler Ersatz ihres `tool:rule`-Schlüssels durch `tool:rule:objekt`. +- Die projektgebundene Vergleichsidentität eines Vorkommens umfasst verifizierte Quelle, native Regel, fachlichen Scope und gegebenenfalls die stabile Identität des betroffenen Objekts. Zeitpunkt und Importlauf gehören zur Beobachtung und Provenienz, nicht in den dauerhaften Vergleichsschlüssel. +- Objektart, Namensraum und Geltungsbereich gehören zum Identitätsvertrag. Fehlende Identität ist nicht die leere Identität eines vermeintlich gleichen Objekts. Anzeigenamen, Positionen und Titelähnlichkeit reichen nicht aus; Umbenennungen oder Aliasbeziehungen dürfen nicht geraten werden. +- Objektbezogene, scopeweite und aggregierte Regeln erhalten deklarierte Vergleichsgranularitäten. Für einen domainweiten Befund wird kein Host erfunden. Eine Regel mit einer Liste betroffener Objekte ist ohne geeignete strukturierte Evidenz nicht automatisch eine Menge eigenständiger Instanzfindings. +- Automatische Zuordnung muss beidseitig eindeutig auf der deklarierten Granularität sein. Unsichere Zuordnungen bleiben Vorschläge; sie dürfen weder Behebung noch neue Abweichungen allein aus unklarer Restmengenbildung beweisen. Lokale bestätigte Regeln dürfen diese Scope-/Objektgrenzen nicht umgehen. +- Der bereits vorhandene objektbezogene Reimport-Reviewtransfer ist eine wiederzuverwendende Grundlage, aber kein ungeprüfter universeller Identitätsvertrag. Definitionsreviews, Vorkommensreviews und Accepted Risk behalten ihren jeweiligen Geltungsbereich. + +### 3.2 Gegenprüfung und Lebenszyklus + +Die Ergebnispräsenz und der Lebenszyklus einer Abweichung werden getrennt betrachtet. Eine Regel kann weiterhin als Ergebnis vorhanden sein, obwohl die konkrete Abweichung behoben ist. + +| Evidenz im Ziel B gegenüber einer bestätigten Abweichung | Fachliche Aussage | +|---|---| +| Eindeutig dasselbe Objekt/derselbe Scope, kompatible Prüfung, neueres belastbares Pass-Ergebnis | nachweislich behoben | +| Dieselbe Vergleichsidentität mit bestätigter aktueller Abweichung | weiterhin offen | +| Quelle, Objekt oder Ergebnis fehlt; Prüfung abgebrochen, unbekannt oder mehrdeutig | ungeklärt, Verpflichtung bleibt bestehen; `unverified-absent` für ungeprüfte Abwesenheit | +| Finding fehlt in einem deklarativ vollständig belegten Negativbericht für genau diese Regel und dieses Objekt | Behebung nur bei erfülltem profilgebundenem Negativnachweisvertrag | +| Nicht anwendbar oder aus dem Scope genommen | keine Behebung; eigene belegte Anwendbarkeits-/Scopeentscheidung | +| Manuell als erledigt markiert oder Risiko akzeptiert | Workflow-/Risikoentscheidung, kein technischer Behebungsnachweis | + +Neue und wieder aufgetretene Abweichungen verlangen ebenfalls ausreichende Historie und Vergleichbarkeit. Eine bloße Lücke im direkten Vorgänger ist kein Nachweis einer zwischenzeitlichen Behebung. Ein späterer Fail nach belegtem Pass derselben Identität ist ein Wiederauftreten; nach einer ungeprüften Lücke bleibt eine alte Verpflichtung offen. + +Ein Gegenprüfungsvertrag je Profil/Format beschreibt Regelpopulation, Zielobjekte, erfolgreichen Ausführungsumfang, positive/negative Berichtsemantik, Zeitbezug, notwendige Provenienz und disqualifizierende Diagnosearten. GPOs verwenden ihre vorhandenen Settings-, Scope-, Baseline- und Evaluationsverträge; ohne Wirksamkeitsevidenz wird keine effektive Anwendung behauptet. + +`assessed` und `eligible` sind unterstützende Signale, kein Beweis vollständig untersuchter Objekte. Ein im Report vollständig fehlendes Objekt kann beide Zähler unverändert lassen. Fehler werden nach ihrem Einfluss auf Identität, einzelne Prüfergebnisse, Abdeckung oder den Gesamtscore klassifiziert. Eine belastbare Einzelprüfung kann trotz fachlich unabhängiger Fehler verwendet werden; unbekannte Fehlerauswirkung verhindert automatische Behebung. + +### 3.3 Dauerhafte offene Verpflichtungen + +- Jede offene Verpflichtung behält Ursprungs-Timeslot, Originalvorkommen, Quelle, Objekt/Scope, letzten bestätigten Zustand und Beobachtungszeitpunkt. Über A, einen unvollständigen Zwischenstand und B darf sie nicht durch „letzter Scan je Quelle“ verschwinden. +- Fortschreibung kopiert keine Rohbeobachtung als aktuelle Evidenz. Sie erhält eine Referenz mit Zustand, Grund und Alter; neue Beobachtungen werden dazu verknüpft. +- Ablösung erfolgt je Verpflichtung durch aktuelle Bestätigung, belegte Behebung oder eine ausdrücklich auditierte Scopeentscheidung. Eine spätere Dateizeit, ein nichtleerer Scan oder `assessed > 0` genügt nicht. +- Die erwartete Quelle kann aktuelle und ungeklärte Teilbereiche zugleich besitzen. Die bisherigen Quellzustände `observed-current`, `carried-forward-awaiting-revalidation` und `retired-out-of-scope` dürfen diesen Mischfall nicht zu „alles aktuell“ verdichten. +- Backlog und Evidenzabdeckung sind getrennt vom gemessenen Score. Historische Risiken verschwinden nicht bei Quellenauswahl; ein alter Score wird nicht als Messwert von B eingesetzt. Die frühere Formulierung „scorewirksam“ autorisiert keinen erfundenen numerischen Malus. Ein zusätzlicher risikogewichteter Expositionsindex benötigt eine eigene Methodikentscheidung. +- Risikoakzeptanz bleibt separat sichtbar und beendet keine technische Abweichung. Reviewhistorie einschließlich zukünftiger Felder wird vollständig erhalten; ein Reimport verlängert oder erneuert keine Akzeptanz. + +### 3.4 Vergleichspaar und Score + +- Der Vergleich bindet genau A und B samt Projekt-, Assessment-, aktiven Run-, Datei- und Processingreferenzen. A muss fachlich vor B liegen; ungültige, identische oder nicht eindeutig geordnete Auswahlen liefern keinen verifizierten Fortschritt. Scanzeit wird nicht durch Importzeit ersetzt. +- Mehrteilige Dateien werden je originalem Scannerlauf geprüft. Mehrere Quellen dürfen nicht zu einem gemeinsamen `multiple`-Vertrag verschmolzen werden. Fehlende oder mehrdeutige Zuordnung sperrt die betroffene Aussage; übrige vergleichbare Bereiche bleiben mit ausgewiesenem Umfang nutzbar. +- Historie vor A darf offene Verpflichtungen und Wiederauftreten erklären, aber weder den Messwert von A ersetzen noch ungefragt die A/B-Scorebasis verändern. +- Der Scorevergleich verlangt eine gemeinsame belegte Prüfpopulation einschließlich der erforderlichen Objekt-/Scopeidentitäten, eindeutige Paarung, kompatible Verarbeitung, neuere Beobachtung sowie gleiche Scoremethodik und Gewichtung. Fehlende, hinzugekommene, entfernte oder ausgetauschte Objekte werden als Scopeänderung erkennbar, auch bei gleicher Anzahl. +- Native Gesamtwerte dürfen nicht auf eine kleinere Objektteilmenge heruntergerechnet werden, wenn deren Beitrag nicht separat belegt ist. Ohne vergleichbare native Grundgesamtheit ist für diesen Beitrag kein Delta verfügbar. Pass-rate-Teilmengen sind nur mit ausgewiesenen, vollständig identifizierten Prüfungen zulässig. +- Score- und Behebungsfreigabe sind getrennte Prädikate. Eine geänderte Gewichtung oder ein unbrauchbarer nativer Score kann das Delta verhindern, ohne eine belegte Einzelbehebung zu entwerten. Umgekehrt ist ein vergleichbarer Gesamtscore kein Behebungsnachweis. +- Die bestehenden Regeln für aktuelle Abweichungen werden gemeinsam verwendet (`isDeviation`, für GPOs `policyComparisonDisposition`). Fehler/Not run/Unknown bleiben Evidenzlücken. Historisch ungeklärte Verpflichtungen bleiben zusätzlich offen, auch wenn B keine aktuelle Abweichung dazu enthält. + +Behebungsquoten beziehen sich auf eine explizite, deduplizierte Menge bestätigter offener Vergleichsinstanzen aus A. Der Zähler enthält nur nachgewiesene Behebungen dieser Menge; ungeklärte, nicht vergleichbare und aus dem Scope genommene Instanzen werden separat ausgewiesen und nicht still aus dem Nenner entfernt. Ein unbekannter oder leerer Nenner liefert keine behauptete Erfolgsquote. Neue Findings aus B und zusätzliche Verpflichtungen vor A gehören in den getrennten Bestandsbericht. Die reine Differenz offener Anzahlen ist ausdrücklich keine Behebungsquote; jede Kennzahl muss auf ihre zugrunde liegenden Identitäten zurückführbar sein. + +## 4. Arbeitspakete und Reihenfolge + +Die Paketstände beziehen sich ausschließlich auf nachgewiesene Ergebnisse dieses Arbeitspakets; ein begonnener Vertrag ist noch keine Produktintegration. + +| Paket | Inhalt und betroffene Grenzen | Voraussetzung / Nachweis | +|---|---|---| +| P0 · abgeschlossen | Synthetisches Bestandsaudit je Scanner/Format/GPO: Regelgranularität, bereits erhaltene Objekt-/Scopefelder, Quellenpfade, Vollständigkeitssignale und fehlende Informationen dokumentieren; notwendige Vertragsänderungen und Reimportbetroffenheit bestimmen | [TIMESLOT_COMPARISON_AUDIT.md](TIMESLOT_COMPARISON_AUDIT.md); keine echten Kundendaten; Fähigkeiten und Grenzen je unterstütztem Pfad dokumentiert | +| P1 · in Arbeit | Versionierte Vergleichsidentität, Gegenprüfungs-/Diagnosevertrag und getrennte Ergebnis-/Verpflichtungszustände in der Domäne spezifizieren; Persistenz-/API-Entwurf und Übergangsregeln festlegen | Domänen- und Profilverträge sowie synthetische Scope-/Zeitfälle umgesetzt; Persistenz-/API- und Übergangsentwurf bleiben offen | +| P2 · in Arbeit | Scanner-/GPO-Paarung anhand echter Quellreferenzen; vollständige Kompatibilitätsprüfungen; objektgenauer Lebenszyklus, Fail-zu-Pass, konservative Abwesenheit und einheitliche aktuelle Abweichungsmetriken | Sicherer Scannerpfad mit echter Tool-/Run-/File-Paarung, Processing-, Scope-, Reportzeit- und Diagnosegrenzen umgesetzt; GPO, Historie, Produktintegration und vollständige Matrix bleiben offen | +| P3 | Verpflichtungsbezogene Fortschreibung über alle Zwischenstände, getrennt von der Score-Baseline; atomare/idempotente Ablage und API gemäß P1, Wiederladen und auditierter Scope-Ausstieg | P1/P2; nichts verschwindet bei Teilimport, Reload, Reimport oder mehrdeutiger Zuordnung | +| P4 | Explizite A/B-Scorebasis, objekt-/scopebewusste Population und getrennte Freigaben für Delta/Gegenprüfung; native Scoregrenzen und Coverageausgabe | P1/P2/P3; keine Verbesserung durch Quellenauslassung, Objektwechsel oder historische Baselinevermischung | +| P5 | A/B-Auswahl und dreiteiliger Bericht in der vorhandenen Oberfläche; Gründe, Messbasis, Quellen/Versionen und Belege pro Aussage; aktueller Workspace bleibt unverändert nutzbar | P2-P4 fachlich verifiziert; UI ist Konsument der Domänenlogik, kein eigener Matcher | +| P6 | Gesamtabnahme, Dokumentationsabgleich und kontrollierte Aktivierung | Alle unten genannten Fälle; keine Freigabe allein wegen vorhandener Funktion oder grüner Buildausgabe | + +Keine frühe Verdrahtung der bisherigen `compareProjectTimeslots`-Ergebnisse als belastbarer Fortschrittsbericht. Nach Implementierungsbeginn und jedem verifizierten Teilpaket werden Status, offene Risiken und tatsächliche Nachweise im Hauptplan fortgeschrieben. + +## 5. Versionierung, Bestand und Betrieb + +- [REIMPORT_POLICY.md](REIMPORT_POLICY.md) bleibt verbindlich. Änderungen an importierter Identität, Findinggrenzen, Assetmapping, Normalisierung, Extraktion, Vollständigkeitsdiagnosen oder neu benötigten Scoreeingaben erhalten append-only Processing-Manifeste und Reimportmarkierungen für betroffene historische Verträge. +- Eine Änderung allein an der Vergleichsauswertung unveränderter, bereits ausreichend gespeicherter Fakten wird getrennt versioniert und benötigt eine nachvollziehbare Neuberechnung der Vergleichsergebnisse. Sie darf keine versteckte Änderung importierter Identität oder eine Ergänzung fehlender Evidenz sein. P0/P1 müssen diese Grenze pro Änderung dokumentieren; kein pauschaler Bestandsreimport und keine pauschale Reimportfreiheit. +- Neue Vergleichsergebnisse erhalten eine eigene Algorithmus-/Vertragsversion, genaue Eingabereferenzen und Freigabegründe. Historische Ergebnisse behalten ihre Bedeutung und werden als Legacy/nicht nach neuem Vertrag verifiziert gekennzeichnet; alte `resolved`-Werte werden nicht rückwirkend zu Beweisen erklärt. +- Der konkrete Speichervertrag für Verpflichtungen und Scopeentscheidungen wird vor Datenbankänderungen festgelegt. Persistenz/Backend bleiben außerhalb von React; Projektgrenzen, optimistische Revisionen, atomare Updates und Wiederholbarkeit sind Pflicht. +- Vor einer gesondert freigegebenen Migration: Backup erstellen und prüfen, Migration/Rückfallplan synthetisch verifizieren. Nur den kanonischen lokalen PostgreSQL-Datastore verwenden; keine Ersatzdatenbank, keine neuen Ports oder Volumes. Der Planauftrag führt weder Migration noch Reimport aus. +- Kundenreviews und Accepted-Risk-Historien dürfen weder verloren gehen noch auf andere Objekte geraten werden. Nicht eindeutig übertragbare Daten bleiben am Ursprung mit dauerhaft sichtbarem Klärungsbedarf. + +## 6. Verbindliche synthetische Abnahmematrix + +Die Matrix bleibt bis auf ausdrücklich im Paketstatus genannte Teilnachweise geplant. Domain-, Import-/Projektions-, Repository-/API- und UI-Ebene werden entsprechend ihrer Verantwortung geprüft. + +| Fall | Erwarteter Nachweis | +|---|---| +| Dieselbe Regel auf Server A in A und Server B in B | Kein objektgenaues Match und keine Behebung für Server A | +| Fünf betroffene Objekte in A, drei erneut vorhanden in B | Drei nur bei Identitätsbeweis zugeordnet; zwei ungeklärt, niemals allein aus der Differenz behoben | +| Gleiche Anzahl und Regeln, aber ausgetauschte Zielobjekte | Scopeänderung; kein ungeprüftes vergleichbares Score-Delta | +| Dasselbe Objekt: Fail zu Pass / Fail zu Fail | Belegt behoben / weiterhin offen; Ergebnispräsenz ersetzt keinen Lebenszyklus | +| Kein oder doppelter Objektschlüssel, gleiche Titel, Umordnung | Kein geratenes Match; deterministische Diagnose und vollständige Erhaltung aller Vorkommen | +| Domainweite oder aggregierte Regel ohne Host-ID | Deklarierte Scopegranularität statt erfundener Objektinstanzen | +| Gesamte Scannerquelle fehlt; generische Begleitdateien bleiben | Offene Verpflichtungen bleiben, fehlende Quelle zählt nicht als Behebung | +| Unvollständiger Folgescan mit `assessed > 0` und Score-Issues | Kein pauschales Entfernen historischer Verpflichtungen; einzelne belegte Prüfungen getrennt behandelbar | +| A offen, Zwischenstand teilweise/leer/fehlerhaft, B ohne Quelle | Ursprüngliche Verpflichtung mit Originalherkunft bleibt sichtbar, auch nach Reload | +| `assessed === eligible`, aber ein erwartetes Objekt fehlt | Zählergleichheit allein erteilt keine Vollständigkeits- oder Behebungsfreigabe | +| Findings-only-Bericht enthält keinen Treffer | Behebung nur mit explizit erfülltem vollständigem Negativnachweisvertrag | +| Neuerer Scanzeitpunkt fehlt oder ist unverändert; bloßer Reimport | Kein gemessener Fortschritt aus Importzeit oder identischen Beobachtungen | +| Geänderte/ unbekannte Processingverträge, gemischte Scanner und Mehrdateiläufe | Schutz greift auch im Timeslotvergleich; keine Umgehung durch künstliche Lauf-IDs | +| Gewichtung/Scoremethode geändert, Einzelprüfung dennoch belastbar | Delta gesperrt/begrenzt, gültige Behebung unabhängig davon bewertbar | +| Neuere Evidenz wieder Fail nach belegtem Pass / nach ungeprüfter Lücke | Wiederaufgetreten / alte Verpflichtung weiter offen | +| Ältere Historie H vor A und B | A/B-Delta unverändert durch H; historische Verpflichtungen separat und nachvollziehbar | +| Keine vergleichbare Quelle oder fehlende Historie | Kein Null-Delta als Erfolg; nicht verfügbare Aussage mit Grund | +| Not applicable, Not run, Execution error, Unknown und Accepted Risk | Keine künstlichen Behebungen; aktuelle Abweichung, Evidenzlücke und Risikoentscheidung getrennt | +| GPO-Teilabdeckung, andere Baseline/Scope, fehlende Wirksamkeitsevidenz | Konservative getrennte Aussage gemäß Policyvertrag, keine erfundene effektive Behebung | +| Scope-Ausstieg mit/ohne ausdrückliche Begründung und Akteur | Nur auditierte Entscheidung wirksam; nicht als Behebung gezählt; Historie bleibt erhalten | +| Reimport, doppelte Anforderung, Konflikt oder fehlgeschlagene Transaktion | Keine verlorenen/doppelten Verpflichtungen; vollständige Reviews und Accepted Risk erhalten | +| Mandantenwechsel, manipulierte A/B-IDs, supersedierte Läufe | Projektgrenze und aktive Auswahl durch Domäne/API abgesichert | +| Auswahlwechsel, Filter, wiederholtes Öffnen, schmale Ansicht | Kein veraltetes Delta, vollständige Belege, klare A/B-Beschriftung, begrenzte Renderarbeit | + +Für relevante Codeänderungen sind `npm test` und `npm run build` die Basis; zusätzlich gezielte Vergleichs-/Score-, Historien-, Importprojektions-, Persistenz-/API- und synthetische UI-Tests. Optionale PostgreSQL-Tests werden nur im freigegebenen Rahmen ausgeführt; übersprungene Tests ersetzen keine Persistenzabnahme. Laufzeitbeobachtungen sind keine fragilen Millisekunden-CI-Grenzen. Keine echten Reportinhalte, Screenshots gefüllter Kundenansichten, Telemetrie oder externen Uploads für die Verifikation. + +## 7. Offene Detailentscheidungen und Abschlusskriterium + +- P0/P1: exakte Identitätsfelder, Alias-/Umbenennungsbelege, Granularitäten und Negativnachweisfähigkeiten je unterstütztem Profil/Format; fehlende Fähigkeiten bleiben ausdrücklich nicht verifizierbar. +- P1/P3: additive Datensätze/Versionen für Verpflichtungen, Vergleichsergebnisse und Scopeentscheidungen; Rückfall-/Neuberechnungspfad, Projektberechtigungen und Grenzen der vorhandenen Akteursnachweise. Keine Behauptung einer authentifizierten Signatur ohne entsprechende Infrastruktur. +- P4: welche separat belegten Teilpopulationen pro Scoreverfahren tatsächlich berechenbar sind. Keine frei geschätzte Zerlegung nativer Gesamtscores; kein zusätzlicher Expositionsindex ohne separate Entscheidung. +- P5: konkrete Bedienposition und Belegnavigation im bestehenden Designsystem; keine neue Oberfläche oder neue Exportfunktion außerhalb des Vergleichsauftrags. + +Das Paket ist erst abgeschlossen, wenn die Matrix auf den relevanten Schichten bestanden ist, dokumentierte Profilgrenzen in der Oberfläche sichtbar bleiben, A/B-Auswahl und Herkunft reproduzierbar sind und weder fehlende Evidenz noch Objekt-/Methodenwechsel als Verbesserung erscheinen. Plan, Vergleichsdokumentation und Scoringdokumentation müssen denselben verifizierten Stand beschreiben. Bis dahin lautet der Status weiterhin offen beziehungsweise nach Beginn in Arbeit. + +## Verifikation der bisherigen Schnitte, 2026-09-11 + +- Sechs synthetische Domänentests bestätigen getrennte Regel-/Objektidentität, fehlende Typ-/Namespacefreigabe, Fail-zu-Pass nur bei gleicher Identität, konservative Abwesenheit, Diagnose-/Zeitgrenzen sowie Herkunftserhalt und auditierten Scope-Ausstieg. +- Client- und Serverbuild, Local-only-Sicherheitsprüfung und Designprüfung sind erfolgreich. +- Gesamtlauf: 1.224 Tests bestanden, acht optionale PostgreSQL-Tests übersprungen. Ein fachfremder kombinierter Node-Importtest überschritt unter Gesamtlast einmal sein unverändertes Fünf-Sekunden-Limit und bestand isoliert mit 5/5 Tests in 1.193 ms. +- Der erste Schnitt enthielt keine reale Dateninspektion. Über alle bisherigen Schnitte gab es keine Persistenzmutation, Migration, Reimport- oder UI-Aktivierung; P1/P2 bleiben ausdrücklich unvollständig. +- Nach ausdrücklicher Nutzerfreigabe wurde ausschließlich `Dummy` lesend ergänzt geprüft. Der Bestand bestätigt, dass Purple-Knight-`affectedAsset` nur Bereiche statt Objekte enthält und dass wiederholte Reimporte ohne neue Reportzeit keinen Fortschritt belegen. Keine Daten wurden verändert. +- Vier Profile besitzen nun scopegebundene Vergleichsverträge; Generic bleibt nicht automatisch vergleichbar. Die sichere Scannerpaarung zählt nur ein eindeutiges Fail-zu-Pass derselben Identität bei kompatibler Verarbeitung und neuerer Reportzeit als behoben. Fehlende Quellen, Abwesenheit und gleiche Reportzeit bleiben ungeklärt oder nicht vergleichbar. +- 23 fokussierte synthetische Tests in drei Dateien sowie Client- und Serverbuild sind erfolgreich. Persistenz/API, GPO, Verpflichtungshistorie, Score-A/B-Basis und UI bleiben offen. +- Projektweiter Lauf: 1.240 Tests bestanden, acht optionale PostgreSQL-Tests übersprungen. Derselbe fachfremde kombinierte Node-Importtest überschritt unter Gesamtlast einmal sein unverändertes Fünf-Sekunden-Limit und bestand isoliert mit 5/5 Tests in 3.661 ms. Local-only- und Designsprache-Prüfung sind erfolgreich; das Zeitlimit wurde nicht erhöht. diff --git a/docs/architecture/policy-analyzer-comparison-contract.md b/docs/architecture/policy-analyzer-comparison-contract.md index c73a13c..86e81e5 100644 --- a/docs/architecture/policy-analyzer-comparison-contract.md +++ b/docs/architecture/policy-analyzer-comparison-contract.md @@ -13,14 +13,16 @@ Policy Analyzer distinguishes differing configured values from absent settings. | Outcome | Evidence required | | --- | --- | -| Fail / Misconfigured | Explicit nonempty Microsoft recommendation, an actual configured customer value and a persisted deterministic mismatch. | +| Fail / Misconfigured | Explicit Microsoft recommendation and a persisted deterministic mismatch. A missing required key or typed empty value is a mismatch; ordinary missing value recommendations remain Not configured. | | Not configured | Explicit nonempty Microsoft recommendation and a missing customer setting; informational, excluded from Fail and Deviation. | -| Pass | Explicit Microsoft recommendation and a persisted deterministic match with an actual customer value. | +| Pass | Explicit Microsoft recommendation and a persisted deterministic match. For Registry.pol deletion requirements, target absence in the analyzed backup set is an explicit matching state. | | Conflicts | Multiple distinct typed customer values for the same setting, or explicitly recorded contradictory recommendations within one baseline set. | | Duplicates | Multiple source entries configuring the same setting to the same typed value. | Registry addresses include computer/user scope (implicit HKLM/HKCU in Registry.pol), key and value name. Address matching ignores case; value data retains case and type. Different value names under the same key are distinct settings. Native security-template and advanced-audit settings use their resolved identities. Assessments and projects are never merged for collision detection. +Registry.pol `delete-value`, `delete-all-values` and `create-key` are compared as typed target states rather than discarded as missing values. A typed empty string remains a present value. These rules describe only the imported backup configuration; local effective state remains a separate Policy Analyzer operation and requires separate evidence. + Microsoft also calls configured differences *between* policy sets conflicts. ASSESSOR labels configured customer-versus-benchmark mismatches Fail. The user's 2026-09-06 correction replaces the earlier four-outcome contract: missing settings remain a separate informational outcome. GPO Deviation includes only Misconfigured, not Conflicts, Duplicates, missing values or review-only records. Other scanner deviation semantics remain unchanged. A conflict in the imported set is not a claim that both settings apply to the same endpoint: GPO backup analysis does not establish resultant policy. One baseline comparison creates one Work row with all source references. One customer collision group creates one Conflicts/Duplicates row. A duplicate group may also have a separate Pass/Fail benchmark result; these are different questions. Multiple benchmarks do not themselves create duplicate customer settings. diff --git a/outputs/Exxeta_360_Assessor_Cyber_Hygiene_KRITIS_Sales.docx b/outputs/Exxeta_360_Assessor_Cyber_Hygiene_KRITIS_Sales.docx new file mode 100644 index 0000000000000000000000000000000000000000..52258a3beecc00b356fbd1464a6a46cd242159e1 GIT binary patch literal 50628 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 x&jd^Lf4Z#yvY&Wam6r?LXQsf$r{for(const r of i)if(r.type==="childList")for(const c of r.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&a(c)}).observe(document,{childList:!0,subtree:!0});function n(i){const r={};return i.integrity&&(r.integrity=i.integrity),i.referrerPolicy&&(r.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?r.credentials="include":i.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function a(i){if(i.ep)return;i.ep=!0;const r=n(i);fetch(i.href,r)}})();var Cf={exports:{}},xc={};var sv;function T8(){if(sv)return xc;sv=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function n(a,i,r){var c=null;if(r!==void 0&&(c=""+r),i.key!==void 0&&(c=""+i.key),"key"in i){r={};for(var l in i)l!=="key"&&(r[l]=i[l])}else r=i;return i=r.ref,{$$typeof:e,type:a,key:c,ref:i!==void 0?i:null,props:r}}return xc.Fragment=t,xc.jsx=n,xc.jsxs=n,xc}var rv;function f8(){return rv||(rv=1,Cf.exports=T8()),Cf.exports}var d=f8(),Ef={exports:{}},ft={};var ov;function h8(){if(ov)return ft;ov=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),r=Symbol.for("react.consumer"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),T=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),m=Symbol.for("react.activity"),g=Symbol.iterator;function S(ee){return ee===null||typeof ee!="object"?null:(ee=g&&ee[g]||ee["@@iterator"],typeof ee=="function"?ee:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},y=Object.assign,w={};function C(ee,M,Y){this.props=ee,this.context=M,this.refs=w,this.updater=Y||x}C.prototype.isReactComponent={},C.prototype.setState=function(ee,M){if(typeof ee!="object"&&typeof ee!="function"&&ee!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,ee,M,"setState")},C.prototype.forceUpdate=function(ee){this.updater.enqueueForceUpdate(this,ee,"forceUpdate")};function k(){}k.prototype=C.prototype;function E(ee,M,Y){this.props=ee,this.context=M,this.refs=w,this.updater=Y||x}var O=E.prototype=new k;O.constructor=E,y(O,C.prototype),O.isPureReactComponent=!0;var N=Array.isArray;function B(){}var A={H:null,A:null,T:null,S:null},z=Object.prototype.hasOwnProperty;function P(ee,M,Y){var Z=Y.ref;return{$$typeof:e,type:ee,key:M,ref:Z!==void 0?Z:null,props:Y}}function K(ee,M){return P(ee.type,M,ee.props)}function I(ee){return typeof ee=="object"&&ee!==null&&ee.$$typeof===e}function L(ee){var M={"=":"=0",":":"=2"};return"$"+ee.replace(/[=:]/g,function(Y){return M[Y]})}var le=/\/+/g;function ue(ee,M){return typeof ee=="object"&&ee!==null&&ee.key!=null?L(""+ee.key):M.toString(36)}function X(ee){switch(ee.status){case"fulfilled":return ee.value;case"rejected":throw ee.reason;default:switch(typeof ee.status=="string"?ee.then(B,B):(ee.status="pending",ee.then(function(M){ee.status==="pending"&&(ee.status="fulfilled",ee.value=M)},function(M){ee.status==="pending"&&(ee.status="rejected",ee.reason=M)})),ee.status){case"fulfilled":return ee.value;case"rejected":throw ee.reason}}throw ee}function F(ee,M,Y,Z,J){var he=typeof ee;(he==="undefined"||he==="boolean")&&(ee=null);var ge=!1;if(ee===null)ge=!0;else switch(he){case"bigint":case"string":case"number":ge=!0;break;case"object":switch(ee.$$typeof){case e:case t:ge=!0;break;case p:return ge=ee._init,F(ge(ee._payload),M,Y,Z,J)}}if(ge)return J=J(ee),ge=Z===""?"."+ue(ee,0):Z,N(J)?(Y="",ge!=null&&(Y=ge.replace(le,"$&/")+"/"),F(J,M,Y,"",function(ye){return ye})):J!=null&&(I(J)&&(J=K(J,Y+(J.key==null||ee&&ee.key===J.key?"":(""+J.key).replace(le,"$&/")+"/")+ge)),M.push(J)),1;ge=0;var de=Z===""?".":Z+":";if(N(ee))for(var fe=0;fe>>1,Ce=F[te];if(0>>1;tei(Y,me))Zi(J,Y)?(F[te]=J,F[Z]=me,te=Z):(F[te]=Y,F[M]=me,te=M);else if(Zi(J,me))F[te]=J,F[Z]=me,te=Z;else break e}}return re}function i(F,re){var me=F.sortIndex-re.sortIndex;return me!==0?me:F.id-re.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var r=performance;e.unstable_now=function(){return r.now()}}else{var c=Date,l=c.now();e.unstable_now=function(){return c.now()-l}}var f=[],T=[],p=1,m=null,g=3,S=!1,x=!1,y=!1,w=!1,C=typeof setTimeout=="function"?setTimeout:null,k=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;function O(F){for(var re=n(T);re!==null;){if(re.callback===null)a(T);else if(re.startTime<=F)a(T),re.sortIndex=re.expirationTime,t(f,re);else break;re=n(T)}}function N(F){if(y=!1,O(F),!x)if(n(f)!==null)x=!0,B||(B=!0,L());else{var re=n(T);re!==null&&X(N,re.startTime-F)}}var B=!1,A=-1,z=5,P=-1;function K(){return w?!0:!(e.unstable_now()-PF&&K());){var te=m.callback;if(typeof te=="function"){m.callback=null,g=m.priorityLevel;var Ce=te(m.expirationTime<=F);if(F=e.unstable_now(),typeof Ce=="function"){m.callback=Ce,O(F),re=!0;break t}m===n(f)&&a(f),O(F)}else a(f);m=n(f)}if(m!==null)re=!0;else{var ee=n(T);ee!==null&&X(N,ee.startTime-F),re=!1}}break e}finally{m=null,g=me,S=!1}re=void 0}}finally{re?L():B=!1}}}var L;if(typeof E=="function")L=function(){E(I)};else if(typeof MessageChannel<"u"){var le=new MessageChannel,ue=le.port2;le.port1.onmessage=I,L=function(){ue.postMessage(null)}}else L=function(){C(I,0)};function X(F,re){A=C(function(){F(e.unstable_now())},re)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(F){F.callback=null},e.unstable_forceFrameRate=function(F){0>F||125te?(F.sortIndex=me,t(T,F),n(f)===null&&F===n(T)&&(y?(k(A),A=-1):y=!0,X(N,me-te))):(F.sortIndex=Ce,t(f,F),x||S||(x=!0,B||(B=!0,L()))),F},e.unstable_shouldYield=K,e.unstable_wrapCallback=function(F){var re=g;return function(){var me=g;g=re;try{return F.apply(this,arguments)}finally{g=me}}}})(Rf)),Rf}var uv;function m8(){return uv||(uv=1,Af.exports=p8()),Af.exports}var Df={exports:{}},Ta={};var dv;function g8(){if(dv)return Ta;dv=1;var e=wp();function t(f){var T="https://react.dev/errors/"+f;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Df.exports=g8(),Df.exports}var fv;function v8(){if(fv)return yc;fv=1;var e=m8(),t=wp(),n=Xy();function a(s){var o="https://react.dev/errors/"+s;if(1Ce||(s.current=te[Ce],te[Ce]=null,Ce--)}function Y(s,o){Ce++,te[Ce]=s.current,s.current=o}var Z=ee(null),J=ee(null),he=ee(null),ge=ee(null);function de(s,o){switch(Y(he,o),Y(J,s),Y(Z,null),o.nodeType){case 9:case 11:s=(s=o.documentElement)&&(s=s.namespaceURI)?R2(s):0;break;default:if(s=o.tagName,o=o.namespaceURI)o=R2(o),s=D2(o,s);else switch(s){case"svg":s=1;break;case"math":s=2;break;default:s=0}}M(Z),Y(Z,s)}function fe(){M(Z),M(J),M(he)}function ye(s){s.memoizedState!==null&&Y(ge,s);var o=Z.current,u=D2(o,s.type);o!==u&&(Y(J,s),Y(Z,u))}function qe(s){J.current===s&&(M(Z),M(J)),ge.current===s&&(M(ge),pc._currentValue=me)}var ae,Ne;function Ve(s){if(ae===void 0)try{throw Error()}catch(u){var o=u.stack.trim().match(/\n( *(at )?)/);ae=o&&o[1]||"",Ne=-1)":-1v||ce[h]!==be[v]){var Re=` +`+ce[h].replace(" at new "," at ");return s.displayName&&Re.includes("")&&(Re=Re.replace("",s.displayName)),Re}while(1<=h&&0<=v);break}}}finally{tt=!1,Error.prepareStackTrace=u}return(u=s?s.displayName||s.name:"")?Ve(u):""}function Le(s,o){switch(s.tag){case 26:case 27:case 5:return Ve(s.type);case 16:return Ve("Lazy");case 13:return s.child!==o&&o!==null?Ve("Suspense Fallback"):Ve("Suspense");case 19:return Ve("SuspenseList");case 0:case 15:return We(s.type,!1);case 11:return We(s.type.render,!1);case 1:return We(s.type,!0);case 31:return Ve("Activity");default:return""}}function _e(s){try{var o="",u=null;do o+=Le(s,u),u=s,s=s.return;while(s);return o}catch(h){return` +Error generating stack: `+h.message+` +`+h.stack}}var Xe=Object.prototype.hasOwnProperty,pt=e.unstable_scheduleCallback,Pt=e.unstable_cancelCallback,Kt=e.unstable_shouldYield,Dt=e.unstable_requestPaint,dt=e.unstable_now,jt=e.unstable_getCurrentPriorityLevel,Gt=e.unstable_ImmediatePriority,ln=e.unstable_UserBlockingPriority,Et=e.unstable_NormalPriority,_t=e.unstable_LowPriority,pe=e.unstable_IdlePriority,He=e.log,Je=e.unstable_setDisableYieldValue,rt=null,Ye=null;function mt(s){if(typeof He=="function"&&Je(s),Ye&&typeof Ye.setStrictMode=="function")try{Ye.setStrictMode(rt,s)}catch{}}var Qe=Math.clz32?Math.clz32:Pe,qt=Math.log,ot=Math.LN2;function Pe(s){return s>>>=0,s===0?32:31-(qt(s)/ot|0)|0}var Me=256,Ke=262144,st=4194304;function Vt(s){var o=s&42;if(o!==0)return o;switch(s&-s){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return s&261888;case 262144:case 524288:case 1048576:case 2097152:return s&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return s&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return s}}function Xt(s,o,u){var h=s.pendingLanes;if(h===0)return 0;var v=0,b=s.suspendedLanes,R=s.pingedLanes;s=s.warmLanes;var U=h&134217727;return U!==0?(h=U&~b,h!==0?v=Vt(h):(R&=U,R!==0?v=Vt(R):u||(u=U&~s,u!==0&&(v=Vt(u))))):(U=h&~b,U!==0?v=Vt(U):R!==0?v=Vt(R):u||(u=h&~s,u!==0&&(v=Vt(u)))),v===0?0:o!==0&&o!==v&&(o&b)===0&&(b=v&-v,u=o&-o,b>=u||b===32&&(u&4194048)!==0)?o:v}function Fn(s,o){return(s.pendingLanes&~(s.suspendedLanes&~s.pingedLanes)&o)===0}function Sa(s,o){switch(s){case 1:case 2:case 4:case 8:case 64:return o+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return o+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Zn(){var s=st;return st<<=1,(st&62914560)===0&&(st=4194304),s}function ba(s){for(var o=[],u=0;31>u;u++)o.push(s);return o}function Wn(s,o){s.pendingLanes|=o,o!==268435456&&(s.suspendedLanes=0,s.pingedLanes=0,s.warmLanes=0)}function Ln(s,o,u,h,v,b){var R=s.pendingLanes;s.pendingLanes=u,s.suspendedLanes=0,s.pingedLanes=0,s.warmLanes=0,s.expiredLanes&=u,s.entangledLanes&=u,s.errorRecoveryDisabledLanes&=u,s.shellSuspendCounter=0;var U=s.entanglements,ce=s.expirationTimes,be=s.hiddenUpdates;for(u=R&~u;0"u")return null;try{return s.activeElement||s.body}catch{return s.body}}var Tt=/[\n"\\]/g;function bt(s){return s.replace(Tt,function(o){return"\\"+o.charCodeAt(0).toString(16)+" "})}function Ea(s,o,u,h,v,b,R,U){s.name="",R!=null&&typeof R!="function"&&typeof R!="symbol"&&typeof R!="boolean"?s.type=R:s.removeAttribute("type"),o!=null?R==="number"?(o===0&&s.value===""||s.value!=o)&&(s.value=""+oe(o)):s.value!==""+oe(o)&&(s.value=""+oe(o)):R!=="submit"&&R!=="reset"||s.removeAttribute("value"),o!=null?ua(s,R,oe(o)):u!=null?ua(s,R,oe(u)):h!=null&&s.removeAttribute("value"),v==null&&b!=null&&(s.defaultChecked=!!b),v!=null&&(s.checked=v&&typeof v!="function"&&typeof v!="symbol"),U!=null&&typeof U!="function"&&typeof U!="symbol"&&typeof U!="boolean"?s.name=""+oe(U):s.removeAttribute("name")}function za(s,o,u,h,v,b,R,U){if(b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"&&(s.type=b),o!=null||u!=null){if(!(b!=="submit"&&b!=="reset"||o!=null)){lt(s);return}u=u!=null?""+oe(u):"",o=o!=null?""+oe(o):u,U||o===s.value||(s.value=o),s.defaultValue=o}h=h??v,h=typeof h!="function"&&typeof h!="symbol"&&!!h,s.checked=U?s.checked:!!h,s.defaultChecked=!!h,R!=null&&typeof R!="function"&&typeof R!="symbol"&&typeof R!="boolean"&&(s.name=R),lt(s)}function ua(s,o,u){o==="number"&&ut(s.ownerDocument)===s||s.defaultValue===""+u||(s.defaultValue=""+u)}function It(s,o,u,h){if(s=s.options,o){o={};for(var v=0;v"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Oo=!1;if(Ci)try{var Sr={};Object.defineProperty(Sr,"passive",{get:function(){Oo=!0}}),window.addEventListener("test",Sr,Sr),window.removeEventListener("test",Sr,Sr)}catch{Oo=!1}var Ei=null,v0=null,x0=null;function Mo(){if(x0)return x0;var s,o=v0,u=o.length,h,v="value"in Ei?Ei.value:Ei.textContent,b=v.length;for(s=0;s=Lo),Fm=" ",Lm=!1;function Pm(s,o){switch(s){case"keyup":return j7.indexOf(o.keyCode)!==-1;case"keydown":return o.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function _m(s){return s=s.detail,typeof s=="object"&&"data"in s?s.data:null}var y0=!1;function L7(s,o){switch(s){case"compositionend":return _m(o);case"keypress":return o.which!==32?null:(Lm=!0,Fm);case"textInput":return s=o.data,s===Fm&&Lm?null:s;default:return null}}function P7(s,o){if(y0)return s==="compositionend"||!Dd&&Pm(s,o)?(s=Mo(),x0=v0=Ei=null,y0=!1,s):null;switch(s){case"paste":return null;case"keypress":if(!(o.ctrlKey||o.altKey||o.metaKey)||o.ctrlKey&&o.altKey){if(o.char&&1=o)return{node:u,offset:o-s};s=h}e:{for(;u;){if(u.nextSibling){u=u.nextSibling;break e}u=u.parentNode}u=void 0}u=Gm(u)}}function Km(s,o){return s&&o?s===o?!0:s&&s.nodeType===3?!1:o&&o.nodeType===3?Km(s,o.parentNode):"contains"in s?s.contains(o):s.compareDocumentPosition?!!(s.compareDocumentPosition(o)&16):!1:!1}function $m(s){s=s!=null&&s.ownerDocument!=null&&s.ownerDocument.defaultView!=null?s.ownerDocument.defaultView:window;for(var o=ut(s.document);o instanceof s.HTMLIFrameElement;){try{var u=typeof o.contentWindow.location.href=="string"}catch{u=!1}if(u)s=o.contentWindow;else break;o=ut(s.document)}return o}function Od(s){var o=s&&s.nodeName&&s.nodeName.toLowerCase();return o&&(o==="input"&&(s.type==="text"||s.type==="search"||s.type==="tel"||s.type==="url"||s.type==="password")||o==="textarea"||s.contentEditable==="true")}var H7=Ci&&"documentMode"in document&&11>=document.documentMode,S0=null,Md=null,Bo=null,jd=!1;function Ym(s,o,u){var h=u.window===u?u.document:u.nodeType===9?u:u.ownerDocument;jd||S0==null||S0!==ut(h)||(h=S0,"selectionStart"in h&&Od(h)?h={start:h.selectionStart,end:h.selectionEnd}:(h=(h.ownerDocument&&h.ownerDocument.defaultView||window).getSelection(),h={anchorNode:h.anchorNode,anchorOffset:h.anchorOffset,focusNode:h.focusNode,focusOffset:h.focusOffset}),Bo&&qo(Bo,h)||(Bo=h,h=kl(Md,"onSelect"),0>=R,v-=R,Bi=1<<32-Qe(o)+v|u<xt?(Rt=Ze,Ze=null):Rt=Ze.sibling;var Wt=we(ve,Ze,Se[xt],De);if(Wt===null){Ze===null&&(Ze=Rt);break}s&&Ze&&Wt.alternate===null&&o(ve,Ze),Te=b(Wt,Te,xt),zt===null?et=Wt:zt.sibling=Wt,zt=Wt,Ze=Rt}if(xt===Se.length)return u(ve,Ze),Nt&&Ts(ve,xt),et;if(Ze===null){for(;xtxt?(Rt=Ze,Ze=null):Rt=Ze.sibling;var ir=we(ve,Ze,Wt.value,De);if(ir===null){Ze===null&&(Ze=Rt);break}s&&Ze&&ir.alternate===null&&o(ve,Ze),Te=b(ir,Te,xt),zt===null?et=ir:zt.sibling=ir,zt=ir,Ze=Rt}if(Wt.done)return u(ve,Ze),Nt&&Ts(ve,xt),et;if(Ze===null){for(;!Wt.done;xt++,Wt=Se.next())Wt=Ie(ve,Wt.value,De),Wt!==null&&(Te=b(Wt,Te,xt),zt===null?et=Wt:zt.sibling=Wt,zt=Wt);return Nt&&Ts(ve,xt),et}for(Ze=h(Ze);!Wt.done;xt++,Wt=Se.next())Wt=ke(Ze,ve,xt,Wt.value,De),Wt!==null&&(s&&Wt.alternate!==null&&Ze.delete(Wt.key===null?xt:Wt.key),Te=b(Wt,Te,xt),zt===null?et=Wt:zt.sibling=Wt,zt=Wt);return s&&Ze.forEach(function(d8){return o(ve,d8)}),Nt&&Ts(ve,xt),et}function tn(ve,Te,Se,De){if(typeof Se=="object"&&Se!==null&&Se.type===y&&Se.key===null&&(Se=Se.props.children),typeof Se=="object"&&Se!==null){switch(Se.$$typeof){case S:e:{for(var et=Se.key;Te!==null;){if(Te.key===et){if(et=Se.type,et===y){if(Te.tag===7){u(ve,Te.sibling),De=v(Te,Se.props.children),De.return=ve,ve=De;break e}}else if(Te.elementType===et||typeof et=="object"&&et!==null&&et.$$typeof===z&&Or(et)===Te.type){u(ve,Te.sibling),De=v(Te,Se.props),Go(De,Se),De.return=ve,ve=De;break e}u(ve,Te);break}else o(ve,Te);Te=Te.sibling}Se.type===y?(De=Ar(Se.props.children,ve.mode,De,Se.key),De.return=ve,ve=De):(De=W1(Se.type,Se.key,Se.props,null,ve.mode,De),Go(De,Se),De.return=ve,ve=De)}return R(ve);case x:e:{for(et=Se.key;Te!==null;){if(Te.key===et)if(Te.tag===4&&Te.stateNode.containerInfo===Se.containerInfo&&Te.stateNode.implementation===Se.implementation){u(ve,Te.sibling),De=v(Te,Se.children||[]),De.return=ve,ve=De;break e}else{u(ve,Te);break}else o(ve,Te);Te=Te.sibling}De=Ud(Se,ve.mode,De),De.return=ve,ve=De}return R(ve);case z:return Se=Or(Se),tn(ve,Te,Se,De)}if(X(Se))return $e(ve,Te,Se,De);if(L(Se)){if(et=L(Se),typeof et!="function")throw Error(a(150));return Se=et.call(Se),at(ve,Te,Se,De)}if(typeof Se.then=="function")return tn(ve,Te,Y1(Se),De);if(Se.$$typeof===E)return tn(ve,Te,G1(ve,Se),De);Z1(ve,Se)}return typeof Se=="string"&&Se!==""||typeof Se=="number"||typeof Se=="bigint"?(Se=""+Se,Te!==null&&Te.tag===6?(u(ve,Te.sibling),De=v(Te,Se),De.return=ve,ve=De):(u(ve,Te),De=Bd(Se,ve.mode,De),De.return=ve,ve=De),R(ve)):u(ve,Te)}return function(ve,Te,Se,De){try{Ho=0;var et=tn(ve,Te,Se,De);return O0=null,et}catch(Ze){if(Ze===N0||Ze===K1)throw Ze;var zt=Va(29,Ze,null,ve.mode);return zt.lanes=De,zt.return=ve,zt}}}var jr=x5(!0),y5=x5(!1),Us=!1;function Qd(s){s.updateQueue={baseState:s.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function eT(s,o){s=s.updateQueue,o.updateQueue===s&&(o.updateQueue={baseState:s.baseState,firstBaseUpdate:s.firstBaseUpdate,lastBaseUpdate:s.lastBaseUpdate,shared:s.shared,callbacks:null})}function zs(s){return{lane:s,tag:0,payload:null,callback:null,next:null}}function Ws(s,o,u){var h=s.updateQueue;if(h===null)return null;if(h=h.shared,(Ht&2)!==0){var v=h.pending;return v===null?o.next=o:(o.next=v.next,v.next=o),h.pending=o,o=z1(s),a5(s,null,u),o}return U1(s,h,o,u),z1(s)}function Xo(s,o,u){if(o=o.updateQueue,o!==null&&(o=o.shared,(u&4194048)!==0)){var h=o.lanes;h&=s.pendingLanes,u|=h,o.lanes=u,wa(s,u)}}function tT(s,o){var u=s.updateQueue,h=s.alternate;if(h!==null&&(h=h.updateQueue,u===h)){var v=null,b=null;if(u=u.firstBaseUpdate,u!==null){do{var R={lane:u.lane,tag:u.tag,payload:u.payload,callback:null,next:null};b===null?v=b=R:b=b.next=R,u=u.next}while(u!==null);b===null?v=b=o:b=b.next=o}else v=b=o;u={baseState:h.baseState,firstBaseUpdate:v,lastBaseUpdate:b,shared:h.shared,callbacks:h.callbacks},s.updateQueue=u;return}s=u.lastBaseUpdate,s===null?u.firstBaseUpdate=o:s.next=o,u.lastBaseUpdate=o}var nT=!1;function Ko(){if(nT){var s=I0;if(s!==null)throw s}}function $o(s,o,u,h){nT=!1;var v=s.updateQueue;Us=!1;var b=v.firstBaseUpdate,R=v.lastBaseUpdate,U=v.shared.pending;if(U!==null){v.shared.pending=null;var ce=U,be=ce.next;ce.next=null,R===null?b=be:R.next=be,R=ce;var Re=s.alternate;Re!==null&&(Re=Re.updateQueue,U=Re.lastBaseUpdate,U!==R&&(U===null?Re.firstBaseUpdate=be:U.next=be,Re.lastBaseUpdate=ce))}if(b!==null){var Ie=v.baseState;R=0,Re=be=ce=null,U=b;do{var we=U.lane&-536870913,ke=we!==U.lane;if(ke?(At&we)===we:(h&we)===we){we!==0&&we===D0&&(nT=!0),Re!==null&&(Re=Re.next={lane:0,tag:U.tag,payload:U.payload,callback:null,next:null});e:{var $e=s,at=U;we=o;var tn=u;switch(at.tag){case 1:if($e=at.payload,typeof $e=="function"){Ie=$e.call(tn,Ie,we);break e}Ie=$e;break e;case 3:$e.flags=$e.flags&-65537|128;case 0:if($e=at.payload,we=typeof $e=="function"?$e.call(tn,Ie,we):$e,we==null)break e;Ie=m({},Ie,we);break e;case 2:Us=!0}}we=U.callback,we!==null&&(s.flags|=64,ke&&(s.flags|=8192),ke=v.callbacks,ke===null?v.callbacks=[we]:ke.push(we))}else ke={lane:we,tag:U.tag,payload:U.payload,callback:U.callback,next:null},Re===null?(be=Re=ke,ce=Ie):Re=Re.next=ke,R|=we;if(U=U.next,U===null){if(U=v.shared.pending,U===null)break;ke=U,U=ke.next,ke.next=null,v.lastBaseUpdate=ke,v.shared.pending=null}}while(!0);Re===null&&(ce=Ie),v.baseState=ce,v.firstBaseUpdate=be,v.lastBaseUpdate=Re,b===null&&(v.shared.lanes=0),Ks|=R,s.lanes=R,s.memoizedState=Ie}}function S5(s,o){if(typeof s!="function")throw Error(a(191,s));s.call(o)}function b5(s,o){var u=s.callbacks;if(u!==null)for(s.callbacks=null,s=0;sb?b:8;var R=F.T,U={};F.T=U,ST(s,!1,o,u);try{var ce=v(),be=F.S;if(be!==null&&be(U,ce),ce!==null&&typeof ce=="object"&&typeof ce.then=="function"){var Re=ew(ce,h);Jo(s,o,Re,$a(s))}else Jo(s,o,h,$a(s))}catch(Ie){Jo(s,o,{then:function(){},status:"rejected",reason:Ie},$a())}finally{re.p=b,R!==null&&U.types!==null&&(R.types=U.types),F.T=R}}function rw(){}function xT(s,o,u,h){if(s.tag!==5)throw Error(a(476));var v=eg(s).queue;Q5(s,v,o,me,u===null?rw:function(){return tg(s),u(h)})}function eg(s){var o=s.memoizedState;if(o!==null)return o;o={memoizedState:me,baseState:me,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ms,lastRenderedState:me},next:null};var u={};return o.next={memoizedState:u,baseState:u,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ms,lastRenderedState:u},next:null},s.memoizedState=o,s=s.alternate,s!==null&&(s.memoizedState=o),o}function tg(s){var o=eg(s);o.next===null&&(o=s.alternate.memoizedState),Jo(s,o.next.queue,{},$a())}function yT(){return ea(pc)}function ng(){return bn().memoizedState}function ag(){return bn().memoizedState}function ow(s){for(var o=s.return;o!==null;){switch(o.tag){case 24:case 3:var u=$a();s=zs(u);var h=Ws(o,s,u);h!==null&&(_a(h,o,u),Xo(h,o,u)),o={cache:$d()},s.payload=o;return}o=o.return}}function cw(s,o,u){var h=$a();u={lane:h,revertLane:0,gesture:null,action:u,hasEagerState:!1,eagerState:null,next:null},ol(s)?sg(o,u):(u=_d(s,o,u,h),u!==null&&(_a(u,s,h),rg(u,o,h)))}function ig(s,o,u){var h=$a();Jo(s,o,u,h)}function Jo(s,o,u,h){var v={lane:h,revertLane:0,gesture:null,action:u,hasEagerState:!1,eagerState:null,next:null};if(ol(s))sg(o,v);else{var b=s.alternate;if(s.lanes===0&&(b===null||b.lanes===0)&&(b=o.lastRenderedReducer,b!==null))try{var R=o.lastRenderedState,U=b(R,u);if(v.hasEagerState=!0,v.eagerState=U,Wa(U,R))return U1(s,o,v,0),nn===null&&B1(),!1}catch{}if(u=_d(s,o,v,h),u!==null)return _a(u,s,h),rg(u,o,h),!0}return!1}function ST(s,o,u,h){if(h={lane:2,revertLane:QT(),gesture:null,action:h,hasEagerState:!1,eagerState:null,next:null},ol(s)){if(o)throw Error(a(479))}else o=_d(s,u,h,2),o!==null&&_a(o,s,2)}function ol(s){var o=s.alternate;return s===gt||o!==null&&o===gt}function sg(s,o){j0=el=!0;var u=s.pending;u===null?o.next=o:(o.next=u.next,u.next=o),s.pending=o}function rg(s,o,u){if((u&4194048)!==0){var h=o.lanes;h&=s.pendingLanes,u|=h,o.lanes=u,wa(s,u)}}var Qo={readContext:ea,use:al,useCallback:pn,useContext:pn,useEffect:pn,useImperativeHandle:pn,useLayoutEffect:pn,useInsertionEffect:pn,useMemo:pn,useReducer:pn,useRef:pn,useState:pn,useDebugValue:pn,useDeferredValue:pn,useTransition:pn,useSyncExternalStore:pn,useId:pn,useHostTransitionStatus:pn,useFormState:pn,useActionState:pn,useOptimistic:pn,useMemoCache:pn,useCacheRefresh:pn};Qo.useEffectEvent=pn;var og={readContext:ea,use:al,useCallback:function(s,o){return ka().memoizedState=[s,o===void 0?null:o],s},useContext:ea,useEffect:V5,useImperativeHandle:function(s,o,u){u=u!=null?u.concat([s]):null,sl(4194308,4,K5.bind(null,o,s),u)},useLayoutEffect:function(s,o){return sl(4194308,4,s,o)},useInsertionEffect:function(s,o){sl(4,2,s,o)},useMemo:function(s,o){var u=ka();o=o===void 0?null:o;var h=s();if(Fr){mt(!0);try{s()}finally{mt(!1)}}return u.memoizedState=[h,o],h},useReducer:function(s,o,u){var h=ka();if(u!==void 0){var v=u(o);if(Fr){mt(!0);try{u(o)}finally{mt(!1)}}}else v=o;return h.memoizedState=h.baseState=v,s={pending:null,lanes:0,dispatch:null,lastRenderedReducer:s,lastRenderedState:v},h.queue=s,s=s.dispatch=cw.bind(null,gt,s),[h.memoizedState,s]},useRef:function(s){var o=ka();return s={current:s},o.memoizedState=s},useState:function(s){s=hT(s);var o=s.queue,u=ig.bind(null,gt,o);return o.dispatch=u,[s.memoizedState,u]},useDebugValue:gT,useDeferredValue:function(s,o){var u=ka();return vT(u,s,o)},useTransition:function(){var s=hT(!1);return s=Q5.bind(null,gt,s.queue,!0,!1),ka().memoizedState=s,[!1,s]},useSyncExternalStore:function(s,o,u){var h=gt,v=ka();if(Nt){if(u===void 0)throw Error(a(407));u=u()}else{if(u=o(),nn===null)throw Error(a(349));(At&127)!==0||R5(h,o,u)}v.memoizedState=u;var b={value:u,getSnapshot:o};return v.queue=b,V5(I5.bind(null,h,b,s),[s]),h.flags|=2048,L0(9,{destroy:void 0},D5.bind(null,h,b,u,o),null),u},useId:function(){var s=ka(),o=nn.identifierPrefix;if(Nt){var u=Ui,h=Bi;u=(h&~(1<<32-Qe(h)-1)).toString(32)+u,o="_"+o+"R_"+u,u=tl++,0<\/script>",b=b.removeChild(b.firstChild);break;case"select":b=typeof h.is=="string"?R.createElement("select",{is:h.is}):R.createElement("select"),h.multiple?b.multiple=!0:h.size&&(b.size=h.size);break;default:b=typeof h.is=="string"?R.createElement(v,{is:h.is}):R.createElement(v)}}b[G]=o,b[Q]=h;e:for(R=o.child;R!==null;){if(R.tag===5||R.tag===6)b.appendChild(R.stateNode);else if(R.tag!==4&&R.tag!==27&&R.child!==null){R.child.return=R,R=R.child;continue}if(R===o)break e;for(;R.sibling===null;){if(R.return===null||R.return===o)break e;R=R.return}R.sibling.return=R.return,R=R.sibling}o.stateNode=b;e:switch(na(b,v,h),v){case"button":case"input":case"select":case"textarea":h=!!h.autoFocus;break e;case"img":h=!0;break e;default:h=!1}h&&vs(o)}}return cn(o),FT(o,o.type,s===null?null:s.memoizedProps,o.pendingProps,u),null;case 6:if(s&&o.stateNode!=null)s.memoizedProps!==h&&vs(o);else{if(typeof h!="string"&&o.stateNode===null)throw Error(a(166));if(s=he.current,A0(o)){if(s=o.stateNode,u=o.memoizedProps,h=null,v=Qn,v!==null)switch(v.tag){case 27:case 5:h=v.memoizedProps}s[G]=o,s=!!(s.nodeValue===u||h!==null&&h.suppressHydrationWarning===!0||k2(s.nodeValue,u)),s||qs(o,!0)}else s=Al(s).createTextNode(h),s[G]=o,o.stateNode=s}return cn(o),null;case 31:if(u=o.memoizedState,s===null||s.memoizedState!==null){if(h=A0(o),u!==null){if(s===null){if(!h)throw Error(a(318));if(s=o.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(a(557));s[G]=o}else Rr(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;cn(o),s=!1}else u=Hd(),s!==null&&s.memoizedState!==null&&(s.memoizedState.hydrationErrors=u),s=!0;if(!s)return o.flags&256?(Ga(o),o):(Ga(o),null);if((o.flags&128)!==0)throw Error(a(558))}return cn(o),null;case 13:if(h=o.memoizedState,s===null||s.memoizedState!==null&&s.memoizedState.dehydrated!==null){if(v=A0(o),h!==null&&h.dehydrated!==null){if(s===null){if(!v)throw Error(a(318));if(v=o.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(a(317));v[G]=o}else Rr(),(o.flags&128)===0&&(o.memoizedState=null),o.flags|=4;cn(o),v=!1}else v=Hd(),s!==null&&s.memoizedState!==null&&(s.memoizedState.hydrationErrors=v),v=!0;if(!v)return o.flags&256?(Ga(o),o):(Ga(o),null)}return Ga(o),(o.flags&128)!==0?(o.lanes=u,o):(u=h!==null,s=s!==null&&s.memoizedState!==null,u&&(h=o.child,v=null,h.alternate!==null&&h.alternate.memoizedState!==null&&h.alternate.memoizedState.cachePool!==null&&(v=h.alternate.memoizedState.cachePool.pool),b=null,h.memoizedState!==null&&h.memoizedState.cachePool!==null&&(b=h.memoizedState.cachePool.pool),b!==v&&(h.flags|=2048)),u!==s&&u&&(o.child.flags|=8192),Tl(o,o.updateQueue),cn(o),null);case 4:return fe(),s===null&&af(o.stateNode.containerInfo),cn(o),null;case 10:return hs(o.type),cn(o),null;case 19:if(M(Sn),h=o.memoizedState,h===null)return cn(o),null;if(v=(o.flags&128)!==0,b=h.rendering,b===null)if(v)tc(h,!1);else{if(mn!==0||s!==null&&(s.flags&128)!==0)for(s=o.child;s!==null;){if(b=Q1(s),b!==null){for(o.flags|=128,tc(h,!1),s=b.updateQueue,o.updateQueue=s,Tl(o,s),o.subtreeFlags=0,s=u,u=o.child;u!==null;)i5(u,s),u=u.sibling;return Y(Sn,Sn.current&1|2),Nt&&Ts(o,h.treeForkCount),o.child}s=s.sibling}h.tail!==null&&dt()>gl&&(o.flags|=128,v=!0,tc(h,!1),o.lanes=4194304)}else{if(!v)if(s=Q1(b),s!==null){if(o.flags|=128,v=!0,s=s.updateQueue,o.updateQueue=s,Tl(o,s),tc(h,!0),h.tail===null&&h.tailMode==="hidden"&&!b.alternate&&!Nt)return cn(o),null}else 2*dt()-h.renderingStartTime>gl&&u!==536870912&&(o.flags|=128,v=!0,tc(h,!1),o.lanes=4194304);h.isBackwards?(b.sibling=o.child,o.child=b):(s=h.last,s!==null?s.sibling=b:o.child=b,h.last=b)}return h.tail!==null?(s=h.tail,h.rendering=s,h.tail=s.sibling,h.renderingStartTime=dt(),s.sibling=null,u=Sn.current,Y(Sn,v?u&1|2:u&1),Nt&&Ts(o,h.treeForkCount),s):(cn(o),null);case 22:case 23:return Ga(o),iT(),h=o.memoizedState!==null,s!==null?s.memoizedState!==null!==h&&(o.flags|=8192):h&&(o.flags|=8192),h?(u&536870912)!==0&&(o.flags&128)===0&&(cn(o),o.subtreeFlags&6&&(o.flags|=8192)):cn(o),u=o.updateQueue,u!==null&&Tl(o,u.retryQueue),u=null,s!==null&&s.memoizedState!==null&&s.memoizedState.cachePool!==null&&(u=s.memoizedState.cachePool.pool),h=null,o.memoizedState!==null&&o.memoizedState.cachePool!==null&&(h=o.memoizedState.cachePool.pool),h!==u&&(o.flags|=2048),s!==null&&M(Nr),null;case 24:return u=null,s!==null&&(u=s.memoizedState.cache),o.memoizedState.cache!==u&&(o.flags|=2048),hs(An),cn(o),null;case 25:return null;case 30:return null}throw Error(a(156,o.tag))}function fw(s,o){switch(Wd(o),o.tag){case 1:return s=o.flags,s&65536?(o.flags=s&-65537|128,o):null;case 3:return hs(An),fe(),s=o.flags,(s&65536)!==0&&(s&128)===0?(o.flags=s&-65537|128,o):null;case 26:case 27:case 5:return qe(o),null;case 31:if(o.memoizedState!==null){if(Ga(o),o.alternate===null)throw Error(a(340));Rr()}return s=o.flags,s&65536?(o.flags=s&-65537|128,o):null;case 13:if(Ga(o),s=o.memoizedState,s!==null&&s.dehydrated!==null){if(o.alternate===null)throw Error(a(340));Rr()}return s=o.flags,s&65536?(o.flags=s&-65537|128,o):null;case 19:return M(Sn),null;case 4:return fe(),null;case 10:return hs(o.type),null;case 22:case 23:return Ga(o),iT(),s!==null&&M(Nr),s=o.flags,s&65536?(o.flags=s&-65537|128,o):null;case 24:return hs(An),null;case 25:return null;default:return null}}function Ng(s,o){switch(Wd(o),o.tag){case 3:hs(An),fe();break;case 26:case 27:case 5:qe(o);break;case 4:fe();break;case 31:o.memoizedState!==null&&Ga(o);break;case 13:Ga(o);break;case 19:M(Sn);break;case 10:hs(o.type);break;case 22:case 23:Ga(o),iT(),s!==null&&M(Nr);break;case 24:hs(An)}}function nc(s,o){try{var u=o.updateQueue,h=u!==null?u.lastEffect:null;if(h!==null){var v=h.next;u=v;do{if((u.tag&s)===s){h=void 0;var b=u.create,R=u.inst;h=b(),R.destroy=h}u=u.next}while(u!==v)}}catch(U){Zt(o,o.return,U)}}function Gs(s,o,u){try{var h=o.updateQueue,v=h!==null?h.lastEffect:null;if(v!==null){var b=v.next;h=b;do{if((h.tag&s)===s){var R=h.inst,U=R.destroy;if(U!==void 0){R.destroy=void 0,v=o;var ce=u,be=U;try{be()}catch(Re){Zt(v,ce,Re)}}}h=h.next}while(h!==b)}}catch(Re){Zt(o,o.return,Re)}}function Og(s){var o=s.updateQueue;if(o!==null){var u=s.stateNode;try{b5(o,u)}catch(h){Zt(s,s.return,h)}}}function Mg(s,o,u){u.props=Lr(s.type,s.memoizedProps),u.state=s.memoizedState;try{u.componentWillUnmount()}catch(h){Zt(s,o,h)}}function ac(s,o){try{var u=s.ref;if(u!==null){switch(s.tag){case 26:case 27:case 5:var h=s.stateNode;break;case 30:h=s.stateNode;break;default:h=s.stateNode}typeof u=="function"?s.refCleanup=u(h):u.current=h}}catch(v){Zt(s,o,v)}}function zi(s,o){var u=s.ref,h=s.refCleanup;if(u!==null)if(typeof h=="function")try{h()}catch(v){Zt(s,o,v)}finally{s.refCleanup=null,s=s.alternate,s!=null&&(s.refCleanup=null)}else if(typeof u=="function")try{u(null)}catch(v){Zt(s,o,v)}else u.current=null}function jg(s){var o=s.type,u=s.memoizedProps,h=s.stateNode;try{e:switch(o){case"button":case"input":case"select":case"textarea":u.autoFocus&&h.focus();break e;case"img":u.src?h.src=u.src:u.srcSet&&(h.srcset=u.srcSet)}}catch(v){Zt(s,s.return,v)}}function LT(s,o,u){try{var h=s.stateNode;Fw(h,s.type,u,o),h[Q]=o}catch(v){Zt(s,s.return,v)}}function Fg(s){return s.tag===5||s.tag===3||s.tag===26||s.tag===27&&Qs(s.type)||s.tag===4}function PT(s){e:for(;;){for(;s.sibling===null;){if(s.return===null||Fg(s.return))return null;s=s.return}for(s.sibling.return=s.return,s=s.sibling;s.tag!==5&&s.tag!==6&&s.tag!==18;){if(s.tag===27&&Qs(s.type)||s.flags&2||s.child===null||s.tag===4)continue e;s.child.return=s,s=s.child}if(!(s.flags&2))return s.stateNode}}function _T(s,o,u){var h=s.tag;if(h===5||h===6)s=s.stateNode,o?(u.nodeType===9?u.body:u.nodeName==="HTML"?u.ownerDocument.body:u).insertBefore(s,o):(o=u.nodeType===9?u.body:u.nodeName==="HTML"?u.ownerDocument.body:u,o.appendChild(s),u=u._reactRootContainer,u!=null||o.onclick!==null||(o.onclick=wi));else if(h!==4&&(h===27&&Qs(s.type)&&(u=s.stateNode,o=null),s=s.child,s!==null))for(_T(s,o,u),s=s.sibling;s!==null;)_T(s,o,u),s=s.sibling}function fl(s,o,u){var h=s.tag;if(h===5||h===6)s=s.stateNode,o?u.insertBefore(s,o):u.appendChild(s);else if(h!==4&&(h===27&&Qs(s.type)&&(u=s.stateNode),s=s.child,s!==null))for(fl(s,o,u),s=s.sibling;s!==null;)fl(s,o,u),s=s.sibling}function Lg(s){var o=s.stateNode,u=s.memoizedProps;try{for(var h=s.type,v=o.attributes;v.length;)o.removeAttributeNode(v[0]);na(o,h,u),o[G]=s,o[Q]=u}catch(b){Zt(s,s.return,b)}}var xs=!1,In=!1,qT=!1,Pg=typeof WeakSet=="function"?WeakSet:Set,Xn=null;function hw(s,o){if(s=s.containerInfo,of=jl,s=$m(s),Od(s)){if("selectionStart"in s)var u={start:s.selectionStart,end:s.selectionEnd};else e:{u=(u=s.ownerDocument)&&u.defaultView||window;var h=u.getSelection&&u.getSelection();if(h&&h.rangeCount!==0){u=h.anchorNode;var v=h.anchorOffset,b=h.focusNode;h=h.focusOffset;try{u.nodeType,b.nodeType}catch{u=null;break e}var R=0,U=-1,ce=-1,be=0,Re=0,Ie=s,we=null;t:for(;;){for(var ke;Ie!==u||v!==0&&Ie.nodeType!==3||(U=R+v),Ie!==b||h!==0&&Ie.nodeType!==3||(ce=R+h),Ie.nodeType===3&&(R+=Ie.nodeValue.length),(ke=Ie.firstChild)!==null;)we=Ie,Ie=ke;for(;;){if(Ie===s)break t;if(we===u&&++be===v&&(U=R),we===b&&++Re===h&&(ce=R),(ke=Ie.nextSibling)!==null)break;Ie=we,we=Ie.parentNode}Ie=ke}u=U===-1||ce===-1?null:{start:U,end:ce}}else u=null}u=u||{start:0,end:0}}else u=null;for(cf={focusedElem:s,selectionRange:u},jl=!1,Xn=o;Xn!==null;)if(o=Xn,s=o.child,(o.subtreeFlags&1028)!==0&&s!==null)s.return=o,Xn=s;else for(;Xn!==null;){switch(o=Xn,b=o.alternate,s=o.flags,o.tag){case 0:if((s&4)!==0&&(s=o.updateQueue,s=s!==null?s.events:null,s!==null))for(u=0;u title"))),na(b,h,u),b[G]=s,Ge(b),h=b;break e;case"link":var R=W2("link","href",v).get(h+(u.href||""));if(R){for(var U=0;Utn&&(R=tn,tn=at,at=R);var ve=Xm(U,at),Te=Xm(U,tn);if(ve&&Te&&(ke.rangeCount!==1||ke.anchorNode!==ve.node||ke.anchorOffset!==ve.offset||ke.focusNode!==Te.node||ke.focusOffset!==Te.offset)){var Se=Ie.createRange();Se.setStart(ve.node,ve.offset),ke.removeAllRanges(),at>tn?(ke.addRange(Se),ke.extend(Te.node,Te.offset)):(Se.setEnd(Te.node,Te.offset),ke.addRange(Se))}}}}for(Ie=[],ke=U;ke=ke.parentNode;)ke.nodeType===1&&Ie.push({element:ke,left:ke.scrollLeft,top:ke.scrollTop});for(typeof U.focus=="function"&&U.focus(),U=0;Uu?32:u,F.T=null,u=GT,GT=null;var b=Ys,R=Cs;if(_n=0,U0=Ys=null,Cs=0,(Ht&6)!==0)throw Error(a(331));var U=Ht;if(Ht|=4,Kg(b.current),Hg(b,b.current,R,u),Ht=U,lc(0,!1),Ye&&typeof Ye.onPostCommitFiberRoot=="function")try{Ye.onPostCommitFiberRoot(rt,b)}catch{}return!0}finally{re.p=v,F.T=h,T2(s,o)}}function h2(s,o,u){o=ii(u,o),o=ET(s.stateNode,o,2),s=Ws(s,o,2),s!==null&&(Wn(s,2),Wi(s))}function Zt(s,o,u){if(s.tag===3)h2(s,s,u);else for(;o!==null;){if(o.tag===3){h2(o,s,u);break}else if(o.tag===1){var h=o.stateNode;if(typeof o.type.getDerivedStateFromError=="function"||typeof h.componentDidCatch=="function"&&($s===null||!$s.has(h))){s=ii(u,s),u=pg(2),h=Ws(o,u,2),h!==null&&(mg(u,h,o,s),Wn(h,2),Wi(h));break}}o=o.return}}function YT(s,o,u){var h=s.pingCache;if(h===null){h=s.pingCache=new gw;var v=new Set;h.set(o,v)}else v=h.get(o),v===void 0&&(v=new Set,h.set(o,v));v.has(u)||(zT=!0,v.add(u),s=bw.bind(null,s,o,u),o.then(s,s))}function bw(s,o,u){var h=s.pingCache;h!==null&&h.delete(o),s.pingedLanes|=s.suspendedLanes&u,s.warmLanes&=~u,nn===s&&(At&u)===u&&(mn===4||mn===3&&(At&62914560)===At&&300>dt()-ml?(Ht&2)===0&&z0(s,0):WT|=u,B0===At&&(B0=0)),Wi(s)}function p2(s,o){o===0&&(o=Zn()),s=kr(s,o),s!==null&&(Wn(s,o),Wi(s))}function ww(s){var o=s.memoizedState,u=0;o!==null&&(u=o.retryLane),p2(s,u)}function Cw(s,o){var u=0;switch(s.tag){case 31:case 13:var h=s.stateNode,v=s.memoizedState;v!==null&&(u=v.retryLane);break;case 19:h=s.stateNode;break;case 22:h=s.stateNode._retryCache;break;default:throw Error(a(314))}h!==null&&h.delete(o),p2(s,u)}function Ew(s,o){return pt(s,o)}var wl=null,V0=null,ZT=!1,Cl=!1,JT=!1,Js=0;function Wi(s){s!==V0&&s.next===null&&(V0===null?wl=V0=s:V0=V0.next=s),Cl=!0,ZT||(ZT=!0,Aw())}function lc(s,o){if(!JT&&Cl){JT=!0;do for(var u=!1,h=wl;h!==null;){if(s!==0){var v=h.pendingLanes;if(v===0)var b=0;else{var R=h.suspendedLanes,U=h.pingedLanes;b=(1<<31-Qe(42|s)+1)-1,b&=v&~(R&~U),b=b&201326741?b&201326741|1:b?b|2:0}b!==0&&(u=!0,x2(h,b))}else b=At,b=Xt(h,h===nn?b:0,h.cancelPendingCommit!==null||h.timeoutHandle!==-1),(b&3)===0||Fn(h,b)||(u=!0,x2(h,b));h=h.next}while(u);JT=!1}}function kw(){m2()}function m2(){Cl=ZT=!1;var s=0;Js!==0&&Pw()&&(s=Js);for(var o=dt(),u=null,h=wl;h!==null;){var v=h.next,b=g2(h,o);b===0?(h.next=null,u===null?wl=v:u.next=v,v===null&&(V0=u)):(u=h,(s!==0||(b&3)!==0)&&(Cl=!0)),h=v}_n!==0&&_n!==5||lc(s),Js!==0&&(Js=0)}function g2(s,o){for(var u=s.suspendedLanes,h=s.pingedLanes,v=s.expirationTimes,b=s.pendingLanes&-62914561;0U)break;var Re=ce.transferSize,Ie=ce.initiatorType;Re&&A2(Ie)&&(ce=ce.responseEnd,R+=Re*(ce"u"?null:document;function q2(s,o,u){var h=H0;if(h&&typeof o=="string"&&o){var v=bt(o);v='link[rel="'+s+'"][href="'+v+'"]',typeof u=="string"&&(v+='[crossorigin="'+u+'"]'),_2.has(v)||(_2.add(v),s={rel:s,crossOrigin:u,href:o},h.querySelector(v)===null&&(o=h.createElement("link"),na(o,"link",s),Ge(o),h.head.appendChild(o)))}}function Gw(s){Es.D(s),q2("dns-prefetch",s,null)}function Xw(s,o){Es.C(s,o),q2("preconnect",s,o)}function Kw(s,o,u){Es.L(s,o,u);var h=H0;if(h&&s&&o){var v='link[rel="preload"][as="'+bt(o)+'"]';o==="image"&&u&&u.imageSrcSet?(v+='[imagesrcset="'+bt(u.imageSrcSet)+'"]',typeof u.imageSizes=="string"&&(v+='[imagesizes="'+bt(u.imageSizes)+'"]')):v+='[href="'+bt(s)+'"]';var b=v;switch(o){case"style":b=G0(s);break;case"script":b=X0(s)}ui.has(b)||(s=m({rel:"preload",href:o==="image"&&u&&u.imageSrcSet?void 0:s,as:o},u),ui.set(b,s),h.querySelector(v)!==null||o==="style"&&h.querySelector(fc(b))||o==="script"&&h.querySelector(hc(b))||(o=h.createElement("link"),na(o,"link",s),Ge(o),h.head.appendChild(o)))}}function $w(s,o){Es.m(s,o);var u=H0;if(u&&s){var h=o&&typeof o.as=="string"?o.as:"script",v='link[rel="modulepreload"][as="'+bt(h)+'"][href="'+bt(s)+'"]',b=v;switch(h){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":b=X0(s)}if(!ui.has(b)&&(s=m({rel:"modulepreload",href:s},o),ui.set(b,s),u.querySelector(v)===null)){switch(h){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(u.querySelector(hc(b)))return}h=u.createElement("link"),na(h,"link",s),Ge(h),u.head.appendChild(h)}}}function Yw(s,o,u){Es.S(s,o,u);var h=H0;if(h&&s){var v=Ue(h).hoistableStyles,b=G0(s);o=o||"default";var R=v.get(b);if(!R){var U={loading:0,preload:null};if(R=h.querySelector(fc(b)))U.loading=5;else{s=m({rel:"stylesheet",href:s,"data-precedence":o},u),(u=ui.get(b))&&pf(s,u);var ce=R=h.createElement("link");Ge(ce),na(ce,"link",s),ce._p=new Promise(function(be,Re){ce.onload=be,ce.onerror=Re}),ce.addEventListener("load",function(){U.loading|=1}),ce.addEventListener("error",function(){U.loading|=2}),U.loading|=4,Dl(R,o,h)}R={type:"stylesheet",instance:R,count:1,state:U},v.set(b,R)}}}function Zw(s,o){Es.X(s,o);var u=H0;if(u&&s){var h=Ue(u).hoistableScripts,v=X0(s),b=h.get(v);b||(b=u.querySelector(hc(v)),b||(s=m({src:s,async:!0},o),(o=ui.get(v))&&mf(s,o),b=u.createElement("script"),Ge(b),na(b,"link",s),u.head.appendChild(b)),b={type:"script",instance:b,count:1,state:null},h.set(v,b))}}function Jw(s,o){Es.M(s,o);var u=H0;if(u&&s){var h=Ue(u).hoistableScripts,v=X0(s),b=h.get(v);b||(b=u.querySelector(hc(v)),b||(s=m({src:s,async:!0,type:"module"},o),(o=ui.get(v))&&mf(s,o),b=u.createElement("script"),Ge(b),na(b,"link",s),u.head.appendChild(b)),b={type:"script",instance:b,count:1,state:null},h.set(v,b))}}function B2(s,o,u,h){var v=(v=he.current)?Rl(v):null;if(!v)throw Error(a(446));switch(s){case"meta":case"title":return null;case"style":return typeof u.precedence=="string"&&typeof u.href=="string"?(o=G0(u.href),u=Ue(v).hoistableStyles,h=u.get(o),h||(h={type:"style",instance:null,count:0,state:null},u.set(o,h)),h):{type:"void",instance:null,count:0,state:null};case"link":if(u.rel==="stylesheet"&&typeof u.href=="string"&&typeof u.precedence=="string"){s=G0(u.href);var b=Ue(v).hoistableStyles,R=b.get(s);if(R||(v=v.ownerDocument||v,R={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},b.set(s,R),(b=v.querySelector(fc(s)))&&!b._p&&(R.instance=b,R.state.loading=5),ui.has(s)||(u={rel:"preload",as:"style",href:u.href,crossOrigin:u.crossOrigin,integrity:u.integrity,media:u.media,hrefLang:u.hrefLang,referrerPolicy:u.referrerPolicy},ui.set(s,u),b||Qw(v,s,u,R.state))),o&&h===null)throw Error(a(528,""));return R}if(o&&h!==null)throw Error(a(529,""));return null;case"script":return o=u.async,u=u.src,typeof u=="string"&&o&&typeof o!="function"&&typeof o!="symbol"?(o=X0(u),u=Ue(v).hoistableScripts,h=u.get(o),h||(h={type:"script",instance:null,count:0,state:null},u.set(o,h)),h):{type:"void",instance:null,count:0,state:null};default:throw Error(a(444,s))}}function G0(s){return'href="'+bt(s)+'"'}function fc(s){return'link[rel="stylesheet"]['+s+"]"}function U2(s){return m({},s,{"data-precedence":s.precedence,precedence:null})}function Qw(s,o,u,h){s.querySelector('link[rel="preload"][as="style"]['+o+"]")?h.loading=1:(o=s.createElement("link"),h.preload=o,o.addEventListener("load",function(){return h.loading|=1}),o.addEventListener("error",function(){return h.loading|=2}),na(o,"link",u),Ge(o),s.head.appendChild(o))}function X0(s){return'[src="'+bt(s)+'"]'}function hc(s){return"script[async]"+s}function z2(s,o,u){if(o.count++,o.instance===null)switch(o.type){case"style":var h=s.querySelector('style[data-href~="'+bt(u.href)+'"]');if(h)return o.instance=h,Ge(h),h;var v=m({},u,{"data-href":u.href,"data-precedence":u.precedence,href:null,precedence:null});return h=(s.ownerDocument||s).createElement("style"),Ge(h),na(h,"style",v),Dl(h,u.precedence,s),o.instance=h;case"stylesheet":v=G0(u.href);var b=s.querySelector(fc(v));if(b)return o.state.loading|=4,o.instance=b,Ge(b),b;h=U2(u),(v=ui.get(v))&&pf(h,v),b=(s.ownerDocument||s).createElement("link"),Ge(b);var R=b;return R._p=new Promise(function(U,ce){R.onload=U,R.onerror=ce}),na(b,"link",h),o.state.loading|=4,Dl(b,u.precedence,s),o.instance=b;case"script":return b=X0(u.src),(v=s.querySelector(hc(b)))?(o.instance=v,Ge(v),v):(h=u,(v=ui.get(b))&&(h=m({},u),mf(h,v)),s=s.ownerDocument||s,v=s.createElement("script"),Ge(v),na(v,"link",h),s.head.appendChild(v),o.instance=v);case"void":return null;default:throw Error(a(443,o.type))}else o.type==="stylesheet"&&(o.state.loading&4)===0&&(h=o.instance,o.state.loading|=4,Dl(h,u.precedence,s));return o.instance}function Dl(s,o,u){for(var h=u.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),v=h.length?h[h.length-1]:null,b=v,R=0;R title"):null)}function e8(s,o,u){if(u===1||o.itemProp!=null)return!1;switch(s){case"meta":case"title":return!0;case"style":if(typeof o.precedence!="string"||typeof o.href!="string"||o.href==="")break;return!0;case"link":if(typeof o.rel!="string"||typeof o.href!="string"||o.href===""||o.onLoad||o.onError)break;return o.rel==="stylesheet"?(s=o.disabled,typeof o.precedence=="string"&&s==null):!0;case"script":if(o.async&&typeof o.async!="function"&&typeof o.async!="symbol"&&!o.onLoad&&!o.onError&&o.src&&typeof o.src=="string")return!0}return!1}function H2(s){return!(s.type==="stylesheet"&&(s.state.loading&3)===0)}function t8(s,o,u,h){if(u.type==="stylesheet"&&(typeof h.media!="string"||matchMedia(h.media).matches!==!1)&&(u.state.loading&4)===0){if(u.instance===null){var v=G0(h.href),b=o.querySelector(fc(v));if(b){o=b._p,o!==null&&typeof o=="object"&&typeof o.then=="function"&&(s.count++,s=Nl.bind(s),o.then(s,s)),u.state.loading|=4,u.instance=b,Ge(b);return}b=o.ownerDocument||o,h=U2(h),(v=ui.get(v))&&pf(h,v),b=b.createElement("link"),Ge(b);var R=b;R._p=new Promise(function(U,ce){R.onload=U,R.onerror=ce}),na(b,"link",h),u.instance=b}s.stylesheets===null&&(s.stylesheets=new Map),s.stylesheets.set(u,o),(o=u.state.preload)&&(u.state.loading&3)===0&&(s.count++,u=Nl.bind(s),o.addEventListener("load",u),o.addEventListener("error",u))}}var gf=0;function n8(s,o){return s.stylesheets&&s.count===0&&Ml(s,s.stylesheets),0gf?50:800)+o);return s.unsuspend=u,function(){s.unsuspend=null,clearTimeout(h),clearTimeout(v)}}:null}function Nl(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Ml(this,this.stylesheets);else if(this.unsuspend){var s=this.unsuspend;this.unsuspend=null,s()}}}var Ol=null;function Ml(s,o){s.stylesheets=null,s.unsuspend!==null&&(s.count++,Ol=new Map,o.forEach(a8,s),Ol=null,Nl.call(s))}function a8(s,o){if(!(o.state.loading&4)){var u=Ol.get(s);if(u)var h=u.get(null);else{u=new Map,Ol.set(s,u);for(var v=s.querySelectorAll("link[data-precedence],style[data-precedence]"),b=0;b"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),kf.exports=v8(),kf.exports}var y8=x8();const S8="/api/v1",b8="X-Assessor-Request";class w8 extends Error{constructor(t,n,a,i){super(t),this.status=n,this.code=a,this.requestId=i,this.name="AssessorApiError"}status;code;requestId}function Lh(e){let n="";for(let a=0;a{r!==void 0&&(Array.isArray(r)?r.forEach(c=>n.append(i,String(c))):n.set(i,String(r)))});const a=n.toString();return a?`${e}?${a}`:e}class qi{baseUrl;fetcher;constructor(t={}){this.baseUrl=(t.baseUrl??S8).replace(/\/$/,""),this.fetcher=t.fetcher??globalThis.fetch.bind(globalThis)}async request(t,n={}){const a=new Headers(n.headers);a.set("Accept","application/json"),n.body!==void 0&&a.set("Content-Type","application/json"),n.method&&n.method!=="GET"&&a.set(b8,"1");const i=await this.fetcher(`${this.baseUrl}${t}`,{...n,headers:a}),r=await i.json().catch(()=>null);if(!i.ok){const c=r&&typeof r=="object"&&"error"in r?r.error:void 0;throw new w8(c?.message??`API-Anfrage fehlgeschlagen (${i.status}).`,i.status,c?.code??"api_error",c?.requestId)}return r}health(){return this.request("/health")}getDatabaseStructure(){return this.request("/db-structure")}listProjects(){return this.request("/projects")}saveProject(t){return this.request("/projects",{method:"POST",body:JSON.stringify(t)})}getProject(t){return this.request(`/projects/${encodeURIComponent(t)}`)}exportProject(t){return this.request(`/projects/${encodeURIComponent(t)}/export`)}listProjectImportFiles(t){return this.request(`/projects/${encodeURIComponent(t)}/import-files`)}listProjectAssessmentHistory(t){return this.request(`/projects/${encodeURIComponent(t)}/assessment-history`)}saveAssessment(t){return this.request("/assessments",{method:"POST",body:JSON.stringify(t)})}listProjectAssessments(t){return this.request(`/projects/${encodeURIComponent(t)}/assessments`)}loadAssessmentModel(t){return this.request(`/assessments/${encodeURIComponent(t)}/model`)}listProjectReviews(t){return this.request(`/projects/${encodeURIComponent(t)}/reviews`)}saveReview(t,n){return this.request("/reviews",{method:"POST",body:JSON.stringify({review:t,expectedRevision:n})})}recordRiskAcceptance(t,n,a,i){return this.request(`/projects/${encodeURIComponent(t)}/risk-acceptances`,{method:"POST",body:JSON.stringify({occurrenceId:n,command:a,expectedRevision:i})})}queryUnifiedResults(t={}){return this.request(If("/results",t))}queryUnifiedResultFacets(t={}){return this.request(If("/results/facets",t))}getUnifiedResultById(t){return this.request(`/results/${encodeURIComponent(t)}`)}listResultCategories(t={}){return this.request(If("/results/categories",t))}deleteProject(t){return this.request(`/projects/${encodeURIComponent(t)}`,{method:"DELETE",body:JSON.stringify({projectId:t,cascade:!0})})}getEnvironmentSnapshot(t){const n=new URLSearchParams;t.assessmentId&&n.set("assessmentId",t.assessmentId),t.scanRunIds?.forEach(i=>n.append("scanRunIds",i));const a=n.size?`?${n.toString()}`:"";return this.request(`/projects/${encodeURIComponent(t.projectId)}/environment-snapshot${a}`)}deleteAssessment(t,n){return this.request(`/projects/${encodeURIComponent(t)}/assessments/${encodeURIComponent(n)}`,{method:"DELETE",body:JSON.stringify({projectId:t,assessmentId:n,cascade:!0})})}deleteScanRun(t,n){return this.request(`/projects/${encodeURIComponent(t)}/scan-runs/${encodeURIComponent(n)}`,{method:"DELETE",body:JSON.stringify({projectId:t,scanRunId:n,cascade:!0})})}evaluateGpoBackup(t,n){return this.request(`/projects/${encodeURIComponent(t)}/gpo-backups/${encodeURIComponent(n)}/evaluate`,{method:"POST",body:JSON.stringify({})})}async submitGpoBackup(t,n,a,i){const r=new Uint8Array(await n.arrayBuffer());return this.request(`/projects/${encodeURIComponent(t)}/gpo-backups`,{method:"POST",body:JSON.stringify({fileName:n.name,sizeBytes:n.size,bytesBase64:Lh(r),assessmentId:a,restoreArtifactId:i})})}listProjectGpoBackupStatus(t){return this.request(`/projects/${encodeURIComponent(t)}/gpo-backups/status`)}retryGpoBackup(t,n){return this.request(`/projects/${encodeURIComponent(t)}/gpo-backups/${encodeURIComponent(n)}/retry`,{method:"POST",body:JSON.stringify({})})}reprocessGpoBackup(t,n,a){return this.request(`/projects/${encodeURIComponent(t)}/gpo-backups/${encodeURIComponent(n)}/reprocess`,{method:"POST",body:JSON.stringify({expectedLatestProcessingRunId:a})})}listProjectGpoPolicyAnalyses(t){return this.request(`/projects/${encodeURIComponent(t)}/policy-analyses`)}listEnvironmentProfiles(t){return this.request("/projects/"+encodeURIComponent(t)+"/environment-profiles")}createEnvironmentProfile(t,n){return this.request("/projects/"+encodeURIComponent(t)+"/environment-profiles",{method:"POST",body:JSON.stringify(n)})}listPolicySnapshotAggregations(t){return this.request("/projects/"+encodeURIComponent(t)+"/policy-snapshot-aggregations")}aggregatePolicySnapshot(t,n){return this.request("/projects/"+encodeURIComponent(t)+"/policy-snapshot-aggregations",{method:"POST",body:JSON.stringify(n)})}listPolicyEvaluations(t){return this.request("/projects/"+encodeURIComponent(t)+"/policy-evaluations")}evaluatePolicy(t,n){return this.request("/projects/"+encodeURIComponent(t)+"/policy-evaluations",{method:"POST",body:JSON.stringify(n)})}listPolicyFindingRuns(t){return this.request("/projects/"+encodeURIComponent(t)+"/policy-finding-runs")}createPolicyFindingRun(t,n){return this.request("/projects/"+encodeURIComponent(t)+"/policy-finding-runs",{method:"POST",body:JSON.stringify(n)})}getPolicyAnalysisOverview(t){return this.request("/projects/"+encodeURIComponent(t)+"/policy-analysis-overview")}deleteGpoBackup(t,n){return this.request(`/projects/${encodeURIComponent(t)}/gpo-backups/${encodeURIComponent(n)}`,{method:"DELETE",body:JSON.stringify({artifactId:n,confirmDelete:!0})})}getPolicyEvaluationRuleCatalog(){return this.request("/reference-data/policy-evaluation-rule-catalog")}listMicrosoftSecurityBaselines(){return this.request("/reference-data/microsoft-security-baselines")}async submitMicrosoftSecurityBaseline(t){const n=new Uint8Array(await t.arrayBuffer());return this.request("/reference-data/microsoft-security-baselines",{method:"POST",body:JSON.stringify({fileName:t.name,sizeBytes:t.size,bytesBase64:Lh(n)})})}adoptScanRunReplacement(t,n,a){return this.request(`/projects/${encodeURIComponent(t)}/scan-runs/${encodeURIComponent(n)}/adopt-replacement`,{method:"POST",body:JSON.stringify({replacementScanRunId:a})})}deleteMicrosoftSecurityBaseline(t){return this.request(`/reference-data/microsoft-security-baselines/${encodeURIComponent(t)}`,{method:"DELETE",body:JSON.stringify({confirmDelete:!0})})}listMicrosoftSecurityBaselineAnalyses(t){return this.request(`/reference-data/microsoft-security-baselines/${encodeURIComponent(t)}/analysis`)}reprocessMicrosoftSecurityBaseline(t){return this.request(`/reference-data/microsoft-security-baselines/${encodeURIComponent(t)}/reprocess`,{method:"POST",body:JSON.stringify({})})}selectMicrosoftSecurityBaseline(t){return this.request("/reference-data/microsoft-security-baselines/select",{method:"POST",body:JSON.stringify(t)})}async importFile(t,n){return this.request("/import-sources/parse",{method:"POST",body:JSON.stringify(await pv(t,n))})}async previewImportBatch(t,n,a,i,r){const c=await Promise.all(t.map(l=>pv(l,n)));return this.request("/import-batches/preview",{method:"POST",body:JSON.stringify({files:c,targetProjectId:a,targetAssessmentId:i,replacesScanRunId:r})})}completeImportBatch(t,n,a,i,r){return this.request("/import-batches/complete",{method:"POST",body:JSON.stringify({batchId:t,entries:n,targetProjectId:a,targetAssessmentId:i,replacesScanRunId:r})})}}const hr=()=>({riskAcceptance:void 0,include:!1,status:"Open",priority:"Medium",owner:"",due:"",prerequisites:"",access:"",nextStep:"",evidence:"",comment:"",markerQuestion:!1,markerBlocked:!1,markerQuickwin:!1,markerExternal:!1,markerNotRelevant:!1});async function C8(e){return{metadata:{name:e.name,sizeBytes:e.size,lastModified:e.lastModified,...e.type?{mediaType:e.type}:{}},bytes:new Uint8Array(await e.arrayBuffer())}}class Ia extends Error{constructor(t,n=[],a){super(t,a),this.diagnostics=n,this.name="ImportError"}diagnostics}function sd(e,t=!1){const n=[];let a=0,i=0;for(;(i=e.indexOf("<",i))>=0;){if(e.startsWith("",i+4);i=S<0?e.length:S+3;continue}const r=/^<\/?([a-z][\w:-]*)(?=[\s/>])/i.exec(e.slice(i,i+256));if(!r){i++;continue}const c=i,l=n.length,f=a;let T="",p=!1,m=!1,g=!1;for(i+=r[0].length;i")&&(n.push(e.slice(a,i),S==="<"?"<":">"),a=i+1);else if(S===">"){i++,g=!0;break}else if(m)/\s/.test(S)&&(m=!1);else if(p){if(/\s/.test(S))continue;p=!1,S==='"'||S==="'"?T=S:m=!0}else S==="="&&(p=!0)}if(!g&&t)return n.slice(0,l).join("")+e.slice(f,c);if(!g&&T)throw new Ia("HTML enthält ein nicht abgeschlossenes Attribut.",[{severity:"error",code:"html-unclosed-attribute",stage:"structure-decoding",message:"Eine Attributzeichenkette endet nicht innerhalb des HTML-Dokuments."}]);if(e[c+1]!=="/"&&/^(script|style|textarea|title|xmp|iframe|noembed|noframes)$/i.test(r[1])){const S=new RegExp("","ig");S.lastIndex=i;const x=S.exec(e);i=x?x.index+x[0].length:e.length}}return n.length?n.join("")+e.slice(a):e}function*Cp(e){let t=0;for(;t]/.test(e[t])){t++;continue}const n=t;for(;t]/.test(e[t]);)t++;const a=e.slice(n,t).toLowerCase(),i=t;for(;t]/.test(e[t]);)t++;r=e.slice(l,t)}}yield{name:a,value:r,start:n,end:r===void 0?i:t}}}function Kr(e,t){const n=t.toLowerCase();for(const a of Cp(e))if(a.name===n&&a.value!==void 0)return a.value;return""}const E8=1*1024*1024,Ep=10001,Iu=250001,Nu=500001,mv=1e5,k8=new Set(["SCRIPT","STYLE","IFRAME","OBJECT","EMBED","SVG","LINK","META","BASE","FORM","INPUT","BUTTON","TEXTAREA","SELECT","TEMPLATE","CANVAS","AUDIO","VIDEO","SOURCE"]),A8=new Set(["ADDRESS","ARTICLE","ASIDE","BLOCKQUOTE","BR","DIV","DL","FIELDSET","FIGCAPTION","FIGURE","FOOTER","H1","H2","H3","H4","H5","H6","HEADER","HR","LI","MAIN","NAV","OL","P","PRE","SECTION","TABLE","TBODY","TD","TFOOT","TH","THEAD","TR","UL"]),R8=/^(?:on.*|srcdoc|src|action|formaction|xlink:href)$/i,D8=/^https?:\/\/[^\s"'<>]+$/i;function g1(e){return D8.test(e.trim())}function t1(e){return e.replace(/[&<>"]/g,t=>t==="&"?"&":t==="<"?"<":t===">"?">":""")}function I8(e){return e.length>E8}function N8(e){return e instanceof RangeError||e instanceof Error&&/maximum call stack|stack overflow/i.test(e.message)}function kp(e){return e.replace(/\s+/g," ").trim()}function v1(e){const t={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"'};return e.replace(/&(?:#(\d+)|#x([\da-f]+)|([a-z][\da-z]+));/gi,(n,a,i,r)=>{if(a||i){const c=Number.parseInt(a??i,a?10:16);if(Number.isInteger(c)&&c>=0&&c<=1114111)try{return String.fromCodePoint(c)}catch{return n}return n}return t[String(r).toLocaleLowerCase("en-US")]??n})}function Nf(e,t=!1,n=!1){const a=[],i=[{node:e,closing:!1}];for(;i.length;){const r=i.pop(),c=r.node;if(c.nodeType===3||c.nodeType===4){const m=c.nodeValue??"";a.push(n?t1(m):m);continue}if(c.nodeType!==1&&c.nodeType!==9&&c.nodeType!==11)continue;const l=c.nodeType===1?c:null,f=t&&!!(l&&A8.has(l.tagName.toLocaleUpperCase("en-US"))),T=n&&l&&l.tagName.toLocaleUpperCase("en-US")==="A"?l.getAttribute("href")??"":"",p=!!T&&g1(T);if(r.closing){p&&a.push(""),f&&a.push(` +`);continue}f&&a.push(` +`),p&&a.push(``),i.push({node:c,closing:!0});for(let m=c.lastChild;m;m=m.previousSibling)i.push({node:m,closing:!1})}return t?a.join(""):kp(a.join(" "))}function O8(e){const t=e.documentElement;if(!t)return 0;let n=0;const a=[t];for(;a.length;){const i=a.pop();if(k8.has(i.tagName.toLocaleUpperCase("en-US"))){i.remove(),n+=1;continue}for(let r=i.attributes.length-1;r>=0;r-=1){const c=i.attributes.item(r);if(!c)continue;const l=c.name.toLocaleLowerCase("en-US")==="href";!(l&&i.tagName.toLocaleUpperCase("en-US")==="A"&&g1(c.value??""))&&(l||R8.test(c.name))&&(i.removeAttribute(c.name),n+=1)}for(let r=i.lastElementChild;r;r=r.previousElementSibling)a.push(r)}return n}const gv=1e3;function Ky(e){const t=new Map;return e.map(n=>{const a=[],i=[];let r=0;for(const c of n){for(;t.has(r)&&t.get(r).remaining>0;){const T=t.get(r);a[r]=T.text,i[r]=T.selector,T.remaining-=1,T.remaining<=0&&t.delete(r),r+=1}const l=Math.min(Math.max(c.colSpan,1),gv),f=Math.min(Math.max(c.rowSpan,1),gv);for(let T=0;T1&&t.set(r,{remaining:f-1,text:c.text,selector:c.selector}),r+=1}for(;t.has(r)&&t.get(r).remaining>0;){const c=t.get(r);a[r]=c.text,i[r]=c.selector,c.remaining-=1,c.remaining<=0&&t.delete(r),r+=1}return{values:a,selectors:i}})}function Ap(e){const t=[];for(const n of e.split(/\r\n|\r|\n/)){const a=kp(n);if(a){for(let i=0;i=Iu)break}}return t}function M8(e){const t=O8(e),n=[],a=e.getElementsByTagName("table"),i=Math.min(a.length,Ep);let r=0;for(let f=0;f :nth-child(${A+1})`})}x.push(B),y.push($y(N.className??"")),r+=1}const w=Ky(x),C=w.map(O=>O.values),k=w.map(O=>O.selectors),E={kind:"html-table"};p&&(E.caption=p),T.id&&(E.elementId=T.id),m&&(E.ariaLabel=m),n.push({name:g,rows:C,cellSelectors:k,attributes:E,highlightedRows:y})}const c=Nf(e.body??e.documentElement,!0),l=n.length?[]:Ap(c);return{tables:n,fallbackRows:l,documentText:c,removedContentCount:t,extractionMode:"dom"}}function wo(e){let t=0,n=sd(e).replace(/<(script|style|iframe|object|embed|svg|form|template|canvas|audio|video)\b[^>]*>[\s\S]*?<\/\1\s*>/gi,()=>(t+=1," "));return n=n.replace(/<(?:script|style|iframe|object|embed|svg|link|meta|base|form|input|button|textarea|select|template|canvas|audio|video|source)\b[^>]*\/?>/gi,()=>(t+=1," ")),n=n.replace(/(<\/?[a-z][\w:-]*)([^>]*)(>)/gi,(a,i,r,c)=>{const l=[i];let f=0;for(const T of Cp(r)){const{name:p,value:m,start:g,end:S}=T;let x;if(/^(?:on[\w:-]*|srcdoc|src|action|formaction|xlink:href)$/.test(p))t+=1,x="";else if(p==="href"){const y=v1(m??"").trim();g1(y)?x=`href="${t1(y)}"`:(t+=1,x="")}x!==void 0&&(l.push(r.slice(f,g),x),f=S)}return l.push(r.slice(f),c),l.join("")}),n=n.replace(//g," "),{text:n,removedContentCount:t}}function Sc(e,t){return v1(Kr(e,t)).trim()}function $y(e){return/(?:^|\s)evaluated(?:$|\s)/i.test(e)}function sn(e){return kp(v1(sd(e,!0).replace(//g," ").replace(/<[^>]*>/g," ")))}const j8=Ep*4;function rd(e){const t=/]*)>|<\/table\s*>/gi,n=[],a=[];let i;for(;a.lengthr.end>=0)}function F8(e,t,n,a){let i=e.slice(t,n);for(let r=a.length-1;r>=0;r-=1){const c=a[r];c.end<0||(i=i.slice(0,c.start-t)+i.slice(c.end-t))}return i}function L8(e){const t=e.replace(//gi,` +`).replace(/<\/?(?:address|article|aside|blockquote|div|dl|fieldset|figcaption|figure|footer|h[1-6]|header|hr|li|main|nav|ol|p|pre|section|table|tbody|td|tfoot|th|thead|tr|ul)\b[^>]*>/gi,` +`).replace(/<[^>]*>/g," ");return Ap(v1(t))}function vv(e){const t=wo(e),n=[],a=rd(t.text);let i=0;for(let c=0;c]*>([\s\S]*?)<\/caption\s*>/i.exec(T)?.[1]??""),m=Sc(f,"id"),g=Sc(f,"aria-label"),S=[],x=[],y=/]*)>([\s\S]*?)<\/tr\s*>/gi;let w;for(;S.length]*)>([\s\S]*?)<\/t[hd]\s*>/gi;let A;for(;A=B.exec(w[2]??"");){const z=N.length,P=A[1]??"";N.push({text:sn(A[2]??""),colSpan:Number.parseInt(Sc(P,"colspan"),10)||1,rowSpan:Number.parseInt(Sc(P,"rowspan"),10)||1,selector:`table:nth-of-type(${c+1}) tr:nth-of-type(${S.length+1}) > :nth-child(${z+1})`})}N.length&&(S.push(N),x.push($y(Sc(w[1]??"","class"))),i+=1)}const C=Ky(S),k=C.map(N=>N.values),E=C.map(N=>N.selectors),O={kind:"html-table",extractionMode:"bounded-lexical"};p&&(O.caption=p),m&&(O.elementId=m),g&&(O.ariaLabel=g),n.push({name:p||m||g||`Tabelle ${c+1}`,rows:k,cellSelectors:E,attributes:O,highlightedRows:x})}const r=L8(t.text).map(c=>c[0]??"").filter(Boolean).join(` +`);return{tables:n,fallbackRows:n.length?[]:Ap(r),documentText:r,removedContentCount:t.removedContentCount,extractionMode:"bounded-lexical"}}function Yy(e,t,n){const a=[...e.attributes].map(c=>`${c.name}="${c.value}"`).join("; "),i=Object.fromEntries([...e.attributes].map(c=>[c.name,c.value])),r=[...e.childNodes].filter(c=>c.nodeType===3||c.nodeType===4).map(c=>c.textContent?.trim()??"").filter(Boolean).join(" ");n.push({path:t,attributes:a,attributeValues:i,text:r}),[...e.children].forEach((c,l)=>Yy(c,`${t}/${c.nodeName}[${l+1}]`,n))}const P8={decodeHtml(e){if(I8(e))return vv(e);try{const t=new DOMParser().parseFromString(e,"text/html");return M8(t)}catch(t){if(N8(t))return vv(e);throw t}},decodeXml(e){if(/e.role!=="status"),{role:"status",headers:[{pattern:/^(?:status|result|outcome|evaluation|zustand)$/i,contribution:.96,message:"Native Maester status field."}],whenHeadersAbsent:[/^status$/i]},{role:"status",headers:[{pattern:/^(?:status|outcome|evaluation|zustand)$/i,contribution:.96,message:"Separate Maester status column."}],whenHeadersPresent:[/^status$/i]},{role:"evidence",headers:[{pattern:/^result$/i,contribution:1,message:"Maester result text next to a separate Status column."}],whenHeadersPresent:[/^status$/i]}],normalization:{severity:x1,status:y1},presentation:{titleHeaders:[/^title$/i],severityHeaders:[/^severity$/i],sortHeaders:[/^severity$/i],sortDirection:"desc",resultMessageHeaders:[/^resultdetail$/i,/^result$/i],statusHeaders:[/^status$/i,/^result$/i],defaultStatusFilter:"deviation",statusFilters:[{value:"all",label:"All Results",patterns:[]},{value:"deviation",label:"Deviation",patterns:[/^fail(?:ed)?$/i,/^investigate$/i]},{value:"failed",label:"Failed",patterns:[/^fail(?:ed)?$/i]},{value:"investigate",label:"Investigate",patterns:[/^investigate$/i]},{value:"passed",label:"Passed",patterns:[/^pass(?:ed)?$/i]},{value:"skipped",label:"Skipped",patterns:[/^skipped$/i,/^notrun$/i]}]},comparisonKeys:[["rule-id","asset"],["rule-id"]]},U8=y1.map(e=>e.normalizedValue==="failed"?{...e,patterns:[...e.patterns,/^matched$/i]}:e),Qy={schemaVersion:1,id:"pingcastle",securityScoring:{version:"1.0.0",native:{kind:"mapped",properties:["risk.domain","risk.global"],scope:"overall",scale:"0-100",direction:"lower-is-better"},targets:["domain.fqdn"],resultPopulation:"findings-only"},priorityBasis:{version:"1.0.0",basis:{kind:"numeric",properties:["rule.points"],scale:"0-50+",direction:"higher-is-worse"},excludedProperties:[{property:"rule.points_scale",reason:"Static scoring-scheme description, not the awarded value."},{property:"risk.domain",reason:"Category or domain risk total, not a per-finding rank."}]},timeslotComparison:{version:"1.0.0",kind:"available",granularity:"scope",scope:{kind:"ad-domain",properties:["domain.fqdn"]},observationTimeProperties:["report.generated_at"],resultEvidence:"findings-only",negativeEvidence:"unsupported",diagnosticPolicy:"fail-closed-by-impact"},name:"PingCastle",version:"1.5.0",processing:{mappingVersion:"1.2.0",normalizationVersion:"1.1.0",presentationVersion:"1.2.0",compatibilityKey:"pingcastle-canonical-v1.1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["environment-context","evidence","import-diagnostics"]},sourceSignals:[{scope:"file-name",pattern:/ping[\s_.-]*castle|^ad[_-]hc[_-]/i,contribution:.5,message:"Der Dateiname entspricht einem PingCastle-Healthcheck."},{scope:"raw-text",pattern:/ping[\s_-]*castle/i,contribution:.7,message:"Der Dateiinhalt enthält einen PingCastle-Marker."},{scope:"raw-text",pattern:/rule\s+id\s*:/i,contribution:.1,message:"Der Bericht enthält Rule-ID-Details."},{scope:"table-name",pattern:/^healthcheckdata$/i,contribution:.7,message:"Das XML-Wurzelelement entspricht einem PingCastle-Healthcheck."},{scope:"table-name",pattern:/^risk\s+scores?$/i,contribution:.2,message:"Eine Tabelle heißt „Risk Scores“."},{scope:"header",pattern:/^rules?\s+matched$/i,contribution:.12,message:"Die Kopfzeile „Rules matched“ wurde gefunden."}],tableRules:{preferredNames:[{pattern:/risk\s+scores?|rule|finding/i,contribution:.8,message:"PingCastle-Risiko- oder Regeltabelle."}],discouragedNames:[{pattern:/domain\s+information|summary/i,contribution:.35,message:"Domänenmetadaten oder Zusammenfassung."}]},fieldRules:S1,normalization:{severity:x1,status:U8},presentation:{titleHeaders:[/^title$/i],severityHeaders:[/^(?:severity|risk\s*level|score)$/i],sortHeaders:[/^(?:points?|score)$/i],sortDirection:"desc",defaultStatusFilter:"all",statusFilters:[],showResultSheetTitles:!0,resultSheetTitleRules:[{pattern:/^PingCastle\s*·\s*/i,replacement:""}]},comparisonKeys:[["rule-id","asset"],["rule-id"]]},e4={schemaVersion:1,id:"purple-knight",securityScoring:{version:"1.0.0",native:{kind:"mapped",properties:["purple_knight.ad.security_posture_score"],scope:"overall",scale:"0-100",direction:"higher-is-better",incompatibleProperties:["purple_knight.entra.security_posture_score","purple_knight.aad.security_posture_score","purple_knight.okta.security_posture_score"]},targets:["forest.name"],resultPopulation:"complete"},priorityBasis:{version:"1.0.0",basis:{kind:"severity",properties:["indicator.severity"]},excludedProperties:[{property:"indicator.weight",reason:"Scoring weight, not comparable with another tool ordering."}]},timeslotComparison:{version:"1.0.0",kind:"available",granularity:"scope",scope:{kind:"ad-forest",properties:["forest.name"]},observationTimeProperties:["report.generated_at"],resultEvidence:"explicit-results",negativeEvidence:"unsupported",diagnosticPolicy:"fail-closed-by-impact"},name:"PurpleKnight",version:"1.3.0",processing:{mappingVersion:"1.1.0",normalizationVersion:"1.1.0",presentationVersion:"1.1.0",compatibilityKey:"purple-knight-canonical-v1.1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["environment-context","evidence","import-diagnostics"]},sourceSignals:[{scope:"file-name",pattern:/^Security_Assessment_Report_.+_\(Indicators_results\)\.csv$/i,contribution:.25,message:"Native PurpleKnight indicator CSV naming structure."},{scope:"header",pattern:/^number of results$/i,contribution:.15,message:"Native result-count column."},{scope:"file-name",pattern:/purple[\s_.-]*knight/i,contribution:.55,message:"Der Dateiname enthält Purple Knight."},{scope:"raw-text",pattern:/purple[\s_-]*knight/i,contribution:.7,message:"Der Dateiinhalt enthält einen Purple-Knight-Marker."},{scope:"table-name",pattern:/^indicator(?:s)?\s+results?$/i,contribution:.38,message:"Ein Sheet heißt „Indicator Results“."},{scope:"header",pattern:/^short\s*name$/i,contribution:.14,message:"Die Kopfzeile „Short Name“ wurde gefunden."},{scope:"header",pattern:/^si\s*version$/i,contribution:.16,message:"Die Kopfzeile „SI Version“ wurde gefunden."},{scope:"header",pattern:/^weight$/i,contribution:.08,message:"Die Kopfzeile „Weight“ wurde gefunden."},{scope:"cell-value",pattern:/^ioes?\s+found$/i,contribution:.16,message:"Ein typischer IOE-Ergebniswert wurde gefunden."},{scope:"raw-text",pattern:/(?:^|[\r\n"])AD:\s*security posture score/i,contribution:.6,message:"Die Datei nennt den Purple-Knight-Posture-Score."},{scope:"raw-text",pattern:/(?:^|[\r\n"])AD category score:/i,contribution:.4,message:"Die Datei nennt Purple-Knight-Kategoriewerte."}],tableRules:{preferredNames:[{pattern:/^indicator(?:s)?\s+results?$/i,contribution:1,message:"Haupttabelle mit Indicator Results."},{pattern:/indicators?|findings?|ioe/i,contribution:.35,message:"Tabellenname deutet auf Indicators oder Findings."}],discouragedNames:[{pattern:/assessment|summary|overview|dashboard/i,contribution:.15,message:"Zusammenfassungs- oder Dashboardtabelle."}]},fieldRules:S1,normalization:{severity:x1,status:y1},presentation:{titleHeaders:[/^(?:name|indicator\s+name|security\s+indicator|finding|title)$/i],severityHeaders:[/^(?:severity|criticality|priority|status)$/i],sortHeaders:[/^weight$/i],sortDirection:"desc",defaultStatusFilter:"ioes-found",statusHeaders:[/^status$/i,/^(?:result|evaluation)$/i],statusDisplayRules:[{label:"Passed",patterns:[/^pass(?:ed)?$/i]},{label:"Failed",patterns:[/^fail(?:ed)?$|^ioes?\s+found$/i]}],statusFilters:[{value:"all",label:"All Results",patterns:[]},{value:"evaluated",label:"Evaluated",patterns:[/^(?:evaluated|ioes? found|passed?|pass)$/i]},{value:"not-selected",label:"Not selected",patterns:[/^not selected$/i]},{value:"ioes-found",label:"IOEs found",patterns:[/^ioes? found$/i]},{value:"passed",label:"Passed",patterns:[/^pass(?:ed)?$/i]},{value:"failed-to-run",label:"Failed to run",patterns:[/^failed to run$/i]},{value:"not-relevant",label:"Not Relevant",patterns:[/^(?:not relevant|irrelevant)$/i]},{value:"canceled",label:"Canceled",patterns:[/^cancel(?:ed|led)$/i]}]},comparisonKeys:[["rule-id","asset"],["rule-id"]]},ei=[e4,Qy,Zy,Jy,Dp];function Fi(e){return e instanceof Date?e.toLocaleString("en-US"):e==null?"":typeof e=="object"?JSON.stringify(e):String(e)}function je(e){return Fi(e).replace(/\s+/g," ").trim()}function ts(e){return Fi(e).replace(/\r\n?/g,` +`).replace(/[^\S\n]+/g," ").replace(/ *\n */g,` +`).trim()}function ga(e){return String(e??"").replace(//gi," ").replace(//gi," ").replace(/<[^>]+>/g," ").replace(/ /gi," ").replace(/&/gi,"&").replace(/</gi,"<").replace(/>/gi,">").replace(/"/gi,'"').replace(/�?39;/gi,"'").replace(/\s+/g," ").trim()}function vi(e){let t=je(e).replace(/[\s']/g,"").replace(/%$/,"");if(!t)return null;if(/^[+-]?\d{1,3}(?:\.\d{3})+(?:,\d+)?$/.test(t))t=t.replace(/\./g,"").replace(",",".");else if(/^[+-]?\d{1,3}(?:,\d{3})+(?:\.\d+)?$/.test(t))t=t.replace(/,/g,"");else if(/^[+-]?(?:\d+(?:[.,]\d+)?|[.,]\d+)$/.test(t))t=t.replace(",",".");else return null;const n=Number(t);return Number.isFinite(n)?n:null}function z8(e){return e>=.82?"high":e>=.62?"medium":e>=.35?"low":"unknown"}function Qi(e,t){const n=Math.max(0,Math.min(1,e));return{level:z8(n),score:Number(n.toFixed(3)),reasons:t.map(a=>a.message)}}function Of(e,t){return e.lastIndex=0,e.test(t)}function W8(e,t){if(!t.length)return[];const n=r=>t.filter(r).length/t.length,a=[];e==="severity"&&n(r=>/^(?:critical|high|medium|low|info|kritisch|hoch|mittel|niedrig)$/i.test(r))>=.6&&a.push({signal:"value-distribution",contribution:.88,message:"Die Werte entsprechen überwiegend bekannten Schweregraden."}),e==="status"&&n(r=>/^(?:pass(?:ed)?|fail(?:ed)?|open|closed|resolved|error|unknown|manual|not selected|not run|ioes? found)$/i.test(r))>=.6&&a.push({signal:"value-distribution",contribution:.86,message:"Die Werte entsprechen überwiegend bekannten Ergebnis- oder Statuswerten."}),e==="rule-id"&&n(r=>/^(?:[A-Z]{1,8}[.-])?[A-Z0-9]+(?:[._-][A-Z0-9]+)+$/i.test(r))>=.6&&a.push({signal:"value-shape",contribution:.7,message:"Die Werte besitzen überwiegend die Form stabiler Regelbezeichner."}),e==="score"&&n(r=>vi(r)!==null)>=.8&&a.push({signal:"detected-type",contribution:.36,message:"Die Spalte besteht überwiegend aus Zahlenwerten."}),e==="framework-reference"&&n(r=>/^(?:https?:\/\/|[A-Z]+[- ]?\d)/i.test(r))>=.5&&a.push({signal:"value-shape",contribution:.48,message:"Die Werte ähneln URLs oder Control-Referenzen."});const i=t.reduce((r,c)=>r+c.length,0)/t.length;return e==="description"&&i>=80&&a.push({signal:"value-length",contribution:.52,message:"Die Werte sind überwiegend längere beschreibende Texte."}),e==="evidence"&&i>=40&&a.push({signal:"value-length",contribution:.4,message:"Die Werte besitzen die typische Länge von Evidenzdetails."}),a}function t4(e,t,n,a=[e]){return n.filter(i=>(i.whenHeadersPresent??[]).every(r=>a.some(c=>Of(r,c.trim())))&&(i.whenHeadersAbsent??[]).every(r=>!a.some(c=>Of(r,c.trim())))).map(i=>{const c=[...i.headers.filter(f=>Of(f.pattern,e)).map(f=>({signal:"header",contribution:f.contribution,message:f.message})),...W8(i.role,t)],l=c.length?Math.min(1,c.reduce((f,T)=>f+T.contribution,0)):0;return{role:i.role,evidence:c,confidence:Qi(l,c)}}).filter(i=>i.confidence.score>=.2).sort((i,r)=>r.confidence.score-i.confidence.score||i.role.localeCompare(r.role))}const V8=ei.filter(e=>!e.fallback).map(e=>({toolId:e.id,toolName:e.name,signals:e.sourceSignals}));function n4(e){return JSON.stringify([e.source.tableIndex??null,e.key,e.label])}function H8(e,t){const n=new Map,a=new Map,i=t.flatMap(r=>[...r.whenHeadersPresent??[],...r.whenHeadersAbsent??[]]);return e.forEach(r=>{const c=i.length?r.fields.map(f=>f.label):[],l=i.map(f=>c.some(T=>(f.lastIndex=0,f.test(T.trim())))?"1":"0").join("");a.set(r,l),r.fields.forEach(f=>{const T=`${n4(f)}:${l}`,p=n.get(T);if(p){p.values.length<250&&f.decodedValue.trim()&&p.values.push(f.decodedValue.trim());return}n.set(T,{id:`candidate-field-${n.size}`,identity:T,fieldKey:f.key,sourceLabel:f.label,tableIndex:f.source.tableIndex,headers:c,values:f.decodedValue.trim()?[f.decodedValue.trim()]:[]})})}),{groups:[...n.values()],contexts:a}}function G8(e,t){if(t.tableIndex===void 0)return;const n=Number(/^column-(\d+)$/.exec(t.fieldKey)?.[1]);if(Number.isInteger(n))return e?.fields.find(a=>a.tableIndex===t.tableIndex&&a.columnIndex===n&&a.decisionSource==="user-confirmed")}function X8(e,t,n){const a=G8(n,e);if(a)return{id:e.id,fieldKey:e.fieldKey,sourceLabel:e.sourceLabel,sourceScope:{tableIndex:e.tableIndex},proposedRole:a.proposedRole,appliedRole:a.appliedRole,alternatives:a.alternatives,confidence:a.confidence,evidence:a.evidence,decisionSource:"user-confirmed",requiresConfirmation:!1};const i=t4(e.sourceLabel,e.values,t.definition.fieldRules,e.headers),r=i[0],c=r&&r.confidence.level!=="unknown"?r.role:null,l=r&&["high","medium"].includes(r.confidence.level);return{id:e.id,fieldKey:e.fieldKey,sourceLabel:e.sourceLabel,sourceScope:{tableIndex:e.tableIndex},proposedRole:c,appliedRole:l?r.role:"additional",alternatives:i.map(({role:f,confidence:T})=>({role:f,confidence:T})),confidence:r?.confidence??Qi(0,[]),evidence:r?.evidence??[],decisionSource:c?"automatic":"fallback",requiresConfirmation:r?.confidence.level==="low"}}function a4(e,t,n,a){const{groups:i,contexts:r}=H8(e.candidates,t.definition.fieldRules),c=new Map((a?.candidateFieldRoles??[]).map(p=>[p.decisionId,p.role])),l=i.map(p=>X8(p,t,n)).map(p=>{const m=p.sourceScope.tableIndex===void 0?c.get(p.id):void 0;if(!m)return p;const g=[{signal:"user-confirmation",contribution:1,message:"Die Candidate-Feldrolle wurde durch den Benutzer bestätigt oder korrigiert."}];return{...p,proposedRole:m,appliedRole:m,confidence:Qi(1,g),evidence:g,decisionSource:"user-confirmed",requiresConfirmation:!1}}),f=new Map(i.map((p,m)=>[p.identity,l[m]])),T={kind:"mapping-profile",id:t.id,version:t.definition.processing.mappingVersion};return{version:1,extractor:e.extractor,mappingProfile:T,fieldDecisions:l,candidates:e.candidates.map(p=>({version:1,id:p.id,source:p.source,fields:p.fields.map(m=>{const g=f.get(`${n4(m)}:${r.get(p)??""}`);if(!g)throw new Error(`Keine Mappingentscheidung für Quellfeld ${m.key} vorhanden.`);return{...m,mappingDecisionId:g.id,role:g.appliedRole}})})),diagnostics:[],processing:{stage:"mapping",status:"complete",processor:T,diagnosticCodes:[]}}}function K8(e,t){const n=e.headerCandidates[0]?.rowIndex??0;return e.rows.filter(a=>a.index!==n).map(a=>je(a.cells[t]?.decodedValue)).filter(Boolean).slice(0,250)}function $8(e,t){const n=e.headerCandidates[0];return je(n?.headers[t]??e.rows[n?.rowIndex??0]?.cells[t]?.decodedValue)}function Y8(e,t,n){const a=$8(e,t),i=K8(e,t),r=t4(a,i,n,e.headerCandidates[0]?.headers??[]),c=r[0],l=c&&c.confidence.level!=="unknown"?c.role:null,f=c&&["high","medium"].includes(c.confidence.level);return{tableId:e.id,tableIndex:e.index,columnIndex:t,sourceHeader:a,proposedRole:l,appliedRole:f?c.role:"additional",alternatives:r.map(({role:T,confidence:p})=>({role:T,confidence:p})),confidence:c?.confidence??Qi(0,[]),evidence:c?.evidence??[],decisionSource:l?"automatic":"fallback",requiresConfirmation:c?.confidence.level==="low"}}function Z8(e,t){return t==="file-name"?[e.file.name]:t==="raw-text"?[e.rawText.slice(0,25e4)]:t==="table-name"?e.tables.map(n=>n.name):t==="header"?e.tables.flatMap(n=>n.headerCandidates.flatMap(a=>a.headers)):e.tables.flatMap(n=>n.rows.slice(0,80).flatMap(a=>a.cells.map(i=>i.decodedValue)))}function J8(e,t){const n=V8.map(f=>{const T=f.signals.flatMap(m=>Z8(e,m.scope).some(g=>m.pattern.test(g))?[{signal:m.scope,contribution:m.contribution,message:m.message}]:[]);t?.match.toolId===f.toolId&&t.processing.status!=="failed"&&T.push({signal:"source-extractor",contribution:t.match.score,message:"Das registrierte Quellenmodul hat die native Berichtsstruktur validiert."});const p=Math.min(1,T.reduce((m,g)=>m+g.contribution,0));return{toolId:f.toolId,toolName:f.toolName,confidence:Qi(p,T),evidence:T}}).sort((f,T)=>T.confidence.score-f.confidence.score||f.toolName.localeCompare(T.toolName)),a=n[0],i=n[1],r=a?.confidence.level!=="unknown"?a:{toolId:"unknown",toolName:"Unknown",confidence:Qi(0,[]),evidence:[]},c=r.evidence.some(f=>f.signal!=="file-name"),l=r.toolId!=="unknown"&&i!==void 0&&i.confidence.level!=="unknown"&&r.confidence.score-i.confidence.score<.15;return{selected:r,candidates:n,decisionSource:r.toolId==="unknown"?"fallback":"automatic",requiresConfirmation:r.toolId!=="unknown"&&(r.confidence.level==="low"||!c||l)}}function Q8(e,t,n){const a=[],i=je(e.name);n.tableRules.preferredNames.forEach(f=>{f.pattern.lastIndex=0,f.pattern.test(i)&&a.push({signal:"profile-table-name",contribution:f.contribution,message:f.message})}),n.tableRules.discouragedNames.forEach(f=>{f.pattern.lastIndex=0,f.pattern.test(i)&&a.push({signal:"profile-table-name-penalty",contribution:-f.contribution,message:f.message})}),e.rows.length>1&&a.push({signal:"row-count",contribution:.1,message:"Die Tabelle enthält Datenzeilen unterhalb der Kopfzeile."});const r=new Set(t.filter(f=>f.appliedRole!=="additional").map(f=>f.appliedRole));r.size&&a.push({signal:"semantic-columns",contribution:Math.min(.55,r.size*.12),message:`${r.size} semantische Spaltenrollen wurden automatisch erkannt.`}),["title","rule-id"].some(f=>r.has(f))&&["status","severity","score"].some(f=>r.has(f))?a.push({signal:"role-combination",contribution:.3,message:"Identität und Bewertung eines Findings sind gemeinsam vorhanden."}):r.has("category")&&r.has("score")&&a.push({signal:"role-combination",contribution:.2,message:"Kategorie und Score bilden gemeinsam eine auswertbare Risikotabelle."});const c=Math.max(0,Math.min(1,a.reduce((f,T)=>f+T.contribution,0))),l=Qi(c,a);return{tableId:e.id,tableIndex:e.index,tableName:e.name,selected:["high","medium"].includes(l.level),confidence:l,evidence:a,decisionSource:l.level==="unknown"?"fallback":"automatic",requiresConfirmation:l.level==="low"}}function eC(e,t){const n=J8(e,t),a=ei.find(c=>c.id===n.selected.toolId)??Dp,i=e.tables.flatMap(c=>c.columns.map(l=>Y8(c,l.index,a.fieldRules))),r=e.tables.map(c=>Q8(c,i.filter(l=>l.tableId===c.id),a));return{version:1,source:n,tables:r,fields:i}}function i4(e,t){const n=t.sourceTool?{selected:{toolId:t.sourceTool.toolId,toolName:t.sourceTool.toolName,confidence:Qi(1,[{signal:"user-confirmation",contribution:1,message:"Die Quelle wurde durch den Benutzer bestätigt oder korrigiert."}]),evidence:[{signal:"user-confirmation",contribution:1,message:"Die Quelle wurde durch den Benutzer bestätigt oder korrigiert."}]},candidates:e.source.candidates,decisionSource:"user-confirmed",requiresConfirmation:!1}:e.source,a=t.tableSelections??{},i=e.tables.map(l=>Object.hasOwn(a,l.tableId)?{...l,selected:a[l.tableId],confidence:Qi(1,[{signal:"user-confirmation",contribution:1,message:"Die Tabellenauswahl wurde durch den Benutzer bestätigt oder korrigiert."}]),decisionSource:"user-confirmed",requiresConfirmation:!1}:l),r=new Map((t.fieldRoles??[]).map(l=>[`${l.tableId}:${l.columnIndex}`,l.role])),c=e.fields.map(l=>{const f=r.get(`${l.tableId}:${l.columnIndex}`);if(!f)return l;const T=[{signal:"user-confirmation",contribution:1,message:"Die Feldrolle wurde durch den Benutzer bestätigt oder korrigiert."}];return{...l,proposedRole:f,appliedRole:f,confidence:Qi(1,T),evidence:T,decisionSource:"user-confirmed",requiresConfirmation:!1}});return{...e,source:n,tables:i,fields:c}}function s4(e,t){if(!t.length)throw new Error("Für die Profilentscheidung ist mindestens ein Importprofil erforderlich.");const n=t.find(a=>a.definition.fallback)??t.find(a=>a.id==="generic")??t[0];return e.source.selected.toolId==="unknown"||e.source.requiresConfirmation?n:t.find(a=>a.id===e.source.selected.toolId)??n}function xv(e,t,n){if(!e.recognition)return e;const a=i4(e.recognition,t),i=s4(a,n),r=e.extraction?a4(e.extraction,i,a,t):e.mapping;return{...e,sheets:i.prioritizeSheets(e.sheets),profileId:i.id,profileVersion:i.version,scanTool:i.name,recognition:a,mapping:r,intermediate:e.intermediate&&r?{...e.intermediate,diagnostics:[...e.intermediate.diagnostics.filter(c=>c.stage!=="mapping"),...r.diagnostics],processing:[...e.intermediate.processing.filter(c=>c.stage!=="mapping"),r.processing]}:e.intermediate}}function r4(e){return/^\d{1,2}[./-]\d{1,2}[./-]\d{2,4}$/.test(je(e))}const tC=/^.{1,42}:$/;function o4(e){return tC.test(je(e))}function nC(e){if(e.length<2||e.some(n=>n.length!==2))return!1;const t=e.filter(n=>o4(n[0]));return t.length>=2&&t.length>=Math.ceil(e.length*.6)}function c4(e){let t={index:0,score:Number.NEGATIVE_INFINITY};return e.slice(0,12).forEach((n,a)=>{const i=n.map(je).filter(Boolean),c=e.slice(a+1,a+5).reduce((g,S)=>g+S.filter(x=>je(x)).length,0),l=new Set(i.map(g=>g.toLocaleLowerCase("de-DE"))).size,f=i.filter(g=>/[A-Za-zÄÖÜäöüß]/.test(g)&&g.length<=42).length,T=i.some(g=>g.length>55||g.includes(` +`))?4:0,p=i.filter(r4).length*1.5,m=i.length*2+l+f+c*.35-T-p-a*.25;m>t.score&&(t={index:a,score:m})}),t.index}function Ph(e){const t=new Map;return e.map((n,a)=>{const i=je(n)||`Feld ${a+1}`,r=t.get(i)??0;return t.set(i,r+1),r?`${i} (${r+1})`:i})}function od(e){let t=2166136261;for(let n=0;n>>0).toString(16).padStart(8,"0")}function _h(e){const t=e.headers.map((a,i)=>[je(a).toLocaleLowerCase("de-DE"),je(e.row[i]).toLocaleLowerCase("de-DE")]).filter(([,a])=>a).sort(([a],[i])=>a.localeCompare(i)),n=JSON.stringify({sourceFile:je(e.sourceFile).toLocaleLowerCase("de-DE"),sheetName:je(e.sheetName).toLocaleLowerCase("de-DE"),values:t,occurrence:e.occurrence??0});return`record-${od(n)}`}function Ou(e,t,n){const a=n===void 0?"":`::${n}`;return`sheet-${od(`${je(e)}::${je(t)}${a}`.toLocaleLowerCase("de-DE"))}`}function hu(e,t,n){return`project-${od(`${je(e)}::${t}::${n}`)}`}function aC(e,t){return`assessment-${od(`${je(e)}::${je(t)}`.toLocaleLowerCase("en-US"))}`}function iC(e){const t=e.map(je).filter(Boolean);if(!t.length)return"leer";const n=t.slice(0,30);return n.filter(r4).length/n.length>.65?"Datum":n.filter(a=>/^-?\d+([,.]\d+)?$/.test(a)).length/n.length>.75?"Zahl":new Set(n.map(a=>a.toLocaleLowerCase("de-DE"))).size<=Math.max(5,n.length*.35)?"Kategorie":n.some(a=>a.length>80)?"Text":"Text kurz"}function sC(e,t){const n=t.map(je).filter(Boolean),a=new Map;return n.forEach(i=>a.set(i,(a.get(i)??0)+1)),{header:e,type:iC(n),filled:n.length,total:t.length,fillRate:t.length?Math.round(n.length/t.length*100):0,unique:new Set(n.map(i=>i.toLocaleLowerCase("de-DE"))).size,topValues:[...a.entries()].sort((i,r)=>r[1]-i[1]).slice(0,4).map(([i,r])=>({value:i,count:r}))}}const rC=["benchmark item","benchmark","tätigkeit","aktivität","aufgabe","title","titel","name","finding","recommendation","indicator","scope","ziel","beschreibung","description","tool"],oC=["datum","status","zustand","norm","scope","priorität","risiko"];function l4(e){const t=e.headers.map((l,f)=>({label:l,value:ts(e.row[f]),index:f})),n=t.filter(l=>l.value),a=l=>/^(?:short\s*name|shortname|rule\s*id|control\s*id|test\s*id|id|key|code)$/i.test(l.trim()),i=n.filter(l=>!/^(?:quelle:|source:|datei|file|sheet|blatt|scan)/i.test(l.label.trim())),r=je(rC.map(l=>n.find(f=>!a(f.label)&&f.label.toLocaleLowerCase("de-DE").includes(l)&&f.value)).find(Boolean)?.value??i.find(l=>!a(l.label))?.value??i[0]?.value??n[0]?.value??`Datensatz ${e.index+1}`),c=n.filter(l=>oC.some(f=>l.label.toLocaleLowerCase("de-DE").includes(f))).slice(0,4);return{id:_h({sourceFile:e.sourceFile,sheetName:e.sheetName,headers:e.headers,row:e.row,occurrence:e.occurrence}),index:e.index,title:r,fields:t,filled:n,meta:c,sourceFile:e.sourceFile,sourceSheet:e.sheetName,highlighted:e.highlighted}}function cC(e,t,n="",a){const r=e.map((E,O)=>({row:E,highlighted:a?.[O]??!1})).filter(E=>E.row.some(O=>je(O))),c=r.map(E=>E.row);if(!c.length)return{headerIndex:0,headers:[],records:[],columns:[],signals:["Keine auswertbaren Inhalte gefunden."],title:""};const l=c.length===1,f=!l&&nC(c),T=l?-1:f?Math.max(0,c.findIndex(E=>o4(E[0]))):c4(c),p=T>0?c.slice(0,T).flat().map(je).filter(Boolean).join(" · "):"",m=l?c[0].length===1?["Hinweis"]:Ph(c[0].map(()=>"")):f?["Feld","Wert"]:Ph(c[T]??[]),g=l?r:r.slice(f?T:T+1).filter(E=>E.row.some(O=>je(O))),S=g.map(E=>E.row),x=new Map,y=g.map((E,O)=>{const N=JSON.stringify(E.row.map(je)),B=x.get(N)??0;return x.set(N,B+1),l4({row:E.row,headers:m,index:O,sourceFile:n,sheetName:t,occurrence:B,highlighted:E.highlighted})}),w=m.map((E,O)=>sC(E,S.map(N=>N[O]))),C=[];p&&C.push(`Titelbereich erkannt: ${p.slice(0,120)}`),f?C.push("Schlüssel/Wert-Tabelle ohne Kopfzeile erkannt: jede Zeile ist ein Wertepaar."):T>0&&C.push(`Die eigentliche Kopfzeile wurde in Zeile ${T+1} erkannt.`);const k=w.filter(E=>E.total&&E.fillRate<20).map(E=>E.header).slice(0,4);return k.length&&C.push(`Sehr leere Felder: ${k.join(", ")}.`),y.length||C.push("Nur Struktur erkannt, aber keine Datensätze unterhalb der Kopfzeile."),C.length||C.push("Struktur wirkt konsistent: Kopfzeile, Datensätze und Felder konnten abgeleitet werden."),{headerIndex:T,headers:m,records:y,columns:w,signals:C,title:p}}function lC(e){const t=e.reduce((n,a)=>Math.max(n,a.length),0);return e.map(n=>Array.from({length:t},(a,i)=>Fi(n[i]??"")))}function es(e,t,n,a,i={},r){const c=lC(t);return{id:Ou(a,e),name:e,rows:c,raw:n,sourceFile:a,sourceSheet:e,analysis:cC(c,e,a,r),...i}}function Mu(e){return e==null?null:e instanceof Date?e.toISOString():typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:Array.isArray(e)?e.map(Mu):typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,n])=>[t,Mu(n)])):String(e)}function uC(e,t){return e==null||t===""?"empty":e instanceof Date||/^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2})?/.test(t)?"date":typeof e=="number"||vi(t)!==null?"number":typeof e=="boolean"||/^(?:true|false)$/i.test(t)?"boolean":typeof e=="object"?"json":"string"}function dC(e){return{...e,extension:Rp(e)}}function TC(e){return{kind:"format-adapter",id:`${e.toLocaleLowerCase("en-US")}-format-adapter`,version:e==="HTML"?"1.1.1":e==="XML"?"1.1.0":"1.0.0"}}function Mf(e,t,n={},a=[]){return{version:1,source:{fileName:e,...n},processor:t,transformations:[{id:t.id,version:t.version,kind:"decode",lossless:!0},...a]}}function vo(e){const t=e.rawRows??e.decodedRows,n=e.decodedRows.reduce((c,l)=>Math.max(c,l.length),t.reduce((c,l)=>Math.max(c,l.length),0)),a=e.decodedRows.length?c4(e.decodedRows):-1,i=a>=0?[{rowIndex:a,headers:Ph(e.decodedRows[a]??[]),confidence:.7,reason:"Strukturell stärkste Kopfzeile der ersten zwölf Zeilen."}]:[],r=e.decodedRows.map((c,l)=>{const f=t[l]??[],T=Array.from({length:Math.max(c.length,f.length)},(p,m)=>{const g=f[m],S=Fi(c[m]);return{rawValue:Mu(g),decodedValue:S,detectedType:uC(g,S),source:{fileName:e.sourceFile,tableIndex:e.index,rowIndex:l,columnIndex:m,...e.positionForCell?.(l,m)}}});return{index:l,cells:T,source:{fileName:e.sourceFile,tableIndex:e.index,rowIndex:l},highlighted:e.highlightedRows?.[l]}});return{id:Ou(e.sourceFile,e.name,e.index),name:e.name,index:e.index,columns:Array.from({length:n},(c,l)=>({index:l,headerCandidates:i.map(f=>({rowIndex:f.rowIndex,value:f.headers[l]??"",confidence:f.confidence})).filter(f=>je(f.value)!=="")})),rows:r,rawText:e.rawText??e.decodedRows.map(c=>c.map(Fi).join(";")).join(` +`),headerCandidates:i,attributes:e.attributes??{}}}function b1(e){const t=TC(e.format),n=(e.diagnostics??[]).map(f=>({...f,stage:f.stage??"structure-decoding",provenance:f.provenance??Mf(e.file.name,t)})),a=e.discardedContent??[],i=n.some(f=>f.severity==="error")?"failed":n.some(f=>f.severity==="warning")||a.length?"partial":"complete",r=e.transformations??[],c=e.tables.map(f=>({kind:"table",id:`view-${f.id}`,name:f.name,tableId:f.id,source:{fileName:e.file.name,tableIndex:f.index},provenance:Mf(e.file.name,t,{tableIndex:f.index},[...r,...f.attributes.compatibilityProjection===!0?[{id:"tabular-compatibility-projection",version:"1.0.0",kind:"flatten-for-compatibility",lossless:!1}]:[]]),attributes:f.attributes})),l=(e.additionalViews??[]).map(f=>{const T={fileName:e.file.name,...f.source},p=Mf(e.file.name,t,f.source,r);return f.kind==="hierarchy"?{...f,source:T,provenance:p,attributes:f.attributes??{},nodes:f.nodes.map(m=>({...m,attributes:m.attributes??{},source:{fileName:e.file.name,objectPath:m.path,...m.source}}))}:f.kind==="container"?{...f,source:T,provenance:p,attributes:f.attributes??{},entries:f.entries.map(m=>({...m,source:{fileName:e.file.name,containerEntryPath:m.path}}))}:{...f,source:T,provenance:p,attributes:f.attributes??{}}});return{version:1,status:i,format:e.format,file:dC(e.file),rawText:e.rawText,tables:e.tables,diagnostics:n,discardedContent:a,views:[...c,...l],processing:[{stage:"format-decoding",status:i==="failed"?"failed":"complete",processor:t,diagnosticCodes:[]},{stage:"structure-decoding",status:i,processor:t,diagnosticCodes:n.map(f=>f.code)}]}}function w1(e){return{fileName:e.file.name,fileSize:e.file.sizeBytes,lastModified:e.file.lastModified,format:e.format,rawText:e.rawText,sheets:e.tables.map(t=>es(t.name,t.rows.map(n=>n.cells.map(a=>a.decodedValue)),t.rawText,e.file.name,{id:t.id,sourceTableIndex:t.index,workbookIndex:typeof t.attributes.workbookIndex=="number"?t.attributes.workbookIndex:void 0,hidden:typeof t.attributes.hidden=="number"?t.attributes.hidden:void 0},t.rows.map(n=>n.highlighted??!1))),intermediate:e}}function u4(e,t){const n=[],a=[];let i=[],r="",c=!1,l=1,f=1;for(let T=0;Tg!=="")&&(n.push(i),a.push(f)),i=[],r="",l+=1,f=l):(r+=p,(p===` +`||p==="\r")&&c&&(p==="\r"&&m===` +`&&(r+=` +`,T+=1),l+=1))}return i.push(r),i.some(T=>T!=="")&&(n.push(i),a.push(f)),{rows:n,rowStartLines:a,unclosedQuote:c}}function fC(e,t){return u4(e,t).rows}function hC(e){const t=e.split(/\r?\n/).filter(Boolean).slice(0,8);return[",",";"," ","|"].map(a=>{const r=t.map(l=>fC(l,a)[0]?.length??1).filter(l=>l>1),c=r.length?r.filter(l=>l===r[0]).length:0;return{candidate:a,score:c*100+(r[0]??1)}}).sort((a,i)=>i.score-a.score)[0].candidate}function pC(e,t,n="auto"){const a=n==="auto"||!n?hC(t):n,i=a==="\\t"?" ":a,r=u4(t,i),c=r.unclosedQuote?[{severity:"warning",code:"csv-unclosed-quote",message:"Die CSV-Datei endet innerhalb eines nicht geschlossenen Textfelds."}]:[];return b1({file:e,format:"CSV",rawText:t,tables:[vo({sourceFile:e.name,name:"CSV",index:0,decodedRows:r.rows,rawRows:r.rows,rawText:t,attributes:{delimiter:i}})],diagnostics:c})}function mC(e,t,n="auto"){return w1(pC(e,t,n))}var d4=1252,gC=[874,932,936,949,950,1250,1251,1252,1253,1254,1255,1256,1257,1258,1e4],Ip={0:1252,1:65001,2:65001,77:1e4,128:932,129:949,130:1361,134:936,136:950,161:1253,162:1254,163:1258,177:1255,178:1256,186:1257,204:1251,222:874,238:1250,255:1252,69:6969},Np=function(e){gC.indexOf(e)!=-1&&(d4=Ip[0]=e)};function vC(){Np(1252)}var Li=function(e){Np(e)};function T4(){Li(1200),vC()}function yv(e){for(var t=[],n=0,a=e.length;n>1;++n)t[n]=String.fromCharCode(e.charCodeAt(2*n)+(e.charCodeAt(2*n+1)<<8));return t.join("")}function f4(e){for(var t=[],n=0;n>1;++n)t[n]=String.fromCharCode(e.charCodeAt(2*n+1)+(e.charCodeAt(2*n)<<8));return t.join("")}var Oc=function(e){var t=e.charCodeAt(0),n=e.charCodeAt(1);return t==255&&n==254?xC(e.slice(2)):t==254&&n==255?f4(e.slice(2)):t==65279?e.slice(1):e},Ul=function(t){return String.fromCharCode(t)},Sv=function(t){return String.fromCharCode(t)},n1,dr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function bv(e){for(var t="",n=0,a=0,i=0,r=0,c=0,l=0,f=0,T=0;T>2,a=e.charCodeAt(T++),c=(n&3)<<4|a>>4,i=e.charCodeAt(T++),l=(a&15)<<2|i>>6,f=i&63,isNaN(a)?l=f=64:isNaN(i)&&(f=64),t+=dr.charAt(r)+dr.charAt(c)+dr.charAt(l)+dr.charAt(f);return t}function Qa(e){var t="",n=0,a=0,i=0,r=0,c=0,l=0,f=0;e=e.replace(/[^\w\+\/\=]/g,"");for(var T=0;T>4,t+=String.fromCharCode(n),l=dr.indexOf(e.charAt(T++)),a=(c&15)<<4|l>>2,l!==64&&(t+=String.fromCharCode(a)),f=dr.indexOf(e.charAt(T++)),i=(l&3)<<6|f,f!==64&&(t+=String.fromCharCode(i));return t}var Mt=(function(){return typeof Buffer<"u"&&typeof process<"u"&&typeof process.versions<"u"&&!!process.versions.node})(),u0=(function(){if(typeof Buffer<"u"){var e=!Buffer.from;if(!e)try{Buffer.from("foo","utf8")}catch{e=!0}return e?function(t,n){return n?new Buffer(t,n):new Buffer(t)}:Buffer.from.bind(Buffer)}return function(){}})();function pr(e){return Mt?Buffer.alloc?Buffer.alloc(e):new Buffer(e):typeof Uint8Array<"u"?new Uint8Array(e):new Array(e)}function wv(e){return Mt?Buffer.allocUnsafe?Buffer.allocUnsafe(e):new Buffer(e):typeof Uint8Array<"u"?new Uint8Array(e):new Array(e)}var Oi=function(t){return Mt?u0(t,"binary"):t.split("").map(function(n){return n.charCodeAt(0)&255})};function d0(e){if(Array.isArray(e))return e.map(function(a){return String.fromCharCode(a)}).join("");for(var t=[],n=0;n"u")throw new Error("Unsupported");if(e instanceof ArrayBuffer)return Op(new Uint8Array(e));for(var t=new Array(e.length),n=0;n>6&31,i[n++]=128|c&63;else if(c>=55296&&c<57344){c=(c&1023)+64;var l=e.charCodeAt(++r)&1023;i[n++]=240|c>>8&7,i[n++]=128|c>>2&63,i[n++]=128|l>>6&15|(c&3)<<4,i[n++]=128|l&63}else i[n++]=224|c>>12&15,i[n++]=128|c>>6&63,i[n++]=128|c&63;n>a&&(t.push(i.slice(0,n)),n=0,i=pr(65535),a=65530)}return t.push(i.slice(0,n)),lr(t)}var Oa=/\u0000/g,Mc=/[\u0001-\u0006]/g;function uo(e){for(var t="",n=e.length-1;n>=0;)t+=e.charAt(n--);return t}function Pi(e,t){var n=""+e;return n.length>=t?n:gn("0",t-n.length)+n}function Mp(e,t){var n=""+e;return n.length>=t?n:gn(" ",t-n.length)+n}function ju(e,t){var n=""+e;return n.length>=t?n:n+gn(" ",t-n.length)}function SC(e,t){var n=""+Math.round(e);return n.length>=t?n:gn("0",t-n.length)+n}function bC(e,t){var n=""+e;return n.length>=t?n:gn("0",t-n.length)+n}var Cv=Math.pow(2,32);function $0(e,t){if(e>Cv||e<-Cv)return SC(e,t);var n=Math.round(e);return bC(n,t)}function Fu(e,t){return t=t||0,e.length>=7+t&&(e.charCodeAt(t)|32)===103&&(e.charCodeAt(t+1)|32)===101&&(e.charCodeAt(t+2)|32)===110&&(e.charCodeAt(t+3)|32)===101&&(e.charCodeAt(t+4)|32)===114&&(e.charCodeAt(t+5)|32)===97&&(e.charCodeAt(t+6)|32)===108}var Ev=[["Sun","Sunday"],["Mon","Monday"],["Tue","Tuesday"],["Wed","Wednesday"],["Thu","Thursday"],["Fri","Friday"],["Sat","Saturday"]],jf=[["J","Jan","January"],["F","Feb","February"],["M","Mar","March"],["A","Apr","April"],["M","May","May"],["J","Jun","June"],["J","Jul","July"],["A","Aug","August"],["S","Sep","September"],["O","Oct","October"],["N","Nov","November"],["D","Dec","December"]];function wC(e){return e||(e={}),e[0]="General",e[1]="0",e[2]="0.00",e[3]="#,##0",e[4]="#,##0.00",e[9]="0%",e[10]="0.00%",e[11]="0.00E+00",e[12]="# ?/?",e[13]="# ??/??",e[14]="m/d/yy",e[15]="d-mmm-yy",e[16]="d-mmm",e[17]="mmm-yy",e[18]="h:mm AM/PM",e[19]="h:mm:ss AM/PM",e[20]="h:mm",e[21]="h:mm:ss",e[22]="m/d/yy h:mm",e[37]="#,##0 ;(#,##0)",e[38]="#,##0 ;[Red](#,##0)",e[39]="#,##0.00;(#,##0.00)",e[40]="#,##0.00;[Red](#,##0.00)",e[45]="mm:ss",e[46]="[h]:mm:ss",e[47]="mmss.0",e[48]="##0.0E+0",e[49]="@",e[56]='"上午/下午 "hh"時"mm"分"ss"秒 "',e}var vt={0:"General",1:"0",2:"0.00",3:"#,##0",4:"#,##0.00",9:"0%",10:"0.00%",11:"0.00E+00",12:"# ?/?",13:"# ??/??",14:"m/d/yy",15:"d-mmm-yy",16:"d-mmm",17:"mmm-yy",18:"h:mm AM/PM",19:"h:mm:ss AM/PM",20:"h:mm",21:"h:mm:ss",22:"m/d/yy h:mm",37:"#,##0 ;(#,##0)",38:"#,##0 ;[Red](#,##0)",39:"#,##0.00;(#,##0.00)",40:"#,##0.00;[Red](#,##0.00)",45:"mm:ss",46:"[h]:mm:ss",47:"mmss.0",48:"##0.0E+0",49:"@",56:'"上午/下午 "hh"時"mm"分"ss"秒 "'},kv={5:37,6:38,7:39,8:40,23:0,24:0,25:0,26:0,27:14,28:14,29:14,30:14,31:14,50:14,51:14,52:14,53:14,54:14,55:14,56:14,57:14,58:14,59:1,60:2,61:3,62:4,67:9,68:10,69:12,70:13,71:14,72:14,73:15,74:16,75:17,76:20,77:21,78:22,79:45,80:46,81:47,82:0},CC={5:'"$"#,##0_);\\("$"#,##0\\)',63:'"$"#,##0_);\\("$"#,##0\\)',6:'"$"#,##0_);[Red]\\("$"#,##0\\)',64:'"$"#,##0_);[Red]\\("$"#,##0\\)',7:'"$"#,##0.00_);\\("$"#,##0.00\\)',65:'"$"#,##0.00_);\\("$"#,##0.00\\)',8:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',66:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',41:'_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)',42:'_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)',43:'_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)',44:'_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'};function Lu(e,t,n){for(var a=e<0?-1:1,i=e*a,r=0,c=1,l=0,f=1,T=0,p=0,m=Math.floor(i);Tt&&(T>t?(p=f,l=r):(p=T,l=c)),!n)return[0,a*l,p];var g=Math.floor(a*l/p);return[g,a*l-g*p,p]}function $r(e,t,n){if(e>2958465||e<0)return null;var a=e|0,i=Math.floor(86400*(e-a)),r=0,c=[],l={D:a,T:i,u:86400*(e-a)-i,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(l.u)<1e-6&&(l.u=0),t&&t.date1904&&(a+=1462),l.u>.9999&&(l.u=0,++i==86400&&(l.T=i=0,++a,++l.D)),a===60)c=n?[1317,10,29]:[1900,2,29],r=3;else if(a===0)c=n?[1317,8,29]:[1900,1,0],r=6;else{a>60&&--a;var f=new Date(1900,0,1);f.setDate(f.getDate()+a-1),c=[f.getFullYear(),f.getMonth()+1,f.getDate()],r=f.getDay(),a<60&&(r=(r+6)%7),n&&(r=IC(f,c))}return l.y=c[0],l.m=c[1],l.d=c[2],l.S=i%60,i=Math.floor(i/60),l.M=i%60,i=Math.floor(i/60),l.H=i,l.q=r,l}var h4=new Date(1899,11,31,0,0,0),EC=h4.getTime(),kC=new Date(1900,2,1,0,0,0);function p4(e,t){var n=e.getTime();return t?n-=1461*24*60*60*1e3:e>=kC&&(n+=1440*60*1e3),(n-(EC+(e.getTimezoneOffset()-h4.getTimezoneOffset())*6e4))/(1440*60*1e3)}function jp(e){return e.indexOf(".")==-1?e:e.replace(/(?:\.0*|(\.\d*[1-9])0+)$/,"$1")}function AC(e){return e.indexOf("E")==-1?e:e.replace(/(?:\.0*|(\.\d*[1-9])0+)[Ee]/,"$1E").replace(/(E[+-])(\d)$/,"$10$2")}function RC(e){var t=e<0?12:11,n=jp(e.toFixed(12));return n.length<=t||(n=e.toPrecision(10),n.length<=t)?n:e.toExponential(5)}function DC(e){var t=jp(e.toFixed(11));return t.length>(e<0?12:11)||t==="0"||t==="-0"?e.toPrecision(6):t}function a1(e){var t=Math.floor(Math.log(Math.abs(e))*Math.LOG10E),n;return t>=-4&&t<=-1?n=e.toPrecision(10+t):Math.abs(t)<=9?n=RC(e):t===10?n=e.toFixed(10).substr(0,12):n=DC(e),jp(AC(n.toUpperCase()))}function i0(e,t){switch(typeof e){case"string":return e;case"boolean":return e?"TRUE":"FALSE";case"number":return(e|0)===e?e.toString(10):a1(e);case"undefined":return"";case"object":if(e==null)return"";if(e instanceof Date)return xi(14,p4(e,t&&t.date1904),t)}throw new Error("unsupported value in General format: "+e)}function IC(e,t){t[0]-=581;var n=e.getDay();return e<60&&(n=(n+6)%7),n}function NC(e,t,n,a){var i="",r=0,c=0,l=n.y,f,T=0;switch(e){case 98:l=n.y+543;case 121:switch(t.length){case 1:case 2:f=l%100,T=2;break;default:f=l%1e4,T=4;break}break;case 109:switch(t.length){case 1:case 2:f=n.m,T=t.length;break;case 3:return jf[n.m-1][1];case 5:return jf[n.m-1][0];default:return jf[n.m-1][2]}break;case 100:switch(t.length){case 1:case 2:f=n.d,T=t.length;break;case 3:return Ev[n.q][0];default:return Ev[n.q][1]}break;case 104:switch(t.length){case 1:case 2:f=1+(n.H+11)%12,T=t.length;break;default:throw"bad hour format: "+t}break;case 72:switch(t.length){case 1:case 2:f=n.H,T=t.length;break;default:throw"bad hour format: "+t}break;case 77:switch(t.length){case 1:case 2:f=n.M,T=t.length;break;default:throw"bad minute format: "+t}break;case 115:if(t!="s"&&t!="ss"&&t!=".0"&&t!=".00"&&t!=".000")throw"bad second format: "+t;return n.u===0&&(t=="s"||t=="ss")?Pi(n.S,t.length):(a>=2?c=a===3?1e3:100:c=a===1?10:1,r=Math.round(c*(n.S+n.u)),r>=60*c&&(r=0),t==="s"?r===0?"0":""+r/c:(i=Pi(r,2+a),t==="ss"?i.substr(0,2):"."+i.substr(2,t.length-1)));case 90:switch(t){case"[h]":case"[hh]":f=n.D*24+n.H;break;case"[m]":case"[mm]":f=(n.D*24+n.H)*60+n.M;break;case"[s]":case"[ss]":f=((n.D*24+n.H)*60+n.M)*60+Math.round(n.S+n.u);break;default:throw"bad abstime format: "+t}T=t.length===3?1:2;break;case 101:f=l,T=1;break}var p=T>0?Pi(f,T):"";return p}function Tr(e){var t=3;if(e.length<=t)return e;for(var n=e.length%t,a=e.substr(0,n);n!=e.length;n+=t)a+=(a.length>0?",":"")+e.substr(n,t);return a}var m4=/%/g;function OC(e,t,n){var a=t.replace(m4,""),i=t.length-a.length;return Ds(e,a,n*Math.pow(10,2*i))+gn("%",i)}function MC(e,t,n){for(var a=t.length-1;t.charCodeAt(a-1)===44;)--a;return Ds(e,t.substr(0,a),n/Math.pow(10,3*(t.length-a)))}function g4(e,t){var n,a=e.indexOf("E")-e.indexOf(".")-1;if(e.match(/^#+0.0E\+0$/)){if(t==0)return"0.0E+0";if(t<0)return"-"+g4(e,-t);var i=e.indexOf(".");i===-1&&(i=e.indexOf("E"));var r=Math.floor(Math.log(t)*Math.LOG10E)%i;if(r<0&&(r+=i),n=(t/Math.pow(10,r)).toPrecision(a+1+(i+r)%i),n.indexOf("e")===-1){var c=Math.floor(Math.log(t)*Math.LOG10E);for(n.indexOf(".")===-1?n=n.charAt(0)+"."+n.substr(1)+"E+"+(c-n.length+r):n+="E+"+(c-r);n.substr(0,2)==="0.";)n=n.charAt(0)+n.substr(2,i)+"."+n.substr(2+i),n=n.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");n=n.replace(/\+-/,"-")}n=n.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function(l,f,T,p){return f+T+p.substr(0,(i+r)%i)+"."+p.substr(r)+"E"})}else n=t.toExponential(a);return e.match(/E\+00$/)&&n.match(/e[+-]\d$/)&&(n=n.substr(0,n.length-1)+"0"+n.charAt(n.length-1)),e.match(/E\-/)&&n.match(/e\+/)&&(n=n.replace(/e\+/,"e")),n.replace("e","E")}var v4=/# (\?+)( ?)\/( ?)(\d+)/;function jC(e,t,n){var a=parseInt(e[4],10),i=Math.round(t*a),r=Math.floor(i/a),c=i-r*a,l=a;return n+(r===0?"":""+r)+" "+(c===0?gn(" ",e[1].length+1+e[4].length):Mp(c,e[1].length)+e[2]+"/"+e[3]+Pi(l,e[4].length))}function FC(e,t,n){return n+(t===0?"":""+t)+gn(" ",e[1].length+2+e[4].length)}var x4=/^#*0*\.([0#]+)/,y4=/\).*[0#]/,S4=/\(###\) ###\\?-####/;function Aa(e){for(var t="",n,a=0;a!=e.length;++a)switch(n=e.charCodeAt(a)){case 35:break;case 63:t+=" ";break;case 48:t+="0";break;default:t+=String.fromCharCode(n)}return t}function Av(e,t){var n=Math.pow(10,t);return""+Math.round(e*n)/n}function Rv(e,t){var n=e-Math.floor(e),a=Math.pow(10,t);return t<(""+Math.round(n*a)).length?0:Math.round(n*a)}function LC(e,t){return t<(""+Math.round((e-Math.floor(e))*Math.pow(10,t))).length?1:0}function PC(e){return e<2147483647&&e>-2147483648?""+(e>=0?e|0:e-1|0):""+Math.floor(e)}function fi(e,t,n){if(e.charCodeAt(0)===40&&!t.match(y4)){var a=t.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");return n>=0?fi("n",a,n):"("+fi("n",a,-n)+")"}if(t.charCodeAt(t.length-1)===44)return MC(e,t,n);if(t.indexOf("%")!==-1)return OC(e,t,n);if(t.indexOf("E")!==-1)return g4(t,n);if(t.charCodeAt(0)===36)return"$"+fi(e,t.substr(t.charAt(1)==" "?2:1),n);var i,r,c,l,f=Math.abs(n),T=n<0?"-":"";if(t.match(/^00+$/))return T+$0(f,t.length);if(t.match(/^[#?]+$/))return i=$0(n,0),i==="0"&&(i=""),i.length>t.length?i:Aa(t.substr(0,t.length-i.length))+i;if(r=t.match(v4))return jC(r,f,T);if(t.match(/^#+0+$/))return T+$0(f,t.length-t.indexOf("0"));if(r=t.match(x4))return i=Av(n,r[1].length).replace(/^([^\.]+)$/,"$1."+Aa(r[1])).replace(/\.$/,"."+Aa(r[1])).replace(/\.(\d*)$/,function(x,y){return"."+y+gn("0",Aa(r[1]).length-y.length)}),t.indexOf("0.")!==-1?i:i.replace(/^0\./,".");if(t=t.replace(/^#+([0.])/,"$1"),r=t.match(/^(0*)\.(#*)$/))return T+Av(f,r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");if(r=t.match(/^#{1,3},##0(\.?)$/))return T+Tr($0(f,0));if(r=t.match(/^#,##0\.([#0]*0)$/))return n<0?"-"+fi(e,t,-n):Tr(""+(Math.floor(n)+LC(n,r[1].length)))+"."+Pi(Rv(n,r[1].length),r[1].length);if(r=t.match(/^#,#*,#0/))return fi(e,t.replace(/^#,#*,/,""),n);if(r=t.match(/^([0#]+)(\\?-([0#]+))+$/))return i=uo(fi(e,t.replace(/[\\-]/g,""),n)),c=0,uo(uo(t.replace(/\\/g,"")).replace(/[0#]/g,function(x){return c=0?Ki("n",a,n):"("+Ki("n",a,-n)+")"}if(t.charCodeAt(t.length-1)===44)return _C(e,t,n);if(t.indexOf("%")!==-1)return qC(e,t,n);if(t.indexOf("E")!==-1)return b4(t,n);if(t.charCodeAt(0)===36)return"$"+Ki(e,t.substr(t.charAt(1)==" "?2:1),n);var i,r,c,l,f=Math.abs(n),T=n<0?"-":"";if(t.match(/^00+$/))return T+Pi(f,t.length);if(t.match(/^[#?]+$/))return i=""+n,n===0&&(i=""),i.length>t.length?i:Aa(t.substr(0,t.length-i.length))+i;if(r=t.match(v4))return FC(r,f,T);if(t.match(/^#+0+$/))return T+Pi(f,t.length-t.indexOf("0"));if(r=t.match(x4))return i=(""+n).replace(/^([^\.]+)$/,"$1."+Aa(r[1])).replace(/\.$/,"."+Aa(r[1])),i=i.replace(/\.(\d*)$/,function(x,y){return"."+y+gn("0",Aa(r[1]).length-y.length)}),t.indexOf("0.")!==-1?i:i.replace(/^0\./,".");if(t=t.replace(/^#+([0.])/,"$1"),r=t.match(/^(0*)\.(#*)$/))return T+(""+f).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");if(r=t.match(/^#{1,3},##0(\.?)$/))return T+Tr(""+f);if(r=t.match(/^#,##0\.([#0]*0)$/))return n<0?"-"+Ki(e,t,-n):Tr(""+n)+"."+gn("0",r[1].length);if(r=t.match(/^#,#*,#0/))return Ki(e,t.replace(/^#,#*,/,""),n);if(r=t.match(/^([0#]+)(\\?-([0#]+))+$/))return i=uo(Ki(e,t.replace(/[\\-]/g,""),n)),c=0,uo(uo(t.replace(/\\/g,"")).replace(/[0#]/g,function(x){return c-1||n=="\\"&&e.charAt(t+1)=="-"&&"0#".indexOf(e.charAt(t+2))>-1););break;case"?":for(;e.charAt(++t)===n;);break;case"*":++t,(e.charAt(t)==" "||e.charAt(t)=="*")&&++t;break;case"(":case")":++t;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":for(;t-1;);break;case" ":++t;break;default:++t;break}return!1}function UC(e,t,n,a){for(var i=[],r="",c=0,l="",f="t",T,p,m,g="H";c=12?"P":"A"),y.t="T",g="h",c+=3):e.substr(c,5).toUpperCase()==="AM/PM"?(T!=null&&(y.v=T.H>=12?"PM":"AM"),y.t="T",c+=5,g="h"):e.substr(c,5).toUpperCase()==="上午/下午"?(T!=null&&(y.v=T.H>=12?"下午":"上午"),y.t="T",c+=5,g="h"):(y.t="t",++c),T==null&&y.t==="T")return"";i[i.length]=y,f=l;break;case"[":for(r=l;e.charAt(c++)!=="]"&&c-1&&(r=(r.match(/\$([^-\[\]]*)/)||[])[1]||"$",Co(e)||(i[i.length]={t:"t",v:r}));break;case".":if(T!=null){for(r=l;++c-1;)r+=l;i[i.length]={t:"n",v:r};break;case"?":for(r=l;e.charAt(++c)===l;)r+=l;i[i.length]={t:l,v:r},f=l;break;case"*":++c,(e.charAt(c)==" "||e.charAt(c)=="*")&&++c;break;case"(":case")":i[i.length]={t:a===1?"t":l,v:l},++c;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":for(r=l;c-1;)r+=e.charAt(c);i[i.length]={t:"D",v:r};break;case" ":i[i.length]={t:l,v:l},++c;break;case"$":i[i.length]={t:"t",v:"$"},++c;break;default:if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(l)===-1)throw new Error("unrecognized character "+l+" in "+e);i[i.length]={t:"t",v:l},++c;break}var w=0,C=0,k;for(c=i.length-1,f="t";c>=0;--c)switch(i[c].t){case"h":case"H":i[c].t=g,f="h",w<1&&(w=1);break;case"s":(k=i[c].v.match(/\.0+$/))&&(C=Math.max(C,k[0].length-1)),w<3&&(w=3);case"d":case"y":case"M":case"e":f=i[c].t;break;case"m":f==="s"&&(i[c].t="M",w<2&&(w=2));break;case"X":break;case"Z":w<1&&i[c].v.match(/[Hh]/)&&(w=1),w<2&&i[c].v.match(/[Mm]/)&&(w=2),w<3&&i[c].v.match(/[Ss]/)&&(w=3)}switch(w){case 0:break;case 1:T.u>=.5&&(T.u=0,++T.S),T.S>=60&&(T.S=0,++T.M),T.M>=60&&(T.M=0,++T.H);break;case 2:T.u>=.5&&(T.u=0,++T.S),T.S>=60&&(T.S=0,++T.M);break}var E="",O;for(c=0;c0){E.charCodeAt(0)==40?(B=t<0&&E.charCodeAt(0)===45?-t:t,A=Ds("n",E,B)):(B=t<0&&a>1?-t:t,A=Ds("n",E,B),B<0&&i[0]&&i[0].t=="t"&&(A=A.substr(1),i[0].v="-"+i[0].v)),O=A.length-1;var z=i.length;for(c=0;c-1){z=c;break}var P=i.length;if(z===i.length&&A.indexOf("E")===-1){for(c=i.length-1;c>=0;--c)i[c]==null||"n?".indexOf(i[c].t)===-1||(O>=i[c].v.length-1?(O-=i[c].v.length,i[c].v=A.substr(O+1,i[c].v.length)):O<0?i[c].v="":(i[c].v=A.substr(0,O+1),O=-1),i[c].t="t",P=c);O>=0&&P=0;--c)if(!(i[c]==null||"n?".indexOf(i[c].t)===-1)){for(p=i[c].v.indexOf(".")>-1&&c===z?i[c].v.indexOf(".")-1:i[c].v.length-1,N=i[c].v.substr(p+1);p>=0;--p)O>=0&&(i[c].v.charAt(p)==="0"||i[c].v.charAt(p)==="#")&&(N=A.charAt(O--)+N);i[c].v=N,i[c].t="t",P=c}for(O>=0&&P-1&&c===z?i[c].v.indexOf(".")+1:0,N=i[c].v.substr(0,p);p-1&&(B=a>1&&t<0&&c>0&&i[c-1].v==="-"?-t:t,i[c].v=Ds(i[c].t,i[c].v,B),i[c].t="t");var K="";for(c=0;c!==i.length;++c)i[c]!=null&&(K+=i[c].v);return K}var Dv=/\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;function Iv(e,t){if(t==null)return!1;var n=parseFloat(t[2]);switch(t[1]){case"=":if(e==n)return!0;break;case">":if(e>n)return!0;break;case"<":if(e":if(e!=n)return!0;break;case">=":if(e>=n)return!0;break;case"<=":if(e<=n)return!0;break}return!1}function zC(e,t){var n=BC(e),a=n.length,i=n[a-1].indexOf("@");if(a<4&&i>-1&&--a,n.length>4)throw new Error("cannot find right format for |"+n.join("|")+"|");if(typeof t!="number")return[4,n.length===4||i>-1?n[n.length-1]:"@"];switch(n.length){case 1:n=i>-1?["General","General","General",n[0]]:[n[0],n[0],n[0],"@"];break;case 2:n=i>-1?[n[0],n[0],n[0],n[1]]:[n[0],n[1],n[0],"@"];break;case 3:n=i>-1?[n[0],n[1],n[0],n[2]]:[n[0],n[1],n[2],"@"];break}var r=t>0?n[0]:t<0?n[1]:n[2];if(n[0].indexOf("[")===-1&&n[1].indexOf("[")===-1)return[a,r];if(n[0].match(/\[[=<>]/)!=null||n[1].match(/\[[=<>]/)!=null){var c=n[0].match(Dv),l=n[1].match(Dv);return Iv(t,c)?[a,n[0]]:Iv(t,l)?[a,n[1]]:[a,n[c!=null&&l!=null?2:1]]}return[a,r]}function xi(e,t,n){n==null&&(n={});var a="";switch(typeof e){case"string":e=="m/d/yy"&&n.dateNF?a=n.dateNF:a=e;break;case"number":e==14&&n.dateNF?a=n.dateNF:a=(n.table!=null?n.table:vt)[e],a==null&&(a=n.table&&n.table[kv[e]]||vt[kv[e]]),a==null&&(a=CC[e]||"General");break}if(Fu(a,0))return i0(t,n);t instanceof Date&&(t=p4(t,n.date1904));var i=zC(a,t);if(Fu(i[1]))return i0(t,n);if(t===!0)t="TRUE";else if(t===!1)t="FALSE";else if(t===""||t==null)return"";return UC(i[1],t,n,i[0])}function e0(e,t){if(typeof t!="number"){t=+t||-1;for(var n=0;n<392;++n){if(vt[n]==null){t<0&&(t=n);continue}if(vt[n]==e){t=n;break}}t<0&&(t=391)}return vt[t]=e,t}function C4(){vt=wC()}var WC={5:'"$"#,##0_);\\("$"#,##0\\)',6:'"$"#,##0_);[Red]\\("$"#,##0\\)',7:'"$"#,##0.00_);\\("$"#,##0.00\\)',8:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',23:"General",24:"General",25:"General",26:"General",27:"m/d/yy",28:"m/d/yy",29:"m/d/yy",30:"m/d/yy",31:"m/d/yy",32:"h:mm:ss",33:"h:mm:ss",34:"h:mm:ss",35:"h:mm:ss",36:"m/d/yy",41:'_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)',42:'_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)',43:'_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)',44:'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)',50:"m/d/yy",51:"m/d/yy",52:"m/d/yy",53:"m/d/yy",54:"m/d/yy",55:"m/d/yy",56:"m/d/yy",57:"m/d/yy",58:"m/d/yy",59:"0",60:"0.00",61:"#,##0",62:"#,##0.00",63:'"$"#,##0_);\\("$"#,##0\\)',64:'"$"#,##0_);[Red]\\("$"#,##0\\)',65:'"$"#,##0.00_);\\("$"#,##0.00\\)',66:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',67:"0%",68:"0.00%",69:"# ?/?",70:"# ??/??",71:"m/d/yy",72:"m/d/yy",73:"d-mmm-yy",74:"d-mmm",75:"mmm-yy",76:"h:mm",77:"h:mm:ss",78:"m/d/yy h:mm",79:"mm:ss",80:"[h]:mm:ss",81:"mmss.0"},E4=/[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;function VC(e){var t=typeof e=="number"?vt[e]:e;return t=t.replace(E4,"(\\d+)"),new RegExp("^"+t+"$")}function HC(e,t,n){var a=-1,i=-1,r=-1,c=-1,l=-1,f=-1;(t.match(E4)||[]).forEach(function(m,g){var S=parseInt(n[g+1],10);switch(m.toLowerCase().charAt(0)){case"y":a=S;break;case"d":r=S;break;case"h":c=S;break;case"s":f=S;break;case"m":c>=0?l=S:i=S;break}}),f>=0&&l==-1&&i>=0&&(l=i,i=-1);var T=(""+(a>=0?a:new Date().getFullYear())).slice(-4)+"-"+("00"+(i>=1?i:1)).slice(-2)+"-"+("00"+(r>=1?r:1)).slice(-2);T.length==7&&(T="0"+T),T.length==8&&(T="20"+T);var p=("00"+(c>=0?c:0)).slice(-2)+":"+("00"+(l>=0?l:0)).slice(-2)+":"+("00"+(f>=0?f:0)).slice(-2);return c==-1&&l==-1&&f==-1?T:a==-1&&i==-1&&r==-1?p:T+"T"+p}var GC=(function(){var e={};e.version="1.2.0";function t(){for(var A=0,z=new Array(256),P=0;P!=256;++P)A=P,A=A&1?-306674912^A>>>1:A>>>1,A=A&1?-306674912^A>>>1:A>>>1,A=A&1?-306674912^A>>>1:A>>>1,A=A&1?-306674912^A>>>1:A>>>1,A=A&1?-306674912^A>>>1:A>>>1,A=A&1?-306674912^A>>>1:A>>>1,A=A&1?-306674912^A>>>1:A>>>1,A=A&1?-306674912^A>>>1:A>>>1,z[P]=A;return typeof Int32Array<"u"?new Int32Array(z):z}var n=t();function a(A){var z=0,P=0,K=0,I=typeof Int32Array<"u"?new Int32Array(4096):new Array(4096);for(K=0;K!=256;++K)I[K]=A[K];for(K=0;K!=256;++K)for(P=A[K],z=256+K;z<4096;z+=256)P=I[z]=P>>>8^A[P&255];var L=[];for(K=1;K!=16;++K)L[K-1]=typeof Int32Array<"u"?I.subarray(K*256,K*256+256):I.slice(K*256,K*256+256);return L}var i=a(n),r=i[0],c=i[1],l=i[2],f=i[3],T=i[4],p=i[5],m=i[6],g=i[7],S=i[8],x=i[9],y=i[10],w=i[11],C=i[12],k=i[13],E=i[14];function O(A,z){for(var P=z^-1,K=0,I=A.length;K>>8^n[(P^A.charCodeAt(K++))&255];return~P}function N(A,z){for(var P=z^-1,K=A.length-15,I=0;I>8&255]^C[A[I++]^P>>16&255]^w[A[I++]^P>>>24]^y[A[I++]]^x[A[I++]]^S[A[I++]]^g[A[I++]]^m[A[I++]]^p[A[I++]]^T[A[I++]]^f[A[I++]]^l[A[I++]]^c[A[I++]]^r[A[I++]]^n[A[I++]];for(K+=15;I>>8^n[(P^A[I++])&255];return~P}function B(A,z){for(var P=z^-1,K=0,I=A.length,L=0,le=0;K>>8^n[(P^L)&255]:L<2048?(P=P>>>8^n[(P^(192|L>>6&31))&255],P=P>>>8^n[(P^(128|L&63))&255]):L>=55296&&L<57344?(L=(L&1023)+64,le=A.charCodeAt(K++)&1023,P=P>>>8^n[(P^(240|L>>8&7))&255],P=P>>>8^n[(P^(128|L>>2&63))&255],P=P>>>8^n[(P^(128|le>>6&15|(L&3)<<4))&255],P=P>>>8^n[(P^(128|le&63))&255]):(P=P>>>8^n[(P^(224|L>>12&15))&255],P=P>>>8^n[(P^(128|L>>6&63))&255],P=P>>>8^n[(P^(128|L&63))&255]);return~P}return e.table=n,e.bstr=O,e.buf=N,e.str=B,e})(),Ft=(function(){var t={};t.version="1.2.1";function n(q,ne){for(var V=q.split("/"),G=ne.split("/"),Q=0,ie=0,W=Math.min(V.length,G.length);Q>>1,q.write_shift(2,V);var G=ne.getFullYear()-1980;G=G<<4|ne.getMonth()+1,G=G<<5|ne.getDate(),q.write_shift(2,G)}function c(q){var ne=q.read_shift(2)&65535,V=q.read_shift(2)&65535,G=new Date,Q=V&31;V>>>=5;var ie=V&15;V>>>=4,G.setMilliseconds(0),G.setFullYear(V+1980),G.setMonth(ie-1),G.setDate(Q);var W=ne&31;ne>>>=5;var D=ne&63;return ne>>>=6,G.setHours(ne),G.setMinutes(D),G.setSeconds(W<<1),G}function l(q){aa(q,0);for(var ne={},V=0;q.l<=q.length-4;){var G=q.read_shift(2),Q=q.read_shift(2),ie=q.l+Q,W={};G===21589&&(V=q.read_shift(1),V&1&&(W.mtime=q.read_shift(4)),Q>5&&(V&2&&(W.atime=q.read_shift(4)),V&4&&(W.ctime=q.read_shift(4))),W.mtime&&(W.mt=new Date(W.mtime*1e3))),q.l=ie,ne[G]=W}return ne}var f;function T(){return f||(f={})}function p(q,ne){if(q[0]==80&&q[1]==75)return Me(q,ne);if((q[0]|32)==109&&(q[1]|32)==105)return Wn(q,ne);if(q.length<512)throw new Error("CFB file size "+q.length+" < 512");var V=3,G=512,Q=0,ie=0,W=0,D=0,j=0,_=[],se=q.slice(0,512);aa(se,0);var xe=m(se);switch(V=xe[0],V){case 3:G=512;break;case 4:G=4096;break;case 0:if(xe[1]==0)return Me(q,ne);default:throw new Error("Major Version: Expected 3 or 4 saw "+V)}G!==512&&(se=q.slice(0,G),aa(se,28));var Ae=q.slice(0,G);g(se,V);var Fe=se.read_shift(4,"i");if(V===3&&Fe!==0)throw new Error("# Directory Sectors: Expected 0 saw "+Fe);se.l+=4,W=se.read_shift(4,"i"),se.l+=4,se.chk("00100000","Mini Stream Cutoff Size: "),D=se.read_shift(4,"i"),Q=se.read_shift(4,"i"),j=se.read_shift(4,"i"),ie=se.read_shift(4,"i");for(var Oe=-1,Ue=0;Ue<109&&(Oe=se.read_shift(4,"i"),!(Oe<0));++Ue)_[Ue]=Oe;var Ge=S(q,G);w(j,ie,Ge,G,_);var kt=k(Ge,W,_,G);kt[W].name="!Directory",Q>0&&D!==le&&(kt[D].name="!MiniFAT"),kt[_[0]].name="!FAT",kt.fat_addrs=_,kt.ssz=G;var Be={},ct=[],St=[],kn=[];E(W,kt,Ge,ct,Q,Be,St,D),x(St,kn,ct),ct.shift();var ni={FileIndex:St,FullPaths:kn};return ne&&ne.raw&&(ni.raw={header:Ae,sectors:Ge}),ni}function m(q){if(q[q.l]==80&&q[q.l+1]==75)return[0,0];q.chk(ue,"Header Signature: "),q.l+=16;var ne=q.read_shift(2,"u");return[q.read_shift(2,"u"),ne]}function g(q,ne){var V=9;switch(q.l+=2,V=q.read_shift(2)){case 9:if(ne!=3)throw new Error("Sector Shift: Expected 9 saw "+V);break;case 12:if(ne!=4)throw new Error("Sector Shift: Expected 12 saw "+V);break;default:throw new Error("Sector Shift: Expected 9 or 12 saw "+V)}q.chk("0600","Mini Sector Shift: "),q.chk("000000000000","Reserved: ")}function S(q,ne){for(var V=Math.ceil(q.length/ne)-1,G=[],Q=1;Q0&&W>=0;)ie.push(ne.slice(W*L,W*L+L)),Q-=L,W=Xr(V,W*4);return ie.length===0?Bn(0):lr(ie).slice(0,q.size)}function w(q,ne,V,G,Q){var ie=le;if(q===le){if(ne!==0)throw new Error("DIFAT chain shorter than expected")}else if(q!==-1){var W=V[q],D=(G>>>2)-1;if(!W)return;for(var j=0;j=0;){Q[j]=!0,ie[ie.length]=j,W.push(q[j]);var se=V[Math.floor(j*4/G)];if(_=j*4&D,G<4+_)throw new Error("FAT boundary crossed: "+j+" 4 "+G);if(!q[se])break;j=Xr(q[se],_)}return{nodes:ie,data:Bv([W])}}function k(q,ne,V,G){var Q=q.length,ie=[],W=[],D=[],j=[],_=G-1,se=0,xe=0,Ae=0,Fe=0;for(se=0;se=Q&&(Ae-=Q),!W[Ae]){j=[];var Oe=[];for(xe=Ae;xe>=0;){Oe[xe]=!0,W[xe]=!0,D[D.length]=xe,j.push(q[xe]);var Ue=V[Math.floor(xe*4/G)];if(Fe=xe*4&_,G<4+Fe)throw new Error("FAT boundary crossed: "+xe+" 4 "+G);if(!q[Ue]||(xe=Xr(q[Ue],Fe),Oe[xe]))break}ie[Ae]={nodes:D,data:Bv([j])}}return ie}function E(q,ne,V,G,Q,ie,W,D){for(var j=0,_=G.length?2:0,se=ne[q].data,xe=0,Ae=0,Fe;xe0&&j!==le&&(ne[j].name="!StreamData")):Ue.size>=4096?(Ue.storage="fat",ne[Ue.start]===void 0&&(ne[Ue.start]=C(V,Ue.start,ne.fat_addrs,ne.ssz)),ne[Ue.start].name=Ue.name,Ue.content=ne[Ue.start].data.slice(0,Ue.size)):(Ue.storage="minifat",Ue.size<0?Ue.size=0:j!==le&&Ue.start!==le&&ne[j]&&(Ue.content=y(Ue,ne[j].data,(ne[D]||{}).data))),Ue.content&&aa(Ue.content,0),ie[Fe]=Ue,W.push(Ue)}}function O(q,ne){return new Date((Za(q,ne+4)/1e7*Math.pow(2,32)+Za(q,ne)/1e7-11644473600)*1e3)}function N(q,ne){return T(),p(f.readFileSync(q),ne)}function B(q,ne){var V=ne&&ne.type;switch(V||Mt&&Buffer.isBuffer(q)&&(V="buffer"),V||"base64"){case"file":return N(q,ne);case"base64":return p(Oi(Qa(q)),ne);case"binary":return p(Oi(q),ne)}return p(q,ne)}function A(q,ne){var V=ne||{},G=V.root||"Root Entry";if(q.FullPaths||(q.FullPaths=[]),q.FileIndex||(q.FileIndex=[]),q.FullPaths.length!==q.FileIndex.length)throw new Error("inconsistent CFB structure");q.FullPaths.length===0&&(q.FullPaths[0]=G+"/",q.FileIndex[0]={name:G,type:5}),V.CLSID&&(q.FileIndex[0].clsid=V.CLSID),z(q)}function z(q){var ne="Sh33tJ5";if(!Ft.find(q,"/"+ne)){var V=Bn(4);V[0]=55,V[1]=V[3]=50,V[2]=54,q.FileIndex.push({name:ne,type:2,content:V,size:4,L:69,R:69,C:69}),q.FullPaths.push(q.FullPaths[0]+ne),P(q)}}function P(q,ne){A(q);for(var V=!1,G=!1,Q=q.FullPaths.length-1;Q>=0;--Q){var ie=q.FileIndex[Q];switch(ie.type){case 0:G?V=!0:(q.FileIndex.pop(),q.FullPaths.pop());break;case 1:case 2:case 5:G=!0,isNaN(ie.R*ie.L*ie.C)&&(V=!0),ie.R>-1&&ie.L>-1&&ie.R==ie.L&&(V=!0);break;default:V=!0;break}}if(!(!V&&!ne)){var W=new Date(1987,1,19),D=0,j=Object.create?Object.create(null):{},_=[];for(Q=0;Q1?1:-1,xe.size=0,xe.type=5;else if(Ae.slice(-1)=="/"){for(D=Q+1;D<_.length&&a(q.FullPaths[D])!=Ae;++D);for(xe.C=D>=_.length?-1:D,D=Q+1;D<_.length&&a(q.FullPaths[D])!=a(Ae);++D);xe.R=D>=_.length?-1:D,xe.type=1}else a(q.FullPaths[Q+1]||"")==a(Ae)&&(xe.R=Q+1),xe.type=2}}}function K(q,ne){var V=ne||{};if(V.fileType=="mad")return Ln(q,V);if(P(q),V.fileType==="zip")return st(q,V);var G=(function(Fe){for(var Oe=0,Ue=0,Ge=0;Ge0&&(Be<4096?Oe+=Be+63>>6:Ue+=Be+511>>9)}}for(var ct=Fe.FullPaths.length+3>>2,St=Oe+7>>3,kn=Oe+127>>7,ni=St+Ue+ct+kn,Ca=ni+127>>7,ss=Ca<=109?0:Math.ceil((Ca-109)/127);ni+Ca+ss+127>>7>Ca;)ss=++Ca<=109?0:Math.ceil((Ca-109)/127);var la=[1,ss,Ca,kn,ct,Ue,Oe,0];return Fe.FileIndex[0].size=Oe<<6,la[7]=(Fe.FileIndex[0].start=la[0]+la[1]+la[2]+la[3]+la[4]+la[5])+(la[6]+7>>3),la})(q),Q=Bn(G[7]<<9),ie=0,W=0;{for(ie=0;ie<8;++ie)Q.write_shift(1,X[ie]);for(ie=0;ie<8;++ie)Q.write_shift(2,0);for(Q.write_shift(2,62),Q.write_shift(2,3),Q.write_shift(2,65534),Q.write_shift(2,9),Q.write_shift(2,6),ie=0;ie<3;++ie)Q.write_shift(2,0);for(Q.write_shift(4,0),Q.write_shift(4,G[2]),Q.write_shift(4,G[0]+G[1]+G[2]+G[3]-1),Q.write_shift(4,0),Q.write_shift(4,4096),Q.write_shift(4,G[3]?G[0]+G[1]+G[2]-1:le),Q.write_shift(4,G[3]),Q.write_shift(-4,G[1]?G[0]-1:le),Q.write_shift(4,G[1]),ie=0;ie<109;++ie)Q.write_shift(-4,ie>9)));for(D(G[6]+7>>3);Q.l&511;)Q.write_shift(-4,re.ENDOFCHAIN);for(W=ie=0,j=0;j=4096)&&(se.start=W,D(_+63>>6)));for(;Q.l&511;)Q.write_shift(-4,re.ENDOFCHAIN);for(ie=0;ie=4096)if(Q.l=se.start+1<<9,Mt&&Buffer.isBuffer(se.content))se.content.copy(Q,Q.l,0,se.size),Q.l+=se.size+511&-512;else{for(j=0;j0&&se.size<4096)if(Mt&&Buffer.isBuffer(se.content))se.content.copy(Q,Q.l,0,se.size),Q.l+=se.size+63&-64;else{for(j=0;j>16|ne>>8|ne)&255}for(var fe=typeof Uint8Array<"u",ye=fe?new Uint8Array(256):[],qe=0;qe<256;++qe)ye[qe]=de(qe);function ae(q,ne){var V=ye[q&255];return ne<=8?V>>>8-ne:(V=V<<8|ye[q>>8&255],ne<=16?V>>>16-ne:(V=V<<8|ye[q>>16&255],V>>>24-ne))}function Ne(q,ne){var V=ne&7,G=ne>>>3;return(q[G]|(V<=6?0:q[G+1]<<8))>>>V&3}function Ve(q,ne){var V=ne&7,G=ne>>>3;return(q[G]|(V<=5?0:q[G+1]<<8))>>>V&7}function tt(q,ne){var V=ne&7,G=ne>>>3;return(q[G]|(V<=4?0:q[G+1]<<8))>>>V&15}function We(q,ne){var V=ne&7,G=ne>>>3;return(q[G]|(V<=3?0:q[G+1]<<8))>>>V&31}function Le(q,ne){var V=ne&7,G=ne>>>3;return(q[G]|(V<=1?0:q[G+1]<<8))>>>V&127}function _e(q,ne,V){var G=ne&7,Q=ne>>>3,ie=(1<>>G;return V<8-G||(W|=q[Q+1]<<8-G,V<16-G)||(W|=q[Q+2]<<16-G,V<24-G)||(W|=q[Q+3]<<24-G),W&ie}function Xe(q,ne,V){var G=ne&7,Q=ne>>>3;return G<=5?q[Q]|=(V&7)<>8-G),ne+3}function pt(q,ne,V){var G=ne&7,Q=ne>>>3;return V=(V&1)<>>3;return V<<=G,q[Q]|=V&255,V>>>=8,q[Q+1]=V,ne+8}function Kt(q,ne,V){var G=ne&7,Q=ne>>>3;return V<<=G,q[Q]|=V&255,V>>>=8,q[Q+1]=V&255,q[Q+2]=V>>>8,ne+16}function Dt(q,ne){var V=q.length,G=2*V>ne?2*V:ne+5,Q=0;if(V>=ne)return q;if(Mt){var ie=wv(G);if(q.copy)q.copy(ie);else for(;Q>G-xe,W=(1<=0;--W)ne[D|W<0;)j[j.l++]=D[_++]}return j.l}function W(D,j){for(var _=0,se=0,xe=fe?new Uint16Array(32768):[];se0;)j[j.l++]=D[se++];_=j.l*8;continue}_=Xe(j,_,+(se+Ae==D.length)+2);for(var Fe=0;Ae-- >0;){var Oe=D[se];Fe=(Fe<<5^Oe)&32767;var Ue=-1,Ge=0;if((Ue=xe[Fe])&&(Ue|=se&-32768,Ue>se&&(Ue-=32768),Ue2){Oe=Q[Ge],Oe<=22?_=Pt(j,_,ye[Oe+1]>>1)-1:(Pt(j,_,3),_+=5,Pt(j,_,ye[Oe-23]>>5),_+=3);var kt=Oe<8?0:Oe-4>>2;kt>0&&(Kt(j,_,Ge-he[Oe]),_+=kt),Oe=ne[se-Ue],_=Pt(j,_,ye[Oe]>>3),_-=3;var Be=Oe<4?0:Oe-2>>1;Be>0&&(Kt(j,_,se-Ue-ge[Oe]),_+=Be);for(var ct=0;ct>8-Oe;for(var Ue=(1<<7-Oe)-1;Ue>=0;--Ue)rt[Fe|Ue<>>=3){case 16:for(ie=3+Ne(q,ne),ne+=2,Fe=Ge[Ge.length-1];ie-- >0;)Ge.push(Fe);break;case 17:for(ie=3+Ve(q,ne),ne+=3;ie-- >0;)Ge.push(0);break;case 18:for(ie=11+Le(q,ne),ne+=7;ie-- >0;)Ge.push(0);break;default:Ge.push(Fe),j>>0,D=0,j=0;(G&1)==0;){if(G=Ve(q,V),V+=3,G>>>1)G>>1==1?(D=9,j=5):(V=Qe(q,V),D=Ye,j=mt);else{V&7&&(V+=8-(V&7));var _=q[V>>>3]|q[(V>>>3)+1]<<8;if(V+=32,_>0)for(!ne&&W0;)Q[ie++]=q[V>>>3],V+=8;continue}for(;;){!ne&&W>>1==1?Gt[se]:He[se];if(V+=xe&15,xe>>>=4,(xe>>>8&255)===0)Q[ie++]=xe;else{if(xe==256)break;xe-=257;var Ae=xe<8?0:xe-4>>2;Ae>5&&(Ae=0);var Fe=ie+he[xe];Ae>0&&(Fe+=_e(q,V,Ae),V+=Ae),se=_e(q,V,j),xe=G>>>1==1?ln[se]:Je[se],V+=xe&15,xe>>>=4;var Oe=xe<4?0:xe-2>>1,Ue=ge[xe];for(Oe>0&&(Ue+=_e(q,V,Oe),V+=Oe),!ne&&W>>3]:[Q.slice(0,ie),V+7>>>3]}function ot(q,ne){var V=q.slice(q.l||0),G=qt(V,ne);return q.l+=G[1],G[0]}function Pe(q,ne){if(q)typeof console<"u"&&console.error(ne);else throw new Error(ne)}function Me(q,ne){var V=q;aa(V,0);var G=[],Q=[],ie={FileIndex:G,FullPaths:Q};A(ie,{root:ne.root});for(var W=V.length-4;(V[W]!=80||V[W+1]!=75||V[W+2]!=5||V[W+3]!=6)&&W>=0;)--W;V.l=W+4,V.l+=4;var D=V.read_shift(2);V.l+=6;var j=V.read_shift(4);for(V.l=j,W=0;W0&&(V=V.slice(0,V.length-1),V=V.slice(0,V.lastIndexOf("/")+1),ie.slice(0,V.length)!=V););var W=(G[1]||"").match(/boundary="(.*?)"/);if(!W)throw new Error("MAD cannot find boundary");var D="--"+(W[1]||""),j=[],_=[],se={FileIndex:j,FullPaths:_};A(se);var xe,Ae=0;for(Q=0;Q=32&&Fe<128&&++xe;var Ue=xe>=Ae*4/5;Q.push(G),Q.push("Content-Location: "+(V.root||"file:///C:/SheetJS/")+W),Q.push("Content-Transfer-Encoding: "+(Ue?"quoted-printable":"base64")),Q.push("Content-Type: "+Xt(D,W)),Q.push(""),Q.push(Ue?Sa(se):Fn(se))}return Q.push(G+`--\r +`),Q.join(`\r +`)}function Si(q){var ne={};return A(ne,q),ne}function wa(q,ne,V,G){var Q=G&&G.unsafe;Q||A(q);var ie=!Q&&Ft.find(q,ne);if(!ie){var W=q.FullPaths[0];ne.slice(0,W.length)==W?W=ne:(W.slice(-1)!="/"&&(W+="/"),W=(W+ne).replace("//","/")),ie={name:i(ne),type:2},q.FileIndex.push(ie),q.FullPaths.push(W),Q||Ft.utils.cfb_gc(q)}return ie.content=V,ie.size=V?V.length:0,G&&(G.CLSID&&(ie.clsid=G.CLSID),G.mt&&(ie.mt=G.mt),G.ct&&(ie.ct=G.ct)),ie}function ti(q,ne){A(q);var V=Ft.find(q,ne);if(V){for(var G=0;G3&&(a=!0),i[r].slice(i[r].length-1)){case"Y":throw new Error("Unsupported ISO Duration Field: "+i[r].slice(i[r].length-1));case"D":n*=24;case"H":n*=60;case"M":if(a)n*=60;else throw new Error("Unsupported ISO Duration Field: M")}t+=n*parseInt(i[r],10)}return t}var Ov=new Date("2017-02-19T19:06:09.000Z"),A4=isNaN(Ov.getFullYear())?new Date("2/19/17"):Ov,YC=A4.getFullYear()==2017;function Yn(e,t){var n=new Date(e);if(YC)return t>0?n.setTime(n.getTime()+n.getTimezoneOffset()*60*1e3):t<0&&n.setTime(n.getTime()-n.getTimezoneOffset()*60*1e3),n;if(e instanceof Date)return e;if(A4.getFullYear()==1917&&!isNaN(n.getFullYear())){var a=n.getFullYear();return e.indexOf(""+a)>-1||n.setFullYear(n.getFullYear()+100),n}var i=e.match(/\d+/g)||["2017","2","19","0","0","0"],r=new Date(+i[0],+i[1]-1,+i[2],+i[3]||0,+i[4]||0,+i[5]||0);return e.indexOf("Z")>-1&&(r=new Date(r.getTime()-r.getTimezoneOffset()*60*1e3)),r}function s0(e,t){if(Mt&&Buffer.isBuffer(e)){if(t){if(e[0]==255&&e[1]==254)return Fc(e.slice(2).toString("utf16le"));if(e[1]==254&&e[2]==255)return Fc(f4(e.slice(2).toString("binary")))}return e.toString("binary")}if(typeof TextDecoder<"u")try{if(t){if(e[0]==255&&e[1]==254)return Fc(new TextDecoder("utf-16le").decode(e.slice(2)));if(e[0]==254&&e[1]==255)return Fc(new TextDecoder("utf-16be").decode(e.slice(2)))}var n={"€":"€","‚":"‚",ƒ:"ƒ","„":"„","…":"…","†":"†","‡":"‡","ˆ":"ˆ","‰":"‰",Š:"Š","‹":"‹",Œ:"Œ",Ž:"Ž","‘":"‘","’":"’","“":"“","”":"”","•":"•","–":"–","—":"—","˜":"˜","™":"™",š:"š","›":"›",œ:"œ",ž:"ž",Ÿ:"Ÿ"};return Array.isArray(e)&&(e=new Uint8Array(e)),new TextDecoder("latin1").decode(e).replace(/[€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ]/g,function(r){return n[r]||r})}catch{}for(var a=[],i=0;i!=e.length;++i)a.push(String.fromCharCode(e[i]));return a.join("")}function sa(e){if(typeof JSON<"u"&&!Array.isArray(e))return JSON.parse(JSON.stringify(e));if(typeof e!="object"||e==null)return e;if(e instanceof Date)return new Date(e.getTime());var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=sa(e[n]));return t}function gn(e,t){for(var n="";n.length3&&ZC.indexOf(c)==-1)return n}else if(c.match(/[a-z]/))return n;return a<0||a>8099?n:(i>0||r>1)&&a!=101?t:e.match(/[^-0-9:,\/\\]/)?n:t}var JC=(function(){var e="abacaba".split(/(:?b)/i).length==5;return function(n,a,i){if(e||typeof a=="string")return n.split(a);for(var r=n.split(a),c=[r[0]],l=1;l\r +`,nE=/([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g,jv=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg,aE=/<[^>]*>/g,ya=N4.match(jv)?jv:aE,iE=/<\w*:/,sE=/<(\/?)\w+:/;function it(e,t,n){for(var a={},i=0,r=0;i!==e.length&&!((r=e.charCodeAt(i))===32||r===10||r===13);++i);if(t||(a[0]=e.slice(0,i)),i===e.length)return a;var c=e.match(nE),l=0,f="",T=0,p="",m="",g=1;if(c)for(T=0;T!=c.length;++T){for(m=c[T],r=0;r!=m.length&&m.charCodeAt(r)!==61;++r);for(p=m.slice(0,r).trim();m.charCodeAt(r+1)==32;)++r;for(g=(i=m.charCodeAt(r+1))==34||i==39?1:0,f=m.slice(r+1+g,m.length-g),l=0;l!=p.length&&p.charCodeAt(l)!==58;++l);if(l===p.length)p.indexOf("_")>0&&(p=p.slice(0,p.indexOf("_"))),a[p]=f,a[p.toLowerCase()]=f;else{var S=(l===5&&p.slice(0,5)==="xmlns"?"xmlns":"")+p.slice(l+1);if(a[S]&&p.slice(l-3,l)=="ext")continue;a[S]=f,a[S.toLowerCase()]=f}}return a}function as(e){return e.replace(sE,"<$1")}var O4={""":'"',"'":"'",">":">","<":"<","&":"&"},rE=Fp(O4),Ut=(function(){var e=/&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig,t=/_x([\da-fA-F]{4})_/ig;return function n(a){var i=a+"",r=i.indexOf("-1?16:10))||l}).replace(t,function(l,f){return String.fromCharCode(parseInt(f,16))});var c=i.indexOf("]]>");return n(i.slice(0,r))+i.slice(r+9,c)+n(i.slice(c+3))}})(),oE=/[&<>'"]/g,cE=/[\u0000-\u001f]/g;function Pp(e){var t=e+"";return t.replace(oE,function(n){return rE[n]}).replace(/\n/g,"
").replace(cE,function(n){return"&#x"+("000"+n.charCodeAt(0).toString(16)).slice(-4)+";"})}var Fv=(function(){var e=/&#(\d+);/g;function t(n,a){return String.fromCharCode(parseInt(a,10))}return function(a){return a.replace(e,t)}})();function dn(e){switch(e){case 1:case!0:case"1":case"true":case"TRUE":return!0;default:return!1}}function Ff(e){for(var t="",n=0,a=0,i=0,r=0,c=0,l=0;n191&&a<224){c=(a&31)<<6,c|=i&63,t+=String.fromCharCode(c);continue}if(r=e.charCodeAt(n++),a<240){t+=String.fromCharCode((a&15)<<12|(i&63)<<6|r&63);continue}c=e.charCodeAt(n++),l=((a&7)<<18|(i&63)<<12|(r&63)<<6|c&63)-65536,t+=String.fromCharCode(55296+(l>>>10&1023)),t+=String.fromCharCode(56320+(l&1023))}return t}function Lv(e){var t=pr(2*e.length),n,a,i=1,r=0,c=0,l;for(a=0;a>>10&1023),n=56320+(n&1023)),c!==0&&(t[r++]=c&255,t[r++]=c>>>8,c=0),t[r++]=n%256,t[r++]=n>>>8;return t.slice(0,r).toString("ucs2")}function Pv(e){return u0(e,"binary").toString("utf8")}var zl="foo bar baz☃🍣",rn=Mt&&(Pv(zl)==Ff(zl)&&Pv||Lv(zl)==Ff(zl)&&Lv)||Ff,Fc=Mt?function(e){return u0(e,"utf8").toString("binary")}:function(e){for(var t=[],n=0,a=0,i=0;n>6))),t.push(String.fromCharCode(128+(a&63)));break;case(a>=55296&&a<57344):a-=55296,i=e.charCodeAt(n++)-56320+(a<<10),t.push(String.fromCharCode(240+(i>>18&7))),t.push(String.fromCharCode(144+(i>>12&63))),t.push(String.fromCharCode(128+(i>>6&63))),t.push(String.fromCharCode(128+(i&63)));break;default:t.push(String.fromCharCode(224+(a>>12))),t.push(String.fromCharCode(128+(a>>6&63))),t.push(String.fromCharCode(128+(a&63)))}return t.join("")},i1=(function(){var e={};return function(n,a){var i=n+"|"+(a||"");return e[i]?e[i]:e[i]=new RegExp("<(?:\\w+:)?"+n+'(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)",a||"")}})(),M4=(function(){var e=[["nbsp"," "],["middot","·"],["quot",'"'],["apos","'"],["gt",">"],["lt","<"],["amp","&"]].map(function(t){return[new RegExp("&"+t[0]+";","ig"),t[1]]});return function(n){for(var a=n.replace(/^[\t\n\r ]+/,"").replace(/[\t\n\r ]+$/,"").replace(/>\s+/g,">").replace(/\s+/g,` +`).replace(/<[^>]*>/g,""),i=0;i([\\s\\S]*?)","g")}})(),uE=/<\/?(?:vt:)?variant>/g,dE=/<(?:vt:)([^>]*)>([\s\S]*)"+t+""}function _p(e){if(Mt&&Buffer.isBuffer(e))return e.toString("utf8");if(typeof e=="string")return e;if(typeof Uint8Array<"u"&&e instanceof Uint8Array)return rn(d0(Op(e)));throw new Error("Bad input format: expected Buffer or string")}var s1=/<(\/?)([^\s?>:\/]+)(?:[\s?:\/][^>]*)?>/mg,pE={CT:"http://schemas.openxmlformats.org/package/2006/content-types"},mE=["http://schemas.openxmlformats.org/spreadsheetml/2006/main","http://purl.oclc.org/ooxml/spreadsheetml/main","http://schemas.microsoft.com/office/excel/2006/main","http://schemas.microsoft.com/office/excel/2006/2"];function gE(e,t){for(var n=1-2*(e[t+7]>>>7),a=((e[t+7]&127)<<4)+(e[t+6]>>>4&15),i=e[t+6]&15,r=5;r>=0;--r)i=i*256+e[t+r];return a==2047?i==0?n*(1/0):NaN:(a==0?a=-1022:(a-=1023,i+=Math.pow(2,52)),n*Math.pow(2,a-52)*i)}function vE(e,t,n){var a=(t<0||1/t==-1/0?1:0)<<7,i=0,r=0,c=a?-t:t;isFinite(c)?c==0?i=r=0:(i=Math.floor(Math.log(c)/Math.LN2),r=c*Math.pow(2,52-i),i<=-1023&&(!isFinite(r)||r>4|a}var qv=function(e){for(var t=[],n=10240,a=0;a0&&Buffer.isBuffer(e[0][0])?Buffer.concat(e[0].map(function(t){return Buffer.isBuffer(t)?t:u0(t)})):qv(e)}:qv,Uv=function(e,t,n){for(var a=[],i=t;i0?C1(e,t+4,t+4+n-1):""},L4=F4,P4=function(e,t){var n=Za(e,t);return n>0?C1(e,t+4,t+4+n-1):""},_4=P4,q4=function(e,t){var n=2*Za(e,t);return n>0?C1(e,t+4,t+4+n-1):""},B4=q4,U4=function(t,n){var a=Za(t,n);return a>0?qp(t,n+4,n+4+a):""},z4=U4,W4=function(e,t){var n=Za(e,t);return n>0?C1(e,t+4,t+4+n):""},V4=W4,H4=function(e,t){return gE(e,t)},_u=H4,G4=function(t){return Array.isArray(t)||typeof Uint8Array<"u"&&t instanceof Uint8Array};Mt&&(L4=function(t,n){if(!Buffer.isBuffer(t))return F4(t,n);var a=t.readUInt32LE(n);return a>0?t.toString("utf8",n+4,n+4+a-1):""},_4=function(t,n){if(!Buffer.isBuffer(t))return P4(t,n);var a=t.readUInt32LE(n);return a>0?t.toString("utf8",n+4,n+4+a-1):""},B4=function(t,n){if(!Buffer.isBuffer(t))return q4(t,n);var a=2*t.readUInt32LE(n);return t.toString("utf16le",n+4,n+4+a-1)},z4=function(t,n){if(!Buffer.isBuffer(t))return U4(t,n);var a=t.readUInt32LE(n);return t.toString("utf16le",n+4,n+4+a)},V4=function(t,n){if(!Buffer.isBuffer(t))return W4(t,n);var a=t.readUInt32LE(n);return t.toString("utf8",n+4,n+4+a)},_u=function(t,n){return Buffer.isBuffer(t)?t.readDoubleLE(n):H4(t,n)},G4=function(t){return Buffer.isBuffer(t)||Array.isArray(t)||typeof Uint8Array<"u"&&t instanceof Uint8Array});var ro=function(e,t){return e[t]},Rs=function(e,t){return e[t+1]*256+e[t]},xE=function(e,t){var n=e[t+1]*256+e[t];return n<32768?n:(65535-n+1)*-1},Za=function(e,t){return e[t+3]*(1<<24)+(e[t+2]<<16)+(e[t+1]<<8)+e[t]},Xr=function(e,t){return e[t+3]<<24|e[t+2]<<16|e[t+1]<<8|e[t]},yE=function(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};function Wc(e,t){var n="",a,i,r=[],c,l,f,T;switch(t){case"dbcs":if(T=this.l,Mt&&Buffer.isBuffer(this))n=this.slice(this.l,this.l+2*e).toString("utf16le");else for(f=0;f0?Xr:yE)(this,this.l),this.l+=4,a):(i=Za(this,this.l),this.l+=4,i);case 8:case-8:if(t==="f")return e==8?i=_u(this,this.l):i=_u([this[this.l+7],this[this.l+6],this[this.l+5],this[this.l+4],this[this.l+3],this[this.l+2],this[this.l+1],this[this.l+0]],0),this.l+=8,i;e=8;case 16:n=j4(this,this.l,e);break}}return this.l+=e,n}var SE=function(e,t,n){e[n]=t&255,e[n+1]=t>>>8&255,e[n+2]=t>>>16&255,e[n+3]=t>>>24&255},bE=function(e,t,n){e[n]=t&255,e[n+1]=t>>8&255,e[n+2]=t>>16&255,e[n+3]=t>>24&255},wE=function(e,t,n){e[n]=t&255,e[n+1]=t>>>8&255};function CE(e,t,n){var a=0,i=0;if(n==="dbcs"){for(i=0;i!=t.length;++i)wE(this,t.charCodeAt(i),this.l+2*i);a=2*t.length}else if(n==="sbcs"){for(t=t.replace(/[^\x00-\x7F]/g,"_"),i=0;i!=t.length;++i)this[this.l+i]=t.charCodeAt(i)&255;a=t.length}else if(n==="hex"){for(;i>8}for(;this.l>>=8,this[this.l+1]=t&255;break;case 3:a=3,this[this.l]=t&255,t>>>=8,this[this.l+1]=t&255,t>>>=8,this[this.l+2]=t&255;break;case 4:a=4,SE(this,t,this.l);break;case 8:if(a=8,n==="f"){vE(this,t,this.l);break}case 16:break;case-4:a=4,bE(this,t,this.l);break}return this.l+=a,this}function X4(e,t){var n=j4(this,this.l,e.length>>1);if(n!==e)throw new Error(t+"Expected "+e+" saw "+n);this.l+=e.length>>1}function aa(e,t){e.l=t,e.read_shift=Wc,e.chk=X4,e.write_shift=CE}function xa(e,t){e.l+=t}function Bn(e){var t=pr(e);return aa(t,0),t}function js(e,t,n){if(e){var a,i,r;aa(e,e.l||0);for(var c=e.length,l=0,f=0;e.la.l&&(a=a.slice(0,a.l),a.l=a.length),a.length>0&&e.push(a),a=null)},r=function(T){return a&&T=256;)a.c-=256;for(;a.r>=65536;)a.r-=65536}return a}function Vv(e,t,n){var a=sa(e);return a.s=Vc(a.s,t.s,n),a.e=Vc(a.e,t.s,n),a}function Hc(e,t){if(e.cRel&&e.c<0)for(e=sa(e);e.c<0;)e.c+=t>8?16384:256;if(e.rRel&&e.r<0)for(e=sa(e);e.r<0;)e.r+=t>8?1048576:t>5?65536:16384;var n=ht(e);return!e.cRel&&e.cRel!=null&&(n=AE(n)),!e.rRel&&e.rRel!=null&&(n=EE(n)),n}function Lf(e,t){return e.s.r==0&&!e.s.rRel&&e.e.r==(t.biff>=12?1048575:t.biff>=8?65536:16384)&&!e.e.rRel?(e.s.cRel?"":"$")+Un(e.s.c)+":"+(e.e.cRel?"":"$")+Un(e.e.c):e.s.c==0&&!e.s.cRel&&e.e.c==(t.biff>=12?16383:255)&&!e.e.cRel?(e.s.rRel?"":"$")+ra(e.s.r)+":"+(e.e.rRel?"":"$")+ra(e.e.r):Hc(e.s,t.biff)+":"+Hc(e.e,t.biff)}function Bp(e){return parseInt(kE(e),10)-1}function ra(e){return""+(e+1)}function EE(e){return e.replace(/([A-Z]|^)(\d+)$/,"$1$$$2")}function kE(e){return e.replace(/\$(\d+)$/,"$1")}function Up(e){for(var t=RE(e),n=0,a=0;a!==t.length;++a)n=26*n+t.charCodeAt(a)-64;return n-1}function Un(e){if(e<0)throw new Error("invalid column "+e);var t="";for(++e;e;e=Math.floor((e-1)/26))t=String.fromCharCode((e-1)%26+65)+t;return t}function AE(e){return e.replace(/^([A-Z])/,"$$$1")}function RE(e){return e.replace(/^\$([A-Z])/,"$1")}function DE(e){return e.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(",")}function Na(e){for(var t=0,n=0,a=0;a=48&&i<=57?t=10*t+(i-48):i>=65&&i<=90&&(n=26*n+(i-64))}return{c:n-1,r:t-1}}function ht(e){for(var t=e.c+1,n="";t;t=(t-1)/26|0)n=String.fromCharCode((t-1)%26+65)+n;return n+(e.r+1)}function Eo(e){var t=e.indexOf(":");return t==-1?{s:Na(e),e:Na(e)}:{s:Na(e.slice(0,t)),e:Na(e.slice(t+1))}}function Lt(e,t){return typeof t>"u"||typeof t=="number"?Lt(e.s,e.e):(typeof e!="string"&&(e=ht(e)),typeof t!="string"&&(t=ht(t)),e==t?e:e+":"+t)}function xn(e){var t={s:{c:0,r:0},e:{c:0,r:0}},n=0,a=0,i=0,r=e.length;for(n=0;a26);++a)n=26*n+i;for(t.s.c=--n,n=0;a9);++a)n=10*n+i;if(t.s.r=--n,a===r||i!=10)return t.e.c=t.s.c,t.e.r=t.s.r,t;for(++a,n=0;a!=r&&!((i=e.charCodeAt(a)-64)<1||i>26);++a)n=26*n+i;for(t.e.c=--n,n=0;a!=r&&!((i=e.charCodeAt(a)-48)<0||i>9);++a)n=10*n+i;return t.e.r=--n,t}function Hv(e,t){var n=e.t=="d"&&t instanceof Date;if(e.z!=null)try{return e.w=xi(e.z,n?Ma(t):t)}catch{}try{return e.w=xi((e.XF||{}).numFmtId||(n?14:0),n?Ma(t):t)}catch{return""+t}}function Ms(e,t,n){return e==null||e.t==null||e.t=="z"?"":e.w!==void 0?e.w:(e.t=="d"&&!e.z&&n&&n.dateNF&&(e.z=n.dateNF),e.t=="e"?h0[e.v]||e.v:t==null?Hv(e,e.v):Hv(e,t))}function xr(e,t){var n=t&&t.sheet?t.sheet:"Sheet1",a={};return a[n]=e,{SheetNames:[n],Sheets:a}}function K4(e,t,n){var a=n||{},i=e?Array.isArray(e):a.dense,r=e||(i?[]:{}),c=0,l=0;if(r&&a.origin!=null){if(typeof a.origin=="number")c=a.origin;else{var f=typeof a.origin=="string"?Na(a.origin):a.origin;c=f.r,l=f.c}r["!ref"]||(r["!ref"]="A1:A1")}var T={s:{c:1e7,r:1e7},e:{c:0,r:0}};if(r["!ref"]){var p=xn(r["!ref"]);T.s.c=p.s.c,T.s.r=p.s.r,T.e.c=Math.max(T.e.c,p.e.c),T.e.r=Math.max(T.e.r,p.e.r),c==-1&&(T.e.r=c=p.e.r+1)}for(var m=0;m!=t.length;++m)if(t[m]){if(!Array.isArray(t[m]))throw new Error("aoa_to_sheet expects an array of arrays");for(var g=0;g!=t[m].length;++g)if(!(typeof t[m][g]>"u")){var S={v:t[m][g]},x=c+m,y=l+g;if(T.s.r>x&&(T.s.r=x),T.s.c>y&&(T.s.c=y),T.e.r>2;return n?i/100:i}function $4(e){var t={s:{},e:{}};return t.s.r=e.read_shift(4),t.e.r=e.read_shift(4),t.s.c=e.read_shift(4),t.e.c=e.read_shift(4),t}var f0=$4;function pa(e){if(e.length-e.l<8)throw"XLS Xnum Buffer underflow";return e.read_shift(8,"f")}function FE(e){var t={},n=e.read_shift(1),a=n>>>1,i=e.read_shift(1),r=e.read_shift(2,"i"),c=e.read_shift(1),l=e.read_shift(1),f=e.read_shift(1);switch(e.l++,a){case 0:t.auto=1;break;case 1:t.index=i;var T=t0[i];T&&(t.rgb=o1(T));break;case 2:t.rgb=o1([c,l,f]);break;case 3:t.theme=i;break}return r!=0&&(t.tint=r>0?r/32767:r/32768),t}function LE(e){var t=e.read_shift(1);e.l++;var n={fBold:t&1,fItalic:t&2,fUnderline:t&4,fStrikeout:t&8,fOutline:t&16,fShadow:t&32,fCondense:t&64,fExtend:t&128};return n}function Y4(e,t){var n={2:"BITMAP",3:"METAFILEPICT",8:"DIB",14:"ENHMETAFILE"},a=e.read_shift(4);switch(a){case 0:return"";case 4294967295:case 4294967294:return n[e.read_shift(4)]||""}if(a>400)throw new Error("Unsupported Clipboard: "+a.toString(16));return e.l-=4,e.read_shift(0,t==1?"lpstr":"lpwstr")}function PE(e){return Y4(e,1)}function _E(e){return Y4(e,2)}var Hp=2,Ba=3,Wl=11,Gv=12,qu=19,Vl=64,qE=65,BE=71,UE=4108,zE=4126,$n=80,Z4=81,WE=[$n,Z4],VE={1:{n:"CodePage",t:Hp},2:{n:"Category",t:$n},3:{n:"PresentationFormat",t:$n},4:{n:"ByteCount",t:Ba},5:{n:"LineCount",t:Ba},6:{n:"ParagraphCount",t:Ba},7:{n:"SlideCount",t:Ba},8:{n:"NoteCount",t:Ba},9:{n:"HiddenCount",t:Ba},10:{n:"MultimediaClipCount",t:Ba},11:{n:"ScaleCrop",t:Wl},12:{n:"HeadingPairs",t:UE},13:{n:"TitlesOfParts",t:zE},14:{n:"Manager",t:$n},15:{n:"Company",t:$n},16:{n:"LinksUpToDate",t:Wl},17:{n:"CharacterCount",t:Ba},19:{n:"SharedDoc",t:Wl},22:{n:"HyperlinksChanged",t:Wl},23:{n:"AppVersion",t:Ba,p:"version"},24:{n:"DigSig",t:qE},26:{n:"ContentType",t:$n},27:{n:"ContentStatus",t:$n},28:{n:"Language",t:$n},29:{n:"Version",t:$n},255:{},2147483648:{n:"Locale",t:qu},2147483651:{n:"Behavior",t:qu},1919054434:{}},HE={1:{n:"CodePage",t:Hp},2:{n:"Title",t:$n},3:{n:"Subject",t:$n},4:{n:"Author",t:$n},5:{n:"Keywords",t:$n},6:{n:"Comments",t:$n},7:{n:"Template",t:$n},8:{n:"LastAuthor",t:$n},9:{n:"RevNumber",t:$n},10:{n:"EditTime",t:Vl},11:{n:"LastPrinted",t:Vl},12:{n:"CreatedDate",t:Vl},13:{n:"ModifiedDate",t:Vl},14:{n:"PageCount",t:Ba},15:{n:"WordCount",t:Ba},16:{n:"CharCount",t:Ba},17:{n:"Thumbnail",t:BE},18:{n:"Application",t:$n},19:{n:"DocSecurity",t:Ba},255:{},2147483648:{n:"Locale",t:qu},2147483651:{n:"Behavior",t:qu},1919054434:{}},Xv={1:"US",2:"CA",3:"",7:"RU",20:"EG",30:"GR",31:"NL",32:"BE",33:"FR",34:"ES",36:"HU",39:"IT",41:"CH",43:"AT",44:"GB",45:"DK",46:"SE",47:"NO",48:"PL",49:"DE",52:"MX",55:"BR",61:"AU",64:"NZ",66:"TH",81:"JP",82:"KR",84:"VN",86:"CN",90:"TR",105:"JS",213:"DZ",216:"MA",218:"LY",351:"PT",354:"IS",358:"FI",420:"CZ",886:"TW",961:"LB",962:"JO",963:"SY",964:"IQ",965:"KW",966:"SA",971:"AE",972:"IL",974:"QA",981:"IR",65535:"US"},GE=[null,"solid","mediumGray","darkGray","lightGray","darkHorizontal","darkVertical","darkDown","darkUp","darkGrid","darkTrellis","lightHorizontal","lightVertical","lightDown","lightUp","lightGrid","lightTrellis","gray125","gray0625"];function XE(e){return e.map(function(t){return[t>>16&255,t>>8&255,t&255]})}var KE=XE([0,16777215,16711680,65280,255,16776960,16711935,65535,0,16777215,16711680,65280,255,16776960,16711935,65535,8388608,32768,128,8421376,8388736,32896,12632256,8421504,10066431,10040166,16777164,13434879,6684774,16744576,26316,13421823,128,16711935,16776960,65535,8388736,8388608,32896,255,52479,13434879,13434828,16777113,10079487,16751052,13408767,16764057,3368703,3394764,10079232,16763904,16750848,16737792,6710937,9868950,13158,3381606,13056,3355392,10040064,10040166,3355545,3355443,16777215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),t0=sa(KE),h0={0:"#NULL!",7:"#DIV/0!",15:"#VALUE!",23:"#REF!",29:"#NAME?",36:"#NUM!",42:"#N/A",43:"#GETTING_DATA",255:"#WTF?"},J4={"#NULL!":0,"#DIV/0!":7,"#VALUE!":15,"#REF!":23,"#NAME?":29,"#NUM!":36,"#N/A":42,"#GETTING_DATA":43,"#WTF?":255},Kv={"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":"workbooks","application/vnd.ms-excel.sheet.macroEnabled.main+xml":"workbooks","application/vnd.ms-excel.sheet.binary.macroEnabled.main":"workbooks","application/vnd.ms-excel.addin.macroEnabled.main+xml":"workbooks","application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":"workbooks","application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":"sheets","application/vnd.ms-excel.worksheet":"sheets","application/vnd.ms-excel.binIndexWs":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":"charts","application/vnd.ms-excel.chartsheet":"charts","application/vnd.ms-excel.macrosheet+xml":"macros","application/vnd.ms-excel.macrosheet":"macros","application/vnd.ms-excel.intlmacrosheet":"TODO","application/vnd.ms-excel.binIndexMs":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":"dialogs","application/vnd.ms-excel.dialogsheet":"dialogs","application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml":"strs","application/vnd.ms-excel.sharedStrings":"strs","application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":"styles","application/vnd.ms-excel.styles":"styles","application/vnd.openxmlformats-package.core-properties+xml":"coreprops","application/vnd.openxmlformats-officedocument.custom-properties+xml":"custprops","application/vnd.openxmlformats-officedocument.extended-properties+xml":"extprops","application/vnd.openxmlformats-officedocument.customXmlProperties+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":"comments","application/vnd.ms-excel.comments":"comments","application/vnd.ms-excel.threadedcomments+xml":"threadedcomments","application/vnd.ms-excel.person+xml":"people","application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml":"metadata","application/vnd.ms-excel.sheetMetadata":"metadata","application/vnd.ms-excel.pivotTable":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.chart+xml":"TODO","application/vnd.ms-office.chartcolorstyle+xml":"TODO","application/vnd.ms-office.chartstyle+xml":"TODO","application/vnd.ms-office.chartex+xml":"TODO","application/vnd.ms-excel.calcChain":"calcchains","application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml":"calcchains","application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings":"TODO","application/vnd.ms-office.activeX":"TODO","application/vnd.ms-office.activeX+xml":"TODO","application/vnd.ms-excel.attachedToolbars":"TODO","application/vnd.ms-excel.connections":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":"TODO","application/vnd.ms-excel.externalLink":"links","application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml":"links","application/vnd.ms-excel.pivotCacheDefinition":"TODO","application/vnd.ms-excel.pivotCacheRecords":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml":"TODO","application/vnd.ms-excel.queryTable":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml":"TODO","application/vnd.ms-excel.userNames":"TODO","application/vnd.ms-excel.revisionHeaders":"TODO","application/vnd.ms-excel.revisionLog":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml":"TODO","application/vnd.ms-excel.tableSingleCells":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml":"TODO","application/vnd.ms-excel.slicer":"TODO","application/vnd.ms-excel.slicerCache":"TODO","application/vnd.ms-excel.slicer+xml":"TODO","application/vnd.ms-excel.slicerCache+xml":"TODO","application/vnd.ms-excel.wsSortMap":"TODO","application/vnd.ms-excel.table":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":"TODO","application/vnd.openxmlformats-officedocument.theme+xml":"themes","application/vnd.openxmlformats-officedocument.themeOverride+xml":"TODO","application/vnd.ms-excel.Timeline+xml":"TODO","application/vnd.ms-excel.TimelineCache+xml":"TODO","application/vnd.ms-office.vbaProject":"vba","application/vnd.ms-office.vbaProjectSignature":"TODO","application/vnd.ms-office.volatileDependencies":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml":"TODO","application/vnd.ms-excel.controlproperties+xml":"TODO","application/vnd.openxmlformats-officedocument.model+data":"TODO","application/vnd.ms-excel.Survey+xml":"TODO","application/vnd.openxmlformats-officedocument.drawing+xml":"drawings","application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml":"TODO","application/vnd.openxmlformats-officedocument.vmlDrawing":"TODO","application/vnd.openxmlformats-package.relationships+xml":"rels","application/vnd.openxmlformats-officedocument.oleObject":"TODO","image/png":"TODO",sheet:"js"};function $E(){return{workbooks:[],sheets:[],charts:[],dialogs:[],macros:[],rels:[],strs:[],comments:[],threadedcomments:[],links:[],coreprops:[],extprops:[],custprops:[],themes:[],styles:[],calcchains:[],vba:[],drawings:[],metadata:[],people:[],TODO:[],xmlns:""}}function YE(e){var t=$E();if(!e||!e.match)return t;var n={};if((e.match(ya)||[]).forEach(function(a){var i=it(a);switch(i[0].replace(iE,"<")){case"0?t.calcchains[0]:"",t.sst=t.strs.length>0?t.strs[0]:"",t.style=t.styles.length>0?t.styles[0]:"",t.defaults=n,delete t.calcchains,t}var co={WB:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",SHEET:"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument",HLINK:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",VML:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",XPATH:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",XMISS:"http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing",XLINK:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink",CXML:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml",CXMLP:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps",CMNT:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",CORE_PROPS:"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties",EXT_PROPS:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties",CUST_PROPS:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties",SST:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings",STY:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles",THEME:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",CHART:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart",CHARTEX:"http://schemas.microsoft.com/office/2014/relationships/chartEx",CS:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet",WS:["http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet","http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"],DS:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet",MS:"http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet",IMG:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",DRAW:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing",XLMETA:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata",TCMNT:"http://schemas.microsoft.com/office/2017/10/relationships/threadedComment",PEOPLE:"http://schemas.microsoft.com/office/2017/10/relationships/person",VBA:"http://schemas.microsoft.com/office/2006/relationships/vbaProject"};function Uh(e){var t=e.lastIndexOf("/");return e.slice(0,t+1)+"_rels/"+e.slice(t+1)+".rels"}function Gc(e,t){var n={"!id":{}};if(!e)return n;t.charAt(0)!=="/"&&(t="/"+t);var a={};return(e.match(ya)||[]).forEach(function(i){var r=it(i);if(r[0]==="]*>([\\s\\S]*?)")}return e})();function Q4(e){var t={};e=rn(e);for(var n=0;n0&&(t[a[1]]=Ut(i[1])),a[2]==="date"&&t[a[1]]&&(t[a[1]]=Yn(t[a[1]]))}return t}var ek=[["Application","Application","string"],["AppVersion","AppVersion","string"],["Company","Company","string"],["DocSecurity","DocSecurity","string"],["Manager","Manager","string"],["HyperlinksChanged","HyperlinksChanged","bool"],["SharedDoc","SharedDoc","bool"],["LinksUpToDate","LinksUpToDate","bool"],["ScaleCrop","ScaleCrop","bool"],["HeadingPairs","HeadingPairs","raw"],["TitlesOfParts","TitlesOfParts","raw"]];function eS(e,t,n,a){var i=[];if(typeof e=="string")i=_v(e,a);else for(var r=0;r0)for(var T=0;T!==i.length;T+=2){switch(f=+i[T+1].v,i[T].v){case"Worksheets":case"工作表":case"Листы":case"أوراق العمل":case"ワークシート":case"גליונות עבודה":case"Arbeitsblätter":case"Çalışma Sayfaları":case"Feuilles de calcul":case"Fogli di lavoro":case"Folhas de cálculo":case"Planilhas":case"Regneark":case"Hojas de cálculo":case"Werkbladen":n.Worksheets=f,n.SheetNames=c.slice(l,l+f);break;case"Named Ranges":case"Rangos con nombre":case"名前付き一覧":case"Benannte Bereiche":case"Navngivne områder":n.NamedRanges=f,n.DefinedNames=c.slice(l,l+f);break;case"Charts":case"Diagramme":n.Chartsheets=f,n.ChartNames=c.slice(l,l+f);break}l+=f}}function tk(e,t,n){var a={};return t||(t={}),e=rn(e),ek.forEach(function(i){var r=(e.match(i1(i[0]))||[])[1];switch(i[2]){case"string":r&&(t[i[1]]=Ut(r));break;case"bool":t[i[1]]=r==="true";break;case"raw":var c=e.match(new RegExp("<"+i[0]+"[^>]*>([\\s\\S]*?)"));c&&c.length>0&&(a[i[1]]=c[1]);break}}),a.HeadingPairs&&a.TitlesOfParts&&eS(a.HeadingPairs,a.TitlesOfParts,t,n),t}var nk=/<[^>]+>[^<]*/g;function ak(e,t){var n={},a="",i=e.match(nk);if(i)for(var r=0;r!=i.length;++r){var c=i[r],l=it(c);switch(l[0]){case"":a=null;break;default:if(c.indexOf(""),T=f[0].slice(4),p=f[1];switch(T){case"lpstr":case"bstr":case"lpwstr":n[a]=Ut(p);break;case"bool":n[a]=dn(p);break;case"i1":case"i2":case"i4":case"i8":case"int":case"uint":n[a]=parseInt(p,10);break;case"r4":case"r8":case"decimal":n[a]=parseFloat(p);break;case"filetime":case"date":n[a]=Yn(p);break;case"cy":case"error":n[a]=Ut(p);break;default:if(T.slice(-1)=="/")break;t.WTF&&typeof console<"u"&&console.warn("Unexpected",c,T,f)}}else if(c.slice(0,2)!==">3<<2),a}function iS(e){var t=e.read_shift(4),n=e.slice(e.l,e.l+t);return e.l+=t,(t&3)>0&&(e.l+=4-(t&3)&3),n}function dk(e){var t={};return t.Size=e.read_shift(4),e.l+=t.Size+3-(t.Size-1)%4,t}function Bu(e,t,n){var a=e.read_shift(2),i,r=n||{};if(e.l+=2,t!==Gv&&a!==t&&WE.indexOf(t)===-1&&!((t&65534)==4126&&(a&65534)==4126))throw new Error("Expected type "+t+" saw "+a);switch(t===Gv?a:t){case 2:return i=e.read_shift(2,"i"),r.raw||(e.l+=2),i;case 3:return i=e.read_shift(4,"i"),i;case 11:return e.read_shift(4)!==0;case 19:return i=e.read_shift(4),i;case 30:return tS(e,a,4).replace(Oa,"");case 31:return nS(e);case 64:return Gp(e);case 65:return iS(e);case 71:return dk(e);case 80:return zh(e,a,!r.raw).replace(Oa,"");case 81:return rk(e,a).replace(Oa,"");case 4108:return uk(e);case 4126:case 4127:return a==4127?ok(e):ck(e);default:throw new Error("TypedPropertyValue unrecognized type "+t+" "+a)}}function Yv(e,t){var n=e.l,a=e.read_shift(4),i=e.read_shift(4),r=[],c=0,l=0,f=-1,T={};for(c=0;c!=i;++c){var p=e.read_shift(4),m=e.read_shift(4);r[c]=[p,m+n]}r.sort(function(k,E){return k[1]-E[1]});var g={};for(c=0;c!=i;++c){if(e.l!==r[c][1]){var S=!0;if(c>0&&t)switch(t[r[c-1][0]].t){case 2:e.l+2===r[c][1]&&(e.l+=2,S=!1);break;case 80:e.l<=r[c][1]&&(e.l=r[c][1],S=!1);break;case 4108:e.l<=r[c][1]&&(e.l=r[c][1],S=!1);break}if((!t||c==0)&&e.l<=r[c][1]&&(S=!1,e.l=r[c][1]),S)throw new Error("Read Error: Expected address "+r[c][1]+" at "+e.l+" :"+c)}if(t){var x=t[r[c][0]];if(g[x.n]=Bu(e,x.t,{raw:!0}),x.p==="version"&&(g[x.n]=String(g[x.n]>>16)+"."+("0000"+String(g[x.n]&65535)).slice(-4)),x.n=="CodePage")switch(g[x.n]){case 0:g[x.n]=1252;case 874:case 932:case 936:case 949:case 950:case 1250:case 1251:case 1253:case 1254:case 1255:case 1256:case 1257:case 1258:case 1e4:case 1200:case 1201:case 1252:case 65e3:case-536:case 65001:case-535:Li(l=g[x.n]>>>0&65535);break;default:throw new Error("Unsupported CodePage: "+g[x.n])}}else if(r[c][0]===1){if(l=g.CodePage=Bu(e,Hp),Li(l),f!==-1){var y=e.l;e.l=r[f][1],T=$v(e,l),e.l=y}}else if(r[c][0]===0){if(l===0){f=c,e.l=r[c+1][1];continue}T=$v(e,l)}else{var w=T[r[c][0]],C;switch(e[e.l]){case 65:e.l+=4,C=iS(e);break;case 30:e.l+=4,C=zh(e,e[e.l-4]).replace(/\u0000+$/,"");break;case 31:e.l+=4,C=zh(e,e[e.l-4]).replace(/\u0000+$/,"");break;case 3:e.l+=4,C=e.read_shift(4,"i");break;case 19:e.l+=4,C=e.read_shift(4);break;case 5:e.l+=4,C=e.read_shift(8,"f");break;case 11:e.l+=4,C=Cn(e,4);break;case 64:e.l+=4,C=Yn(Gp(e));break;default:throw new Error("unparsed value: "+e[e.l])}g[w]=C}}return e.l=n+a,g}function Zv(e,t,n){var a=e.content;if(!a)return{};aa(a,0);var i,r,c,l,f=0;a.chk("feff","Byte Order: "),a.read_shift(2);var T=a.read_shift(4),p=a.read_shift(16);if(p!==Ft.utils.consts.HEADER_CLSID&&p!==n)throw new Error("Bad PropertySet CLSID "+p);if(i=a.read_shift(4),i!==1&&i!==2)throw new Error("Unrecognized #Sets: "+i);if(r=a.read_shift(16),l=a.read_shift(4),i===1&&l!==a.l)throw new Error("Length mismatch: "+l+" !== "+a.l);i===2&&(c=a.read_shift(16),f=a.read_shift(4));var m=Yv(a,t),g={SystemIdentifier:T};for(var S in m)g[S]=m[S];if(g.FMTID=r,i===1)return g;if(f-a.l==2&&(a.l+=2),a.l!==f)throw new Error("Length mismatch 2: "+a.l+" !== "+f);var x;try{x=Yv(a,null)}catch{}for(S in x)g[S]=x[S];return g.FMTID=[r,c],g}function sr(e,t){return e.read_shift(t),null}function Tk(e,t,n){for(var a=[],i=e.l+t;e.l=12?2:1),i="sbcs-cont";if(n&&n.biff>=8,!n||n.biff==8){var r=e.read_shift(1);r&&(i="dbcs-cont")}else n.biff==12&&(i="wstr");n.biff>=2&&n.biff<=5&&(i="cpstr");var c=a?e.read_shift(a,i):"";return c}function hk(e){var t=e.read_shift(2),n=e.read_shift(1),a=n&4,i=n&8,r=1+(n&1),c=0,l,f={};i&&(c=e.read_shift(2)),a&&(l=e.read_shift(4));var T=r==2?"dbcs-cont":"sbcs-cont",p=t===0?"":e.read_shift(t,T);return i&&(e.l+=4*c),a&&(e.l+=l),f.t=p,i||(f.raw=""+f.t+"",f.r=f.t),f}function r0(e,t,n){var a;if(n){if(n.biff>=2&&n.biff<=5)return e.read_shift(t,"cpstr");if(n.biff>=12)return e.read_shift(t,"dbcs-cont")}var i=e.read_shift(1);return i===0?a=e.read_shift(t,"sbcs-cont"):a=e.read_shift(t,"dbcs-cont"),a}function k1(e,t,n){var a=e.read_shift(n&&n.biff==2?1:2);return a===0?(e.l++,""):r0(e,a,n)}function p0(e,t,n){if(n.biff>5)return k1(e,t,n);var a=e.read_shift(1);return a===0?(e.l++,""):e.read_shift(a,n.biff<=4||!e.lens?"cpstr":"sbcs-cont")}function pk(e){var t=e.read_shift(1);e.l++;var n=e.read_shift(2);return e.l+=2,[t,n]}function mk(e){var t=e.read_shift(4),n=e.l,a=!1;t>24&&(e.l+=t-24,e.read_shift(16)==="795881f43b1d7f48af2c825dc4852763"&&(a=!0),e.l=n);var i=e.read_shift((a?t-24:t)>>1,"utf16le").replace(Oa,"");return a&&(e.l+=24),i}function gk(e){for(var t=e.read_shift(2),n="";t-- >0;)n+="../";var a=e.read_shift(0,"lpstr-ansi");if(e.l+=2,e.read_shift(2)!=57005)throw new Error("Bad FileMoniker");var i=e.read_shift(4);if(i===0)return n+a.replace(/\\/g,"/");var r=e.read_shift(4);if(e.read_shift(2)!=3)throw new Error("Bad FileMoniker");var c=e.read_shift(r>>1,"utf16le").replace(Oa,"");return n+c}function vk(e,t){var n=e.read_shift(16);switch(n){case"e0c9ea79f9bace118c8200aa004ba90b":return mk(e);case"0303000000000000c000000000000046":return gk(e);default:throw new Error("Unsupported Moniker "+n)}}function Hl(e){var t=e.read_shift(4),n=t>0?e.read_shift(t,"utf16le").replace(Oa,""):"";return n}function xk(e,t){var n=e.l+t,a=e.read_shift(4);if(a!==2)throw new Error("Unrecognized streamVersion: "+a);var i=e.read_shift(2);e.l+=2;var r,c,l,f,T="",p,m;i&16&&(r=Hl(e,n-e.l)),i&128&&(c=Hl(e,n-e.l)),(i&257)===257&&(l=Hl(e,n-e.l)),(i&257)===1&&(f=vk(e,n-e.l)),i&8&&(T=Hl(e,n-e.l)),i&32&&(p=e.read_shift(16)),i&64&&(m=Gp(e)),e.l=n;var g=c||l||f||"";g&&T&&(g+="#"+T),g||(g="#"+T),i&2&&g.charAt(0)=="/"&&g.charAt(1)!="/"&&(g="file://"+g);var S={Target:g};return p&&(S.guid=p),m&&(S.time=m),r&&(S.Tooltip=r),S}function rS(e){var t=e.read_shift(1),n=e.read_shift(1),a=e.read_shift(1),i=e.read_shift(1);return[t,n,a,i]}function oS(e,t){var n=rS(e);return n[3]=0,n}function is(e){var t=e.read_shift(2),n=e.read_shift(2),a=e.read_shift(2);return{r:t,c:n,ixfe:a}}function yk(e){var t=e.read_shift(2),n=e.read_shift(2);return e.l+=8,{type:t,flags:n}}function Sk(e,t,n){return t===0?"":p0(e,t,n)}function bk(e,t,n){var a=n.biff>8?4:2,i=e.read_shift(a),r=e.read_shift(a,"i"),c=e.read_shift(a,"i");return[i,r,c]}function cS(e){var t=e.read_shift(2),n=Vp(e);return[t,n]}function wk(e,t,n){e.l+=4,t-=4;var a=e.l+t,i=E1(e,t,n),r=e.read_shift(2);if(a-=e.l,r!==a)throw new Error("Malformed AddinUdf: padding = "+a+" != "+r);return e.l+=r,i}function ld(e){var t=e.read_shift(2),n=e.read_shift(2),a=e.read_shift(2),i=e.read_shift(2);return{s:{c:a,r:t},e:{c:i,r:n}}}function lS(e){var t=e.read_shift(2),n=e.read_shift(2),a=e.read_shift(1),i=e.read_shift(1);return{s:{c:a,r:t},e:{c:i,r:n}}}var Ck=lS;function uS(e){e.l+=4;var t=e.read_shift(2),n=e.read_shift(2),a=e.read_shift(2);return e.l+=12,[n,t,a]}function Ek(e){var t={};return e.l+=4,e.l+=16,t.fSharedNote=e.read_shift(2),e.l+=4,t}function kk(e){var t={};return e.l+=4,e.cf=e.read_shift(2),t}function fa(e){e.l+=2,e.l+=e.read_shift(2)}var Ak={0:fa,4:fa,5:fa,6:fa,7:kk,8:fa,9:fa,10:fa,11:fa,12:fa,13:Ek,14:fa,15:fa,16:fa,17:fa,18:fa,19:fa,20:fa,21:uS};function Rk(e,t){for(var n=e.l+t,a=[];e.l=2&&(n.dt=e.read_shift(2),e.l-=2),n.BIFFVer){case 1536:case 1280:case 1024:case 768:case 512:case 2:case 7:break;default:if(t>6)throw new Error("Unexpected BIFF Ver "+n.BIFFVer)}return e.read_shift(t),n}function Dk(e,t){return t===0||e.read_shift(2),1200}function Ik(e,t,n){if(n.enc)return e.l+=t,"";var a=e.l,i=p0(e,0,n);return e.read_shift(t+a-e.l),i}function Nk(e,t,n){var a=n&&n.biff==8||t==2?e.read_shift(2):(e.l+=t,0);return{fDialog:a&16,fBelow:a&64,fRight:a&128}}function Ok(e,t,n){var a=e.read_shift(4),i=e.read_shift(1)&3,r=e.read_shift(1);switch(r){case 0:r="Worksheet";break;case 1:r="Macrosheet";break;case 2:r="Chartsheet";break;case 6:r="VBAModule";break}var c=E1(e,0,n);return c.length===0&&(c="Sheet1"),{pos:a,hs:i,dt:r,name:c}}function Mk(e,t){for(var n=e.l+t,a=e.read_shift(4),i=e.read_shift(4),r=[],c=0;c!=i&&e.l>15),i&=32767);var r={Unsynced:a&1,DyZero:(a&2)>>1,ExAsc:(a&4)>>2,ExDsc:(a&8)>>3};return[r,i]}function _k(e){var t=e.read_shift(2),n=e.read_shift(2),a=e.read_shift(2),i=e.read_shift(2),r=e.read_shift(2),c=e.read_shift(2),l=e.read_shift(2),f=e.read_shift(2),T=e.read_shift(2);return{Pos:[t,n],Dim:[a,i],Flags:r,CurTab:c,FirstTab:l,Selected:f,TabRatio:T}}function qk(e,t,n){if(n&&n.biff>=2&&n.biff<5)return{};var a=e.read_shift(2);return{RTL:a&64}}function Bk(){}function Uk(e,t,n){var a={dyHeight:e.read_shift(2),fl:e.read_shift(2)};switch(n&&n.biff||8){case 2:break;case 3:case 4:e.l+=2;break;default:e.l+=10;break}return a.name=E1(e,0,n),a}function zk(e){var t=is(e);return t.isst=e.read_shift(4),t}function Wk(e,t,n){n.biffguess&&n.biff==2&&(n.biff=5);var a=e.l+t,i=is(e);n.biff==2&&e.l++;var r=k1(e,a-e.l,n);return i.val=r,i}function Vk(e,t,n){var a=e.read_shift(2),i=p0(e,0,n);return[a,i]}var Hk=p0;function Qv(e,t,n){var a=e.l+t,i=n.biff==8||!n.biff?4:2,r=e.read_shift(i),c=e.read_shift(i),l=e.read_shift(2),f=e.read_shift(2);return e.l=a,{s:{r,c:l},e:{r:c,c:f}}}function Gk(e){var t=e.read_shift(2),n=e.read_shift(2),a=cS(e);return{r:t,c:n,ixfe:a[0],rknum:a[1]}}function Xk(e,t){for(var n=e.l+t-2,a=e.read_shift(2),i=e.read_shift(2),r=[];e.l>26],a.cellStyles&&(i.alc=r&7,i.fWrap=r>>3&1,i.alcV=r>>4&7,i.fJustLast=r>>7&1,i.trot=r>>8&255,i.cIndent=r>>16&15,i.fShrinkToFit=r>>20&1,i.iReadOrder=r>>22&2,i.fAtrNum=r>>26&1,i.fAtrFnt=r>>27&1,i.fAtrAlc=r>>28&1,i.fAtrBdr=r>>29&1,i.fAtrPat=r>>30&1,i.fAtrProt=r>>31&1,i.dgLeft=c&15,i.dgRight=c>>4&15,i.dgTop=c>>8&15,i.dgBottom=c>>12&15,i.icvLeft=c>>16&127,i.icvRight=c>>23&127,i.grbitDiag=c>>30&3,i.icvTop=l&127,i.icvBottom=l>>7&127,i.icvDiag=l>>14&127,i.dgDiag=l>>21&15,i.icvFore=f&127,i.icvBack=f>>7&127,i.fsxButton=f>>14&1),i}function Yk(e,t,n){var a={};return a.ifnt=e.read_shift(2),a.numFmtId=e.read_shift(2),a.flags=e.read_shift(2),a.fStyle=a.flags>>2&1,t-=6,a.data=$k(e,t,a.fStyle,n),a}function Zk(e){e.l+=4;var t=[e.read_shift(2),e.read_shift(2)];if(t[0]!==0&&t[0]--,t[1]!==0&&t[1]--,t[0]>7||t[1]>7)throw new Error("Bad Gutters: "+t.join("|"));return t}function ex(e,t,n){var a=is(e);(n.biff==2||t==9)&&++e.l;var i=fk(e);return a.val=i,a.t=i===!0||i===!1?"b":"e",a}function Jk(e,t,n){n.biffguess&&n.biff==2&&(n.biff=5);var a=is(e),i=pa(e);return a.val=i,a}var tx=Sk;function Qk(e,t,n){var a=e.l+t,i=e.read_shift(2),r=e.read_shift(2);if(n.sbcch=r,r==1025||r==14849)return[r,i];if(r<1||r>255)throw new Error("Unexpected SupBook type: "+r);for(var c=r0(e,r),l=[];a>e.l;)l.push(k1(e));return[r,i,c,l]}function nx(e,t,n){var a=e.read_shift(2),i,r={fBuiltIn:a&1,fWantAdvise:a>>>1&1,fWantPict:a>>>2&1,fOle:a>>>3&1,fOleLink:a>>>4&1,cf:a>>>5&1023,fIcon:a>>>15&1};return n.sbcch===14849&&(i=wk(e,t-2,n)),r.body=i||e.read_shift(t-2),typeof i=="string"&&(r.Name=i),r}var e9=["_xlnm.Consolidate_Area","_xlnm.Auto_Open","_xlnm.Auto_Close","_xlnm.Extract","_xlnm.Database","_xlnm.Criteria","_xlnm.Print_Area","_xlnm.Print_Titles","_xlnm.Recorder","_xlnm.Data_Form","_xlnm.Auto_Activate","_xlnm.Auto_Deactivate","_xlnm.Sheet_Title","_xlnm._FilterDatabase"];function ax(e,t,n){var a=e.l+t,i=e.read_shift(2),r=e.read_shift(1),c=e.read_shift(1),l=e.read_shift(n&&n.biff==2?1:2),f=0;(!n||n.biff>=5)&&(n.biff!=5&&(e.l+=2),f=e.read_shift(2),n.biff==5&&(e.l+=2),e.l+=4);var T=r0(e,c,n);i&32&&(T=e9[T.charCodeAt(0)]);var p=a-e.l;n&&n.biff==2&&--p;var m=a==e.l||l===0||!(p>0)?[]:FD(e,p,n,l);return{chKey:r,Name:T,itab:f,rgce:m}}function dS(e,t,n){if(n.biff<8)return t9(e,t,n);for(var a=[],i=e.l+t,r=e.read_shift(n.biff>8?4:2);r--!==0;)a.push(bk(e,n.biff>8?12:6,n));if(e.l!=i)throw new Error("Bad ExternSheet: "+e.l+" != "+i);return a}function t9(e,t,n){e[e.l+1]==3&&e[e.l]++;var a=E1(e,t,n);return a.charCodeAt(0)==3?a.slice(1):a}function n9(e,t,n){if(n.biff<8){e.l+=t;return}var a=e.read_shift(2),i=e.read_shift(2),r=r0(e,a,n),c=r0(e,i,n);return[r,c]}function a9(e,t,n){var a=lS(e);e.l++;var i=e.read_shift(1);return t-=8,[LD(e,t,n),i,a]}function ix(e,t,n){var a=Ck(e);switch(n.biff){case 2:e.l++,t-=7;break;case 3:case 4:e.l+=2,t-=8;break;default:e.l+=6,t-=12}return[a,MD(e,t,n)]}function i9(e){var t=e.read_shift(4)!==0,n=e.read_shift(4)!==0,a=e.read_shift(4);return[t,n,a]}function s9(e,t,n){if(!(n.biff<8)){var a=e.read_shift(2),i=e.read_shift(2),r=e.read_shift(2),c=e.read_shift(2),l=p0(e,0,n);return n.biff<8&&e.read_shift(1),[{r:a,c:i},l,c,r]}}function r9(e,t,n){return s9(e,t,n)}function o9(e,t){for(var n=[],a=e.read_shift(2);a--;)n.push(ld(e));return n}function c9(e,t,n){if(n&&n.biff<8)return u9(e,t,n);var a=uS(e),i=Rk(e,t-22,a[1]);return{cmo:a,ft:i}}var l9={8:function(e,t){var n=e.l+t;e.l+=10;var a=e.read_shift(2);e.l+=4,e.l+=2,e.l+=2,e.l+=2,e.l+=4;var i=e.read_shift(1);return e.l+=i,e.l=n,{fmt:a}}};function u9(e,t,n){e.l+=4;var a=e.read_shift(2),i=e.read_shift(2),r=e.read_shift(2);e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=6,t-=36;var c=[];return c.push((l9[a]||xa)(e,t,n)),{cmo:[i,a,r],ft:c}}function d9(e,t,n){var a=e.l,i="";try{e.l+=4;var r=(n.lastobj||{cmo:[0,0]}).cmo[1],c;[0,5,7,11,12,14].indexOf(r)==-1?e.l+=6:c=pk(e,6,n);var l=e.read_shift(2);e.read_shift(2),jn(e,2);var f=e.read_shift(2);e.l+=f;for(var T=1;T=(p?l:2*l))break}if(i.length!==l&&i.length!==l*2)throw new Error("cchText: "+l+" != "+i.length);return e.l=a+t,{t:i}}catch{return e.l=a+t,{t:i}}}function T9(e,t){var n=ld(e);e.l+=16;var a=xk(e,t-24);return[n,a]}function f9(e,t){e.read_shift(2);var n=ld(e),a=e.read_shift((t-10)/2,"dbcs-cont");return a=a.replace(Oa,""),[n,a]}function h9(e){var t=[0,0],n;return n=e.read_shift(2),t[0]=Xv[n]||n,n=e.read_shift(2),t[1]=Xv[n]||n,t}function p9(e){for(var t=e.read_shift(2),n=[];t-- >0;)n.push(oS(e));return n}function m9(e){for(var t=e.read_shift(2),n=[];t-- >0;)n.push(oS(e));return n}function g9(e){e.l+=2;var t={cxfs:0,crc:0};return t.cxfs=e.read_shift(2),t.crc=e.read_shift(4),t}function TS(e,t,n){if(!n.cellStyles)return xa(e,t);var a=n&&n.biff>=12?4:2,i=e.read_shift(a),r=e.read_shift(a),c=e.read_shift(a),l=e.read_shift(a),f=e.read_shift(2);a==2&&(e.l+=2);var T={s:i,e:r,w:c,ixfe:l,flags:f};return(n.biff>=5||!n.biff)&&(T.level=f>>8&7),T}function v9(e,t){var n={};return t<32||(e.l+=16,n.header=pa(e),n.footer=pa(e),e.l+=2),n}function x9(e,t,n){var a={area:!1};if(n.biff!=5)return e.l+=t,a;var i=e.read_shift(1);return e.l+=3,i&16&&(a.area=!0),a}var y9=is,S9=sS,b9=k1;function w9(e){var t=e.read_shift(2),n=e.read_shift(2),a=e.read_shift(4),i={fmt:t,env:n,len:a,data:e.slice(e.l,e.l+a)};return e.l+=a,i}function C9(e,t,n){n.biffguess&&n.biff==5&&(n.biff=2);var a=is(e);++e.l;var i=p0(e,t-7,n);return a.t="str",a.val=i,a}function E9(e){var t=is(e);++e.l;var n=pa(e);return t.t="n",t.val=n,t}function k9(e){var t=is(e);++e.l;var n=e.read_shift(2);return t.t="n",t.val=n,t}function A9(e){var t=e.read_shift(1);return t===0?(e.l++,""):e.read_shift(t,"sbcs-cont")}function R9(e,t){e.l+=6,e.l+=2,e.l+=1,e.l+=3,e.l+=1,e.l+=t-13}function D9(e,t,n){var a=e.l+t,i=is(e),r=e.read_shift(2),c=r0(e,r,n);return e.l=a,i.t="str",i.val=c,i}var I9=[2,3,48,49,131,139,140,245],sx=(function(){var e={1:437,2:850,3:1252,4:1e4,100:852,101:866,102:865,103:861,104:895,105:620,106:737,107:857,120:950,121:949,122:936,123:932,124:874,125:1255,126:1256,150:10007,151:10029,152:10006,200:1250,201:1251,202:1254,203:1253,0:20127,8:865,9:437,10:850,11:437,13:437,14:850,15:437,16:850,17:437,18:850,19:932,20:850,21:437,22:850,23:865,24:437,25:437,26:850,27:437,28:863,29:850,31:852,34:852,35:852,36:860,37:850,38:866,55:850,64:852,77:936,78:949,79:950,80:874,87:1252,88:1252,89:1252,108:863,134:737,135:852,136:857,204:1257,255:16969},t=Fp({1:437,2:850,3:1252,4:1e4,100:852,101:866,102:865,103:861,104:895,105:620,106:737,107:857,120:950,121:949,122:936,123:932,124:874,125:1255,126:1256,150:10007,151:10029,152:10006,200:1250,201:1251,202:1254,203:1253,0:20127});function n(l,f){var T=[],p=pr(1);switch(f.type){case"base64":p=Oi(Qa(l));break;case"binary":p=Oi(l);break;case"buffer":case"array":p=l;break}aa(p,0);var m=p.read_shift(1),g=!!(m&136),S=!1,x=!1;switch(m){case 2:break;case 3:break;case 48:S=!0,g=!0;break;case 49:S=!0,g=!0;break;case 131:break;case 139:break;case 140:x=!0;break;case 245:break;default:throw new Error("DBF Unsupported Version: "+m.toString(16))}var y=0,w=521;m==2&&(y=p.read_shift(2)),p.l+=3,m!=2&&(y=p.read_shift(4)),y>1048576&&(y=1e6),m!=2&&(w=p.read_shift(2));var C=p.read_shift(2),k=f.codepage||1252;m!=2&&(p.l+=16,p.read_shift(1),p[p.l]!==0&&(k=e[p[p.l]]),p.l+=1,p.l+=2),x&&(p.l+=36);for(var E=[],O={},N=Math.min(p.length,m==2?521:w-10-(S?264:0)),B=x?32:11;p.l0;){if(p[p.l]===42){p.l+=C;continue}for(++p.l,T[++A]=[],z=0,z=0;z!=E.length;++z){var P=p.slice(p.l,p.l+E[z].len);p.l+=E[z].len,aa(P,0);var K=n1.utils.decode(k,P);switch(E[z].type){case"C":K.trim().length&&(T[A][z]=K.replace(/\s+$/,""));break;case"D":K.length===8?T[A][z]=new Date(+K.slice(0,4),+K.slice(4,6)-1,+K.slice(6,8)):T[A][z]=K;break;case"F":T[A][z]=parseFloat(K.trim());break;case"+":case"I":T[A][z]=x?P.read_shift(-4,"i")^2147483648:P.read_shift(4,"i");break;case"L":switch(K.trim().toUpperCase()){case"Y":case"T":T[A][z]=!0;break;case"N":case"F":T[A][z]=!1;break;case"":case"?":break;default:throw new Error("DBF Unrecognized L:|"+K+"|")}break;case"M":if(!g)throw new Error("DBF Unexpected MEMO for type "+m.toString(16));T[A][z]="##MEMO##"+(x?parseInt(K.trim(),10):P.read_shift(4));break;case"N":K=K.replace(/\u0000/g,"").trim(),K&&K!="."&&(T[A][z]=+K||0);break;case"@":T[A][z]=new Date(P.read_shift(-8,"f")-621356832e5);break;case"T":T[A][z]=new Date((P.read_shift(4)-2440588)*864e5+P.read_shift(4));break;case"Y":T[A][z]=P.read_shift(4,"i")/1e4+P.read_shift(4,"i")/1e4*Math.pow(2,32);break;case"O":T[A][z]=-P.read_shift(-8,"f");break;case"B":if(S&&E[z].len==8){T[A][z]=P.read_shift(8,"f");break}case"G":case"P":P.l+=E[z].len;break;case"0":if(E[z].name==="_NullFlags")break;default:throw new Error("DBF Unsupported data type "+E[z].type)}}}if(m!=2&&p.l=0&&Li(+T.codepage),T.type=="string")throw new Error("Cannot write DBF to JS string");var p=qh(),m=$h(l,{header:1,raw:!0,cellDates:!0}),g=m[0],S=m.slice(1),x=l["!cols"]||[],y=0,w=0,C=0,k=1;for(y=0;y250&&(P=250),z=((x[y]||{}).DBF||{}).type,z=="C"&&x[y].DBF.len>P&&(P=x[y].DBF.len),A=="B"&&z=="N"&&(A="N",B[y]=x[y].DBF.dec,P=x[y].DBF.len),N[y]=A=="C"||z=="N"?P:r[A]||0,k+=N[y],O[y]=A}var I=p.next(32);for(I.write_shift(4,318902576),I.write_shift(4,S.length),I.write_shift(2,296+32*C),I.write_shift(2,k),y=0;y<4;++y)I.write_shift(4,0);for(I.write_shift(4,0|(+t[d4]||3)<<8),y=0,w=0;y":190,"?":191,"{":223},t=new RegExp("\x1BN("+ns(e).join("|").replace(/\|\|\|/,"|\\||").replace(/([?()+])/g,"\\$1")+"|\\|)","gm"),n=function(g,S){var x=e[S];return typeof x=="number"?Sv(x):x},a=function(g,S,x){var y=S.charCodeAt(0)-32<<4|x.charCodeAt(0)-48;return y==59?g:Sv(y)};e["|"]=254;function i(g,S){switch(S.type){case"base64":return r(Qa(g),S);case"binary":return r(g,S);case"buffer":return r(Mt&&Buffer.isBuffer(g)?g.toString("binary"):d0(g),S);case"array":return r(s0(g),S)}throw new Error("Unrecognized type "+S.type)}function r(g,S){var x=g.split(/[\n\r]+/),y=-1,w=-1,C=0,k=0,E=[],O=[],N=null,B={},A=[],z=[],P=[],K=0,I;for(+S.codepage>=0&&Li(+S.codepage);C!==x.length;++C){K=0;var L=x[C].trim().replace(/\x1B([\x20-\x2F])([\x30-\x3F])/g,a).replace(t,n),le=L.replace(/;;/g,"\0").split(";").map(function(J){return J.replace(/\u0000/g,";")}),ue=le[0],X;if(L.length>0)switch(ue){case"ID":break;case"E":break;case"B":break;case"O":break;case"W":break;case"P":le[1].charAt(0)=="P"&&O.push(L.slice(3).replace(/;;/g,";"));break;case"C":var F=!1,re=!1,me=!1,te=!1,Ce=-1,ee=-1;for(k=1;k-1&&E[Ce][ee];if(!Y||!Y[1])throw new Error("SYLK shared formula cannot find base");E[y][w][1]=bS(Y[1],{r:y-Ce,c:w-ee})}break;case"F":var Z=0;for(k=1;k0?(A[y].hpt=K,A[y].hpx=c1(K)):K===0&&(A[y].hidden=!0);break;default:if(S&&S.WTF)throw new Error("SYLK bad record "+L)}Z<1&&(N=null);break;default:if(S&&S.WTF)throw new Error("SYLK bad record "+L)}}return A.length>0&&(B["!rows"]=A),z.length>0&&(B["!cols"]=z),S&&S.sheetRows&&(E=E.slice(0,S.sheetRows)),[E,B]}function c(g,S){var x=i(g,S),y=x[0],w=x[1],C=ko(y,S);return ns(w).forEach(function(k){C[k]=w[k]}),C}function l(g,S){return xr(c(g,S),S)}function f(g,S,x,y){var w="C;Y"+(x+1)+";X"+(y+1)+";K";switch(g.t){case"n":w+=g.v||0,g.f&&!g.F&&(w+=";E"+gR(g.f,{r:x,c:y}));break;case"b":w+=g.v?"TRUE":"FALSE";break;case"e":w+=g.w||g.v;break;case"d":w+='"'+(g.w||g.v)+'"';break;case"s":w+='"'+g.v.replace(/"/g,"").replace(/;/g,";;")+'"';break}return w}function T(g,S){S.forEach(function(x,y){var w="F;W"+(y+1)+" "+(y+1)+" ";x.hidden?w+="0":(typeof x.width=="number"&&!x.wpx&&(x.wpx=zu(x.width)),typeof x.wpx=="number"&&!x.wch&&(x.wch=Wu(x.wpx)),typeof x.wch=="number"&&(w+=Math.round(x.wch))),w.charAt(w.length-1)!=" "&&g.push(w)})}function p(g,S){S.forEach(function(x,y){var w="F;";x.hidden?w+="M0;":x.hpt?w+="M"+20*x.hpt+";":x.hpx&&(w+="M"+20*xS(x.hpx)+";"),w.length>2&&g.push(w+"R"+(y+1))})}function m(g,S){var x=["ID;PWXL;N;E"],y=[],w=xn(g["!ref"]),C,k=Array.isArray(g),E=`\r +`;x.push("P;PGeneral"),x.push("F;P0;DG0G8;M255"),g["!cols"]&&T(x,g["!cols"]),g["!rows"]&&p(x,g["!rows"]),x.push("B;Y"+(w.e.r-w.s.r+1)+";X"+(w.e.c-w.s.c+1)+";D"+[w.s.c,w.s.r,w.e.c,w.e.r].join(" "));for(var O=w.s.r;O<=w.e.r;++O)for(var N=w.s.c;N<=w.e.c;++N){var B=ht({r:O,c:N});C=k?(g[O]||[])[N]:g[B],!(!C||C.v==null&&(!C.f||C.F))&&y.push(f(C,g,O,N))}return x.join(E)+E+y.join(E)+E+"E"+E}return{to_workbook:l,to_sheet:c,from_sheet:m}})(),O9=(function(){function e(r,c){switch(c.type){case"base64":return t(Qa(r),c);case"binary":return t(r,c);case"buffer":return t(Mt&&Buffer.isBuffer(r)?r.toString("binary"):d0(r),c);case"array":return t(s0(r),c)}throw new Error("Unrecognized type "+c.type)}function t(r,c){for(var l=r.split(` +`),f=-1,T=-1,p=0,m=[];p!==l.length;++p){if(l[p].trim()==="BOT"){m[++f]=[],T=0;continue}if(!(f<0)){var g=l[p].trim().split(","),S=g[0],x=g[1];++p;for(var y=l[p]||"";(y.match(/["]/g)||[]).length&1&&p=0&&x[y].length===0;)--y;for(var w=10,C=0,k=0;k<=y;++k)C=x[k].indexOf(" "),C==-1?C=x[k].length:C++,w=Math.max(w,C);for(k=0;k<=y;++k){S[k]=[];var E=0;for(e(x[k].slice(0,w).trim(),S,k,E,g),E=1;E<=(x[k].length-w)/10+1;++E)e(x[k].slice(w+(E-1)*10,w+E*10).trim(),S,k,E,g)}return g.sheetRows&&(S=S.slice(0,g.sheetRows)),S}var n={44:",",9:" ",59:";",124:"|"},a={44:3,9:2,59:1,124:0};function i(p){for(var m={},g=!1,S=0,x=0;S0&&K(),x["!ref"]=Lt(y),x}function c(p,m){return!(m&&m.PRN)||m.FS||p.slice(0,4)=="sep="||p.indexOf(" ")>=0||p.indexOf(",")>=0||p.indexOf(";")>=0?r(p,m):ko(t(p,m),m)}function l(p,m){var g="",S=m.type=="string"?[0,0,0,0]:em(p,m);switch(m.type){case"base64":g=Qa(p);break;case"binary":g=p;break;case"buffer":m.codepage==65001?g=p.toString("utf8"):m.codepage&&typeof n1<"u"||(g=Mt&&Buffer.isBuffer(p)?p.toString("binary"):d0(p));break;case"array":g=s0(p);break;case"string":g=p;break;default:throw new Error("Unrecognized type "+m.type)}return S[0]==239&&S[1]==187&&S[2]==191?g=rn(g.slice(3)):m.type!="string"&&m.type!="buffer"&&m.codepage==65001?g=rn(g):m.type=="binary"&&typeof n1<"u",g.slice(0,19)=="socialcalc:version:"?M9.to_sheet(m.type=="string"?g:rn(g),m):c(g,m)}function f(p,m){return xr(l(p,m),m)}function T(p){for(var m=[],g=xn(p["!ref"]),S,x=Array.isArray(p),y=g.s.r;y<=g.e.r;++y){for(var w=[],C=g.s.c;C<=g.e.c;++C){var k=ht({r:y,c:C});if(S=x?(p[y]||[])[C]:p[k],!S||S.v==null){w.push(" ");continue}for(var E=(S.w||(Ms(S),S.w)||"").slice(0,10);E.length<10;)E+=" ";w.push(E+(C===0?" ":""))}m.push(w.join(""))}return m.join(` +`)}return{to_workbook:f,to_sheet:l,from_sheet:T}})();function j9(e,t){var n=t||{},a=!!n.WTF;n.WTF=!0;try{var i=N9.to_workbook(e,n);return n.WTF=a,i}catch(r){if(n.WTF=a,!r.message.match(/SYLK bad record ID/)&&a)throw r;return r1.to_workbook(e,t)}}var Kc=(function(){function e(M,Y,Z){if(M){aa(M,M.l||0);for(var J=Z.Enum||Ce;M.l=16&&M[14]==5&&M[15]===108)throw new Error("Unsupported Works 3 for Mac file");if(M[2]==2)Z.Enum=Ce,e(M,function(Le,_e,Xe){switch(Xe){case 0:Z.vers=Le,Le>=4096&&(Z.qpro=!0);break;case 6:ae=Le;break;case 204:Le&&(ge=Le);break;case 222:ge=Le;break;case 15:case 51:Z.qpro||(Le[1].v=Le[1].v.slice(1));case 13:case 14:case 16:Xe==14&&(Le[2]&112)==112&&(Le[2]&15)>1&&(Le[2]&15)<15&&(Le[1].z=Z.dateNF||vt[14],Z.cellDates&&(Le[1].t="d",Le[1].v=cd(Le[1].v))),Z.qpro&&Le[3]>de&&(J["!ref"]=Lt(ae),fe[he]=J,ye.push(he),J=Z.dense?[]:{},ae={s:{r:0,c:0},e:{r:0,c:0}},de=Le[3],he=ge||"Sheet"+(de+1),ge="");var pt=Z.dense?(J[Le[0].r]||[])[Le[0].c]:J[ht(Le[0])];if(pt){pt.t=Le[1].t,pt.v=Le[1].v,Le[1].z!=null&&(pt.z=Le[1].z),Le[1].f!=null&&(pt.f=Le[1].f);break}Z.dense?(J[Le[0].r]||(J[Le[0].r]=[]),J[Le[0].r][Le[0].c]=Le[1]):J[ht(Le[0])]=Le[1];break}},Z);else if(M[2]==26||M[2]==14)Z.Enum=ee,M[2]==14&&(Z.qpro=!0,M.l=0),e(M,function(Le,_e,Xe){switch(Xe){case 204:he=Le;break;case 22:Le[1].v=Le[1].v.slice(1);case 23:case 24:case 25:case 37:case 39:case 40:if(Le[3]>de&&(J["!ref"]=Lt(ae),fe[he]=J,ye.push(he),J=Z.dense?[]:{},ae={s:{r:0,c:0},e:{r:0,c:0}},de=Le[3],he="Sheet"+(de+1)),Ne>0&&Le[0].r>=Ne)break;Z.dense?(J[Le[0].r]||(J[Le[0].r]=[]),J[Le[0].r][Le[0].c]=Le[1]):J[ht(Le[0])]=Le[1],ae.e.c=0&&Li(+Z.codepage),Z.type=="string")throw new Error("Cannot write WK1 to JS string");var J=qh(),he=xn(M["!ref"]),ge=Array.isArray(M),de=[];Ii(J,0,r(1030)),Ii(J,6,f(he));for(var fe=Math.min(he.e.r,8191),ye=he.s.r;ye<=fe;++ye)for(var qe=ra(ye),ae=he.s.c;ae<=he.e.c;++ae){ye===he.s.r&&(de[ae]=Un(ae));var Ne=de[ae]+qe,Ve=ge?(M[ye]||[])[ae]:M[Ne];if(!(!Ve||Ve.t=="z"))if(Ve.t=="n")(Ve.v|0)==Ve.v&&Ve.v>=-32768&&Ve.v<=32767?Ii(J,13,S(ye,ae,Ve.v)):Ii(J,14,y(ye,ae,Ve.v));else{var tt=Ms(Ve);Ii(J,15,m(ye,ae,tt.slice(0,239)))}}return Ii(J,1),J.end()}function i(M,Y){var Z=Y||{};if(+Z.codepage>=0&&Li(+Z.codepage),Z.type=="string")throw new Error("Cannot write WK3 to JS string");var J=qh();Ii(J,0,c(M));for(var he=0,ge=0;he8191&&(Z=8191),Y.write_shift(2,Z),Y.write_shift(1,he),Y.write_shift(1,J),Y.write_shift(2,0),Y.write_shift(2,0),Y.write_shift(1,1),Y.write_shift(1,2),Y.write_shift(4,0),Y.write_shift(4,0),Y}function l(M,Y,Z){var J={s:{c:0,r:0},e:{c:0,r:0}};return Y==8&&Z.qpro?(J.s.c=M.read_shift(1),M.l++,J.s.r=M.read_shift(2),J.e.c=M.read_shift(1),M.l++,J.e.r=M.read_shift(2),J):(J.s.c=M.read_shift(2),J.s.r=M.read_shift(2),Y==12&&Z.qpro&&(M.l+=2),J.e.c=M.read_shift(2),J.e.r=M.read_shift(2),Y==12&&Z.qpro&&(M.l+=2),J.s.c==65535&&(J.s.c=J.e.c=J.s.r=J.e.r=0),J)}function f(M){var Y=Bn(8);return Y.write_shift(2,M.s.c),Y.write_shift(2,M.s.r),Y.write_shift(2,M.e.c),Y.write_shift(2,M.e.r),Y}function T(M,Y,Z){var J=[{c:0,r:0},{t:"n",v:0},0,0];return Z.qpro&&Z.vers!=20768?(J[0].c=M.read_shift(1),J[3]=M.read_shift(1),J[0].r=M.read_shift(2),M.l+=2):(J[2]=M.read_shift(1),J[0].c=M.read_shift(2),J[0].r=M.read_shift(2)),J}function p(M,Y,Z){var J=M.l+Y,he=T(M,Y,Z);if(he[1].t="s",Z.vers==20768){M.l++;var ge=M.read_shift(1);return he[1].v=M.read_shift(ge,"utf8"),he}return Z.qpro&&M.l++,he[1].v=M.read_shift(J-M.l,"cstr"),he}function m(M,Y,Z){var J=Bn(7+Z.length);J.write_shift(1,255),J.write_shift(2,Y),J.write_shift(2,M),J.write_shift(1,39);for(var he=0;he=128?95:ge)}return J.write_shift(1,0),J}function g(M,Y,Z){var J=T(M,Y,Z);return J[1].v=M.read_shift(2,"i"),J}function S(M,Y,Z){var J=Bn(7);return J.write_shift(1,255),J.write_shift(2,Y),J.write_shift(2,M),J.write_shift(2,Z,"i"),J}function x(M,Y,Z){var J=T(M,Y,Z);return J[1].v=M.read_shift(8,"f"),J}function y(M,Y,Z){var J=Bn(13);return J.write_shift(1,255),J.write_shift(2,Y),J.write_shift(2,M),J.write_shift(8,Z,"f"),J}function w(M,Y,Z){var J=M.l+Y,he=T(M,Y,Z);if(he[1].v=M.read_shift(8,"f"),Z.qpro)M.l=J;else{var ge=M.read_shift(2);O(M.slice(M.l,M.l+ge),he),M.l+=ge}return he}function C(M,Y,Z){var J=Y&32768;return Y&=-32769,Y=(J?M:0)+(Y>=8192?Y-16384:Y),(J?"":"$")+(Z?Un(Y):ra(Y))}var k={51:["FALSE",0],52:["TRUE",0],70:["LEN",1],80:["SUM",69],81:["AVERAGEA",69],82:["COUNTA",69],83:["MINA",69],84:["MAXA",69],111:["T",1]},E=["","","","","","","","","","+","-","*","/","^","=","<>","<=",">=","<",">","","","","","&","","","","","","",""];function O(M,Y){aa(M,0);for(var Z=[],J=0,he="",ge="",de="",fe="";M.lZ.length){console.error("WK1 bad formula parse 0x"+ye.toString(16)+":|"+Z.join("|")+"|");return}var Ve=Z.slice(-J);Z.length-=J,Z.push(k[ye][0]+"("+Ve.join(",")+")")}else return ye<=7?console.error("WK1 invalid opcode "+ye.toString(16)):ye<=24?console.error("WK1 unsupported op "+ye.toString(16)):ye<=30?console.error("WK1 invalid opcode "+ye.toString(16)):ye<=115?console.error("WK1 unsupported function opcode "+ye.toString(16)):console.error("WK1 unrecognized opcode "+ye.toString(16))}}Z.length==1?Y[1].f=""+Z[0]:console.error("WK1 bad formula parse |"+Z.join("|")+"|")}function N(M){var Y=[{c:0,r:0},{t:"n",v:0},0];return Y[0].r=M.read_shift(2),Y[3]=M[M.l++],Y[0].c=M[M.l++],Y}function B(M,Y){var Z=N(M);return Z[1].t="s",Z[1].v=M.read_shift(Y-4,"cstr"),Z}function A(M,Y,Z,J){var he=Bn(6+J.length);he.write_shift(2,M),he.write_shift(1,Z),he.write_shift(1,Y),he.write_shift(1,39);for(var ge=0;ge=128?95:de)}return he.write_shift(1,0),he}function z(M,Y){var Z=N(M);Z[1].v=M.read_shift(2);var J=Z[1].v>>1;if(Z[1].v&1)switch(J&7){case 0:J=(J>>3)*5e3;break;case 1:J=(J>>3)*500;break;case 2:J=(J>>3)/20;break;case 3:J=(J>>3)/200;break;case 4:J=(J>>3)/2e3;break;case 5:J=(J>>3)/2e4;break;case 6:J=(J>>3)/16;break;case 7:J=(J>>3)/64;break}return Z[1].v=J,Z}function P(M,Y){var Z=N(M),J=M.read_shift(4),he=M.read_shift(4),ge=M.read_shift(2);if(ge==65535)return J===0&&he===3221225472?(Z[1].t="e",Z[1].v=15):J===0&&he===3489660928?(Z[1].t="e",Z[1].v=42):Z[1].v=0,Z;var de=ge&32768;return ge=(ge&32767)-16446,Z[1].v=(1-de*2)*(he*Math.pow(2,ge+32)+J*Math.pow(2,ge)),Z}function K(M,Y,Z,J){var he=Bn(14);if(he.write_shift(2,M),he.write_shift(1,Z),he.write_shift(1,Y),J==0)return he.write_shift(4,0),he.write_shift(4,0),he.write_shift(2,65535),he;var ge=0,de=0,fe=0,ye=0;return J<0&&(ge=1,J=-J),de=Math.log2(J)|0,J/=Math.pow(2,de-31),ye=J>>>0,(ye&2147483648)==0&&(J/=2,++de,ye=J>>>0),J-=ye,ye|=2147483648,ye>>>=0,J*=Math.pow(2,32),fe=J>>>0,he.write_shift(4,fe),he.write_shift(4,ye),de+=16383+(ge?32768:0),he.write_shift(2,de),he}function I(M,Y){var Z=P(M);return M.l+=Y-14,Z}function L(M,Y){var Z=N(M),J=M.read_shift(4);return Z[1].v=J>>6,Z}function le(M,Y){var Z=N(M),J=M.read_shift(8,"f");return Z[1].v=J,Z}function ue(M,Y){var Z=le(M);return M.l+=Y-10,Z}function X(M,Y){return M[M.l+Y-1]==0?M.read_shift(Y,"cstr"):""}function F(M,Y){var Z=M[M.l++];Z>Y-1&&(Z=Y-1);for(var J="";J.length127?95:he}return Z[Z.l++]=0,Z}var Ce={0:{n:"BOF",f:jn},1:{n:"EOF"},2:{n:"CALCMODE"},3:{n:"CALCORDER"},4:{n:"SPLIT"},5:{n:"SYNC"},6:{n:"RANGE",f:l},7:{n:"WINDOW1"},8:{n:"COLW1"},9:{n:"WINTWO"},10:{n:"COLW2"},11:{n:"NAME"},12:{n:"BLANK"},13:{n:"INTEGER",f:g},14:{n:"NUMBER",f:x},15:{n:"LABEL",f:p},16:{n:"FORMULA",f:w},24:{n:"TABLE"},25:{n:"ORANGE"},26:{n:"PRANGE"},27:{n:"SRANGE"},28:{n:"FRANGE"},29:{n:"KRANGE1"},32:{n:"HRANGE"},35:{n:"KRANGE2"},36:{n:"PROTEC"},37:{n:"FOOTER"},38:{n:"HEADER"},39:{n:"SETUP"},40:{n:"MARGINS"},41:{n:"LABELFMT"},42:{n:"TITLES"},43:{n:"SHEETJS"},45:{n:"GRAPH"},46:{n:"NGRAPH"},47:{n:"CALCCOUNT"},48:{n:"UNFORMATTED"},49:{n:"CURSORW12"},50:{n:"WINDOW"},51:{n:"STRING",f:p},55:{n:"PASSWORD"},56:{n:"LOCKED"},60:{n:"QUERY"},61:{n:"QUERYNAME"},62:{n:"PRINT"},63:{n:"PRINTNAME"},64:{n:"GRAPH2"},65:{n:"GRAPHNAME"},66:{n:"ZOOM"},67:{n:"SYMSPLIT"},68:{n:"NSROWS"},69:{n:"NSCOLS"},70:{n:"RULER"},71:{n:"NNAME"},72:{n:"ACOMM"},73:{n:"AMACRO"},74:{n:"PARSE"},102:{n:"PRANGES??"},103:{n:"RRANGES??"},104:{n:"FNAME??"},105:{n:"MRANGES??"},204:{n:"SHEETNAMECS",f:X},222:{n:"SHEETNAMELP",f:F},65535:{n:""}},ee={0:{n:"BOF"},1:{n:"EOF"},2:{n:"PASSWORD"},3:{n:"CALCSET"},4:{n:"WINDOWSET"},5:{n:"SHEETCELLPTR"},6:{n:"SHEETLAYOUT"},7:{n:"COLUMNWIDTH"},8:{n:"HIDDENCOLUMN"},9:{n:"USERRANGE"},10:{n:"SYSTEMRANGE"},11:{n:"ZEROFORCE"},12:{n:"SORTKEYDIR"},13:{n:"FILESEAL"},14:{n:"DATAFILLNUMS"},15:{n:"PRINTMAIN"},16:{n:"PRINTSTRING"},17:{n:"GRAPHMAIN"},18:{n:"GRAPHSTRING"},19:{n:"??"},20:{n:"ERRCELL"},21:{n:"NACELL"},22:{n:"LABEL16",f:B},23:{n:"NUMBER17",f:P},24:{n:"NUMBER18",f:z},25:{n:"FORMULA19",f:I},26:{n:"FORMULA1A"},27:{n:"XFORMAT",f:me},28:{n:"DTLABELMISC"},29:{n:"DTLABELCELL"},30:{n:"GRAPHWINDOW"},31:{n:"CPA"},32:{n:"LPLAUTO"},33:{n:"QUERY"},34:{n:"HIDDENSHEET"},35:{n:"??"},37:{n:"NUMBER25",f:L},38:{n:"??"},39:{n:"NUMBER27",f:le},40:{n:"FORMULA28",f:ue},142:{n:"??"},147:{n:"??"},150:{n:"??"},151:{n:"??"},152:{n:"??"},153:{n:"??"},154:{n:"??"},155:{n:"??"},156:{n:"??"},163:{n:"??"},174:{n:"??"},175:{n:"??"},176:{n:"??"},177:{n:"??"},184:{n:"??"},185:{n:"??"},186:{n:"??"},187:{n:"??"},188:{n:"??"},195:{n:"??"},201:{n:"??"},204:{n:"SHEETNAMECS",f:X},205:{n:"??"},206:{n:"??"},207:{n:"??"},208:{n:"??"},256:{n:"??"},259:{n:"??"},260:{n:"??"},261:{n:"??"},262:{n:"??"},263:{n:"??"},265:{n:"??"},266:{n:"??"},267:{n:"??"},268:{n:"??"},270:{n:"??"},271:{n:"??"},384:{n:"??"},389:{n:"??"},390:{n:"??"},393:{n:"??"},396:{n:"??"},512:{n:"??"},514:{n:"??"},513:{n:"??"},516:{n:"??"},517:{n:"??"},640:{n:"??"},641:{n:"??"},642:{n:"??"},643:{n:"??"},644:{n:"??"},645:{n:"??"},646:{n:"??"},647:{n:"??"},648:{n:"??"},658:{n:"??"},659:{n:"??"},660:{n:"??"},661:{n:"??"},662:{n:"??"},665:{n:"??"},666:{n:"??"},768:{n:"??"},772:{n:"??"},1537:{n:"SHEETINFOQP",f:re},1600:{n:"??"},1602:{n:"??"},1793:{n:"??"},1794:{n:"??"},1795:{n:"??"},1796:{n:"??"},1920:{n:"??"},2048:{n:"??"},2049:{n:"??"},2052:{n:"??"},2688:{n:"??"},10998:{n:"??"},12849:{n:"??"},28233:{n:"??"},28484:{n:"??"},65535:{n:""}};return{sheet_to_wk1:a,book_to_wk3:i,to_workbook:t}})();function F9(e){var t={},n=e.match(ya),a=0,i=!1;if(n)for(;a!=n.length;++a){var r=it(n[a]);switch(r[0].replace(/\w*:/g,"")){case"":case"":t.shadow=1;break;case"":break;case"":case"":t.outline=1;break;case"":break;case"":case"":t.strike=1;break;case"":break;case"":case"":t.u=1;break;case"":break;case"":case"":t.b=1;break;case"":break;case"":case"":t.i=1;break;case"":break;case"":case"":case"":break;case"":case"":case"":break;case"":case"":case"":break;case"":case"":case"":break;case"":case"":break;case"":i=!1;break;default:if(r[0].charCodeAt(1)!==47&&!i)throw new Error("Unrecognized rich format "+r[0])}}return t}var L9=(function(){var e=i1("t"),t=i1("rPr");function n(r){var c=r.match(e);if(!c)return{t:"s",v:""};var l={t:"s",v:Ut(c[1])},f=r.match(t);return f&&(l.s=F9(f[1])),l}var a=/<(?:\w+:)?r>/g,i=/<\/(?:\w+:)?r>/;return function(c){return c.replace(a,"").split(i).map(n).filter(function(l){return l.v})}})(),P9=(function(){var t=/(\r\n|\n)/g;function n(i,r,c){var l=[];i.u&&l.push("text-decoration: underline;"),i.uval&&l.push("text-underline-style:"+i.uval+";"),i.sz&&l.push("font-size:"+i.sz+"pt;"),i.outline&&l.push("text-effect: outline;"),i.shadow&&l.push("text-shadow: auto;"),r.push(''),i.b&&(r.push(""),c.push("")),i.i&&(r.push(""),c.push("")),i.strike&&(r.push(""),c.push(""));var f=i.valign||"";return f=="superscript"||f=="super"?f="sup":f=="subscript"&&(f="sub"),f!=""&&(r.push("<"+f+">"),c.push("")),c.push(""),i}function a(i){var r=[[],i.v,[]];return i.v?(i.s&&n(i.s,r[0],r[2]),r[0].join("")+r[1].replace(t,"
")+r[2].join("")):""}return function(r){return r.map(a).join("")}})(),_9=/<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g,q9=/<(?:\w+:)?r>/,B9=/<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g;function Xp(e,t){var n=t?t.cellHTML:!0,a={};return e?(e.match(/^\s*<(?:\w+:)?t[^>]*>/)?(a.t=Ut(rn(e.slice(e.indexOf(">")+1).split(/<\/(?:\w+:)?t>/)[0]||"")),a.r=rn(e),n&&(a.h=Pp(a.t))):e.match(q9)&&(a.r=rn(e),a.t=Ut(rn((e.replace(B9,"").match(_9)||[]).join("").replace(ya,""))),n&&(a.h=P9(L9(a.r)))),a):{t:""}}var U9=/<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/,z9=/<(?:\w+:)?(?:si|sstItem)>/g,W9=/<\/(?:\w+:)?(?:si|sstItem)>/;function V9(e,t){var n=[],a="";if(!e)return n;var i=e.match(U9);if(i){a=i[2].replace(z9,"").split(W9);for(var r=0;r!=a.length;++r){var c=Xp(a[r].trim(),t);c!=null&&(n[n.length]=c)}i=it(i[1]),n.Count=i.count,n.Unique=i.uniqueCount}return n}function H9(e){return[e.read_shift(4),e.read_shift(4)]}function G9(e,t){var n=[],a=!1;return js(e,function(r,c,l){switch(l){case 159:n.Count=r[0],n.Unique=r[1];break;case 19:n.push(r);break;case 160:return!0;case 35:a=!0;break;case 36:a=!1;break;default:if(c.T,!a||t.WTF)throw new Error("Unexpected record 0x"+l.toString(16))}}),n}function fS(e){for(var t=[],n=e.split(""),a=0;a=4&&(e.l+=t-4),n}function X9(e){var t={};return t.id=e.read_shift(0,"lpp4"),t.R=Is(e,4),t.U=Is(e,4),t.W=Is(e,4),t}function K9(e){for(var t=e.read_shift(4),n=e.l+t-4,a={},i=e.read_shift(4),r=[];i-- >0;)r.push({t:e.read_shift(4),v:e.read_shift(0,"lpp4")});if(a.name=e.read_shift(0,"lpp4"),a.comps=r,e.l!=n)throw new Error("Bad DataSpaceMapEntry: "+e.l+" != "+n);return a}function $9(e){var t=[];e.l+=4;for(var n=e.read_shift(4);n-- >0;)t.push(K9(e));return t}function Y9(e){var t=[];e.l+=4;for(var n=e.read_shift(4);n-- >0;)t.push(e.read_shift(0,"lpp4"));return t}function Z9(e){var t={};return e.read_shift(4),e.l+=4,t.id=e.read_shift(0,"lpp4"),t.name=e.read_shift(0,"lpp4"),t.R=Is(e,4),t.U=Is(e,4),t.W=Is(e,4),t}function J9(e){var t=Z9(e);if(t.ename=e.read_shift(0,"8lpp4"),t.blksz=e.read_shift(4),t.cmode=e.read_shift(4),e.read_shift(4)!=4)throw new Error("Bad !Primary record");return t}function hS(e,t){var n=e.l+t,a={};a.Flags=e.read_shift(4)&63,e.l+=4,a.AlgID=e.read_shift(4);var i=!1;switch(a.AlgID){case 26126:case 26127:case 26128:i=a.Flags==36;break;case 26625:i=a.Flags==4;break;case 0:i=a.Flags==16||a.Flags==4||a.Flags==36;break;default:throw"Unrecognized encryption algorithm: "+a.AlgID}if(!i)throw new Error("Encryption Flags/AlgID mismatch");return a.AlgIDHash=e.read_shift(4),a.KeySize=e.read_shift(4),a.ProviderType=e.read_shift(4),e.l+=8,a.CSPName=e.read_shift(n-e.l>>1,"utf16le"),e.l=n,a}function pS(e,t){var n={},a=e.l+t;return e.l+=4,n.Salt=e.slice(e.l,e.l+16),e.l+=16,n.Verifier=e.slice(e.l,e.l+16),e.l+=16,e.read_shift(4),n.VerifierHash=e.slice(e.l,a),e.l=a,n}function Q9(e){var t=Is(e);switch(t.Minor){case 2:return[t.Minor,eA(e)];case 3:return[t.Minor,tA()];case 4:return[t.Minor,nA(e)]}throw new Error("ECMA-376 Encrypted file unrecognized Version: "+t.Minor)}function eA(e){var t=e.read_shift(4);if((t&63)!=36)throw new Error("EncryptionInfo mismatch");var n=e.read_shift(4),a=hS(e,n),i=pS(e,e.length-e.l);return{t:"Std",h:a,v:i}}function tA(){throw new Error("File is password-protected: ECMA-376 Extensible")}function nA(e){var t=["saltSize","blockSize","keyBits","hashSize","cipherAlgorithm","cipherChaining","hashAlgorithm","saltValue"];e.l+=4;var n=e.read_shift(e.length-e.l,"utf8"),a={};return n.replace(ya,function(r){var c=it(r);switch(as(c[0])){case"":break;case"":case"":break;case"":break;case"4||a.Major<2)throw new Error("unrecognized major version code: "+a.Major);n.Flags=e.read_shift(4),t-=4;var i=e.read_shift(4);return t-=4,n.EncryptionHeader=hS(e,i),t-=i,n.EncryptionVerifier=pS(e,t),n}function iA(e){var t={},n=t.EncryptionVersionInfo=Is(e,4);if(n.Major!=1||n.Minor!=1)throw"unrecognized version code "+n.Major+" : "+n.Minor;return t.Salt=e.read_shift(16),t.EncryptedVerifier=e.read_shift(16),t.EncryptedVerifierHash=e.read_shift(16),t}function sA(e){var t=0,n,a=fS(e),i=a.length+1,r,c,l,f,T;for(n=pr(i),n[0]=a.length,r=1;r!=i;++r)n[r]=a[r-1];for(r=i-1;r>=0;--r)c=n[r],l=(t&16384)===0?0:1,f=t<<1&32767,T=l|f,t=T^c;return t^52811}var mS=(function(){var e=[187,255,255,186,255,255,185,128,0,190,15,0,191,15,0],t=[57840,7439,52380,33984,4364,3600,61902,12606,6258,57657,54287,34041,10252,43370,20163],n=[44796,19929,39858,10053,20106,40212,10761,31585,63170,64933,60267,50935,40399,11199,17763,35526,1453,2906,5812,11624,23248,885,1770,3540,7080,14160,28320,56640,55369,41139,20807,41614,21821,43642,17621,28485,56970,44341,19019,38038,14605,29210,60195,50791,40175,10751,21502,43004,24537,18387,36774,3949,7898,15796,31592,63184,47201,24803,49606,37805,14203,28406,56812,17824,35648,1697,3394,6788,13576,27152,43601,17539,35078,557,1114,2228,4456,30388,60776,51953,34243,7079,14158,28316,14128,28256,56512,43425,17251,34502,7597,13105,26210,52420,35241,883,1766,3532,4129,8258,16516,33032,4657,9314,18628],a=function(c){return(c/2|c*128)&255},i=function(c,l){return a(c^l)},r=function(c){for(var l=t[c.length-1],f=104,T=c.length-1;T>=0;--T)for(var p=c[T],m=0;m!=7;++m)p&64&&(l^=n[f]),p*=2,--f;return l};return function(c){for(var l=fS(c),f=r(l),T=l.length,p=pr(16),m=0;m!=16;++m)p[m]=0;var g,S,x;for((T&1)===1&&(g=f>>8,p[T]=i(e[0],g),--T,g=f&255,S=l[l.length-1],p[T]=i(S,g));T>0;)--T,g=f>>8,p[T]=i(l[T],g),--T,g=f&255,p[T]=i(l[T],g);for(T=15,x=15-l.length;x>0;)g=f>>8,p[T]=i(e[x],g),--T,--x,g=f&255,p[T]=i(l[T],g),--T,--x;return p}})(),rA=function(e,t,n,a,i){i||(i=t),a||(a=mS(e));var r,c;for(r=0;r!=t.length;++r)c=t[r],c^=a[n],c=(c>>5|c<<3)&255,i[r]=c,++n;return[i,n,a]},oA=function(e){var t=0,n=mS(e);return function(a){var i=rA("",a,t,n);return t=i[1],i[0]}};function cA(e,t,n,a){var i={key:jn(e),verificationBytes:jn(e)};return n.password&&(i.verifier=sA(n.password)),a.valid=i.verificationBytes===i.verifier,a.valid&&(a.insitu=oA(n.password)),i}function lA(e,t,n){var a=n||{};return a.Info=e.read_shift(2),e.l-=2,a.Info===1?a.Data=iA(e):a.Data=aA(e,t),a}function uA(e,t,n){var a={Type:n.biff>=8?e.read_shift(2):0};return a.Type?lA(e,t-2,a):cA(e,n.biff>=8?t:t-2,n,a),a}var dA=(function(){function e(i,r){switch(r.type){case"base64":return t(Qa(i),r);case"binary":return t(i,r);case"buffer":return t(Mt&&Buffer.isBuffer(i)?i.toString("binary"):d0(i),r);case"array":return t(s0(i),r)}throw new Error("Unrecognized type "+r.type)}function t(i,r){var c=r||{},l=c.dense?[]:{},f=i.match(/\\trowd.*?\\row\b/g);if(!f.length)throw new Error("RTF missing table");var T={s:{c:0,r:0},e:{c:0,r:f.length-1}};return f.forEach(function(p,m){Array.isArray(l)&&(l[m]=[]);for(var g=/\\\w+\b/g,S=0,x,y=-1;x=g.exec(p);){switch(x[0]){case"\\cell":var w=p.slice(S,g.lastIndex-x[0].length);if(w[0]==" "&&(w=w.slice(1)),++y,w.length){var C={v:w,t:"s"};Array.isArray(l)?l[m][y]=C:l[ht({r:m,c:y})]=C}break}S=g.lastIndex}y>T.e.c&&(T.e.c=y)}),l["!ref"]=Lt(T),l}function n(i,r){return xr(e(i,r),r)}function a(i){for(var r=["{\\rtf1\\ansi"],c=xn(i["!ref"]),l,f=Array.isArray(i),T=c.s.r;T<=c.e.r;++T){r.push("\\trowd\\trautofit1");for(var p=c.s.c;p<=c.e.c;++p)r.push("\\cellx"+(p+1));for(r.push("\\pard\\intbl"),p=c.s.c;p<=c.e.c;++p){var m=ht({r:T,c:p});l=f?(i[T]||[])[p]:i[m],!(!l||l.v==null&&(!l.f||l.F))&&(r.push(" "+(l.w||(Ms(l),l.w))),r.push("\\cell"))}r.push("\\pard\\intbl\\row")}return r.join("")+"}"}return{to_workbook:n,to_sheet:e,from_sheet:a}})();function TA(e){var t=e.slice(e[0]==="#"?1:0).slice(0,6);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}function o1(e){for(var t=0,n=1;t!=3;++t)n=n*256+(e[t]>255?255:e[t]<0?0:e[t]);return n.toString(16).toUpperCase().slice(1)}function fA(e){var t=e[0]/255,n=e[1]/255,a=e[2]/255,i=Math.max(t,n,a),r=Math.min(t,n,a),c=i-r;if(c===0)return[0,0,t];var l=0,f=0,T=i+r;switch(f=c/(T>1?2-T:T),i){case t:l=((n-a)/c+6)%6;break;case n:l=(a-t)/c+2;break;case a:l=(t-n)/c+4;break}return[l/6,f,T/2]}function hA(e){var t=e[0],n=e[1],a=e[2],i=n*2*(a<.5?a:1-a),r=a-i/2,c=[r,r,r],l=6*t,f;if(n!==0)switch(l|0){case 0:case 6:f=i*l,c[0]+=i,c[1]+=f;break;case 1:f=i*(2-l),c[0]+=f,c[1]+=i;break;case 2:f=i*(l-2),c[1]+=i,c[2]+=f;break;case 3:f=i*(4-l),c[1]+=f,c[2]+=i;break;case 4:f=i*(l-4),c[2]+=i,c[0]+=f;break;case 5:f=i*(6-l),c[2]+=f,c[0]+=i;break}for(var T=0;T!=3;++T)c[T]=Math.round(c[T]*255);return c}function Uu(e,t){if(t===0)return e;var n=fA(TA(e));return t<0?n[2]=n[2]*(1+t):n[2]=1-(1-n[2])*(1-t),o1(hA(n))}var gS=6,pA=15,mA=1,Da=gS;function zu(e){return Math.floor((e+Math.round(128/Da)/256)*Da)}function Wu(e){return Math.floor((e-5)/Da*100+.5)/100}function Wh(e){return Math.round((e*Da+5)/Da*256)/256}function _f(e){return Wh(Wu(zu(e)))}function Kp(e){var t=Math.abs(e-_f(e)),n=Da;if(t>.005)for(Da=mA;Da":case"":break;case"":case"":i={},l.diagonalUp&&(i.diagonalUp=dn(l.diagonalUp)),l.diagonalDown&&(i.diagonalDown=dn(l.diagonalDown)),t.Borders.push(i);break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":case"":break;case"":break;case"":case"":break;case"":break;case"":case"":break;case"":break;case"":case"":break;case"":break;case"":case"":break;case"":break;case"":break;case"":case"":break;case"":case"":break;case"":r=!1;break;default:if(a&&a.WTF&&!r)throw new Error("unrecognized "+l[0]+" in borders")}})}function yA(e,t,n,a){t.Fills=[];var i={},r=!1;(e[0].match(ya)||[]).forEach(function(c){var l=it(c);switch(as(l[0])){case"":case"":break;case"":case"":i={},t.Fills.push(i);break;case"":break;case"":break;case"":t.Fills.push(i),i={};break;case"":l.patternType&&(i.patternType=l.patternType);break;case"":case"":break;case"":case"":break;case"":case"":break;case"":break;case"":break;case"":break;case"":break;case"":case"":break;case"":r=!1;break;default:if(a&&a.WTF&&!r)throw new Error("unrecognized "+l[0]+" in fills")}})}function SA(e,t,n,a){t.Fonts=[];var i={},r=!1;(e[0].match(ya)||[]).forEach(function(c){var l=it(c);switch(as(l[0])){case"":case"":break;case"":break;case"":case"":t.Fonts.push(i),i={};break;case"":case"":break;case"":i.bold=1;break;case"":i.italic=1;break;case"":i.underline=1;break;case"":i.strike=1;break;case"":i.outline=1;break;case"":i.shadow=1;break;case"":i.condense=1;break;case"":i.extend=1;break;case"":case"":break;case"":case"":break;case"":case"":break;case"":case"":break;case"":case"":break;case"":r=!1;break;case"":case"":break;case"":r=!1;break;default:if(a&&a.WTF&&!r)throw new Error("unrecognized "+l[0]+" in fonts")}})}function bA(e,t,n){t.NumberFmt=[];for(var a=ns(vt),i=0;i":case"":case"":break;case"0){if(f>392){for(f=392;f>60&&t.NumberFmt[f]!=null;--f);t.NumberFmt[f]=l}e0(l,f)}}break;case"":break;default:if(n.WTF)throw new Error("unrecognized "+c[0]+" in numFmts")}}}var Xl=["numFmtId","fillId","fontId","borderId","xfId"],Kl=["applyAlignment","applyBorder","applyFill","applyFont","applyNumberFormat","applyProtection","pivotButton","quotePrefix"];function wA(e,t,n){t.CellXf=[];var a,i=!1;(e[0].match(ya)||[]).forEach(function(r){var c=it(r),l=0;switch(as(c[0])){case"":case"":case"":break;case"":for(a=c,delete a[0],l=0;l392){for(l=392;l>60;--l)if(t.NumberFmt[a.numFmtId]==t.NumberFmt[l]){a.numFmtId=l;break}}t.CellXf.push(a);break;case"":break;case"":var f={};c.vertical&&(f.vertical=c.vertical),c.horizontal&&(f.horizontal=c.horizontal),c.textRotation!=null&&(f.textRotation=c.textRotation),c.indent&&(f.indent=c.indent),c.wrapText&&(f.wrapText=dn(c.wrapText)),a.alignment=f;break;case"":break;case"":case"":break;case"":i=!1;break;case"":case"":break;case"":i=!1;break;default:if(n&&n.WTF&&!i)throw new Error("unrecognized "+c[0]+" in cellXfs")}})}var CA=(function(){var t=/<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/,n=/<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/,a=/<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/,i=/<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/,r=/<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/;return function(l,f,T){var p={};if(!l)return p;l=l.replace(//mg,"").replace(//gm,"");var m;return(m=l.match(t))&&bA(m,p,T),(m=l.match(i))&&SA(m,p,f,T),(m=l.match(a))&&yA(m,p,f,T),(m=l.match(r))&&xA(m,p,f,T),(m=l.match(n))&&wA(m,p,T),p}})();function EA(e,t){var n=e.read_shift(2),a=va(e);return[n,a]}function kA(e,t,n){var a={};a.sz=e.read_shift(2)/20;var i=LE(e);i.fItalic&&(a.italic=1),i.fCondense&&(a.condense=1),i.fExtend&&(a.extend=1),i.fShadow&&(a.shadow=1),i.fOutline&&(a.outline=1),i.fStrikeout&&(a.strike=1);var r=e.read_shift(2);switch(r===700&&(a.bold=1),e.read_shift(2)){case 1:a.vertAlign="superscript";break;case 2:a.vertAlign="subscript";break}var c=e.read_shift(1);c!=0&&(a.underline=c);var l=e.read_shift(1);l>0&&(a.family=l);var f=e.read_shift(1);switch(f>0&&(a.charset=f),e.l++,a.color=FE(e),e.read_shift(1)){case 1:a.scheme="major";break;case 2:a.scheme="minor";break}return a.name=va(e),a}var AA=xa;function RA(e,t){var n=e.l+t,a=e.read_shift(2),i=e.read_shift(2);return e.l=n,{ixfe:a,numFmtId:i}}var DA=xa;function IA(e,t,n){var a={};a.NumberFmt=[];for(var i in vt)a.NumberFmt[i]=vt[i];a.CellXf=[],a.Fonts=[];var r=[],c=!1;return js(e,function(f,T,p){switch(p){case 44:a.NumberFmt[f[0]]=f[1],e0(f[1],f[0]);break;case 43:a.Fonts.push(f),f.color.theme!=null&&t&&t.themeElements&&t.themeElements.clrScheme&&(f.color.rgb=Uu(t.themeElements.clrScheme[f.color.theme].rgb,f.color.tint||0));break;case 1025:break;case 45:break;case 46:break;case 47:r[r.length-1]==617&&a.CellXf.push(f);break;case 48:case 507:case 572:case 475:break;case 1171:case 2102:case 1130:case 512:case 2095:case 3072:break;case 35:c=!0;break;case 36:c=!1;break;case 37:r.push(p),c=!0;break;case 38:r.pop(),c=!1;break;default:if(T.T>0)r.push(p);else if(T.T<0)r.pop();else if(!c||n.WTF&&r[r.length-1]!=37)throw new Error("Unexpected record 0x"+p.toString(16))}}),a}var NA=["","","","","","","","","","","",""];function OA(e,t,n){t.themeElements.clrScheme=[];var a={};(e[0].match(ya)||[]).forEach(function(i){var r=it(i);switch(r[0]){case"":break;case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":r[0].charAt(1)==="/"?(t.themeElements.clrScheme[NA.indexOf(r[0])]=a,a={}):a.name=r[0].slice(3,r[0].length-1);break;default:if(n&&n.WTF)throw new Error("Unrecognized "+r[0]+" in clrScheme")}})}function MA(){}function jA(){}var FA=/]*)>[\s\S]*<\/a:clrScheme>/,LA=/]*)>[\s\S]*<\/a:fontScheme>/,PA=/]*)>[\s\S]*<\/a:fmtScheme>/;function _A(e,t,n){t.themeElements={};var a;[["clrScheme",FA,OA],["fontScheme",LA,MA],["fmtScheme",PA,jA]].forEach(function(i){if(!(a=e.match(i[1])))throw new Error(i[0]+" not found in themeElements");i[2](a,t,n)})}var qA=/]*)>[\s\S]*<\/a:themeElements>/;function yS(e,t){(!e||e.length===0)&&(e=BA());var n,a={};if(!(n=e.match(qA)))throw new Error("themeElements not found in theme");return _A(n[0],a,t),a.raw=e,a}function BA(e,t){var n=[N4];return n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]='',n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]='',n[n.length]="",n[n.length]="",n[n.length]="",n[n.length]="",n.join("")}function UA(e,t,n){var a=e.l+t,i=e.read_shift(4);if(i!==124226){if(!n.cellStyles){e.l=a;return}var r=e.slice(e.l);e.l=a;var c;try{c=I4(r,{type:"array"})}catch{return}var l=Ja(c,"theme/theme/theme1.xml",!0);if(l)return yS(l,n)}}function zA(e){return e.read_shift(4)}function WA(e){var t={};switch(t.xclrType=e.read_shift(2),t.nTintShade=e.read_shift(2),t.xclrType){case 0:e.l+=4;break;case 1:t.xclrValue=VA(e,4);break;case 2:t.xclrValue=rS(e);break;case 3:t.xclrValue=zA(e);break;case 4:e.l+=4;break}return e.l+=8,t}function VA(e,t){return xa(e,t)}function HA(e,t){return xa(e,t)}function GA(e){var t=e.read_shift(2),n=e.read_shift(2)-4,a=[t];switch(t){case 4:case 5:case 7:case 8:case 9:case 10:case 11:case 13:a[1]=WA(e);break;case 6:a[1]=HA(e,n);break;case 14:case 15:a[1]=e.read_shift(n===1?1:2);break;default:throw new Error("Unrecognized ExtProp type: "+t+" "+n)}return a}function XA(e,t){var n=e.l+t;e.l+=2;var a=e.read_shift(2);e.l+=2;for(var i=e.read_shift(2),r=[];i-- >0;)r.push(GA(e,n-e.l));return{ixfe:a,ext:r}}function KA(e,t){t.forEach(function(n){n[0]})}function $A(e,t){return{flags:e.read_shift(4),version:e.read_shift(4),name:va(e)}}function YA(e){for(var t=[],n=e.read_shift(4);n-- >0;)t.push([e.read_shift(4),e.read_shift(4)]);return t}function ZA(e){return e.l+=4,e.read_shift(4)!=0}function JA(e,t,n){var a={Types:[],Cell:[],Value:[]},i=n||{},r=[],c=!1,l=2;return js(e,function(f,T,p){switch(p){case 335:a.Types.push({name:f.name});break;case 51:f.forEach(function(m){l==1?a.Cell.push({type:a.Types[m[0]-1].name,index:m[1]}):l==0&&a.Value.push({type:a.Types[m[0]-1].name,index:m[1]})});break;case 337:l=f?1:0;break;case 338:l=2;break;case 35:r.push(p),c=!0;break;case 36:r.pop(),c=!1;break;default:if(!T.T){if(!c||i.WTF&&r[r.length-1]!=35)throw new Error("Unexpected record 0x"+p.toString(16))}}}),a}function QA(e,t,n){var a={Types:[],Cell:[],Value:[]};if(!e)return a;var i=!1,r=2,c;return e.replace(ya,function(l){var f=it(l);switch(as(f[0])){case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":break;case"":r=2;break;case"":r=2;break;case"":case"":case"":break;case"":i=!1;break;case"":case"":break;case"]*r:id="([^"]*)"/)||["",""])[1];return t["!id"][n].Target}function rx(e,t,n,a){var i=Array.isArray(e),r;t.forEach(function(c){var l=Na(c.ref);if(i?(e[l.r]||(e[l.r]=[]),r=e[l.r][l.c]):r=e[c.ref],!r){r={t:"z"},i?e[l.r][l.c]=r:e[c.ref]=r;var f=xn(e["!ref"]||"BDWGO1000001:A1");f.s.r>l.r&&(f.s.r=l.r),f.e.rl.c&&(f.s.c=l.c),f.e.c=0;--m){if(!n&&r.c[m].T)return;n&&!r.c[m].T&&r.c.splice(m,1)}if(n&&a){for(m=0;m/))return[];var n=[],a=[],i=e.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/);i&&i[1]&&i[1].split(/<\/\w*:?author>/).forEach(function(c){if(!(c===""||c.trim()==="")){var l=c.match(/<(?:\w+:)?author[^>]*>(.*)/);l&&n.push(l[1])}});var r=e.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);return r&&r[1]&&r[1].split(/<\/\w*:?comment>/).forEach(function(c){if(!(c===""||c.trim()==="")){var l=c.match(/<(?:\w+:)?comment[^>]*>/);if(l){var f=it(l[0]),T={author:f.authorId&&n[f.authorId]||"sheetjsghost",ref:f.ref,guid:f.guid},p=Na(f.ref);if(!(t.sheetRows&&t.sheetRows<=p.r)){var m=c.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/),g=!!m&&!!m[1]&&Xp(m[1])||{r:"",t:"",h:""};T.r=g.r,g.r==""&&(g.t=g.h=""),T.t=(g.t||"").replace(/\r\n/g,` +`).replace(/\r/g,` +`),t.cellHTML&&(T.h=g.h),a.push(T)}}}}),a}function rR(e,t){var n=[],a=!1,i={},r=0;return e.replace(ya,function(l,f){var T=it(l);switch(as(T[0])){case"":break;case"":i.t!=null&&n.push(i);break;case"":case"":i.t=e.slice(r,f).replace(/\r\n/g,` +`).replace(/\r/g,` +`);break;case"":a=!0;break;case"":a=!1;break;case"":case"":case"":break;case"":a=!1;break;default:if(!a&&t.WTF)throw new Error("unrecognized "+T[0]+" in threaded comments")}return l}),n}function oR(e,t){var n=[],a=!1;return e.replace(ya,function(r){var c=it(r);switch(as(c[0])){case"":break;case"":break;case"":case"":case"":break;case"":a=!1;break;default:if(!a&&t.WTF)throw new Error("unrecognized "+c[0]+" in threaded comments")}return r}),n}function cR(e){var t={};t.iauthor=e.read_shift(4);var n=f0(e);return t.rfx=n.s,t.ref=ht(n.s),e.l+=16,t}var lR=va;function uR(e,t){var n=[],a=[],i={},r=!1;return js(e,function(l,f,T){switch(T){case 632:a.push(l);break;case 635:i=l;break;case 637:i.t=l.t,i.h=l.h,i.r=l.r;break;case 636:if(i.author=a[i.iauthor],delete i.iauthor,t.sheetRows&&i.rfx&&t.sheetRows<=i.rfx.r)break;i.t||(i.t=""),delete i.rfx,n.push(i);break;case 3072:break;case 35:r=!0;break;case 36:r=!1;break;case 37:break;case 38:break;default:if(!f.T){if(!r||t.WTF)throw new Error("Unexpected record 0x"+T.toString(16))}}}),n}var dR="application/vnd.ms-office.vbaProject";function TR(e){var t=Ft.utils.cfb_new({root:"R"});return e.FullPaths.forEach(function(n,a){if(!(n.slice(-1)==="/"||!n.match(/_VBA_PROJECT_CUR/))){var i=n.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/,"");Ft.utils.cfb_add(t,i,e.FileIndex[a].content)}}),Ft.write(t)}function fR(){return{"!type":"dialog"}}function hR(){return{"!type":"dialog"}}function pR(){return{"!type":"macro"}}function mR(){return{"!type":"macro"}}var To=(function(){var e=/(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g,t={r:0,c:0};function n(a,i,r,c){var l=!1,f=!1;r.length==0?f=!0:r.charAt(0)=="["&&(f=!0,r=r.slice(1,-1)),c.length==0?l=!0:c.charAt(0)=="["&&(l=!0,c=c.slice(1,-1));var T=r.length>0?parseInt(r,10)|0:0,p=c.length>0?parseInt(c,10)|0:0;return l?p+=t.c:--p,f?T+=t.r:--T,i+(l?"":"$")+Un(p)+(f?"":"$")+ra(T)}return function(i,r){return t=r,i.replace(e,n)}})(),SS=/(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g,gR=(function(){return function(t,n){return t.replace(SS,function(a,i,r,c,l,f){var T=Up(c)-(r?0:n.c),p=Bp(f)-(l?0:n.r),m=p==0?"":l?p+1:"["+p+"]",g=T==0?"":r?T+1:"["+T+"]";return i+"R"+m+"C"+g})}})();function bS(e,t){return e.replace(SS,function(n,a,i,r,c,l){return a+(i=="$"?i+r:Un(Up(r)+t.c))+(c=="$"?c+l:ra(Bp(l)+t.r))})}function vR(e,t,n){var a=Eo(t),i=a.s,r=Na(n),c={r:r.r-i.r,c:r.c-i.c};return bS(e,c)}function xR(e){return e.length!=1}function ox(e){return e.replace(/_xlfn\./g,"")}function Nn(e){e.l+=1}function mr(e,t){var n=e.read_shift(2);return[n&16383,n>>14&1,n>>15&1]}function wS(e,t,n){var a=2;if(n){if(n.biff>=2&&n.biff<=5)return CS(e);n.biff==12&&(a=4)}var i=e.read_shift(a),r=e.read_shift(a),c=mr(e),l=mr(e);return{s:{r:i,c:c[0],cRel:c[1],rRel:c[2]},e:{r,c:l[0],cRel:l[1],rRel:l[2]}}}function CS(e){var t=mr(e),n=mr(e),a=e.read_shift(1),i=e.read_shift(1);return{s:{r:t[0],c:a,cRel:t[1],rRel:t[2]},e:{r:n[0],c:i,cRel:n[1],rRel:n[2]}}}function yR(e,t,n){if(n.biff<8)return CS(e);var a=e.read_shift(n.biff==12?4:2),i=e.read_shift(n.biff==12?4:2),r=mr(e),c=mr(e);return{s:{r:a,c:r[0],cRel:r[1],rRel:r[2]},e:{r:i,c:c[0],cRel:c[1],rRel:c[2]}}}function ES(e,t,n){if(n&&n.biff>=2&&n.biff<=5)return SR(e);var a=e.read_shift(n&&n.biff==12?4:2),i=mr(e);return{r:a,c:i[0],cRel:i[1],rRel:i[2]}}function SR(e){var t=mr(e),n=e.read_shift(1);return{r:t[0],c:n,cRel:t[1],rRel:t[2]}}function bR(e){var t=e.read_shift(2),n=e.read_shift(2);return{r:t,c:n&255,fQuoted:!!(n&16384),cRel:n>>15,rRel:n>>15}}function wR(e,t,n){var a=n&&n.biff?n.biff:8;if(a>=2&&a<=5)return CR(e);var i=e.read_shift(a>=12?4:2),r=e.read_shift(2),c=(r&16384)>>14,l=(r&32768)>>15;if(r&=16383,l==1)for(;i>524287;)i-=1048576;if(c==1)for(;r>8191;)r=r-16384;return{r:i,c:r,cRel:c,rRel:l}}function CR(e){var t=e.read_shift(2),n=e.read_shift(1),a=(t&32768)>>15,i=(t&16384)>>14;return t&=16383,a==1&&t>=8192&&(t=t-16384),i==1&&n>=128&&(n=n-256),{r:t,c:n,cRel:i,rRel:a}}function ER(e,t,n){var a=(e[e.l++]&96)>>5,i=wS(e,n.biff>=2&&n.biff<=5?6:8,n);return[a,i]}function kR(e,t,n){var a=(e[e.l++]&96)>>5,i=e.read_shift(2,"i"),r=8;if(n)switch(n.biff){case 5:e.l+=12,r=6;break;case 12:r=12;break}var c=wS(e,r,n);return[a,i,c]}function AR(e,t,n){var a=(e[e.l++]&96)>>5;return e.l+=n&&n.biff>8?12:n.biff<8?6:8,[a]}function RR(e,t,n){var a=(e[e.l++]&96)>>5,i=e.read_shift(2),r=8;if(n)switch(n.biff){case 5:e.l+=12,r=6;break;case 12:r=12;break}return e.l+=r,[a,i]}function DR(e,t,n){var a=(e[e.l++]&96)>>5,i=yR(e,t-1,n);return[a,i]}function IR(e,t,n){var a=(e[e.l++]&96)>>5;return e.l+=n.biff==2?6:n.biff==12?14:7,[a]}function cx(e){var t=e[e.l+1]&1,n=1;return e.l+=4,[t,n]}function NR(e,t,n){e.l+=2;for(var a=e.read_shift(n&&n.biff==2?1:2),i=[],r=0;r<=a;++r)i.push(e.read_shift(n&&n.biff==2?1:2));return i}function OR(e,t,n){var a=e[e.l+1]&255?1:0;return e.l+=2,[a,e.read_shift(n&&n.biff==2?1:2)]}function MR(e,t,n){var a=e[e.l+1]&255?1:0;return e.l+=2,[a,e.read_shift(n&&n.biff==2?1:2)]}function jR(e){var t=e[e.l+1]&255?1:0;return e.l+=2,[t,e.read_shift(2)]}function FR(e,t,n){var a=e[e.l+1]&255?1:0;return e.l+=n&&n.biff==2?3:4,[a]}function kS(e){var t=e.read_shift(1),n=e.read_shift(1);return[t,n]}function LR(e){return e.read_shift(2),kS(e)}function PR(e){return e.read_shift(2),kS(e)}function _R(e,t,n){var a=(e[e.l]&96)>>5;e.l+=1;var i=ES(e,0,n);return[a,i]}function qR(e,t,n){var a=(e[e.l]&96)>>5;e.l+=1;var i=wR(e,0,n);return[a,i]}function BR(e,t,n){var a=(e[e.l]&96)>>5;e.l+=1;var i=e.read_shift(2);n&&n.biff==5&&(e.l+=12);var r=ES(e,0,n);return[a,i,r]}function UR(e,t,n){var a=(e[e.l]&96)>>5;e.l+=1;var i=e.read_shift(n&&n.biff<=3?1:2);return[zD[i],DS[i],a]}function zR(e,t,n){var a=e[e.l++],i=e.read_shift(1),r=n&&n.biff<=3?[a==88?-1:0,e.read_shift(1)]:WR(e);return[i,(r[0]===0?DS:UD)[r[1]]]}function WR(e){return[e[e.l+1]>>7,e.read_shift(2)&32767]}function VR(e,t,n){e.l+=n&&n.biff==2?3:4}function HR(e,t,n){if(e.l++,n&&n.biff==12)return[e.read_shift(4,"i"),0];var a=e.read_shift(2),i=e.read_shift(n&&n.biff==2?1:2);return[a,i]}function GR(e){return e.l++,h0[e.read_shift(1)]}function XR(e){return e.l++,e.read_shift(2)}function KR(e){return e.l++,e.read_shift(1)!==0}function $R(e){return e.l++,pa(e)}function YR(e,t,n){return e.l++,E1(e,t-1,n)}function ZR(e,t){var n=[e.read_shift(1)];if(t==12)switch(n[0]){case 2:n[0]=4;break;case 4:n[0]=16;break;case 0:n[0]=1;break;case 1:n[0]=2;break}switch(n[0]){case 4:n[1]=Cn(e,1)?"TRUE":"FALSE",t!=12&&(e.l+=7);break;case 37:case 16:n[1]=h0[e[e.l]],e.l+=t==12?4:8;break;case 0:e.l+=8;break;case 1:n[1]=pa(e);break;case 2:n[1]=p0(e,0,{biff:t>0&&t<8?2:t});break;default:throw new Error("Bad SerAr: "+n[0])}return n}function JR(e,t,n){for(var a=e.read_shift(n.biff==12?4:2),i=[],r=0;r!=a;++r)i.push((n.biff==12?f0:ld)(e));return i}function QR(e,t,n){var a=0,i=0;n.biff==12?(a=e.read_shift(4),i=e.read_shift(4)):(i=1+e.read_shift(1),a=1+e.read_shift(2)),n.biff>=2&&n.biff<8&&(--a,--i==0&&(i=256));for(var r=0,c=[];r!=a&&(c[r]=[]);++r)for(var l=0;l!=i;++l)c[r][l]=ZR(e,n.biff);return c}function eD(e,t,n){var a=e.read_shift(1)>>>5&3,i=!n||n.biff>=8?4:2,r=e.read_shift(i);switch(n.biff){case 2:e.l+=5;break;case 3:case 4:e.l+=8;break;case 5:e.l+=12;break}return[a,0,r]}function tD(e,t,n){if(n.biff==5)return nD(e);var a=e.read_shift(1)>>>5&3,i=e.read_shift(2),r=e.read_shift(4);return[a,i,r]}function nD(e){var t=e.read_shift(1)>>>5&3,n=e.read_shift(2,"i");e.l+=8;var a=e.read_shift(2);return e.l+=12,[t,n,a]}function aD(e,t,n){var a=e.read_shift(1)>>>5&3;e.l+=n&&n.biff==2?3:4;var i=e.read_shift(n&&n.biff==2?1:2);return[a,i]}function iD(e,t,n){var a=e.read_shift(1)>>>5&3,i=e.read_shift(n&&n.biff==2?1:2);return[a,i]}function sD(e,t,n){var a=e.read_shift(1)>>>5&3;return e.l+=4,n.biff<8&&e.l--,n.biff==12&&(e.l+=2),[a]}function rD(e,t,n){var a=(e[e.l++]&96)>>5,i=e.read_shift(2),r=4;if(n)switch(n.biff){case 5:r=15;break;case 12:r=6;break}return e.l+=r,[a,i]}var oD=xa,cD=xa,lD=xa;function A1(e,t,n){return e.l+=2,[bR(e)]}function $p(e){return e.l+=6,[]}var uD=A1,dD=$p,TD=$p,fD=A1;function AS(e){return e.l+=2,[jn(e),e.read_shift(2)&1]}var hD=A1,pD=AS,mD=$p,gD=A1,vD=A1,xD=["Data","All","Headers","??","?Data2","??","?DataHeaders","??","Totals","??","??","??","?DataTotals","??","??","??","?Current"];function yD(e){e.l+=2;var t=e.read_shift(2),n=e.read_shift(2),a=e.read_shift(4),i=e.read_shift(2),r=e.read_shift(2),c=xD[n>>2&31];return{ixti:t,coltype:n&3,rt:c,idx:a,c:i,C:r}}function SD(e){return e.l+=2,[e.read_shift(4)]}function bD(e,t,n){return e.l+=5,e.l+=2,e.l+=n.biff==2?1:4,["PTGSHEET"]}function wD(e,t,n){return e.l+=n.biff==2?4:5,["PTGENDSHEET"]}function CD(e){var t=e.read_shift(1)>>>5&3,n=e.read_shift(2);return[t,n]}function ED(e){var t=e.read_shift(1)>>>5&3,n=e.read_shift(2);return[t,n]}function kD(e){return e.l+=4,[0,0]}var lx={1:{n:"PtgExp",f:HR},2:{n:"PtgTbl",f:lD},3:{n:"PtgAdd",f:Nn},4:{n:"PtgSub",f:Nn},5:{n:"PtgMul",f:Nn},6:{n:"PtgDiv",f:Nn},7:{n:"PtgPower",f:Nn},8:{n:"PtgConcat",f:Nn},9:{n:"PtgLt",f:Nn},10:{n:"PtgLe",f:Nn},11:{n:"PtgEq",f:Nn},12:{n:"PtgGe",f:Nn},13:{n:"PtgGt",f:Nn},14:{n:"PtgNe",f:Nn},15:{n:"PtgIsect",f:Nn},16:{n:"PtgUnion",f:Nn},17:{n:"PtgRange",f:Nn},18:{n:"PtgUplus",f:Nn},19:{n:"PtgUminus",f:Nn},20:{n:"PtgPercent",f:Nn},21:{n:"PtgParen",f:Nn},22:{n:"PtgMissArg",f:Nn},23:{n:"PtgStr",f:YR},26:{n:"PtgSheet",f:bD},27:{n:"PtgEndSheet",f:wD},28:{n:"PtgErr",f:GR},29:{n:"PtgBool",f:KR},30:{n:"PtgInt",f:XR},31:{n:"PtgNum",f:$R},32:{n:"PtgArray",f:IR},33:{n:"PtgFunc",f:UR},34:{n:"PtgFuncVar",f:zR},35:{n:"PtgName",f:eD},36:{n:"PtgRef",f:_R},37:{n:"PtgArea",f:ER},38:{n:"PtgMemArea",f:aD},39:{n:"PtgMemErr",f:oD},40:{n:"PtgMemNoMem",f:cD},41:{n:"PtgMemFunc",f:iD},42:{n:"PtgRefErr",f:sD},43:{n:"PtgAreaErr",f:AR},44:{n:"PtgRefN",f:qR},45:{n:"PtgAreaN",f:DR},46:{n:"PtgMemAreaN",f:CD},47:{n:"PtgMemNoMemN",f:ED},57:{n:"PtgNameX",f:tD},58:{n:"PtgRef3d",f:BR},59:{n:"PtgArea3d",f:kR},60:{n:"PtgRefErr3d",f:rD},61:{n:"PtgAreaErr3d",f:RR},255:{}},AD={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,78:46,110:46,79:47,111:47,88:34,120:34,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61},RD={1:{n:"PtgElfLel",f:AS},2:{n:"PtgElfRw",f:gD},3:{n:"PtgElfCol",f:uD},6:{n:"PtgElfRwV",f:vD},7:{n:"PtgElfColV",f:fD},10:{n:"PtgElfRadical",f:hD},11:{n:"PtgElfRadicalS",f:mD},13:{n:"PtgElfColS",f:dD},15:{n:"PtgElfColSV",f:TD},16:{n:"PtgElfRadicalLel",f:pD},25:{n:"PtgList",f:yD},29:{n:"PtgSxName",f:SD},255:{}},DD={0:{n:"PtgAttrNoop",f:kD},1:{n:"PtgAttrSemi",f:FR},2:{n:"PtgAttrIf",f:MR},4:{n:"PtgAttrChoose",f:NR},8:{n:"PtgAttrGoto",f:OR},16:{n:"PtgAttrSum",f:VR},32:{n:"PtgAttrBaxcel",f:cx},33:{n:"PtgAttrBaxcel",f:cx},64:{n:"PtgAttrSpace",f:LR},65:{n:"PtgAttrSpaceSemi",f:PR},128:{n:"PtgAttrIfError",f:jR},255:{}};function R1(e,t,n,a){if(a.biff<8)return xa(e,t);for(var i=e.l+t,r=[],c=0;c!==n.length;++c)switch(n[c][0]){case"PtgArray":n[c][1]=QR(e,0,a),r.push(n[c][1]);break;case"PtgMemArea":n[c][2]=JR(e,n[c][1],a),r.push(n[c][2]);break;case"PtgExp":a&&a.biff==12&&(n[c][1][1]=e.read_shift(4),r.push(n[c][1]));break;case"PtgList":case"PtgElfRadicalS":case"PtgElfColS":case"PtgElfColSV":throw"Unsupported "+n[c][0]}return t=i-e.l,t!==0&&r.push(xa(e,t)),r}function D1(e,t,n){for(var a=e.l+t,i,r,c=[];a!=e.l;)t=a-e.l,r=e[e.l],i=lx[r]||lx[AD[r]],(r===24||r===25)&&(i=(r===24?RD:DD)[e[e.l+1]]),!i||!i.f?xa(e,t):c.push([i.n,i.f(e,t,n)]);return c}function ID(e){for(var t=[],n=0;n=",PtgGt:">",PtgLe:"<=",PtgLt:"<",PtgMul:"*",PtgNe:"<>",PtgPower:"^",PtgSub:"-"};function OD(e,t){if(!e&&!(t&&t.biff<=5&&t.biff>=2))throw new Error("empty sheet name");return/[^\w\u4E00-\u9FFF\u3040-\u30FF]/.test(e)?"'"+e+"'":e}function RS(e,t,n){if(!e)return"SH33TJSERR0";if(n.biff>8&&(!e.XTI||!e.XTI[t]))return e.SheetNames[t];if(!e.XTI)return"SH33TJSERR6";var a=e.XTI[t];if(n.biff<8)return t>1e4&&(t-=65536),t<0&&(t=-t),t==0?"":e.XTI[t-1];if(!a)return"SH33TJSERR1";var i="";if(n.biff>8)switch(e[a[0]][0]){case 357:return i=a[1]==-1?"#REF":e.SheetNames[a[1]],a[1]==a[2]?i:i+":"+e.SheetNames[a[2]];case 358:return n.SID!=null?e.SheetNames[n.SID]:"SH33TJSSAME"+e[a[0]][0];default:return"SH33TJSSRC"+e[a[0]][0]}switch(e[a[0]][0][0]){case 1025:return i=a[1]==-1?"#REF":e.SheetNames[a[1]]||"SH33TJSERR3",a[1]==a[2]?i:i+":"+e.SheetNames[a[2]];case 14849:return e[a[0]].slice(1).map(function(r){return r.Name}).join(";;");default:return e[a[0]][0][3]?(i=a[1]==-1?"#REF":e[a[0]][0][3][a[1]]||"SH33TJSERR4",a[1]==a[2]?i:i+":"+e[a[0]][0][3][a[2]]):"SH33TJSERR2"}}function ux(e,t,n){var a=RS(e,t,n);return a=="#REF"?a:OD(a,n)}function ha(e,t,n,a,i){var r=i&&i.biff||8,c={s:{c:0,r:0}},l=[],f,T,p,m=0,g=0,S,x="";if(!e[0]||!e[0][0])return"";for(var y=-1,w="",C=0,k=e[0].length;C=0){switch(e[0][y][1][0]){case 0:w=gn(" ",e[0][y][1][1]);break;case 1:w=gn("\r",e[0][y][1][1]);break;default:if(w="",i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][y][1][0])}T=T+w,y=-1}l.push(T+ND[E[0]]+f);break;case"PtgIsect":f=l.pop(),T=l.pop(),l.push(T+" "+f);break;case"PtgUnion":f=l.pop(),T=l.pop(),l.push(T+","+f);break;case"PtgRange":f=l.pop(),T=l.pop(),l.push(T+":"+f);break;case"PtgAttrChoose":break;case"PtgAttrGoto":break;case"PtgAttrIf":break;case"PtgAttrIfError":break;case"PtgRef":p=Vc(E[1][1],c,i),l.push(Hc(p,r));break;case"PtgRefN":p=n?Vc(E[1][1],n,i):E[1][1],l.push(Hc(p,r));break;case"PtgRef3d":m=E[1][1],p=Vc(E[1][2],c,i),x=ux(a,m,i),l.push(x+"!"+Hc(p,r));break;case"PtgFunc":case"PtgFuncVar":var O=E[1][0],N=E[1][1];O||(O=0),O&=127;var B=O==0?[]:l.slice(-O);l.length-=O,N==="User"&&(N=B.shift()),l.push(N+"("+B.join(",")+")");break;case"PtgBool":l.push(E[1]?"TRUE":"FALSE");break;case"PtgInt":l.push(E[1]);break;case"PtgNum":l.push(String(E[1]));break;case"PtgStr":l.push('"'+E[1].replace(/"/g,'""')+'"');break;case"PtgErr":l.push(E[1]);break;case"PtgAreaN":S=Vv(E[1][1],n?{s:n}:c,i),l.push(Lf(S,i));break;case"PtgArea":S=Vv(E[1][1],c,i),l.push(Lf(S,i));break;case"PtgArea3d":m=E[1][1],S=E[1][2],x=ux(a,m,i),l.push(x+"!"+Lf(S,i));break;case"PtgAttrSum":l.push("SUM("+l.pop()+")");break;case"PtgAttrBaxcel":case"PtgAttrSemi":break;case"PtgName":g=E[1][2];var A=(a.names||[])[g-1]||(a[0]||[])[g],z=A?A.Name:"SH33TJSNAME"+String(g);z&&z.slice(0,6)=="_xlfn."&&!i.xlfn&&(z=z.slice(6)),l.push(z);break;case"PtgNameX":var P=E[1][1];g=E[1][2];var K;if(i.biff<=5)P<0&&(P=-P),a[P]&&(K=a[P][g]);else{var I="";if(((a[P]||[])[0]||[])[0]==14849||(((a[P]||[])[0]||[])[0]==1025?a[P][g]&&a[P][g].itab>0&&(I=a.SheetNames[a[P][g].itab-1]+"!"):I=a.SheetNames[g-1]+"!"),a[P]&&a[P][g])I+=a[P][g].Name;else if(a[0]&&a[0][g])I+=a[0][g].Name;else{var L=(RS(a,P,i)||"").split(";;");L[g-1]?I=L[g-1]:I+="SH33TJSERRX"}l.push(I);break}K||(K={Name:"SH33TJSERRY"}),l.push(K.Name);break;case"PtgParen":var le="(",ue=")";if(y>=0){switch(w="",e[0][y][1][0]){case 2:le=gn(" ",e[0][y][1][1])+le;break;case 3:le=gn("\r",e[0][y][1][1])+le;break;case 4:ue=gn(" ",e[0][y][1][1])+ue;break;case 5:ue=gn("\r",e[0][y][1][1])+ue;break;default:if(i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][y][1][0])}y=-1}l.push(le+l.pop()+ue);break;case"PtgRefErr":l.push("#REF!");break;case"PtgRefErr3d":l.push("#REF!");break;case"PtgExp":p={c:E[1][1],r:E[1][0]};var X={c:n.c,r:n.r};if(a.sharedf[ht(p)]){var F=a.sharedf[ht(p)];l.push(ha(F,c,X,a,i))}else{var re=!1;for(f=0;f!=a.arrayf.length;++f)if(T=a.arrayf[f],!(p.cT[0].e.c)&&!(p.rT[0].e.r)){l.push(ha(T[1],c,X,a,i)),re=!0;break}re||l.push(E[1])}break;case"PtgArray":l.push("{"+ID(E[1])+"}");break;case"PtgMemArea":break;case"PtgAttrSpace":case"PtgAttrSpaceSemi":y=C;break;case"PtgTbl":break;case"PtgMemErr":break;case"PtgMissArg":l.push("");break;case"PtgAreaErr":l.push("#REF!");break;case"PtgAreaErr3d":l.push("#REF!");break;case"PtgList":l.push("Table"+E[1].idx+"[#"+E[1].rt+"]");break;case"PtgMemAreaN":case"PtgMemNoMemN":case"PtgAttrNoop":case"PtgSheet":case"PtgEndSheet":break;case"PtgMemFunc":break;case"PtgMemNoMem":break;case"PtgElfCol":case"PtgElfColS":case"PtgElfColSV":case"PtgElfColV":case"PtgElfLel":case"PtgElfRadical":case"PtgElfRadicalLel":case"PtgElfRadicalS":case"PtgElfRw":case"PtgElfRwV":throw new Error("Unsupported ELFs");case"PtgSxName":throw new Error("Unrecognized Formula Token: "+String(E));default:throw new Error("Unrecognized Formula Token: "+String(E))}var me=["PtgAttrSpace","PtgAttrSpaceSemi","PtgAttrGoto"];if(i.biff!=3&&y>=0&&me.indexOf(e[0][C][0])==-1){E=e[0][y];var te=!0;switch(E[1][0]){case 4:te=!1;case 0:w=gn(" ",E[1][1]);break;case 5:te=!1;case 1:w=gn("\r",E[1][1]);break;default:if(w="",i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+E[1][0])}l.push((te?w:"")+l.pop()+(te?"":w)),y=-1}}if(l.length>1&&i.WTF)throw new Error("bad formula stack");return l[0]}function MD(e,t,n){var a=e.l+t,i=n.biff==2?1:2,r,c=e.read_shift(i);if(c==65535)return[[],xa(e,t-2)];var l=D1(e,c,n);return t!==c+i&&(r=R1(e,t-c-i,l,n)),e.l=a,[l,r]}function jD(e,t,n){var a=e.l+t,i=n.biff==2?1:2,r,c=e.read_shift(i);if(c==65535)return[[],xa(e,t-2)];var l=D1(e,c,n);return t!==c+i&&(r=R1(e,t-c-i,l,n)),e.l=a,[l,r]}function FD(e,t,n,a){var i=e.l+t,r=D1(e,a,n),c;return i!==e.l&&(c=R1(e,i-e.l,r,n)),[r,c]}function LD(e,t,n){var a=e.l+t,i,r=e.read_shift(2),c=D1(e,r,n);return r==65535?[[],xa(e,t-2)]:(t!==r+2&&(i=R1(e,a-r-2,c,n)),[c,i])}function PD(e){var t;if(Rs(e,e.l+6)!==65535)return[pa(e),"n"];switch(e[e.l]){case 0:return e.l+=8,["String","s"];case 1:return t=e[e.l+2]===1,e.l+=8,[t,"b"];case 2:return t=e[e.l+2],e.l+=8,[t,"e"];case 3:return e.l+=8,["","s"]}return[]}function qf(e,t,n){var a=e.l+t,i=is(e);n.biff==2&&++e.l;var r=PD(e),c=e.read_shift(1);n.biff!=2&&(e.read_shift(1),n.biff>=5&&e.read_shift(4));var l=jD(e,a-e.l,n);return{cell:i,val:r[0],formula:l,shared:c>>3&1,tt:r[1]}}function ud(e,t,n){var a=e.read_shift(4),i=D1(e,a,n),r=e.read_shift(4),c=r>0?R1(e,r,i,n):null;return[i,c]}var _D=ud,dd=ud,qD=ud,BD=ud,UD={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"},DS={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD",380:"CUBEVALUE",381:"CUBEMEMBER",382:"CUBEMEMBERPROPERTY",383:"CUBERANKEDMEMBER",384:"HEX2BIN",385:"HEX2DEC",386:"HEX2OCT",387:"DEC2BIN",388:"DEC2HEX",389:"DEC2OCT",390:"OCT2BIN",391:"OCT2HEX",392:"OCT2DEC",393:"BIN2DEC",394:"BIN2OCT",395:"BIN2HEX",396:"IMSUB",397:"IMDIV",398:"IMPOWER",399:"IMABS",400:"IMSQRT",401:"IMLN",402:"IMLOG2",403:"IMLOG10",404:"IMSIN",405:"IMCOS",406:"IMEXP",407:"IMARGUMENT",408:"IMCONJUGATE",409:"IMAGINARY",410:"IMREAL",411:"COMPLEX",412:"IMSUM",413:"IMPRODUCT",414:"SERIESSUM",415:"FACTDOUBLE",416:"SQRTPI",417:"QUOTIENT",418:"DELTA",419:"GESTEP",420:"ISEVEN",421:"ISODD",422:"MROUND",423:"ERF",424:"ERFC",425:"BESSELJ",426:"BESSELK",427:"BESSELY",428:"BESSELI",429:"XIRR",430:"XNPV",431:"PRICEMAT",432:"YIELDMAT",433:"INTRATE",434:"RECEIVED",435:"DISC",436:"PRICEDISC",437:"YIELDDISC",438:"TBILLEQ",439:"TBILLPRICE",440:"TBILLYIELD",441:"PRICE",442:"YIELD",443:"DOLLARDE",444:"DOLLARFR",445:"NOMINAL",446:"EFFECT",447:"CUMPRINC",448:"CUMIPMT",449:"EDATE",450:"EOMONTH",451:"YEARFRAC",452:"COUPDAYBS",453:"COUPDAYS",454:"COUPDAYSNC",455:"COUPNCD",456:"COUPNUM",457:"COUPPCD",458:"DURATION",459:"MDURATION",460:"ODDLPRICE",461:"ODDLYIELD",462:"ODDFPRICE",463:"ODDFYIELD",464:"RANDBETWEEN",465:"WEEKNUM",466:"AMORDEGRC",467:"AMORLINC",468:"CONVERT",724:"SHEETJS",469:"ACCRINT",470:"ACCRINTM",471:"WORKDAY",472:"NETWORKDAYS",473:"GCD",474:"MULTINOMIAL",475:"LCM",476:"FVSCHEDULE",477:"CUBEKPIMEMBER",478:"CUBESET",479:"CUBESETCOUNT",480:"IFERROR",481:"COUNTIFS",482:"SUMIFS",483:"AVERAGEIF",484:"AVERAGEIFS"},zD={2:1,3:1,10:0,15:1,16:1,17:1,18:1,19:0,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,34:0,35:0,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,63:0,65:3,66:3,67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:0,75:1,76:1,77:1,79:2,80:2,83:1,85:0,86:1,89:0,90:1,94:0,95:0,97:2,98:1,99:1,101:3,102:3,105:1,106:1,108:2,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,144:4,161:1,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,186:1,189:3,190:1,195:3,196:3,197:1,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,225:0,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,247:4,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,382:3,385:1,392:1,393:1,396:2,397:2,398:2,399:1,400:1,401:1,402:1,403:1,404:1,405:1,406:1,407:1,408:1,409:1,410:1,414:4,415:1,416:1,417:2,420:1,421:1,422:2,424:1,425:2,426:2,427:2,428:2,430:3,438:3,439:3,440:3,443:2,444:2,445:2,446:2,447:6,448:6,449:2,450:2,464:2,468:3,476:2,479:1,480:2,65535:0};function dx(e){return e.slice(0,3)=="of:"&&(e=e.slice(3)),e.charCodeAt(0)==61&&(e=e.slice(1),e.charCodeAt(0)==61&&(e=e.slice(1))),e=e.replace(/COM\.MICROSOFT\./g,""),e=e.replace(/\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g,function(t,n){return n.replace(/\./g,"")}),e=e.replace(/\[.(#[A-Z]*[?!])\]/g,"$1"),e.replace(/[;~]/g,",").replace(/\|/g,";")}function Bf(e){var t=e.split(":"),n=t[0].split(".")[0];return[n,t[0].split(".")[1]+(t.length>1?":"+(t[1].split(".")[1]||t[1].split(".")[0]):"")]}var $c={},fo={};function Yc(e,t){if(e){var n=[.7,.7,.75,.75,.3,.3];t=="xlml"&&(n=[1,1,1,1,.5,.5]),e.left==null&&(e.left=n[0]),e.right==null&&(e.right=n[1]),e.top==null&&(e.top=n[2]),e.bottom==null&&(e.bottom=n[3]),e.header==null&&(e.header=n[4]),e.footer==null&&(e.footer=n[5])}}function IS(e,t,n,a,i,r){try{a.cellNF&&(e.z=vt[t])}catch(l){if(a.WTF)throw l}if(!(e.t==="z"&&!a.cellStyles)){if(e.t==="d"&&typeof e.v=="string"&&(e.v=Yn(e.v)),(!a||a.cellText!==!1)&&e.t!=="z")try{if(vt[t]==null&&e0(WC[t]||"General",t),e.t==="e")e.w=e.w||h0[e.v];else if(t===0)if(e.t==="n")(e.v|0)===e.v?e.w=e.v.toString(10):e.w=a1(e.v);else if(e.t==="d"){var c=Ma(e.v);(c|0)===c?e.w=c.toString(10):e.w=a1(c)}else{if(e.v===void 0)return"";e.w=i0(e.v,fo)}else e.t==="d"?e.w=xi(t,Ma(e.v),fo):e.w=xi(t,e.v,fo)}catch(l){if(a.WTF)throw l}if(a.cellStyles&&n!=null)try{e.s=r.Fills[n],e.s.fgColor&&e.s.fgColor.theme&&!e.s.fgColor.rgb&&(e.s.fgColor.rgb=Uu(i.themeElements.clrScheme[e.s.fgColor.theme].rgb,e.s.fgColor.tint||0),a.WTF&&(e.s.fgColor.raw_rgb=i.themeElements.clrScheme[e.s.fgColor.theme].rgb)),e.s.bgColor&&e.s.bgColor.theme&&(e.s.bgColor.rgb=Uu(i.themeElements.clrScheme[e.s.bgColor.theme].rgb,e.s.bgColor.tint||0),a.WTF&&(e.s.bgColor.raw_rgb=i.themeElements.clrScheme[e.s.bgColor.theme].rgb))}catch(l){if(a.WTF&&r.Fills)throw l}}}function WD(e,t){var n=xn(t);n.s.r<=n.e.r&&n.s.c<=n.e.c&&n.s.r>=0&&n.s.c>=0&&(e["!ref"]=Lt(n))}var VD=/<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g,HD=/<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/,GD=/<(?:\w:)?hyperlink [^>]*>/mg,XD=/"(\w*:\w*)"/,KD=/<(?:\w:)?col\b[^>]*[\/]?>/g,$D=/<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g,YD=/<(?:\w:)?pageMargins[^>]*\/>/g,NS=/<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/,ZD=/<(?:\w:)?sheetPr[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetPr)>/,JD=/<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/;function QD(e,t,n,a,i,r,c){if(!e)return e;a||(a={"!id":{}});var l=t.dense?[]:{},f={s:{r:2e6,c:2e6},e:{r:0,c:0}},T="",p="",m=e.match(HD);m?(T=e.slice(0,m.index),p=e.slice(m.index+m[0].length)):T=p=e;var g=T.match(NS);g?Yp(g[0],l,i,n):(g=T.match(ZD))&&eI(g[0],g[1]||"",l,i,n);var S=(T.match(/<(?:\w*:)?dimension/)||{index:-1}).index;if(S>0){var x=T.slice(S,S+50).match(XD);x&&WD(l,x[1])}var y=T.match(JD);y&&y[1]&&rI(y[1],i);var w=[];if(t.cellStyles){var C=T.match(KD);C&&aI(w,C)}m&&oI(m[1],l,t,f,r,c);var k=p.match($D);k&&(l["!autofilter"]=iI(k[0]));var E=[],O=p.match(VD);if(O)for(S=0;S!=O.length;++S)E[S]=xn(O[S].slice(O[S].indexOf('"')+1));var N=p.match(GD);N&&tI(l,N,a);var B=p.match(YD);if(B&&(l["!margins"]=nI(it(B[0]))),!l["!ref"]&&f.e.c>=f.s.c&&f.e.r>=f.s.r&&(l["!ref"]=Lt(f)),t.sheetRows>0&&l["!ref"]){var A=xn(l["!ref"]);t.sheetRows<=+A.e.r&&(A.e.r=t.sheetRows-1,A.e.r>f.e.r&&(A.e.r=f.e.r),A.e.rf.e.c&&(A.e.c=f.e.c),A.e.c0&&(l["!cols"]=w),E.length>0&&(l["!merges"]=E),l}function Yp(e,t,n,a){var i=it(e);n.Sheets[a]||(n.Sheets[a]={}),i.codeName&&(n.Sheets[a].CodeName=Ut(rn(i.codeName)))}function eI(e,t,n,a,i){Yp(e.slice(0,e.indexOf(">")),n,a,i)}function tI(e,t,n){for(var a=Array.isArray(e),i=0;i!=t.length;++i){var r=it(rn(t[i]),!0);if(!r.ref)return;var c=((n||{})["!id"]||[])[r.id];c?(r.Target=c.Target,r.location&&(r.Target+="#"+Ut(r.location))):(r.Target="#"+Ut(r.location),c={Target:r.Target,TargetMode:"Internal"}),r.Rel=c,r.tooltip&&(r.Tooltip=r.tooltip,delete r.tooltip);for(var l=xn(r.ref),f=l.s.r;f<=l.e.r;++f)for(var T=l.s.c;T<=l.e.c;++T){var p=ht({c:T,r:f});a?(e[f]||(e[f]=[]),e[f][T]||(e[f][T]={t:"z",v:void 0}),e[f][T].l=r):(e[p]||(e[p]={t:"z",v:void 0}),e[p].l=r)}}}function nI(e){var t={};return["left","right","top","bottom","header","footer"].forEach(function(n){e[n]&&(t[n]=parseFloat(e[n]))}),t}function aI(e,t){for(var n=!1,a=0;a!=t.length;++a){var i=it(t[a],!0);i.hidden&&(i.hidden=dn(i.hidden));var r=parseInt(i.min,10)-1,c=parseInt(i.max,10)-1;for(i.outlineLevel&&(i.level=+i.outlineLevel||0),delete i.min,delete i.max,i.width=+i.width,!n&&i.width&&(n=!0,Kp(i.width)),yo(i);r<=c;)e[r++]=sa(i)}}function iI(e){var t={ref:(e.match(/ref="([^"]*)"/)||[])[1]};return t}var sI=/<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/;function rI(e,t){t.Views||(t.Views=[{}]),(e.match(sI)||[]).forEach(function(n,a){var i=it(n);t.Views[a]||(t.Views[a]={}),+i.zoomScale&&(t.Views[a].zoom=+i.zoomScale),dn(i.rightToLeft)&&(t.Views[a].RTL=!0)})}var oI=(function(){var e=/<(?:\w+:)?c[ \/>]/,t=/<\/(?:\w+:)?row>/,n=/r=["']([^"']*)["']/,a=/<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/,i=/ref=["']([^"']*)["']/,r=i1("v"),c=i1("f");return function(f,T,p,m,g,S){for(var x=0,y="",w=[],C=[],k=0,E=0,O=0,N="",B,A,z=0,P=0,K,I,L=0,le=0,ue=Array.isArray(S.CellXf),X,F=[],re=[],me=Array.isArray(T),te=[],Ce={},ee=!1,M=!!p.sheetStubs,Y=f.split(t),Z=0,J=Y.length;Z!=J;++Z){y=Y[Z].trim();var he=y.length;if(he!==0){var ge=0;e:for(x=0;x":if(y[x-1]!="/"){++x;break e}if(p&&p.cellStyles){if(A=it(y.slice(ge,x),!0),z=A.r!=null?parseInt(A.r,10):z+1,P=-1,p.sheetRows&&p.sheetRows=x)break;if(A=it(y.slice(ge,x),!0),z=A.r!=null?parseInt(A.r,10):z+1,P=-1,!(p.sheetRows&&p.sheetRowsz-1&&(m.s.r=z-1),m.e.r":"")+y,C!=null&&C.length===2){for(k=0,N=C[1],E=0;E!=N.length&&!((O=N.charCodeAt(E)-64)<1||O>26);++E)k=26*k+O;--k,P=k}else++P;for(E=0;E!=y.length&&y.charCodeAt(E)!==62;++E);if(++E,A=it(y.slice(0,E),!0),A.r||(A.r=ht({r:z-1,c:P})),N=y.slice(E),B={t:""},(C=N.match(r))!=null&&C[1]!==""&&(B.v=Ut(C[1])),p.cellFormula){if((C=N.match(c))!=null&&C[1]!==""){if(B.f=Ut(rn(C[1])).replace(/\r\n/g,` +`),p.xlfn||(B.f=ox(B.f)),C[0].indexOf('t="array"')>-1)B.F=(N.match(i)||[])[1],B.F.indexOf(":")>-1&&F.push([xn(B.F),B.F]);else if(C[0].indexOf('t="shared"')>-1){I=it(C[0]);var fe=Ut(rn(C[1]));p.xlfn||(fe=ox(fe)),re[parseInt(I.si,10)]=[I,fe,A.r]}}else(C=N.match(/]*\/>/))&&(I=it(C[0]),re[I.si]&&(B.f=vR(re[I.si][1],re[I.si][2],A.r)));var ye=Na(A.r);for(E=0;E=F[E][0].s.r&&ye.r<=F[E][0].e.r&&ye.c>=F[E][0].s.c&&ye.c<=F[E][0].e.c&&(B.F=F[E][1])}if(A.t==null&&B.v===void 0)if(B.f||B.F)B.v=0,B.t="n";else if(M)B.t="z";else continue;else B.t=A.t||"n";switch(m.s.c>P&&(m.s.c=P),m.e.c"u"){if(!M)continue;B.t="z"}else K=$c[parseInt(B.v,10)],B.v=K.t,B.r=K.r,p.cellHTML&&(B.h=K.h);break;case"str":B.t="s",B.v=B.v!=null?rn(B.v):"",p.cellHTML&&(B.h=Pp(B.v));break;case"inlineStr":C=N.match(a),B.t="s",C!=null&&(K=Xp(C[1]))?(B.v=K.t,p.cellHTML&&(B.h=K.h)):B.v="";break;case"b":B.v=dn(B.v);break;case"d":p.cellDates?B.v=Yn(B.v,1):(B.v=Ma(Yn(B.v,1)),B.t="n");break;case"e":(!p||p.cellText!==!1)&&(B.w=B.v),B.v=J4[B.v];break}if(L=le=0,X=null,ue&&A.s!==void 0&&(X=S.CellXf[A.s],X!=null&&(X.numFmtId!=null&&(L=X.numFmtId),p.cellStyles&&X.fillId!=null&&(le=X.fillId))),IS(B,L,le,p,g,S),p.cellDates&&ue&&B.t=="n"&&Co(vt[L])&&(B.t="d",B.v=cd(B.v)),A.cm&&p.xlmeta){var qe=(p.xlmeta.Cell||[])[+A.cm-1];qe&&qe.type=="XLDAPR"&&(B.D=!0)}if(me){var ae=Na(A.r);T[ae.r]||(T[ae.r]=[]),T[ae.r][ae.c]=B}else T[A.r]=B}}}}te.length>0&&(T["!rows"]=te)}})();function cI(e,t){var n={},a=e.l+t;n.r=e.read_shift(4),e.l+=4;var i=e.read_shift(2);e.l+=1;var r=e.read_shift(1);return e.l=a,r&7&&(n.level=r&7),r&16&&(n.hidden=!0),r&32&&(n.hpt=i/20),n}var lI=f0;function uI(){}function dI(e,t){var n={},a=e[e.l];return++e.l,n.above=!(a&64),n.left=!(a&128),e.l+=18,n.name=ME(e),n}function TI(e){var t=yi(e);return[t]}function fI(e){var t=T0(e);return[t]}function hI(e){var t=yi(e),n=e.read_shift(1);return[t,n,"b"]}function pI(e){var t=T0(e),n=e.read_shift(1);return[t,n,"b"]}function mI(e){var t=yi(e),n=e.read_shift(1);return[t,n,"e"]}function gI(e){var t=T0(e),n=e.read_shift(1);return[t,n,"e"]}function vI(e){var t=yi(e),n=e.read_shift(4);return[t,n,"s"]}function xI(e){var t=T0(e),n=e.read_shift(4);return[t,n,"s"]}function yI(e){var t=yi(e),n=pa(e);return[t,n,"n"]}function OS(e){var t=T0(e),n=pa(e);return[t,n,"n"]}function SI(e){var t=yi(e),n=Vp(e);return[t,n,"n"]}function bI(e){var t=T0(e),n=Vp(e);return[t,n,"n"]}function wI(e){var t=yi(e),n=zp(e);return[t,n,"is"]}function CI(e){var t=yi(e),n=va(e);return[t,n,"str"]}function EI(e){var t=T0(e),n=va(e);return[t,n,"str"]}function kI(e,t,n){var a=e.l+t,i=yi(e);i.r=n["!row"];var r=e.read_shift(1),c=[i,r,"b"];if(n.cellFormula){e.l+=2;var l=dd(e,a-e.l,n);c[3]=ha(l,null,i,n.supbooks,n)}else e.l=a;return c}function AI(e,t,n){var a=e.l+t,i=yi(e);i.r=n["!row"];var r=e.read_shift(1),c=[i,r,"e"];if(n.cellFormula){e.l+=2;var l=dd(e,a-e.l,n);c[3]=ha(l,null,i,n.supbooks,n)}else e.l=a;return c}function RI(e,t,n){var a=e.l+t,i=yi(e);i.r=n["!row"];var r=pa(e),c=[i,r,"n"];if(n.cellFormula){e.l+=2;var l=dd(e,a-e.l,n);c[3]=ha(l,null,i,n.supbooks,n)}else e.l=a;return c}function DI(e,t,n){var a=e.l+t,i=yi(e);i.r=n["!row"];var r=va(e),c=[i,r,"str"];if(n.cellFormula){e.l+=2;var l=dd(e,a-e.l,n);c[3]=ha(l,null,i,n.supbooks,n)}else e.l=a;return c}var II=f0;function NI(e,t){var n=e.l+t,a=f0(e),i=Wp(e),r=va(e),c=va(e),l=va(e);e.l=n;var f={rfx:a,relId:i,loc:r,display:l};return c&&(f.Tooltip=c),f}function OI(){}function MI(e,t,n){var a=e.l+t,i=$4(e),r=e.read_shift(1),c=[i];if(c[2]=r,n.cellFormula){var l=_D(e,a-e.l,n);c[1]=l}else e.l=a;return c}function jI(e,t,n){var a=e.l+t,i=f0(e),r=[i];if(n.cellFormula){var c=BD(e,a-e.l,n);r[1]=c,e.l=a}else e.l=a;return r}var FI=["left","right","top","bottom","header","footer"];function LI(e){var t={};return FI.forEach(function(n){t[n]=pa(e)}),t}function PI(e){var t=e.read_shift(2);return e.l+=28,{RTL:t&32}}function _I(){}function qI(){}function BI(e,t,n,a,i,r,c){if(!e)return e;var l=t||{};a||(a={"!id":{}});var f=l.dense?[]:{},T,p={s:{r:2e6,c:2e6},e:{r:0,c:0}},m=!1,g=!1,S,x,y,w,C,k,E,O,N,B=[];l.biff=12,l["!row"]=0;var A=0,z=!1,P=[],K={},I=l.supbooks||i.supbooks||[[]];if(I.sharedf=K,I.arrayf=P,I.SheetNames=i.SheetNames||i.Sheets.map(function(me){return me.name}),!l.supbooks&&(l.supbooks=I,i.Names))for(var L=0;L=M[0].s.r&&S.r<=M[0].e.r&&C>=M[0].s.c&&C<=M[0].e.c&&(x.F=Lt(M[0]),z=!0)}!z&&te.length>3&&(x.f=te[3])}if(p.s.r>S.r&&(p.s.r=S.r),p.s.c>C&&(p.s.c=C),p.e.rS.r&&(p.s.r=S.r),p.s.c>C&&(p.s.c=C),p.e.r=te.s;)le[te.e--]={width:te.w/256,hidden:!!(te.flags&1),level:te.level},X||(X=!0,Kp(te.w/256)),yo(le[te.e+1]);break;case 161:f["!autofilter"]={ref:Lt(te)};break;case 476:f["!margins"]=te;break;case 147:i.Sheets[n]||(i.Sheets[n]={}),te.name&&(i.Sheets[n].CodeName=te.name),(te.above||te.left)&&(f["!outline"]={above:te.above,left:te.left});break;case 137:i.Views||(i.Views=[{}]),i.Views[0]||(i.Views[0]={}),te.RTL&&(i.Views[0].RTL=!0);break;case 485:break;case 64:case 1053:break;case 151:break;case 152:case 175:case 644:case 625:case 562:case 396:case 1112:case 1146:case 471:case 1050:case 649:case 1105:case 589:case 607:case 564:case 1055:case 168:case 174:case 1180:case 499:case 507:case 550:case 171:case 167:case 1177:case 169:case 1181:case 551:case 552:case 661:case 639:case 478:case 537:case 477:case 536:case 1103:case 680:case 1104:case 1024:case 663:case 535:case 678:case 504:case 1043:case 428:case 170:case 3072:case 50:case 2070:case 1045:break;case 35:m=!0;break;case 36:m=!1;break;case 37:m=!0;break;case 38:m=!1;break;default:if(!Ce.T){if(!m||l.WTF)throw new Error("Unexpected record 0x"+ee.toString(16))}}},l),delete l.supbooks,delete l["!row"],!f["!ref"]&&(p.s.r<2e6||T&&(T.e.r>0||T.e.c>0||T.s.r>0||T.s.c>0))&&(f["!ref"]=Lt(T||p)),l.sheetRows&&f["!ref"]){var re=xn(f["!ref"]);l.sheetRows<=+re.e.r&&(re.e.r=l.sheetRows-1,re.e.r>p.e.r&&(re.e.r=p.e.r),re.e.rp.e.c&&(re.e.c=p.e.c),re.e.c0&&(f["!merges"]=B),le.length>0&&(f["!cols"]=le),ue.length>0&&(f["!rows"]=ue),f}function UI(e){var t=[],n=e.match(/^/),a;(e.match(/(.*?)<\/c:pt>/mg)||[]).forEach(function(r){var c=r.match(/(.*)<\/c:v><\/c:pt>/);c&&(t[+c[1]]=n?+c[2]:c[2])});var i=Ut((e.match(/([\s\S]*?)<\/c:formatCode>/)||["","General"])[1]);return(e.match(/(.*?)<\/c:f>/mg)||[]).forEach(function(r){a=r.replace(/<.*?>/g,"")}),[t,i,a]}function zI(e,t,n,a,i,r){var c=r||{"!type":"chart"};if(!e)return r;var l=0,f=0,T="A",p={s:{r:2e6,c:2e6},e:{r:0,c:0}};return(e.match(/[\s\S]*?<\/c:numCache>/gm)||[]).forEach(function(m){var g=UI(m);p.s.r=p.s.c=0,p.e.c=l,T=Un(l),g[0].forEach(function(S,x){c[T+ra(x)]={t:"n",v:S,z:g[1]},f=x}),p.e.r0&&(c["!ref"]=Lt(p)),c}function WI(e,t,n,a,i){if(!e)return e;a||(a={"!id":{}});var r={"!type":"chart","!drawel":null,"!rel":""},c,l=e.match(NS);return l&&Yp(l[0],r,i,n),(c=e.match(/drawing r:id="(.*?)"/))&&(r["!rel"]=c[1]),a["!id"][r["!rel"]]&&(r["!drawel"]=a["!id"][r["!rel"]]),r}function VI(e,t){e.l+=10;var n=va(e);return{name:n}}function HI(e,t,n,a,i){if(!e)return e;a||(a={"!id":{}});var r={"!type":"chart","!drawel":null,"!rel":""},c=!1;return js(e,function(f,T,p){switch(p){case 550:r["!rel"]=f;break;case 651:i.Sheets[n]||(i.Sheets[n]={}),f.name&&(i.Sheets[n].CodeName=f.name);break;case 562:case 652:case 669:case 679:case 551:case 552:case 476:case 3072:break;case 35:c=!0;break;case 36:c=!1;break;case 37:break;case 38:break;default:if(!(T.T>0)){if(!(T.T<0)){if(!c||t.WTF)throw new Error("Unexpected record 0x"+p.toString(16))}}}},t),a["!id"][r["!rel"]]&&(r["!drawel"]=a["!id"][r["!rel"]]),r}var MS=[["allowRefreshQuery",!1,"bool"],["autoCompressPictures",!0,"bool"],["backupFile",!1,"bool"],["checkCompatibility",!1,"bool"],["CodeName",""],["date1904",!1,"bool"],["defaultThemeVersion",0,"int"],["filterPrivacy",!1,"bool"],["hidePivotFieldList",!1,"bool"],["promptedSolutions",!1,"bool"],["publishItems",!1,"bool"],["refreshAllConnections",!1,"bool"],["saveExternalLinkValues",!0,"bool"],["showBorderUnselectedTables",!0,"bool"],["showInkAnnotation",!0,"bool"],["showObjects","all"],["showPivotChartFilter",!1,"bool"],["updateLinks","userSet"]],GI=[["activeTab",0,"int"],["autoFilterDateGrouping",!0,"bool"],["firstSheet",0,"int"],["minimized",!1,"bool"],["showHorizontalScroll",!0,"bool"],["showSheetTabs",!0,"bool"],["showVerticalScroll",!0,"bool"],["tabRatio",600,"int"],["visibility","visible"]],XI=[],KI=[["calcCompleted","true"],["calcMode","auto"],["calcOnSave","true"],["concurrentCalc","true"],["fullCalcOnLoad","false"],["fullPrecision","true"],["iterate","false"],["iterateCount","100"],["iterateDelta","0.001"],["refMode","A1"]];function Tx(e,t){for(var n=0;n!=e.length;++n)for(var a=e[n],i=0;i!=t.length;++i){var r=t[i];if(a[r[0]]==null)a[r[0]]=r[1];else switch(r[2]){case"bool":typeof a[r[0]]=="string"&&(a[r[0]]=dn(a[r[0]]));break;case"int":typeof a[r[0]]=="string"&&(a[r[0]]=parseInt(a[r[0]],10));break}}}function fx(e,t){for(var n=0;n!=t.length;++n){var a=t[n];if(e[a[0]]==null)e[a[0]]=a[1];else switch(a[2]){case"bool":typeof e[a[0]]=="string"&&(e[a[0]]=dn(e[a[0]]));break;case"int":typeof e[a[0]]=="string"&&(e[a[0]]=parseInt(e[a[0]],10));break}}}function jS(e){fx(e.WBProps,MS),fx(e.CalcPr,KI),Tx(e.WBView,GI),Tx(e.Sheets,XI),fo.date1904=dn(e.WBProps.date1904)}var $I="][*?/\\".split("");function YI(e,t){if(e.length>31)throw new Error("Sheet names cannot exceed 31 chars");var n=!0;return $I.forEach(function(a){if(e.indexOf(a)!=-1)throw new Error("Sheet name cannot contain : \\ / ? * [ ]")}),n}var ZI=/<\w+:workbook/;function JI(e,t){if(!e)throw new Error("Could not find file");var n={AppVersion:{},WBProps:{},WBView:[],Sheets:[],CalcPr:{},Names:[],xmlns:""},a=!1,i="xmlns",r={},c=0;if(e.replace(ya,function(f,T){var p=it(f);switch(as(p[0])){case"":break;case"":case"":break;case"":break;case"":MS.forEach(function(m){if(p[m[0]]!=null)switch(m[2]){case"bool":n.WBProps[m[0]]=dn(p[m[0]]);break;case"int":n.WBProps[m[0]]=parseInt(p[m[0]],10);break;default:n.WBProps[m[0]]=p[m[0]]}}),p.codeName&&(n.WBProps.CodeName=rn(p.codeName));break;case"":break;case"":break;case"":case"":break;case"":delete p[0],n.WBView.push(p);break;case"":break;case"":case"":break;case"":break;case"":break;case"":case"":break;case"":break;case"":case"":a=!1;break;case"":r.Ref=Ut(rn(e.slice(c,T))),n.Names.push(r);break;case"":break;case"":delete p[0],n.CalcPr=p;break;case"":break;case"":case"":case"":break;case"":case"":case"":break;case"":case"":break;case"":break;case"":break;case"":case"":break;case"":case"":case"":break;case"":a=!1;break;case"":a=!0;break;case"":a=!1;break;case"8?va(e):"";return i.length>0&&(n.CodeName=i),n.autoCompressPictures=!!(a&65536),n.backupFile=!!(a&64),n.checkCompatibility=!!(a&4096),n.date1904=!!(a&1),n.filterPrivacy=!!(a&8),n.hidePivotFieldList=!!(a&1024),n.promptedSolutions=!!(a&16),n.publishItems=!!(a&2048),n.refreshAllConnections=!!(a&262144),n.saveExternalLinkValues=!!(a&128),n.showBorderUnselectedTables=!!(a&4),n.showInkAnnotation=!!(a&32),n.showObjects=["all","placeholders","none"][a>>13&3],n.showPivotChartFilter=!!(a&32768),n.updateLinks=["userSet","never","always"][a>>8&3],n}function tN(e,t){var n={};return e.read_shift(4),n.ArchID=e.read_shift(4),e.l+=t-8,n}function nN(e,t,n){var a=e.l+t;e.l+=4,e.l+=1;var i=e.read_shift(4),r=jE(e),c=qD(e,0,n),l=Wp(e);e.l=a;var f={Name:r,Ptg:c};return i<268435455&&(f.Sheet=i),l&&(f.Comment=l),f}function aN(e,t){var n={AppVersion:{},WBProps:{},WBView:[],Sheets:[],CalcPr:{},xmlns:""},a=[],i=!1;t||(t={}),t.biff=12;var r=[],c=[[]];return c.SheetNames=[],c.XTI=[],Vu[16]={n:"BrtFRTArchID$",f:tN},js(e,function(f,T,p){switch(p){case 156:c.SheetNames.push(f.name),n.Sheets.push(f);break;case 153:n.WBProps=f;break;case 39:f.Sheet!=null&&(t.SID=f.Sheet),f.Ref=ha(f.Ptg,null,null,c,t),delete t.SID,delete f.Ptg,r.push(f);break;case 1036:break;case 357:case 358:case 355:case 667:c[0].length?c.push([p,f]):c[0]=[p,f],c[c.length-1].XTI=[];break;case 362:c.length===0&&(c[0]=[],c[0].XTI=[]),c[c.length-1].XTI=c[c.length-1].XTI.concat(f),c.XTI=c.XTI.concat(f);break;case 361:break;case 2071:case 158:case 143:case 664:case 353:break;case 3072:case 3073:case 534:case 677:case 157:case 610:case 2050:case 155:case 548:case 676:case 128:case 665:case 2128:case 2125:case 549:case 2053:case 596:case 2076:case 2075:case 2082:case 397:case 154:case 1117:case 553:case 2091:break;case 35:a.push(p),i=!0;break;case 36:a.pop(),i=!1;break;case 37:a.push(p),i=!0;break;case 38:a.pop(),i=!1;break;case 16:break;default:if(!T.T){if(!i||t.WTF&&a[a.length-1]!=37&&a[a.length-1]!=35)throw new Error("Unexpected record 0x"+p.toString(16))}}},t),jS(n),n.Names=r,n.supbooks=c,n}function iN(e,t,n){return t.slice(-4)===".bin"?aN(e,n):JI(e,n)}function sN(e,t,n,a,i,r,c,l){return t.slice(-4)===".bin"?BI(e,a,n,i,r,c,l):QD(e,a,n,i,r,c,l)}function rN(e,t,n,a,i,r,c,l){return t.slice(-4)===".bin"?HI(e,a,n,i,r):WI(e,a,n,i,r)}function oN(e,t,n,a,i,r,c,l){return t.slice(-4)===".bin"?pR():mR()}function cN(e,t,n,a,i,r,c,l){return t.slice(-4)===".bin"?fR():hR()}function lN(e,t,n,a){return t.slice(-4)===".bin"?IA(e,n,a):CA(e,n,a)}function uN(e,t,n){return yS(e,n)}function dN(e,t,n){return t.slice(-4)===".bin"?G9(e,n):V9(e,n)}function TN(e,t,n){return t.slice(-4)===".bin"?uR(e,n):sR(e,n)}function fN(e,t,n){return t.slice(-4)===".bin"?nR(e):eR(e)}function hN(e,t,n,a){return n.slice(-4)===".bin"?aR(e,t,n,a):void 0}function pN(e,t,n){return t.slice(-4)===".bin"?JA(e,t,n):QA(e,t,n)}var FS=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g,LS=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;function Di(e,t){var n=e.split(/\s+/),a=[];if(a[0]=n[0],n.length===1)return a;var i=e.match(FS),r,c,l,f;if(i)for(f=0;f!=i.length;++f)r=i[f].match(LS),(c=r[1].indexOf(":"))===-1?a[r[1]]=r[2].slice(1,r[2].length-1):(r[1].slice(0,6)==="xmlns:"?l="xmlns"+r[1].slice(6):l=r[1].slice(c+1),a[l]=r[2].slice(1,r[2].length-1));return a}function mN(e){var t=e.split(/\s+/),n={};if(t.length===1)return n;var a=e.match(FS),i,r,c,l;if(a)for(l=0;l!=a.length;++l)i=a[l].match(LS),(r=i[1].indexOf(":"))===-1?n[i[1]]=i[2].slice(1,i[2].length-1):(i[1].slice(0,6)==="xmlns:"?c="xmlns"+i[1].slice(6):c=i[1].slice(r+1),n[c]=i[2].slice(1,i[2].length-1));return n}var Zc;function gN(e,t){var n=Zc[e]||Ut(e);return n==="General"?i0(t):xi(n,t)}function vN(e,t,n,a){var i=a;switch((n[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]){case"boolean":i=dn(a);break;case"i2":case"int":i=parseInt(a,10);break;case"r4":case"float":i=parseFloat(a);break;case"date":case"dateTime.tz":i=Yn(a);break;case"i8":case"string":case"fixed":case"uuid":case"bin.base64":break;default:throw new Error("bad custprop:"+n[0])}e[Ut(t)]=i}function xN(e,t,n){if(e.t!=="z"){if(!n||n.cellText!==!1)try{e.t==="e"?e.w=e.w||h0[e.v]:t==="General"?e.t==="n"?(e.v|0)===e.v?e.w=e.v.toString(10):e.w=a1(e.v):e.w=i0(e.v):e.w=gN(t||"General",e.v)}catch(r){if(n.WTF)throw r}try{var a=Zc[t]||t||"General";if(n.cellNF&&(e.z=a),n.cellDates&&e.t=="n"&&Co(a)){var i=$r(e.v);i&&(e.t="d",e.v=new Date(i.y,i.m-1,i.d,i.H,i.M,i.S,i.u))}}catch(r){if(n.WTF)throw r}}}function yN(e,t,n){if(n.cellStyles&&t.Interior){var a=t.Interior;a.Pattern&&(a.patternType=vA[a.Pattern]||a.Pattern)}e[t.ID]=t}function SN(e,t,n,a,i,r,c,l,f,T){var p="General",m=a.StyleID,g={};T=T||{};var S=[],x=0;for(m===void 0&&l&&(m=l.StyleID),m===void 0&&c&&(m=c.StyleID);r[m]!==void 0&&(r[m].nf&&(p=r[m].nf),r[m].Interior&&S.push(r[m].Interior),!!r[m].Parent);)m=r[m].Parent;switch(n.Type){case"Boolean":a.t="b",a.v=dn(e);break;case"String":a.t="s",a.r=Fv(Ut(e)),a.v=e.indexOf("<")>-1?Ut(t||e).replace(/<.*?>/g,""):a.r;break;case"DateTime":e.slice(-1)!="Z"&&(e+="Z"),a.v=(Yn(e)-new Date(Date.UTC(1899,11,30)))/(1440*60*1e3),a.v!==a.v?a.v=Ut(e):a.v<60&&(a.v=a.v-1),(!p||p=="General")&&(p="yyyy-mm-dd");case"Number":a.v===void 0&&(a.v=+e),a.t||(a.t="n");break;case"Error":a.t="e",a.v=J4[e],T.cellText!==!1&&(a.w=e);break;default:e==""&&t==""?a.t="z":(a.t="s",a.v=Fv(t||e));break}if(xN(a,p,T),T.cellFormula!==!1)if(a.Formula){var y=Ut(a.Formula);y.charCodeAt(0)==61&&(y=y.slice(1)),a.f=To(y,i),delete a.Formula,a.ArrayRange=="RC"?a.F=To("RC:RC",i):a.ArrayRange&&(a.F=To(a.ArrayRange,i),f.push([xn(a.F),a.F]))}else for(x=0;x=f[x][0].s.r&&i.r<=f[x][0].e.r&&i.c>=f[x][0].s.c&&i.c<=f[x][0].e.c&&(a.F=f[x][1]);T.cellStyles&&(S.forEach(function(w){!g.patternType&&w.patternType&&(g.patternType=w.patternType)}),a.s=g),a.StyleID!==void 0&&(a.ixfe=a.StyleID)}function bN(e){e.t=e.v||"",e.t=e.t.replace(/\r\n/g,` +`).replace(/\r/g,` +`),e.v=e.w=e.ixfe=void 0}function Uf(e,t){var n=t||{};C4();var a=Oc(_p(e));(n.type=="binary"||n.type=="array"||n.type=="base64")&&(a=rn(a));var i=a.slice(0,1024).toLowerCase(),r=!1;if(i=i.replace(/".*?"/g,""),(i.indexOf(">")&1023)>Math.min(i.indexOf(",")&1023,i.indexOf(";")&1023)){var c=sa(n);return c.type="string",r1.to_workbook(a,c)}if(i.indexOf("=0&&(r=!0)}),r)return NN(a,n);Zc={"General Number":"General","General Date":vt[22],"Long Date":"dddd, mmmm dd, yyyy","Medium Date":vt[15],"Short Date":vt[14],"Long Time":vt[19],"Medium Time":vt[18],"Short Time":vt[20],Currency:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',Fixed:vt[2],Standard:vt[4],Percent:vt[10],Scientific:vt[11],"Yes/No":'"Yes";"Yes";"No";@',"True/False":'"True";"True";"False";@',"On/Off":'"Yes";"Yes";"No";@'};var l,f=[],T,p={},m=[],g=n.dense?[]:{},S="",x={},y={},w=Di(''),C=0,k=0,E=0,O={s:{r:2e6,c:2e6},e:{r:0,c:0}},N={},B={},A="",z=0,P=[],K={},I={},L=0,le=[],ue=[],X={},F=[],re,me=!1,te=[],Ce=[],ee={},M=0,Y=0,Z={Sheets:[],WBProps:{date1904:!1}},J={};s1.lastIndex=0,a=a.replace(//mg,"");for(var he="";l=s1.exec(a);)switch(l[3]=(he=l[3]).toLowerCase()){case"data":if(he=="data"){if(l[1]==="/"){if((T=f.pop())[0]!==l[3])throw new Error("Bad state: "+T.join("|"))}else l[0].charAt(l[0].length-2)!=="/"&&f.push([l[3],!0]);break}if(f[f.length-1][1])break;l[1]==="/"?SN(a.slice(C,l.index),A,w,f[f.length-1][0]=="comment"?X:x,{c:k,r:E},N,F[k],y,te,n):(A="",w=Di(l[0]),C=l.index+l[0].length);break;case"cell":if(l[1]==="/")if(ue.length>0&&(x.c=ue),(!n.sheetRows||n.sheetRows>E)&&x.v!==void 0&&(n.dense?(g[E]||(g[E]=[]),g[E][k]=x):g[Un(k)+ra(E)]=x),x.HRef&&(x.l={Target:Ut(x.HRef)},x.HRefScreenTip&&(x.l.Tooltip=x.HRefScreenTip),delete x.HRef,delete x.HRefScreenTip),(x.MergeAcross||x.MergeDown)&&(M=k+(parseInt(x.MergeAcross,10)|0),Y=E+(parseInt(x.MergeDown,10)|0),P.push({s:{c:k,r:E},e:{c:M,r:Y}})),!n.sheetStubs)x.MergeAcross?k=M+1:++k;else if(x.MergeAcross||x.MergeDown){for(var ge=k;ge<=M;++ge)for(var de=E;de<=Y;++de)(ge>k||de>E)&&(n.dense?(g[de]||(g[de]=[]),g[de][ge]={t:"z"}):g[Un(ge)+ra(de)]={t:"z"});k=M+1}else++k;else x=mN(l[0]),x.Index&&(k=+x.Index-1),kO.e.c&&(O.e.c=k),l[0].slice(-2)==="/>"&&++k,ue=[];break;case"row":l[1]==="/"||l[0].slice(-2)==="/>"?(EO.e.r&&(O.e.r=E),l[0].slice(-2)==="/>"&&(y=Di(l[0]),y.Index&&(E=+y.Index-1)),k=0,++E):(y=Di(l[0]),y.Index&&(E=+y.Index-1),ee={},(y.AutoFitHeight=="0"||y.Height)&&(ee.hpx=parseInt(y.Height,10),ee.hpt=xS(ee.hpx),Ce[E]=ee),y.Hidden=="1"&&(ee.hidden=!0,Ce[E]=ee));break;case"worksheet":if(l[1]==="/"){if((T=f.pop())[0]!==l[3])throw new Error("Bad state: "+T.join("|"));m.push(S),O.s.r<=O.e.r&&O.s.c<=O.e.c&&(g["!ref"]=Lt(O),n.sheetRows&&n.sheetRows<=O.e.r&&(g["!fullref"]=g["!ref"],O.e.r=n.sheetRows-1,g["!ref"]=Lt(O))),P.length&&(g["!merges"]=P),F.length>0&&(g["!cols"]=F),Ce.length>0&&(g["!rows"]=Ce),p[S]=g}else O={s:{r:2e6,c:2e6},e:{r:0,c:0}},E=k=0,f.push([l[3],!1]),T=Di(l[0]),S=Ut(T.Name),g=n.dense?[]:{},P=[],te=[],Ce=[],J={name:S,Hidden:0},Z.Sheets.push(J);break;case"table":if(l[1]==="/"){if((T=f.pop())[0]!==l[3])throw new Error("Bad state: "+T.join("|"))}else{if(l[0].slice(-2)=="/>")break;f.push([l[3],!1]),F=[],me=!1}break;case"style":l[1]==="/"?yN(N,B,n):B=Di(l[0]);break;case"numberformat":B.nf=Ut(Di(l[0]).Format||"General"),Zc[B.nf]&&(B.nf=Zc[B.nf]);for(var fe=0;fe!=392&&vt[fe]!=B.nf;++fe);if(fe==392){for(fe=57;fe!=392;++fe)if(vt[fe]==null){e0(B.nf,fe);break}}break;case"column":if(f[f.length-1][0]!=="table")break;if(re=Di(l[0]),re.Hidden&&(re.hidden=!0,delete re.Hidden),re.Width&&(re.wpx=parseInt(re.Width,10)),!me&&re.wpx>10){me=!0,Da=gS;for(var ye=0;ye0&&(Ne.Sheet=Z.Sheets.length-1),Z.Names.push(Ne);break;case"namedcell":break;case"b":break;case"i":break;case"u":break;case"s":break;case"em":break;case"h2":break;case"h3":break;case"sub":break;case"sup":break;case"span":break;case"alignment":break;case"borders":break;case"border":break;case"font":if(l[0].slice(-2)==="/>")break;l[1]==="/"?A+=a.slice(z,l.index):z=l.index+l[0].length;break;case"interior":if(!n.cellStyles)break;B.Interior=Di(l[0]);break;case"protection":break;case"author":case"title":case"description":case"created":case"keywords":case"subject":case"category":case"company":case"lastauthor":case"lastsaved":case"lastprinted":case"version":case"revision":case"totaltime":case"hyperlinkbase":case"manager":case"contentstatus":case"identifier":case"language":case"appname":if(l[0].slice(-2)==="/>")break;l[1]==="/"?sk(K,he,a.slice(L,l.index)):L=l.index+l[0].length;break;case"paragraphs":break;case"styles":case"workbook":if(l[1]==="/"){if((T=f.pop())[0]!==l[3])throw new Error("Bad state: "+T.join("|"))}else f.push([l[3],!1]);break;case"comment":if(l[1]==="/"){if((T=f.pop())[0]!==l[3])throw new Error("Bad state: "+T.join("|"));bN(X),ue.push(X)}else f.push([l[3],!1]),T=Di(l[0]),X={a:T.Author};break;case"autofilter":if(l[1]==="/"){if((T=f.pop())[0]!==l[3])throw new Error("Bad state: "+T.join("|"))}else if(l[0].charAt(l[0].length-2)!=="/"){var Ve=Di(l[0]);g["!autofilter"]={ref:To(Ve.Range).replace(/\$/g,"")},f.push([l[3],!0])}break;case"name":break;case"datavalidation":if(l[1]==="/"){if((T=f.pop())[0]!==l[3])throw new Error("Bad state: "+T.join("|"))}else l[0].charAt(l[0].length-2)!=="/"&&f.push([l[3],!0]);break;case"pixelsperinch":break;case"componentoptions":case"documentproperties":case"customdocumentproperties":case"officedocumentsettings":case"pivottable":case"pivotcache":case"names":case"mapinfo":case"pagebreaks":case"querytable":case"sorting":case"schema":case"conditionalformatting":case"smarttagtype":case"smarttags":case"excelworkbook":case"workbookoptions":case"worksheetoptions":if(l[1]==="/"){if((T=f.pop())[0]!==l[3])throw new Error("Bad state: "+T.join("|"))}else l[0].charAt(l[0].length-2)!=="/"&&f.push([l[3],!0]);break;case"null":break;default:if(f.length==0&&l[3]=="document"||f.length==0&&l[3]=="uof")return xx(a,n);var tt=!0;switch(f[f.length-1][0]){case"officedocumentsettings":switch(l[3]){case"allowpng":break;case"removepersonalinformation":break;case"downloadcomponents":break;case"locationofcomponents":break;case"colors":break;case"color":break;case"index":break;case"rgb":break;case"targetscreensize":break;case"readonlyrecommended":break;default:tt=!1}break;case"componentoptions":switch(l[3]){case"toolbar":break;case"hideofficelogo":break;case"spreadsheetautofit":break;case"label":break;case"caption":break;case"maxheight":break;case"maxwidth":break;case"nextsheetnumber":break;default:tt=!1}break;case"excelworkbook":switch(l[3]){case"date1904":Z.WBProps.date1904=!0;break;case"windowheight":break;case"windowwidth":break;case"windowtopx":break;case"windowtopy":break;case"tabratio":break;case"protectstructure":break;case"protectwindow":break;case"protectwindows":break;case"activesheet":break;case"displayinknotes":break;case"firstvisiblesheet":break;case"supbook":break;case"sheetname":break;case"sheetindex":break;case"sheetindexfirst":break;case"sheetindexlast":break;case"dll":break;case"acceptlabelsinformulas":break;case"donotsavelinkvalues":break;case"iteration":break;case"maxiterations":break;case"maxchange":break;case"path":break;case"xct":break;case"count":break;case"selectedsheets":break;case"calculation":break;case"uncalced":break;case"startupprompt":break;case"crn":break;case"externname":break;case"formula":break;case"colfirst":break;case"collast":break;case"wantadvise":break;case"boolean":break;case"error":break;case"text":break;case"ole":break;case"noautorecover":break;case"publishobjects":break;case"donotcalculatebeforesave":break;case"number":break;case"refmoder1c1":break;case"embedsavesmarttags":break;default:tt=!1}break;case"workbookoptions":switch(l[3]){case"owcversion":break;case"height":break;case"width":break;default:tt=!1}break;case"worksheetoptions":switch(l[3]){case"visible":if(l[0].slice(-2)!=="/>")if(l[1]==="/")switch(a.slice(L,l.index)){case"SheetHidden":J.Hidden=1;break;case"SheetVeryHidden":J.Hidden=2;break}else L=l.index+l[0].length;break;case"header":g["!margins"]||Yc(g["!margins"]={},"xlml"),isNaN(+it(l[0]).Margin)||(g["!margins"].header=+it(l[0]).Margin);break;case"footer":g["!margins"]||Yc(g["!margins"]={},"xlml"),isNaN(+it(l[0]).Margin)||(g["!margins"].footer=+it(l[0]).Margin);break;case"pagemargins":var We=it(l[0]);g["!margins"]||Yc(g["!margins"]={},"xlml"),isNaN(+We.Top)||(g["!margins"].top=+We.Top),isNaN(+We.Left)||(g["!margins"].left=+We.Left),isNaN(+We.Right)||(g["!margins"].right=+We.Right),isNaN(+We.Bottom)||(g["!margins"].bottom=+We.Bottom);break;case"displayrighttoleft":Z.Views||(Z.Views=[]),Z.Views[0]||(Z.Views[0]={}),Z.Views[0].RTL=!0;break;case"freezepanes":break;case"frozennosplit":break;case"splithorizontal":case"splitvertical":break;case"donotdisplaygridlines":break;case"activerow":break;case"activecol":break;case"toprowbottompane":break;case"leftcolumnrightpane":break;case"unsynced":break;case"print":break;case"printerrors":break;case"panes":break;case"scale":break;case"pane":break;case"number":break;case"layout":break;case"pagesetup":break;case"selected":break;case"protectobjects":break;case"enableselection":break;case"protectscenarios":break;case"validprinterinfo":break;case"horizontalresolution":break;case"verticalresolution":break;case"numberofcopies":break;case"activepane":break;case"toprowvisible":break;case"leftcolumnvisible":break;case"fittopage":break;case"rangeselection":break;case"papersizeindex":break;case"pagelayoutzoom":break;case"pagebreakzoom":break;case"filteron":break;case"fitwidth":break;case"fitheight":break;case"commentslayout":break;case"zoom":break;case"lefttoright":break;case"gridlines":break;case"allowsort":break;case"allowfilter":break;case"allowinsertrows":break;case"allowdeleterows":break;case"allowinsertcols":break;case"allowdeletecols":break;case"allowinserthyperlinks":break;case"allowformatcells":break;case"allowsizecols":break;case"allowsizerows":break;case"nosummaryrowsbelowdetail":g["!outline"]||(g["!outline"]={}),g["!outline"].above=!0;break;case"tabcolorindex":break;case"donotdisplayheadings":break;case"showpagelayoutzoom":break;case"nosummarycolumnsrightdetail":g["!outline"]||(g["!outline"]={}),g["!outline"].left=!0;break;case"blackandwhite":break;case"donotdisplayzeros":break;case"displaypagebreak":break;case"rowcolheadings":break;case"donotdisplayoutline":break;case"noorientation":break;case"allowusepivottables":break;case"zeroheight":break;case"viewablerange":break;case"selection":break;case"protectcontents":break;default:tt=!1}break;case"pivottable":case"pivotcache":switch(l[3]){case"immediateitemsondrop":break;case"showpagemultipleitemlabel":break;case"compactrowindent":break;case"location":break;case"pivotfield":break;case"orientation":break;case"layoutform":break;case"layoutsubtotallocation":break;case"layoutcompactrow":break;case"position":break;case"pivotitem":break;case"datatype":break;case"datafield":break;case"sourcename":break;case"parentfield":break;case"ptlineitems":break;case"ptlineitem":break;case"countofsameitems":break;case"item":break;case"itemtype":break;case"ptsource":break;case"cacheindex":break;case"consolidationreference":break;case"filename":break;case"reference":break;case"nocolumngrand":break;case"norowgrand":break;case"blanklineafteritems":break;case"hidden":break;case"subtotal":break;case"basefield":break;case"mapchilditems":break;case"function":break;case"refreshonfileopen":break;case"printsettitles":break;case"mergelabels":break;case"defaultversion":break;case"refreshname":break;case"refreshdate":break;case"refreshdatecopy":break;case"versionlastrefresh":break;case"versionlastupdate":break;case"versionupdateablemin":break;case"versionrefreshablemin":break;case"calculation":break;default:tt=!1}break;case"pagebreaks":switch(l[3]){case"colbreaks":break;case"colbreak":break;case"rowbreaks":break;case"rowbreak":break;case"colstart":break;case"colend":break;case"rowend":break;default:tt=!1}break;case"autofilter":switch(l[3]){case"autofiltercolumn":break;case"autofiltercondition":break;case"autofilterand":break;case"autofilteror":break;default:tt=!1}break;case"querytable":switch(l[3]){case"id":break;case"autoformatfont":break;case"autoformatpattern":break;case"querysource":break;case"querytype":break;case"enableredirections":break;case"refreshedinxl9":break;case"urlstring":break;case"htmltables":break;case"connection":break;case"commandtext":break;case"refreshinfo":break;case"notitles":break;case"nextid":break;case"columninfo":break;case"overwritecells":break;case"donotpromptforfile":break;case"textwizardsettings":break;case"source":break;case"number":break;case"decimal":break;case"thousandseparator":break;case"trailingminusnumbers":break;case"formatsettings":break;case"fieldtype":break;case"delimiters":break;case"tab":break;case"comma":break;case"autoformatname":break;case"versionlastedit":break;case"versionlastrefresh":break;default:tt=!1}break;case"datavalidation":switch(l[3]){case"range":break;case"type":break;case"min":break;case"max":break;case"sort":break;case"descending":break;case"order":break;case"casesensitive":break;case"value":break;case"errorstyle":break;case"errormessage":break;case"errortitle":break;case"inputmessage":break;case"inputtitle":break;case"combohide":break;case"inputhide":break;case"condition":break;case"qualifier":break;case"useblank":break;case"value1":break;case"value2":break;case"format":break;case"cellrangelist":break;default:tt=!1}break;case"sorting":case"conditionalformatting":switch(l[3]){case"range":break;case"type":break;case"min":break;case"max":break;case"sort":break;case"descending":break;case"order":break;case"casesensitive":break;case"value":break;case"errorstyle":break;case"errormessage":break;case"errortitle":break;case"cellrangelist":break;case"inputmessage":break;case"inputtitle":break;case"combohide":break;case"inputhide":break;case"condition":break;case"qualifier":break;case"useblank":break;case"value1":break;case"value2":break;case"format":break;default:tt=!1}break;case"mapinfo":case"schema":case"data":switch(l[3]){case"map":break;case"entry":break;case"range":break;case"xpath":break;case"field":break;case"xsdtype":break;case"filteron":break;case"aggregate":break;case"elementtype":break;case"attributetype":break;case"schema":case"element":case"complextype":case"datatype":case"all":case"attribute":case"extends":break;case"row":break;default:tt=!1}break;case"smarttags":break;default:tt=!1;break}if(tt||l[3].match(/!\[CDATA/))break;if(!f[f.length-1][1])throw"Unrecognized tag: "+l[3]+"|"+f.join("|");if(f[f.length-1][0]==="customdocumentproperties"){if(l[0].slice(-2)==="/>")break;l[1]==="/"?vN(I,he,le,a.slice(L,l.index)):(le=l,L=l.index+l[0].length);break}if(n.WTF)throw"Unrecognized tag: "+l[3]+"|"+f.join("|")}var Le={};return!n.bookSheets&&!n.bookProps&&(Le.Sheets=p),Le.SheetNames=m,Le.Workbook=Z,Le.SSF=sa(vt),Le.Props=K,Le.Custprops=I,Le}function Vh(e,t){switch(Qp(t=t||{}),t.type||"base64"){case"base64":return Uf(Qa(e),t);case"binary":case"buffer":case"file":return Uf(e,t);case"array":return Uf(d0(e),t)}}function wN(e){var t={},n=e.content;if(n.l=28,t.AnsiUserType=n.read_shift(0,"lpstr-ansi"),t.AnsiClipboardFormat=PE(n),n.length-n.l<=4)return t;var a=n.read_shift(4);if(a==0||a>40||(n.l-=4,t.Reserved1=n.read_shift(0,"lpstr-ansi"),n.length-n.l<=4)||(a=n.read_shift(4),a!==1907505652)||(t.UnicodeClipboardFormat=_E(n),a=n.read_shift(4),a==0||a>40))return t;n.l-=4,t.Reserved2=n.read_shift(0,"lpwstr")}var CN=[60,1084,2066,2165,2175];function EN(e,t,n,a,i){var r=a,c=[],l=n.slice(n.l,n.l+r);if(i&&i.enc&&i.enc.insitu&&l.length>0)switch(e){case 9:case 521:case 1033:case 2057:case 47:case 405:case 225:case 406:case 312:case 404:case 10:break;case 133:break;default:i.enc.insitu(l)}c.push(l),n.l+=r;for(var f=Rs(n,n.l),T=Hh[f],p=0;T!=null&&CN.indexOf(f)>-1;)r=Rs(n,n.l+2),p=n.l+4,f==2066?p+=4:(f==2165||f==2175)&&(p+=12),l=n.slice(p,n.l+4+r),c.push(l),n.l+=4+r,T=Hh[f=Rs(n,n.l)];var m=lr(c);aa(m,0);var g=0;m.lens=[];for(var S=0;S1)&&!(Je.sheetRows&&pe.r>=Je.sheetRows)){if(Je.cellStyles&&He.XF&&He.XF.data&&K(pe,He,Je),delete He.ixfe,delete He.XF,m=pe,g=ht(pe),(!c||!c.s||!c.e)&&(c={s:{r:0,c:0},e:{r:0,c:0}}),pe.rc.e.r&&(c.e.r=pe.r+1),pe.c+1>c.e.c&&(c.e.c=pe.c+1),Je.cellFormula&&He.f){for(var rt=0;rtpe.c||k[rt][0].s.r>pe.r)&&!(k[rt][0].e.c>8)!==de)throw new Error("rt mismatch: "+qe+"!="+de);ye.r==12&&(e.l+=10,fe-=10)}var ae={};if(de===10?ae=ye.f(e,fe,L):ae=EN(de,ye,e,fe,L),ee==0&&[9,521,1033,2057].indexOf(Ce)===-1)continue;switch(de){case 34:n.opts.Date1904=A.WBProps.date1904=ae;break;case 134:n.opts.WriteProtect=!0;break;case 47:if(L.enc||(e.l=0),L.enc=ae,!t.password)throw new Error("File is password-protected");if(ae.valid==null)throw new Error("Encryption scheme unsupported");if(!ae.valid)throw new Error("Password is incorrect");break;case 92:L.lastuser=ae;break;case 66:var Ne=Number(ae);switch(Ne){case 21010:Ne=1200;break;case 32768:Ne=1e4;break;case 32769:Ne=1252;break}Li(L.codepage=Ne),he=!0;break;case 317:L.rrtabid=ae;break;case 25:L.winlocked=ae;break;case 439:n.opts.RefreshAll=ae;break;case 12:n.opts.CalcCount=ae;break;case 16:n.opts.CalcDelta=ae;break;case 17:n.opts.CalcIter=ae;break;case 13:n.opts.CalcMode=ae;break;case 14:n.opts.CalcPrecision=ae;break;case 95:n.opts.CalcSaveRecalc=ae;break;case 15:L.CalcRefMode=ae;break;case 2211:n.opts.FullCalc=ae;break;case 129:ae.fDialog&&(i["!type"]="dialog"),ae.fBelow||((i["!outline"]||(i["!outline"]={})).above=!0),ae.fRight||((i["!outline"]||(i["!outline"]={})).left=!0);break;case 224:N.push(ae);break;case 430:te.push([ae]),te[te.length-1].XTI=[];break;case 35:case 547:te[te.length-1].push(ae);break;case 24:case 536:J={Name:ae.Name,Ref:ha(ae.rgce,c,null,te,L)},ae.itab>0&&(J.Sheet=ae.itab-1),te.names.push(J),te[0]||(te[0]=[],te[0].XTI=[]),te[te.length-1].push(ae),ae.Name=="_xlnm._FilterDatabase"&&ae.itab>0&&ae.rgce&&ae.rgce[0]&&ae.rgce[0][0]&&ae.rgce[0][0][0]=="PtgArea3d"&&(Z[ae.itab-1]={ref:Lt(ae.rgce[0][0][1][2])});break;case 22:L.ExternCount=ae;break;case 23:te.length==0&&(te[0]=[],te[0].XTI=[]),te[te.length-1].XTI=te[te.length-1].XTI.concat(ae),te.XTI=te.XTI.concat(ae);break;case 2196:if(L.biff<8)break;J!=null&&(J.Comment=ae[1]);break;case 18:i["!protect"]=ae;break;case 19:ae!==0&&L.WTF&&console.error("Password verifier: "+ae);break;case 133:r[ae.pos]=ae,L.snames.push(ae.name);break;case 10:{if(--ee)break;if(c.e){if(c.e.r>0&&c.e.c>0){if(c.e.r--,c.e.c--,i["!ref"]=Lt(c),t.sheetRows&&t.sheetRows<=c.e.r){var Ve=c.e.r;c.e.r=t.sheetRows-1,i["!fullref"]=i["!ref"],i["!ref"]=Lt(c),c.e.r=Ve}c.e.r++,c.e.c++}ue.length>0&&(i["!merges"]=ue),X.length>0&&(i["!objects"]=X),F.length>0&&(i["!cols"]=F),re.length>0&&(i["!rows"]=re),A.Sheets.push(z)}T===""?p=i:a[T]=i,i=t.dense?[]:{}}break;case 9:case 521:case 1033:case 2057:{if(L.biff===8&&(L.biff={9:2,521:3,1033:4}[de]||{512:2,768:3,1024:4,1280:5,1536:8,2:2,7:2}[ae.BIFFVer]||8),L.biffguess=ae.BIFFVer==0,ae.BIFFVer==0&&ae.dt==4096&&(L.biff=5,he=!0,Li(L.codepage=28591)),L.biff==8&&ae.BIFFVer==0&&ae.dt==16&&(L.biff=2),ee++)break;if(i=t.dense?[]:{},L.biff<8&&!he&&(he=!0,Li(L.codepage=t.codepage||1252)),L.biff<5||ae.BIFFVer==0&&ae.dt==4096){T===""&&(T="Sheet1"),c={s:{r:0,c:0},e:{r:0,c:0}};var tt={pos:e.l-fe,name:T};r[tt.pos]=tt,L.snames.push(T)}else T=(r[ge]||{name:""}).name;ae.dt==32&&(i["!type"]="chart"),ae.dt==64&&(i["!type"]="macro"),ue=[],X=[],L.arrayf=k=[],F=[],re=[],me=!1,z={Hidden:(r[ge]||{hs:0}).hs,name:T}}break;case 515:case 3:case 2:i["!type"]=="chart"&&(t.dense?(i[ae.r]||[])[ae.c]:i[ht({c:ae.c,r:ae.r})])&&++ae.c,E={ixfe:ae.ixfe,XF:N[ae.ixfe]||{},v:ae.val,t:"n"},M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I({c:ae.c,r:ae.r},E,t);break;case 5:case 517:E={ixfe:ae.ixfe,XF:N[ae.ixfe],v:ae.val,t:ae.t},M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I({c:ae.c,r:ae.r},E,t);break;case 638:E={ixfe:ae.ixfe,XF:N[ae.ixfe],v:ae.rknum,t:"n"},M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I({c:ae.c,r:ae.r},E,t);break;case 189:for(var We=ae.c;We<=ae.C;++We){var Le=ae.rkrec[We-ae.c][0];E={ixfe:Le,XF:N[Le],v:ae.rkrec[We-ae.c][1],t:"n"},M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I({c:We,r:ae.r},E,t)}break;case 6:case 518:case 1030:{if(ae.val=="String"){l=ae;break}if(E=$l(ae.val,ae.cell.ixfe,ae.tt),E.XF=N[E.ixfe],t.cellFormula){var _e=ae.formula;if(_e&&_e[0]&&_e[0][0]&&_e[0][0][0]=="PtgExp"){var Xe=_e[0][0][1][0],pt=_e[0][0][1][1],Pt=ht({r:Xe,c:pt});C[Pt]?E.f=""+ha(ae.formula,c,ae.cell,te,L):E.F=((t.dense?(i[Xe]||[])[pt]:i[Pt])||{}).F}else E.f=""+ha(ae.formula,c,ae.cell,te,L)}M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I(ae.cell,E,t),l=ae}break;case 7:case 519:if(l)l.val=ae,E=$l(ae,l.cell.ixfe,"s"),E.XF=N[E.ixfe],t.cellFormula&&(E.f=""+ha(l.formula,c,l.cell,te,L)),M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I(l.cell,E,t),l=null;else throw new Error("String record expects Formula");break;case 33:case 545:{k.push(ae);var Kt=ht(ae[0].s);if(S=t.dense?(i[ae[0].s.r]||[])[ae[0].s.c]:i[Kt],t.cellFormula&&S){if(!l||!Kt||!S)break;S.f=""+ha(ae[1],c,ae[0],te,L),S.F=Lt(ae[0])}}break;case 1212:{if(!t.cellFormula)break;if(g){if(!l)break;C[ht(l.cell)]=ae[0],S=t.dense?(i[l.cell.r]||[])[l.cell.c]:i[ht(l.cell)],(S||{}).f=""+ha(ae[0],c,m,te,L)}}break;case 253:E=$l(f[ae.isst].t,ae.ixfe,"s"),f[ae.isst].h&&(E.h=f[ae.isst].h),E.XF=N[E.ixfe],M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I({c:ae.c,r:ae.r},E,t);break;case 513:t.sheetStubs&&(E={ixfe:ae.ixfe,XF:N[ae.ixfe],t:"z"},M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I({c:ae.c,r:ae.r},E,t));break;case 190:if(t.sheetStubs)for(var Dt=ae.c;Dt<=ae.C;++Dt){var dt=ae.ixfe[Dt-ae.c];E={ixfe:dt,XF:N[dt],t:"z"},M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I({c:Dt,r:ae.r},E,t)}break;case 214:case 516:case 4:E=$l(ae.val,ae.ixfe,"s"),E.XF=N[E.ixfe],M>0&&(E.z=Y[E.ixfe>>8&63]),Vi(E,t,n.opts.Date1904),I({c:ae.c,r:ae.r},E,t);break;case 0:case 512:ee===1&&(c=ae);break;case 252:f=ae;break;case 1054:if(L.biff==4){Y[M++]=ae[1];for(var jt=0;jt=163&&e0(ae[1],M+163)}else e0(ae[1],ae[0]);break;case 30:{Y[M++]=ae;for(var Gt=0;Gt=163&&e0(ae,M+163)}break;case 229:ue=ue.concat(ae);break;case 93:X[ae.cmo[0]]=L.lastobj=ae;break;case 438:L.lastobj.TxO=ae;break;case 127:L.lastobj.ImData=ae;break;case 440:for(w=ae[0].s.r;w<=ae[0].e.r;++w)for(y=ae[0].s.c;y<=ae[0].e.c;++y)S=t.dense?(i[w]||[])[y]:i[ht({c:y,r:w})],S&&(S.l=ae[1]);break;case 2048:for(w=ae[0].s.r;w<=ae[0].e.r;++w)for(y=ae[0].s.c;y<=ae[0].e.c;++y)S=t.dense?(i[w]||[])[y]:i[ht({c:y,r:w})],S&&S.l&&(S.l.Tooltip=ae[1]);break;case 28:{if(L.biff<=5&&L.biff>=2)break;S=t.dense?(i[ae[0].r]||[])[ae[0].c]:i[ht(ae[0])];var ln=X[ae[2]];S||(t.dense?(i[ae[0].r]||(i[ae[0].r]=[]),S=i[ae[0].r][ae[0].c]={t:"z"}):S=i[ht(ae[0])]={t:"z"},c.e.r=Math.max(c.e.r,ae[0].r),c.s.r=Math.min(c.s.r,ae[0].r),c.e.c=Math.max(c.e.c,ae[0].c),c.s.c=Math.min(c.s.c,ae[0].c)),S.c||(S.c=[]),x={a:ae[1],t:ln.TxO.t},S.c.push(x)}break;case 2173:KA(N[ae.ixfe],ae.ext);break;case 125:{if(!L.cellStyles)break;for(;ae.e>=ae.s;)F[ae.e--]={width:ae.w/256,level:ae.level||0,hidden:!!(ae.flags&1)},me||(me=!0,Kp(ae.w/256)),yo(F[ae.e+1])}break;case 520:{var Et={};ae.level!=null&&(re[ae.r]=Et,Et.level=ae.level),ae.hidden&&(re[ae.r]=Et,Et.hidden=!0),ae.hpt&&(re[ae.r]=Et,Et.hpt=ae.hpt,Et.hpx=c1(ae.hpt))}break;case 38:case 39:case 40:case 41:i["!margins"]||Yc(i["!margins"]={}),i["!margins"][{38:"left",39:"right",40:"top",41:"bottom"}[de]]=ae;break;case 161:i["!margins"]||Yc(i["!margins"]={}),i["!margins"].header=ae.header,i["!margins"].footer=ae.footer;break;case 574:ae.RTL&&(A.Views[0].RTL=!0);break;case 146:B=ae;break;case 2198:le=ae;break;case 140:O=ae;break;case 442:T?z.CodeName=ae||z.name:A.WBProps.CodeName=ae||"ThisWorkbook";break}}else ye||console.error("Missing Info for XLS Record 0x"+de.toString(16)),e.l+=fe}return n.SheetNames=ns(r).sort(function(_t,pe){return Number(_t)-Number(pe)}).map(function(_t){return r[_t].name}),t.bookSheets||(n.Sheets=a),!n.SheetNames.length&&p["!ref"]?(n.SheetNames.push("Sheet1"),n.Sheets&&(n.Sheets.Sheet1=p)):n.Preamble=p,n.Sheets&&Z.forEach(function(_t,pe){n.Sheets[n.SheetNames[pe]]["!autofilter"]=_t}),n.Strings=f,n.SSF=sa(vt),L.enc&&(n.Encryption=L.enc),le&&(n.Themes=le),n.Metadata={},O!==void 0&&(n.Metadata.Country=O),te.names.length>0&&(A.Names=te.names),n.Workbook=A,n}var hx={SI:"e0859ff2f94f6810ab9108002b27b3d9",DSI:"02d5cdd59c2e1b10939708002b2cf9ae",UDI:"05d5cdd59c2e1b10939708002b2cf9ae"};function AN(e,t,n){var a=Ft.find(e,"/!DocumentSummaryInformation");if(a&&a.size>0)try{var i=Zv(a,VE,hx.DSI);for(var r in i)t[r]=i[r]}catch(T){if(n.WTF)throw T}var c=Ft.find(e,"/!SummaryInformation");if(c&&c.size>0)try{var l=Zv(c,HE,hx.SI);for(var f in l)t[f]==null&&(t[f]=l[f])}catch(T){if(n.WTF)throw T}t.HeadingPairs&&t.TitlesOfParts&&(eS(t.HeadingPairs,t.TitlesOfParts,t,n),delete t.HeadingPairs,delete t.TitlesOfParts)}function PS(e,t){t||(t={}),Qp(t),T4(),t.codepage&&Np(t.codepage);var n,a;if(e.FullPaths){if(Ft.find(e,"/encryption"))throw new Error("File is password-protected");n=Ft.find(e,"!CompObj"),a=Ft.find(e,"/Workbook")||Ft.find(e,"/Book")}else{switch(t.type){case"base64":e=Oi(Qa(e));break;case"binary":e=Oi(e);break;case"buffer":break;case"array":Array.isArray(e)||(e=Array.prototype.slice.call(e));break}aa(e,0),a={content:e}}var i,r;if(n&&wN(n),t.bookProps&&!t.bookSheets)i={};else{var c=Mt?"buffer":"array";if(a&&a.content)i=kN(a.content,t);else if((r=Ft.find(e,"PerfectOffice_MAIN"))&&r.content)i=Kc.to_workbook(r.content,(t.type=c,t));else if((r=Ft.find(e,"NativeContent_MAIN"))&&r.content)i=Kc.to_workbook(r.content,(t.type=c,t));else throw(r=Ft.find(e,"MN0"))&&r.content?new Error("Unsupported Works 4 for Mac file"):new Error("Cannot find Workbook stream");t.bookVBA&&e.FullPaths&&Ft.find(e,"/_VBA_PROJECT_CUR/VBA/dir")&&(i.vbaraw=TR(e))}var l={};return e.FullPaths&&AN(e,l,t),i.Props=i.Custprops=l,t.bookFiles&&(i.cfb=e),i}var Vu={0:{f:cI},1:{f:TI},2:{f:SI},3:{f:mI},4:{f:hI},5:{f:yI},6:{f:CI},7:{f:vI},8:{f:DI},9:{f:RI},10:{f:kI},11:{f:AI},12:{f:fI},13:{f:bI},14:{f:gI},15:{f:pI},16:{f:OS},17:{f:EI},18:{f:xI},19:{f:zp},20:{},21:{},22:{},23:{},24:{},25:{},26:{},27:{},28:{},29:{},30:{},31:{},32:{},33:{},34:{},35:{T:1},36:{T:-1},37:{T:1},38:{T:-1},39:{f:nN},40:{},42:{},43:{f:kA},44:{f:EA},45:{f:AA},46:{f:DA},47:{f:RA},48:{},49:{f:IE},50:{},51:{f:YA},52:{T:1},53:{T:-1},54:{T:1},55:{T:-1},56:{T:1},57:{T:-1},58:{},59:{},60:{f:TS},62:{f:wI},63:{f:tR},64:{f:_I},65:{},66:{},67:{},68:{},69:{},70:{},128:{},129:{T:1},130:{T:-1},131:{T:1,f:xa,p:0},132:{T:-1},133:{T:1},134:{T:-1},135:{T:1},136:{T:-1},137:{T:1,f:PI},138:{T:-1},139:{T:1},140:{T:-1},141:{T:1},142:{T:-1},143:{T:1},144:{T:-1},145:{T:1},146:{T:-1},147:{f:dI},148:{f:lI,p:16},151:{f:OI},152:{},153:{f:eN},154:{},155:{},156:{f:QI},157:{},158:{},159:{T:1,f:H9},160:{T:-1},161:{T:1,f:f0},162:{T:-1},163:{T:1},164:{T:-1},165:{T:1},166:{T:-1},167:{},168:{},169:{},170:{},171:{},172:{T:1},173:{T:-1},174:{},175:{},176:{f:II},177:{T:1},178:{T:-1},179:{T:1},180:{T:-1},181:{T:1},182:{T:-1},183:{T:1},184:{T:-1},185:{T:1},186:{T:-1},187:{T:1},188:{T:-1},189:{T:1},190:{T:-1},191:{T:1},192:{T:-1},193:{T:1},194:{T:-1},195:{T:1},196:{T:-1},197:{T:1},198:{T:-1},199:{T:1},200:{T:-1},201:{T:1},202:{T:-1},203:{T:1},204:{T:-1},205:{T:1},206:{T:-1},207:{T:1},208:{T:-1},209:{T:1},210:{T:-1},211:{T:1},212:{T:-1},213:{T:1},214:{T:-1},215:{T:1},216:{T:-1},217:{T:1},218:{T:-1},219:{T:1},220:{T:-1},221:{T:1},222:{T:-1},223:{T:1},224:{T:-1},225:{T:1},226:{T:-1},227:{T:1},228:{T:-1},229:{T:1},230:{T:-1},231:{T:1},232:{T:-1},233:{T:1},234:{T:-1},235:{T:1},236:{T:-1},237:{T:1},238:{T:-1},239:{T:1},240:{T:-1},241:{T:1},242:{T:-1},243:{T:1},244:{T:-1},245:{T:1},246:{T:-1},247:{T:1},248:{T:-1},249:{T:1},250:{T:-1},251:{T:1},252:{T:-1},253:{T:1},254:{T:-1},255:{T:1},256:{T:-1},257:{T:1},258:{T:-1},259:{T:1},260:{T:-1},261:{T:1},262:{T:-1},263:{T:1},264:{T:-1},265:{T:1},266:{T:-1},267:{T:1},268:{T:-1},269:{T:1},270:{T:-1},271:{T:1},272:{T:-1},273:{T:1},274:{T:-1},275:{T:1},276:{T:-1},277:{},278:{T:1},279:{T:-1},280:{T:1},281:{T:-1},282:{T:1},283:{T:1},284:{T:-1},285:{T:1},286:{T:-1},287:{T:1},288:{T:-1},289:{T:1},290:{T:-1},291:{T:1},292:{T:-1},293:{T:1},294:{T:-1},295:{T:1},296:{T:-1},297:{T:1},298:{T:-1},299:{T:1},300:{T:-1},301:{T:1},302:{T:-1},303:{T:1},304:{T:-1},305:{T:1},306:{T:-1},307:{T:1},308:{T:-1},309:{T:1},310:{T:-1},311:{T:1},312:{T:-1},313:{T:-1},314:{T:1},315:{T:-1},316:{T:1},317:{T:-1},318:{T:1},319:{T:-1},320:{T:1},321:{T:-1},322:{T:1},323:{T:-1},324:{T:1},325:{T:-1},326:{T:1},327:{T:-1},328:{T:1},329:{T:-1},330:{T:1},331:{T:-1},332:{T:1},333:{T:-1},334:{T:1},335:{f:$A},336:{T:-1},337:{f:ZA,T:1},338:{T:-1},339:{T:1},340:{T:-1},341:{T:1},342:{T:-1},343:{T:1},344:{T:-1},345:{T:1},346:{T:-1},347:{T:1},348:{T:-1},349:{T:1},350:{T:-1},351:{},352:{},353:{T:1},354:{T:-1},355:{f:Bh},357:{},358:{},359:{},360:{T:1},361:{},362:{f:dS},363:{},364:{},366:{},367:{},368:{},369:{},370:{},371:{},372:{T:1},373:{T:-1},374:{T:1},375:{T:-1},376:{T:1},377:{T:-1},378:{T:1},379:{T:-1},380:{T:1},381:{T:-1},382:{T:1},383:{T:-1},384:{T:1},385:{T:-1},386:{T:1},387:{T:-1},388:{T:1},389:{T:-1},390:{T:1},391:{T:-1},392:{T:1},393:{T:-1},394:{T:1},395:{T:-1},396:{},397:{},398:{},399:{},400:{},401:{T:1},403:{},404:{},405:{},406:{},407:{},408:{},409:{},410:{},411:{},412:{},413:{},414:{},415:{},416:{},417:{},418:{},419:{},420:{},421:{},422:{T:1},423:{T:1},424:{T:-1},425:{T:-1},426:{f:MI},427:{f:jI},428:{},429:{T:1},430:{T:-1},431:{T:1},432:{T:-1},433:{T:1},434:{T:-1},435:{T:1},436:{T:-1},437:{T:1},438:{T:-1},439:{T:1},440:{T:-1},441:{T:1},442:{T:-1},443:{T:1},444:{T:-1},445:{T:1},446:{T:-1},447:{T:1},448:{T:-1},449:{T:1},450:{T:-1},451:{T:1},452:{T:-1},453:{T:1},454:{T:-1},455:{T:1},456:{T:-1},457:{T:1},458:{T:-1},459:{T:1},460:{T:-1},461:{T:1},462:{T:-1},463:{T:1},464:{T:-1},465:{T:1},466:{T:-1},467:{T:1},468:{T:-1},469:{T:1},470:{T:-1},471:{},472:{},473:{T:1},474:{T:-1},475:{},476:{f:LI},477:{},478:{},479:{T:1},480:{T:-1},481:{T:1},482:{T:-1},483:{T:1},484:{T:-1},485:{f:uI},486:{T:1},487:{T:-1},488:{T:1},489:{T:-1},490:{T:1},491:{T:-1},492:{T:1},493:{T:-1},494:{f:NI},495:{T:1},496:{T:-1},497:{T:1},498:{T:-1},499:{},500:{T:1},501:{T:-1},502:{T:1},503:{T:-1},504:{},505:{T:1},506:{T:-1},507:{},508:{T:1},509:{T:-1},510:{T:1},511:{T:-1},512:{},513:{},514:{T:1},515:{T:-1},516:{T:1},517:{T:-1},518:{T:1},519:{T:-1},520:{T:1},521:{T:-1},522:{},523:{},524:{},525:{},526:{},527:{},528:{T:1},529:{T:-1},530:{T:1},531:{T:-1},532:{T:1},533:{T:-1},534:{},535:{},536:{},537:{},538:{T:1},539:{T:-1},540:{T:1},541:{T:-1},542:{T:1},548:{},549:{},550:{f:Bh},551:{},552:{},553:{},554:{T:1},555:{T:-1},556:{T:1},557:{T:-1},558:{T:1},559:{T:-1},560:{T:1},561:{T:-1},562:{},564:{},565:{T:1},566:{T:-1},569:{T:1},570:{T:-1},572:{},573:{T:1},574:{T:-1},577:{},578:{},579:{},580:{},581:{},582:{},583:{},584:{},585:{},586:{},587:{},588:{T:-1},589:{},590:{T:1},591:{T:-1},592:{T:1},593:{T:-1},594:{T:1},595:{T:-1},596:{},597:{T:1},598:{T:-1},599:{T:1},600:{T:-1},601:{T:1},602:{T:-1},603:{T:1},604:{T:-1},605:{T:1},606:{T:-1},607:{},608:{T:1},609:{T:-1},610:{},611:{T:1},612:{T:-1},613:{T:1},614:{T:-1},615:{T:1},616:{T:-1},617:{T:1},618:{T:-1},619:{T:1},620:{T:-1},625:{},626:{T:1},627:{T:-1},628:{T:1},629:{T:-1},630:{T:1},631:{T:-1},632:{f:lR},633:{T:1},634:{T:-1},635:{T:1,f:cR},636:{T:-1},637:{f:OE},638:{T:1},639:{},640:{T:-1},641:{T:1},642:{T:-1},643:{T:1},644:{},645:{T:-1},646:{T:1},648:{T:1},649:{},650:{T:-1},651:{f:VI},652:{},653:{T:1},654:{T:-1},655:{T:1},656:{T:-1},657:{T:1},658:{T:-1},659:{},660:{T:1},661:{},662:{T:-1},663:{},664:{T:1},665:{},666:{T:-1},667:{},668:{},669:{},671:{T:1},672:{T:-1},673:{T:1},674:{T:-1},675:{},676:{},677:{},678:{},679:{},680:{},681:{},1024:{},1025:{},1026:{T:1},1027:{T:-1},1028:{T:1},1029:{T:-1},1030:{},1031:{T:1},1032:{T:-1},1033:{T:1},1034:{T:-1},1035:{},1036:{},1037:{},1038:{T:1},1039:{T:-1},1040:{},1041:{T:1},1042:{T:-1},1043:{},1044:{},1045:{},1046:{T:1},1047:{T:-1},1048:{T:1},1049:{T:-1},1050:{},1051:{T:1},1052:{T:1},1053:{f:qI},1054:{T:1},1055:{},1056:{T:1},1057:{T:-1},1058:{T:1},1059:{T:-1},1061:{},1062:{T:1},1063:{T:-1},1064:{T:1},1065:{T:-1},1066:{T:1},1067:{T:-1},1068:{T:1},1069:{T:-1},1070:{T:1},1071:{T:-1},1072:{T:1},1073:{T:-1},1075:{T:1},1076:{T:-1},1077:{T:1},1078:{T:-1},1079:{T:1},1080:{T:-1},1081:{T:1},1082:{T:-1},1083:{T:1},1084:{T:-1},1085:{},1086:{T:1},1087:{T:-1},1088:{T:1},1089:{T:-1},1090:{T:1},1091:{T:-1},1092:{T:1},1093:{T:-1},1094:{T:1},1095:{T:-1},1096:{},1097:{T:1},1098:{},1099:{T:-1},1100:{T:1},1101:{T:-1},1102:{},1103:{},1104:{},1105:{},1111:{},1112:{},1113:{T:1},1114:{T:-1},1115:{T:1},1116:{T:-1},1117:{},1118:{T:1},1119:{T:-1},1120:{T:1},1121:{T:-1},1122:{T:1},1123:{T:-1},1124:{T:1},1125:{T:-1},1126:{},1128:{T:1},1129:{T:-1},1130:{},1131:{T:1},1132:{T:-1},1133:{T:1},1134:{T:-1},1135:{T:1},1136:{T:-1},1137:{T:1},1138:{T:-1},1139:{T:1},1140:{T:-1},1141:{},1142:{T:1},1143:{T:-1},1144:{T:1},1145:{T:-1},1146:{},1147:{T:1},1148:{T:-1},1149:{T:1},1150:{T:-1},1152:{T:1},1153:{T:-1},1154:{T:-1},1155:{T:-1},1156:{T:-1},1157:{T:1},1158:{T:-1},1159:{T:1},1160:{T:-1},1161:{T:1},1162:{T:-1},1163:{T:1},1164:{T:-1},1165:{T:1},1166:{T:-1},1167:{T:1},1168:{T:-1},1169:{T:1},1170:{T:-1},1171:{},1172:{T:1},1173:{T:-1},1177:{},1178:{T:1},1180:{},1181:{},1182:{},2048:{T:1},2049:{T:-1},2050:{},2051:{T:1},2052:{T:-1},2053:{},2054:{},2055:{T:1},2056:{T:-1},2057:{T:1},2058:{T:-1},2060:{},2067:{},2068:{T:1},2069:{T:-1},2070:{},2071:{},2072:{T:1},2073:{T:-1},2075:{},2076:{},2077:{T:1},2078:{T:-1},2079:{},2080:{T:1},2081:{T:-1},2082:{},2083:{T:1},2084:{T:-1},2085:{T:1},2086:{T:-1},2087:{T:1},2088:{T:-1},2089:{T:1},2090:{T:-1},2091:{},2092:{},2093:{T:1},2094:{T:-1},2095:{},2096:{T:1},2097:{T:-1},2098:{T:1},2099:{T:-1},2100:{T:1},2101:{T:-1},2102:{},2103:{T:1},2104:{T:-1},2105:{},2106:{T:1},2107:{T:-1},2108:{},2109:{T:1},2110:{T:-1},2111:{T:1},2112:{T:-1},2113:{T:1},2114:{T:-1},2115:{},2116:{},2117:{},2118:{T:1},2119:{T:-1},2120:{},2121:{T:1},2122:{T:-1},2123:{T:1},2124:{T:-1},2125:{},2126:{T:1},2127:{T:-1},2128:{},2129:{T:1},2130:{T:-1},2131:{T:1},2132:{T:-1},2133:{T:1},2134:{},2135:{},2136:{},2137:{T:1},2138:{T:-1},2139:{T:1},2140:{T:-1},2141:{},3072:{},3073:{},4096:{T:1},4097:{T:-1},5002:{T:1},5003:{T:-1},5081:{T:1},5082:{T:-1},5083:{},5084:{T:1},5085:{T:-1},5086:{T:1},5087:{T:-1},5088:{},5089:{},5090:{},5092:{T:1},5093:{T:-1},5094:{},5095:{T:1},5096:{T:-1},5097:{},5099:{},65535:{n:""}},Hh={6:{f:qf},10:{f:sr},12:{f:jn},13:{f:jn},14:{f:Cn},15:{f:Cn},16:{f:pa},17:{f:Cn},18:{f:Cn},19:{f:jn},20:{f:tx},21:{f:tx},23:{f:dS},24:{f:ax},25:{f:Cn},26:{},27:{},28:{f:r9},29:{},34:{f:Cn},35:{f:nx},38:{f:pa},39:{f:pa},40:{f:pa},41:{f:pa},42:{f:Cn},43:{f:Cn},47:{f:uA},49:{f:Uk},51:{f:jn},60:{},61:{f:_k},64:{f:Cn},65:{f:Bk},66:{f:jn},77:{},80:{},81:{},82:{},85:{f:jn},89:{},90:{},91:{},92:{f:Ik},93:{f:c9},94:{},95:{f:Cn},96:{},97:{},99:{f:Cn},125:{f:TS},128:{f:Zk},129:{f:Nk},130:{f:jn},131:{f:Cn},132:{f:Cn},133:{f:Ok},134:{},140:{f:h9},141:{f:jn},144:{},146:{f:m9},151:{},152:{},153:{},154:{},155:{},156:{f:jn},157:{},158:{},160:{f:S9},161:{f:v9},174:{},175:{},176:{},177:{},178:{},180:{},181:{},182:{},184:{},185:{},189:{f:Xk},190:{f:Kk},193:{f:sr},197:{},198:{},199:{},200:{},201:{},202:{f:Cn},203:{},204:{},205:{},206:{},207:{},208:{},209:{},210:{},211:{},213:{},215:{},216:{},217:{},218:{f:jn},220:{},221:{f:Cn},222:{},224:{f:Yk},225:{f:Dk},226:{f:sr},227:{},229:{f:o9},233:{},235:{},236:{},237:{},239:{},240:{},241:{},242:{},244:{},245:{},246:{},247:{},248:{},249:{},251:{},252:{f:Mk},253:{f:zk},255:{f:jk},256:{},259:{},290:{},311:{},312:{},315:{},317:{f:sS},318:{},319:{},320:{},330:{},331:{},333:{},334:{},335:{},336:{},337:{},338:{},339:{},340:{},351:{},352:{f:Cn},353:{f:sr},401:{},402:{},403:{},404:{},405:{},406:{},407:{},408:{},425:{},426:{},427:{},428:{},429:{},430:{f:Qk},431:{f:Cn},432:{},433:{},434:{},437:{},438:{f:d9},439:{f:Cn},440:{f:T9},441:{},442:{f:k1},443:{},444:{f:jn},445:{},446:{},448:{f:sr},449:{f:Pk,r:2},450:{f:sr},512:{f:Qv},513:{f:y9},515:{f:Jk},516:{f:Wk},517:{f:ex},519:{f:b9},520:{f:Fk},523:{},545:{f:ix},549:{f:Jv},566:{},574:{f:qk},638:{f:Gk},659:{},1048:{},1054:{f:Vk},1084:{},1212:{f:a9},2048:{f:f9},2049:{},2050:{},2051:{},2052:{},2053:{},2054:{},2055:{},2056:{},2057:{f:Gl},2058:{},2059:{},2060:{},2061:{},2062:{},2063:{},2064:{},2066:{},2067:{},2128:{},2129:{},2130:{},2131:{},2132:{},2133:{},2134:{},2135:{},2136:{},2137:{},2138:{},2146:{},2147:{r:12},2148:{},2149:{},2150:{},2151:{f:sr},2152:{},2154:{},2155:{},2156:{},2161:{},2162:{},2164:{},2165:{},2166:{},2167:{},2168:{},2169:{},2170:{},2171:{},2172:{f:g9,r:12},2173:{f:XA,r:12},2174:{},2175:{},2180:{},2181:{},2182:{},2183:{},2184:{},2185:{},2186:{},2187:{},2188:{f:Cn,r:12},2189:{},2190:{r:12},2191:{},2192:{},2194:{},2195:{},2196:{f:n9,r:12},2197:{},2198:{f:UA,r:12},2199:{},2200:{},2201:{},2202:{f:i9,r:12},2203:{f:sr},2204:{},2205:{},2206:{},2207:{},2211:{f:Lk},2212:{},2213:{},2214:{},2215:{},4097:{},4098:{},4099:{},4102:{},4103:{},4105:{},4106:{},4107:{},4108:{},4109:{},4116:{},4117:{},4118:{},4119:{},4120:{},4121:{},4122:{},4123:{},4124:{},4125:{},4126:{},4127:{},4128:{},4129:{},4130:{},4132:{},4133:{},4134:{f:jn},4135:{},4146:{},4147:{},4148:{},4149:{},4154:{},4156:{},4157:{},4158:{},4159:{},4160:{},4161:{},4163:{},4164:{f:x9},4165:{},4166:{},4168:{},4170:{},4171:{},4174:{},4175:{},4176:{},4177:{},4187:{},4188:{f:p9},4189:{},4191:{},4192:{},4193:{},4194:{},4195:{},4196:{},4197:{},4198:{},4199:{},4200:{},0:{f:Qv},1:{},2:{f:k9},3:{f:E9},4:{f:C9},5:{f:ex},7:{f:A9},8:{},9:{f:Gl},11:{},22:{f:jn},30:{f:Hk},31:{},32:{},33:{f:ix},36:{},37:{f:Jv},50:{f:R9},62:{},52:{},67:{},68:{f:jn},69:{},86:{},126:{},127:{f:w9},135:{},136:{},137:{},145:{},148:{},149:{},150:{},169:{},171:{},188:{},191:{},192:{},194:{},195:{},214:{f:D9},223:{},234:{},354:{},421:{},518:{f:qf},521:{f:Gl},536:{f:ax},547:{f:nx},561:{},579:{},1030:{f:qf},1033:{f:Gl},1091:{},2157:{},2163:{},2177:{},2240:{},2241:{},2242:{},2243:{},2244:{},2245:{},2246:{},2247:{},2248:{},2249:{},2250:{},2251:{},2262:{r:12},29282:{}};function Ii(e,t,n,a){var i=t;if(!isNaN(i)){var r=(n||[]).length||0,c=e.next(4);c.write_shift(2,i),c.write_shift(2,r),r>0&&G4(n)&&e.push(n)}}function px(e,t){var n=t||{},a=n.dense?[]:{};e=e.replace(//g,"");var i=e.match(/");var r=e.match(/<\/table/i),c=i.index,l=r&&r.index||e.length,f=JC(e.slice(c,l),/(:?]*>)/i,""),T=-1,p=0,m=0,g=0,S={s:{r:1e7,c:1e7},e:{r:0,c:0}},x=[];for(c=0;c/i);for(l=0;l"))>-1;)E=E.slice(O+1);for(var N=0;N")));g=A.colspan?+A.colspan:1,((m=+A.rowspan)>1||g>1)&&x.push({s:{r:T,c:p},e:{r:T+(m||1)-1,c:p+g-1}});var z=A.t||A["data-t"]||"";if(!E.length){p+=g;continue}if(E=M4(E),S.s.r>T&&(S.s.r=T),S.e.rp&&(S.s.c=p),S.e.cn||i[T].s.c>c)&&!(i[T].e.r1&&(S.rowspan=l),f>1&&(S.colspan=f),a.editable?g=''+g+"":m&&(S["data-t"]=m&&m.t||"z",m.v!=null&&(S["data-v"]=m.v),m.z!=null&&(S["data-z"]=m.z),m.l&&(m.l.Target||"#").charAt(0)!="#"&&(g=''+g+"")),S.id=(a.id||"sjs")+"-"+p,r.push(hE("td",g,S))}}var x="";return x+r.join("")+""}var DN='SheetJS Table Export',IN="";function NN(e,t){var n=e.match(/[\s\S]*?<\/table>/gi);if(!n||n.length==0)throw new Error("Invalid HTML: could not find
");if(n.length==1)return xr(px(n[0],t),t);var a=tm();return n.forEach(function(i,r){nm(a,px(i,t),"Sheet"+(r+1))}),a}function ON(e,t,n){var a=[];return a.join("")+""}function MN(e,t){var n=t||{},a=n.header!=null?n.header:DN,i=n.footer!=null?n.footer:IN,r=[a],c=Eo(e["!ref"]);n.dense=Array.isArray(e),r.push(ON(e,c,n));for(var l=c.s.r;l<=c.e.r;++l)r.push(RN(e,c,l,n));return r.push("
"+i),r.join("")}function _S(e,t,n){var a=n||{},i=0,r=0;if(a.origin!=null)if(typeof a.origin=="number")i=a.origin;else{var c=typeof a.origin=="string"?Na(a.origin):a.origin;i=c.r,r=c.c}var l=t.getElementsByTagName("tr"),f=Math.min(a.sheetRows||1e7,l.length),T={s:{r:0,c:0},e:{r:i,c:r}};if(e["!ref"]){var p=Eo(e["!ref"]);T.s.r=Math.min(T.s.r,p.s.r),T.s.c=Math.min(T.s.c,p.s.c),T.e.r=Math.max(T.e.r,p.e.r),T.e.c=Math.max(T.e.c,p.e.c),i==-1&&(T.e.r=i=p.e.r+1)}var m=[],g=0,S=e["!rows"]||(e["!rows"]=[]),x=0,y=0,w=0,C=0,k=0,E=0;for(e["!cols"]||(e["!cols"]=[]);x1||E>1)&&m.push({s:{r:y+i,c:C+r},e:{r:y+i+(k||1)-1,c:C+r+(E||1)-1}});var K={t:"s",v:A},I=B.getAttribute("data-t")||B.getAttribute("t")||"";A!=null&&(A.length==0?K.t=I||"z":a.raw||A.trim().length==0||I=="s"||(A==="TRUE"?K={t:"b",v:!0}:A==="FALSE"?K={t:"b",v:!1}:isNaN(_i(A))?isNaN(xo(A).getDate())||(K={t:"d",v:Yn(A)},a.cellDates||(K={t:"n",v:Ma(K.v)}),K.z=a.dateNF||vt[14]):K={t:"n",v:_i(A)})),K.z===void 0&&z!=null&&(K.z=z);var L="",le=B.getElementsByTagName("A");if(le&&le.length)for(var ue=0;ue=f&&(e["!fullref"]=Lt((T.e.r=l.length-x+y-1+i,T))),e}function qS(e,t){var n=t||{},a=n.dense?[]:{};return _S(a,e,t)}function jN(e,t){return xr(qS(e,t),t)}function mx(e){var t="",n=FN(e);return n&&(t=n(e).getPropertyValue("display")),t||(t=e.style&&e.style.display),t==="none"}function FN(e){return e.ownerDocument.defaultView&&typeof e.ownerDocument.defaultView.getComputedStyle=="function"?e.ownerDocument.defaultView.getComputedStyle:typeof getComputedStyle=="function"?getComputedStyle:null}function LN(e){var t=e.replace(/[\t\r\n]/g," ").trim().replace(/ +/g," ").replace(//g," ").replace(//g,function(a,i){return Array(parseInt(i,10)+1).join(" ")}).replace(/]*\/>/g," ").replace(//g,` +`),n=Ut(t.replace(/<[^>]*>/g,""));return[n]}var gx={day:["d","dd"],month:["m","mm"],year:["y","yy"],hours:["h","hh"],minutes:["m","mm"],seconds:["s","ss"],"am-pm":["A/P","AM/PM"],"day-of-week":["ddd","dddd"],era:["e","ee"],quarter:["\\Qm",'m\\"th quarter"']};function BS(e,t){var n=t||{},a=_p(e),i=[],r,c,l={name:""},f="",T=0,p,m,g={},S=[],x=n.dense?[]:{},y,w,C={value:""},k="",E=0,O=[],N=-1,B=-1,A={s:{r:1e6,c:1e7},e:{r:0,c:0}},z=0,P={},K=[],I={},L=0,le=0,ue=[],X=1,F=1,re=[],me={Names:[]},te={},Ce=["",""],ee=[],M={},Y="",Z=0,J=!1,he=!1,ge=0;for(s1.lastIndex=0,a=a.replace(//mg,"").replace(//gm,"");y=s1.exec(a);)switch(y[3]=y[3].replace(/_.*$/,"")){case"table":case"工作表":y[1]==="/"?(A.e.c>=A.s.c&&A.e.r>=A.s.r?x["!ref"]=Lt(A):x["!ref"]="A1:A1",n.sheetRows>0&&n.sheetRows<=A.e.r&&(x["!fullref"]=x["!ref"],A.e.r=n.sheetRows-1,x["!ref"]=Lt(A)),K.length&&(x["!merges"]=K),ue.length&&(x["!rows"]=ue),p.name=p.名称||p.name,typeof JSON<"u"&&JSON.stringify(p),S.push(p.name),g[p.name]=x,he=!1):y[0].charAt(y[0].length-2)!=="/"&&(p=it(y[0],!1),N=B=-1,A.s.r=A.s.c=1e7,A.e.r=A.e.c=0,x=n.dense?[]:{},K=[],ue=[],he=!0);break;case"table-row-group":y[1]==="/"?--z:++z;break;case"table-row":case"行":if(y[1]==="/"){N+=X,X=1;break}if(m=it(y[0],!1),m.行号?N=m.行号-1:N==-1&&(N=0),X=+m["number-rows-repeated"]||1,X<10)for(ge=0;ge0&&(ue[N+ge]={level:z});B=-1;break;case"covered-table-cell":y[1]!=="/"&&++B,n.sheetStubs&&(n.dense?(x[N]||(x[N]=[]),x[N][B]={t:"z"}):x[ht({r:N,c:B})]={t:"z"}),k="",O=[];break;case"table-cell":case"数据":if(y[0].charAt(y[0].length-2)==="/")++B,C=it(y[0],!1),F=parseInt(C["number-columns-repeated"]||"1",10),w={t:"z",v:null},C.formula&&n.cellFormula!=!1&&(w.f=dx(Ut(C.formula))),(C.数据类型||C["value-type"])=="string"&&(w.t="s",w.v=Ut(C["string-value"]||""),n.dense?(x[N]||(x[N]=[]),x[N][B]=w):x[ht({r:N,c:B})]=w),B+=F-1;else if(y[1]!=="/"){++B,k="",E=0,O=[],F=1;var de=X?N+X-1:N;if(B>A.e.c&&(A.e.c=B),BA.e.r&&(A.e.r=de),C=it(y[0],!1),ee=[],M={},w={t:C.数据类型||C["value-type"],v:null},n.cellFormula)if(C.formula&&(C.formula=Ut(C.formula)),C["number-matrix-columns-spanned"]&&C["number-matrix-rows-spanned"]&&(L=parseInt(C["number-matrix-rows-spanned"],10)||0,le=parseInt(C["number-matrix-columns-spanned"],10)||0,I={s:{r:N,c:B},e:{r:N+L-1,c:B+le-1}},w.F=Lt(I),re.push([I,w.F])),C.formula)w.f=dx(C.formula);else for(ge=0;ge=re[ge][0].s.r&&N<=re[ge][0].e.r&&B>=re[ge][0].s.c&&B<=re[ge][0].e.c&&(w.F=re[ge][1]);switch((C["number-columns-spanned"]||C["number-rows-spanned"])&&(L=parseInt(C["number-rows-spanned"],10)||0,le=parseInt(C["number-columns-spanned"],10)||0,I={s:{r:N,c:B},e:{r:N+L-1,c:B+le-1}},K.push(I)),C["number-columns-repeated"]&&(F=parseInt(C["number-columns-repeated"],10)),w.t){case"boolean":w.t="b",w.v=dn(C["boolean-value"]);break;case"float":w.t="n",w.v=parseFloat(C.value);break;case"percentage":w.t="n",w.v=parseFloat(C.value);break;case"currency":w.t="n",w.v=parseFloat(C.value);break;case"date":w.t="d",w.v=Yn(C["date-value"]),n.cellDates||(w.t="n",w.v=Ma(w.v)),w.z="m/d/yy";break;case"time":w.t="n",w.v=$C(C["time-value"])/86400,n.cellDates&&(w.t="d",w.v=cd(w.v)),w.z="HH:MM:SS";break;case"number":w.t="n",w.v=parseFloat(C.数据数值);break;default:if(w.t==="string"||w.t==="text"||!w.t)w.t="s",C["string-value"]!=null&&(k=Ut(C["string-value"]),O=[]);else throw new Error("Unsupported value type "+w.t)}}else{if(J=!1,w.t==="s"&&(w.v=k||"",O.length&&(w.R=O),J=E==0),te.Target&&(w.l=te),ee.length>0&&(w.c=ee,ee=[]),k&&n.cellText!==!1&&(w.w=k),J&&(w.t="z",delete w.v),(!J||n.sheetStubs)&&!(n.sheetRows&&n.sheetRows<=N))for(var fe=0;fe0;)x[N+fe][B+F]=sa(w);else for(x[ht({r:N+fe,c:B})]=w;--F>0;)x[ht({r:N+fe,c:B+F})]=sa(w);A.e.c<=B&&(A.e.c=B)}F=parseInt(C["number-columns-repeated"]||"1",10),B+=F-1,F=0,w={},k="",O=[]}te={};break;case"document":case"document-content":case"电子表格文档":case"spreadsheet":case"主体":case"scripts":case"styles":case"font-face-decls":case"master-styles":if(y[1]==="/"){if((r=i.pop())[0]!==y[3])throw"Bad state: "+r}else y[0].charAt(y[0].length-2)!=="/"&&i.push([y[3],!0]);break;case"annotation":if(y[1]==="/"){if((r=i.pop())[0]!==y[3])throw"Bad state: "+r;M.t=k,O.length&&(M.R=O),M.a=Y,ee.push(M)}else y[0].charAt(y[0].length-2)!=="/"&&i.push([y[3],!1]);Y="",Z=0,k="",E=0,O=[];break;case"creator":y[1]==="/"?Y=a.slice(Z,y.index):Z=y.index+y[0].length;break;case"meta":case"元数据":case"settings":case"config-item-set":case"config-item-map-indexed":case"config-item-map-entry":case"config-item-map-named":case"shapes":case"frame":case"text-box":case"image":case"data-pilot-tables":case"list-style":case"form":case"dde-links":case"event-listeners":case"chart":if(y[1]==="/"){if((r=i.pop())[0]!==y[3])throw"Bad state: "+r}else y[0].charAt(y[0].length-2)!=="/"&&i.push([y[3],!1]);k="",E=0,O=[];break;case"scientific-number":break;case"currency-symbol":break;case"currency-style":break;case"number-style":case"percentage-style":case"date-style":case"time-style":if(y[1]==="/"){if(P[l.name]=f,(r=i.pop())[0]!==y[3])throw"Bad state: "+r}else y[0].charAt(y[0].length-2)!=="/"&&(f="",l=it(y[0],!1),i.push([y[3],!0]));break;case"script":break;case"libraries":break;case"automatic-styles":break;case"default-style":case"page-layout":break;case"style":break;case"map":break;case"font-face":break;case"paragraph-properties":break;case"table-properties":break;case"table-column-properties":break;case"table-row-properties":break;case"table-cell-properties":break;case"number":switch(i[i.length-1][0]){case"time-style":case"date-style":c=it(y[0],!1),f+=gx[y[3]][c.style==="long"?1:0];break}break;case"fraction":break;case"day":case"month":case"year":case"era":case"day-of-week":case"week-of-year":case"quarter":case"hours":case"minutes":case"seconds":case"am-pm":switch(i[i.length-1][0]){case"time-style":case"date-style":c=it(y[0],!1),f+=gx[y[3]][c.style==="long"?1:0];break}break;case"boolean-style":break;case"boolean":break;case"text-style":break;case"text":if(y[0].slice(-2)==="/>")break;if(y[1]==="/")switch(i[i.length-1][0]){case"number-style":case"date-style":case"time-style":f+=a.slice(T,y.index);break}else T=y.index+y[0].length;break;case"named-range":c=it(y[0],!1),Ce=Bf(c["cell-range-address"]);var ye={Name:c.name,Ref:Ce[0]+"!"+Ce[1]};he&&(ye.Sheet=S.length),me.Names.push(ye);break;case"text-content":break;case"text-properties":break;case"embedded-text":break;case"body":case"电子表格":break;case"forms":break;case"table-column":break;case"table-header-rows":break;case"table-rows":break;case"table-column-group":break;case"table-header-columns":break;case"table-columns":break;case"null-date":break;case"graphic-properties":break;case"calculation-settings":break;case"named-expressions":break;case"label-range":break;case"label-ranges":break;case"named-expression":break;case"sort":break;case"sort-by":break;case"sort-groups":break;case"tab":break;case"line-break":break;case"span":break;case"p":case"文本串":if(["master-styles"].indexOf(i[i.length-1][0])>-1)break;if(y[1]==="/"&&(!C||!C["string-value"])){var qe=LN(a.slice(E,y.index));k=(k.length>0?k+` +`:"")+qe[0]}else it(y[0],!1),E=y.index+y[0].length;break;case"s":break;case"database-range":if(y[1]==="/")break;try{Ce=Bf(it(y[0])["target-range-address"]),g[Ce[0]]["!autofilter"]={ref:Ce[1]}}catch{}break;case"date":break;case"object":break;case"title":case"标题":break;case"desc":break;case"binary-data":break;case"table-source":break;case"scenario":break;case"iteration":break;case"content-validations":break;case"content-validation":break;case"help-message":break;case"error-message":break;case"database-ranges":break;case"filter":break;case"filter-and":break;case"filter-or":break;case"filter-condition":break;case"list-level-style-bullet":break;case"list-level-style-number":break;case"list-level-properties":break;case"sender-firstname":case"sender-lastname":case"sender-initials":case"sender-title":case"sender-position":case"sender-email":case"sender-phone-private":case"sender-fax":case"sender-company":case"sender-phone-work":case"sender-street":case"sender-city":case"sender-postal-code":case"sender-country":case"sender-state-or-province":case"author-name":case"author-initials":case"chapter":case"file-name":case"template-name":case"sheet-name":break;case"event-listener":break;case"initial-creator":case"creation-date":case"print-date":case"generator":case"document-statistic":case"user-defined":case"editing-duration":case"editing-cycles":break;case"config-item":break;case"page-number":break;case"page-count":break;case"time":break;case"cell-range-source":break;case"detective":break;case"operation":break;case"highlighted-range":break;case"data-pilot-table":case"source-cell-range":case"source-service":case"data-pilot-field":case"data-pilot-level":case"data-pilot-subtotals":case"data-pilot-subtotal":case"data-pilot-members":case"data-pilot-member":case"data-pilot-display-info":case"data-pilot-sort-info":case"data-pilot-layout-info":case"data-pilot-field-reference":case"data-pilot-groups":case"data-pilot-group":case"data-pilot-group-member":break;case"rect":break;case"dde-connection-decls":case"dde-connection-decl":case"dde-link":case"dde-source":break;case"properties":break;case"property":break;case"a":if(y[1]!=="/"){if(te=it(y[0],!1),!te.href)break;te.Target=Ut(te.href),delete te.href,te.Target.charAt(0)=="#"&&te.Target.indexOf(".")>-1?(Ce=Bf(te.Target.slice(1)),te.Target="#"+Ce[0]+"!"+Ce[1]):te.Target.match(/^\.\.[\\\/]/)&&(te.Target=te.Target.slice(3))}break;case"table-protection":break;case"data-pilot-grand-total":break;case"office-document-common-attrs":break;default:switch(y[2]){case"dc:":case"calcext:":case"loext:":case"ooo:":case"chartooo:":case"draw:":case"style:":case"chart:":case"form:":case"uof:":case"表:":case"字:":break;default:if(n.WTF)throw new Error(y)}}var ae={Sheets:g,SheetNames:S,Workbook:me};return n.bookSheets&&delete ae.Sheets,ae}function vx(e,t){t=t||{},hi(e,"META-INF/manifest.xml")&&JE(Mn(e,"META-INF/manifest.xml"),t);var n=Ja(e,"content.xml");if(!n)throw new Error("Missing content.xml in ODS / UOF file");var a=BS(rn(n),t);return hi(e,"meta.xml")&&(a.Props=Q4(Mn(e,"meta.xml"))),a}function xx(e,t){return BS(e,t)}function Zp(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function Gh(e){return typeof TextDecoder<"u"?new TextDecoder().decode(e):rn(d0(e))}function Xh(e){var t=e.reduce(function(i,r){return i+r.length},0),n=new Uint8Array(t),a=0;return e.forEach(function(i){n.set(i,a),a+=i.length}),n}function yx(e){return e-=e>>1&1431655765,e=(e&858993459)+(e>>2&858993459),(e+(e>>4)&252645135)*16843009>>>24}function PN(e,t){for(var n=(e[t+15]&127)<<7|e[t+14]>>1,a=e[t+14]&1,i=t+13;i>=t;--i)a=a*256+e[i];return(e[t+15]&128?-a:a)*Math.pow(10,n-6176)}function l1(e,t){var n=t?t[0]:0,a=e[n]&127;e:if(e[n++]>=128&&(a|=(e[n]&127)<<7,e[n++]<128||(a|=(e[n]&127)<<14,e[n++]<128)||(a|=(e[n]&127)<<21,e[n++]<128)||(a+=(e[n]&127)*Math.pow(2,28),++n,e[n++]<128)||(a+=(e[n]&127)*Math.pow(2,35),++n,e[n++]<128)||(a+=(e[n]&127)*Math.pow(2,42),++n,e[n++]<128)))break e;return t&&(t[0]=n),a}function zn(e){var t=0,n=e[t]&127;e:if(e[t++]>=128){if(n|=(e[t]&127)<<7,e[t++]<128||(n|=(e[t]&127)<<14,e[t++]<128)||(n|=(e[t]&127)<<21,e[t++]<128))break e;n|=(e[t]&127)<<28}return n}function ma(e){for(var t=[],n=[0];n[0]=128;);l=e.slice(f,n[0])}break;case 5:c=4,l=e.slice(n[0],n[0]+c),n[0]+=c;break;case 1:c=8,l=e.slice(n[0],n[0]+c),n[0]+=c;break;case 2:c=l1(e,n),l=e.slice(n[0],n[0]+c),n[0]+=c;break;default:throw new Error("PB Type ".concat(r," for Field ").concat(i," at offset ").concat(a))}var T={data:l,type:r};t[i]==null?t[i]=[T]:t[i].push(T)}return t}function Jp(e,t){return e?.map(function(n){return t(n.data)})||[]}function _N(e){for(var t,n=[],a=[0];a[0]>>0>0),n.push(c)}return n}function qN(e,t){if(e!=0)throw new Error("Unexpected Snappy chunk type ".concat(e));for(var n=[0],a=l1(t,n),i=[];n[0]>2;if(c<60)++c;else{var l=c-59;c=t[n[0]],l>1&&(c|=t[n[0]+1]<<8),l>2&&(c|=t[n[0]+2]<<16),l>3&&(c|=t[n[0]+3]<<24),c>>>=0,c++,n[0]+=l}i.push(t.slice(n[0],n[0]+c)),n[0]+=c;continue}else{var f=0,T=0;if(r==1?(T=(t[n[0]]>>2&7)+4,f=(t[n[0]++]&224)<<3,f|=t[n[0]++]):(T=(t[n[0]++]>>2)+1,r==2?(f=t[n[0]]|t[n[0]+1]<<8,n[0]+=2):(f=(t[n[0]]|t[n[0]+1]<<8|t[n[0]+2]<<16|t[n[0]+3]<<24)>>>0,n[0]+=4)),i=[Xh(i)],f==0)throw new Error("Invalid offset 0");if(f>i[0].length)throw new Error("Invalid offset beyond length");if(T>=f)for(i.push(i[0].slice(-f)),T-=f;T>=i[i.length-1].length;)i.push(i[i.length-1]),T-=i[i.length-1].length;i.push(i[0].slice(-f,-f+T))}}var p=Xh(i);if(p.length!=a)throw new Error("Unexpected length: ".concat(p.length," != ").concat(a));return p}function BN(e){for(var t=[],n=0;n1?12:8)+yx(r&(a>1?3470:398))*4,l=-1,f=-1,T=NaN,p=new Date(2001,0,1);r&512&&(l=i.getUint32(c,!0),c+=4),c+=yx(r&(a>1?12288:4096))*4,r&16&&(f=i.getUint32(c,!0),c+=4),r&32&&(T=i.getFloat64(c,!0),c+=8),r&64&&(p.setTime(p.getTime()+i.getFloat64(c,!0)*1e3),c+=8);var m;switch(e[2]){case 0:break;case 2:m={t:"n",v:T};break;case 3:m={t:"s",v:t[f]};break;case 5:m={t:"d",v:p};break;case 6:m={t:"b",v:T>0};break;case 7:m={t:"n",v:T/86400};break;case 8:m={t:"e",v:0};break;case 9:if(l>-1)m={t:"s",v:n[l]};else if(f>-1)m={t:"s",v:t[f]};else if(!isNaN(T))m={t:"n",v:T};else throw new Error("Unsupported cell type ".concat(e.slice(0,4)));break;default:throw new Error("Unsupported cell type ".concat(e.slice(0,4)))}return m}function zN(e,t,n){var a=Zp(e),i=a.getUint32(8,!0),r=12,c=-1,l=-1,f=NaN,T=NaN,p=new Date(2001,0,1);i&1&&(f=PN(e,r),r+=16),i&2&&(T=a.getFloat64(r,!0),r+=8),i&4&&(p.setTime(p.getTime()+a.getFloat64(r,!0)*1e3),r+=8),i&8&&(l=a.getUint32(r,!0),r+=4),i&16&&(c=a.getUint32(r,!0),r+=4);var m;switch(e[1]){case 0:break;case 2:m={t:"n",v:f};break;case 3:m={t:"s",v:t[l]};break;case 5:m={t:"d",v:p};break;case 6:m={t:"b",v:T>0};break;case 7:m={t:"n",v:T/86400};break;case 8:m={t:"e",v:0};break;case 9:if(c>-1)m={t:"s",v:n[c]};else throw new Error("Unsupported cell type ".concat(e[1]," : ").concat(i&31," : ").concat(e.slice(0,4)));break;case 10:m={t:"n",v:f};break;default:throw new Error("Unsupported cell type ".concat(e[1]," : ").concat(i&31," : ").concat(e.slice(0,4)))}return m}function WN(e,t,n){switch(e[0]){case 0:case 1:case 2:case 3:return UN(e,t,n,e[0]);case 5:return zN(e,t,n);default:throw new Error("Unsupported payload version ".concat(e[0]))}}function fr(e){var t=ma(e);return l1(t[1][0].data)}function Sx(e,t){var n=ma(t.data),a=zn(n[1][0].data),i=n[3],r=[];return(i||[]).forEach(function(c){var l=ma(c.data),f=zn(l[1][0].data)>>>0;switch(a){case 1:r[f]=Gh(l[3][0].data);break;case 8:{var T=e[fr(l[9][0].data)][0],p=ma(T.data),m=e[fr(p[1][0].data)][0],g=zn(m.meta[1][0].data);if(g!=2001)throw new Error("2000 unexpected reference to ".concat(g));var S=ma(m.data);r[f]=S[3].map(function(x){return Gh(x.data)}).join("")}break}}),r}function VN(e,t){var n,a,i,r,c,l,f,T,p,m,g,S,x,y,w=ma(e),C=zn(w[1][0].data)>>>0,k=zn(w[2][0].data)>>>0,E=((a=(n=w[8])==null?void 0:n[0])==null?void 0:a.data)&&zn(w[8][0].data)>0||!1,O,N;if((r=(i=w[7])==null?void 0:i[0])!=null&&r.data&&t!=0)O=(l=(c=w[7])==null?void 0:c[0])==null?void 0:l.data,N=(T=(f=w[6])==null?void 0:f[0])==null?void 0:T.data;else if((m=(p=w[4])==null?void 0:p[0])!=null&&m.data&&t!=1)O=(S=(g=w[4])==null?void 0:g[0])==null?void 0:S.data,N=(y=(x=w[3])==null?void 0:x[0])==null?void 0:y.data;else throw"NUMBERS Tile missing ".concat(t," cell storage");for(var B=E?4:1,A=Zp(O),z=[],P=0;P=1&&(I[z[z.length-1][0]]=N.subarray(z[z.length-1][1]*B)),{R:C,cells:I}}function HN(e,t){var n,a=ma(t.data),i=(n=a?.[7])!=null&&n[0]?zn(a[7][0].data)>>>0>0?1:0:-1,r=Jp(a[5],function(c){return VN(c,i)});return{nrows:zn(a[4][0].data)>>>0,data:r.reduce(function(c,l){return c[l.R]||(c[l.R]=[]),l.cells.forEach(function(f,T){if(c[l.R][T])throw new Error("Duplicate cell r=".concat(l.R," c=").concat(T));c[l.R][T]=f}),c},[])}}function GN(e,t,n){var a,i=ma(t.data),r={s:{r:0,c:0},e:{r:0,c:0}};if(r.e.r=(zn(i[6][0].data)>>>0)-1,r.e.r<0)throw new Error("Invalid row varint ".concat(i[6][0].data));if(r.e.c=(zn(i[7][0].data)>>>0)-1,r.e.c<0)throw new Error("Invalid col varint ".concat(i[7][0].data));n["!ref"]=Lt(r);var c=ma(i[4][0].data),l=Sx(e,e[fr(c[4][0].data)][0]),f=(a=c[17])!=null&&a[0]?Sx(e,e[fr(c[17][0].data)][0]):[],T=ma(c[3][0].data),p=0;T[1].forEach(function(m){var g=ma(m.data),S=e[fr(g[2][0].data)][0],x=zn(S.meta[1][0].data);if(x!=6002)throw new Error("6001 unexpected reference to ".concat(x));var y=HN(e,S);y.data.forEach(function(w,C){w.forEach(function(k,E){var O=ht({r:p+C,c:E}),N=WN(k,l,f);N&&(n[O]=N)})}),p+=y.nrows})}function XN(e,t){var n=ma(t.data),a={"!ref":"A1"},i=e[fr(n[2][0].data)],r=zn(i[0].meta[1][0].data);if(r!=6001)throw new Error("6000 unexpected reference to ".concat(r));return GN(e,i[0],a),a}function KN(e,t){var n,a=ma(t.data),i={name:(n=a[1])!=null&&n[0]?Gh(a[1][0].data):"",sheets:[]},r=Jp(a[2],fr);return r.forEach(function(c){e[c].forEach(function(l){var f=zn(l.meta[1][0].data);f==6e3&&i.sheets.push(XN(e,l))})}),i}function $N(e,t){var n=tm(),a=ma(t.data),i=Jp(a[1],fr);if(i.forEach(function(r){e[r].forEach(function(c){var l=zn(c.meta[1][0].data);if(l==2){var f=KN(e,c);f.sheets.forEach(function(T,p){nm(n,T,p==0?f.name:f.name+"_"+p,!0)})}})}),n.SheetNames.length==0)throw new Error("Empty NUMBERS file");return n}function zf(e){var t,n,a,i,r={},c=[];if(e.FullPaths.forEach(function(f){if(f.match(/\.iwpv2/))throw new Error("Unsupported password protection")}),e.FileIndex.forEach(function(f){if(f.name.match(/\.iwa$/)){var T;try{T=BN(f.content)}catch(m){return console.log("?? "+f.content.length+" "+(m.message||m))}var p;try{p=_N(T)}catch(m){return console.log("## "+(m.message||m))}p.forEach(function(m){r[m.id]=m.messages,c.push(m.id)})}}),!c.length)throw new Error("File has no messages");var l=((i=(a=(n=(t=r?.[1])==null?void 0:t[0])==null?void 0:n.meta)==null?void 0:a[1])==null?void 0:i[0].data)&&zn(r[1][0].meta[1][0].data)==1&&r[1][0];if(l||c.forEach(function(f){r[f].forEach(function(T){var p=zn(T.meta[1][0].data)>>>0;if(p==1)if(!l)l=T;else throw new Error("Document has multiple roots")})}),!l)throw new Error("Cannot find Document root");return $N(r,l)}function YN(e){return function(n){for(var a=0;a!=e.length;++a){var i=e[a];n[i[0]]===void 0&&(n[i[0]]=i[1]),i[2]==="n"&&(n[i[0]]=Number(n[i[0]]))}}}function Qp(e){YN([["cellNF",!1],["cellHTML",!0],["cellFormula",!0],["cellStyles",!1],["cellText",!0],["cellDates",!1],["sheetStubs",!1],["sheetRows",0,"n"],["bookDeps",!1],["bookSheets",!1],["bookProps",!1],["bookFiles",!1],["bookVBA",!1],["password",""],["WTF",!1]])(e)}function ZN(e){return co.WS.indexOf(e)>-1?"sheet":e==co.CS?"chart":e==co.DS?"dialog":e==co.MS?"macro":e&&e.length?e:"sheet"}function JN(e,t){if(!e)return 0;try{e=t.map(function(a){return a.id||(a.id=a.strRelID),[a.name,e["!id"][a.id].Target,ZN(e["!id"][a.id].Type)]})}catch{return null}return!e||e.length===0?null:e}function QN(e,t,n,a,i,r,c,l,f,T,p,m){try{r[a]=Gc(Ja(e,n,!0),t);var g=Mn(e,t),S;switch(l){case"sheet":S=sN(g,t,i,f,r[a],T,p,m);break;case"chart":if(S=rN(g,t,i,f,r[a],T,p,m),!S||!S["!drawel"])break;var x=jc(S["!drawel"].Target,t),y=Uh(x),w=iR(Ja(e,x,!0),Gc(Ja(e,y,!0),x)),C=jc(w,x),k=Uh(C);S=zI(Ja(e,C,!0),C,f,Gc(Ja(e,k,!0),C),T,S);break;case"macro":S=oN(g,t,i,f,r[a],T,p,m);break;case"dialog":S=cN(g,t,i,f,r[a],T,p,m);break;default:throw new Error("Unrecognized sheet type "+l)}c[a]=S;var E=[];r&&r[a]&&ns(r[a]).forEach(function(O){var N="";if(r[a][O].Type==co.CMNT){N=jc(r[a][O].Target,t);var B=TN(Mn(e,N,!0),N,f);if(!B||!B.length)return;rx(S,B,!1)}r[a][O].Type==co.TCMNT&&(N=jc(r[a][O].Target,t),E=E.concat(rR(Mn(e,N,!0),f)))}),E&&E.length&&rx(S,E,!0,f.people||[])}catch(O){if(f.WTF)throw O}}function di(e){return e.charAt(0)=="/"?e.slice(1):e}function eO(e,t){if(C4(),t=t||{},Qp(t),hi(e,"META-INF/manifest.xml")||hi(e,"objectdata.xml"))return vx(e,t);if(hi(e,"Index/Document.iwa")){if(typeof Uint8Array>"u")throw new Error("NUMBERS file parsing requires Uint8Array support");if(typeof zf<"u"){if(e.FileIndex)return zf(e);var n=Ft.utils.cfb_new();return Mv(e).forEach(function(ue){tE(n,ue,eE(e,ue))}),zf(n)}throw new Error("Unsupported NUMBERS file")}if(!hi(e,"[Content_Types].xml"))throw hi(e,"index.xml.gz")?new Error("Unsupported NUMBERS 08 file"):hi(e,"index.xml")?new Error("Unsupported NUMBERS 09 file"):new Error("Unsupported ZIP file");var a=Mv(e),i=YE(Ja(e,"[Content_Types].xml")),r=!1,c,l;if(i.workbooks.length===0&&(l="xl/workbook.xml",Mn(e,l,!0)&&i.workbooks.push(l)),i.workbooks.length===0){if(l="xl/workbook.bin",!Mn(e,l,!0))throw new Error("Could not find workbook");i.workbooks.push(l),r=!0}i.workbooks[0].slice(-3)=="bin"&&(r=!0);var f={},T={};if(!t.bookSheets&&!t.bookProps){if($c=[],i.sst)try{$c=dN(Mn(e,di(i.sst)),i.sst,t)}catch(ue){if(t.WTF)throw ue}t.cellStyles&&i.themes.length&&(f=uN(Ja(e,i.themes[0].replace(/^\//,""),!0)||"",i.themes[0],t)),i.style&&(T=lN(Mn(e,di(i.style)),i.style,f,t))}i.links.map(function(ue){try{var X=Gc(Ja(e,Uh(di(ue))),ue);return hN(Mn(e,di(ue)),X,ue,t)}catch{}});var p=iN(Mn(e,di(i.workbooks[0])),i.workbooks[0],t),m={},g="";i.coreprops.length&&(g=Mn(e,di(i.coreprops[0]),!0),g&&(m=Q4(g)),i.extprops.length!==0&&(g=Mn(e,di(i.extprops[0]),!0),g&&tk(g,m,t)));var S={};(!t.bookSheets||t.bookProps)&&i.custprops.length!==0&&(g=Ja(e,di(i.custprops[0]),!0),g&&(S=ak(g,t)));var x={};if((t.bookSheets||t.bookProps)&&(p.Sheets?c=p.Sheets.map(function(X){return X.name}):m.Worksheets&&m.SheetNames.length>0&&(c=m.SheetNames),t.bookProps&&(x.Props=m,x.Custprops=S),t.bookSheets&&typeof c<"u"&&(x.SheetNames=c),t.bookSheets?x.SheetNames:t.bookProps))return x;c={};var y={};t.bookDeps&&i.calcchain&&(y=fN(Mn(e,di(i.calcchain)),i.calcchain));var w=0,C={},k,E;{var O=p.Sheets;m.Worksheets=O.length,m.SheetNames=[];for(var N=0;N!=O.length;++N)m.SheetNames[N]=O[N].name}var B=r?"bin":"xml",A=i.workbooks[0].lastIndexOf("/"),z=(i.workbooks[0].slice(0,A+1)+"_rels/"+i.workbooks[0].slice(A+1)+".rels").replace(/^\//,"");hi(e,z)||(z="xl/_rels/workbook."+B+".rels");var P=Gc(Ja(e,z,!0),z.replace(/_rels.*/,"s5s"));(i.metadata||[]).length>=1&&(t.xlmeta=pN(Mn(e,di(i.metadata[0])),i.metadata[0],t)),(i.people||[]).length>=1&&(t.people=oR(Mn(e,di(i.people[0])),t)),P&&(P=JN(P,p.Sheets));var K=Mn(e,"xl/worksheets/sheet.xml",!0)?1:0;e:for(w=0;w!=m.Worksheets;++w){var I="sheet";if(P&&P[w]?(k="xl/"+P[w][1].replace(/[\/]?xl\//,""),hi(e,k)||(k=P[w][1]),hi(e,k)||(k=z.replace(/_rels\/.*$/,"")+P[w][1]),I=P[w][2]):(k="xl/worksheets/sheet"+(w+1-K)+"."+B,k=k.replace(/sheet0\./,"sheet.")),E=k.replace(/^(.*)(\/)([^\/]*)$/,"$1/_rels/$3.rels"),t&&t.sheets!=null)switch(typeof t.sheets){case"number":if(w!=t.sheets)continue e;break;case"string":if(m.SheetNames[w].toLowerCase()!=t.sheets.toLowerCase())continue e;break;default:if(Array.isArray&&Array.isArray(t.sheets)){for(var L=!1,le=0;le!=t.sheets.length;++le)typeof t.sheets[le]=="number"&&t.sheets[le]==w&&(L=1),typeof t.sheets[le]=="string"&&t.sheets[le].toLowerCase()==m.SheetNames[w].toLowerCase()&&(L=1);if(!L)continue e}}QN(e,k,E,m.SheetNames[w],w,C,c,I,t,p,f,T)}return x={Directory:i,Workbook:p,Props:m,Custprops:S,Deps:y,Sheets:c,SheetNames:m.SheetNames,Strings:$c,Styles:T,Themes:f,SSF:sa(vt)},t&&t.bookFiles&&(e.files?(x.keys=a,x.files=e.files):(x.keys=[],x.files={},e.FullPaths.forEach(function(ue,X){ue=ue.replace(/^Root Entry[\/]/,""),x.keys.push(ue),x.files[ue]=e.FileIndex[X]}))),t&&t.bookVBA&&(i.vba.length>0?x.vbaraw=Mn(e,di(i.vba[0]),!0):i.defaults&&i.defaults.bin===dR&&(x.vbaraw=Mn(e,"xl/vbaProject.bin",!0))),x}function tO(e,t){var n=t||{},a="Workbook",i=Ft.find(e,a);try{if(a="/!DataSpaces/Version",i=Ft.find(e,a),!i||!i.content)throw new Error("ECMA-376 Encrypted file missing "+a);if(X9(i.content),a="/!DataSpaces/DataSpaceMap",i=Ft.find(e,a),!i||!i.content)throw new Error("ECMA-376 Encrypted file missing "+a);var r=$9(i.content);if(r.length!==1||r[0].comps.length!==1||r[0].comps[0].t!==0||r[0].name!=="StrongEncryptionDataSpace"||r[0].comps[0].v!=="EncryptedPackage")throw new Error("ECMA-376 Encrypted file bad "+a);if(a="/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace",i=Ft.find(e,a),!i||!i.content)throw new Error("ECMA-376 Encrypted file missing "+a);var c=Y9(i.content);if(c.length!=1||c[0]!="StrongEncryptionTransform")throw new Error("ECMA-376 Encrypted file bad "+a);if(a="/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary",i=Ft.find(e,a),!i||!i.content)throw new Error("ECMA-376 Encrypted file missing "+a);J9(i.content)}catch{}if(a="/EncryptionInfo",i=Ft.find(e,a),!i||!i.content)throw new Error("ECMA-376 Encrypted file missing "+a);var l=Q9(i.content);if(a="/EncryptedPackage",i=Ft.find(e,a),!i||!i.content)throw new Error("ECMA-376 Encrypted file missing "+a);if(l[0]==4&&typeof decrypt_agile<"u")return decrypt_agile(l[1],i.content,n.password||"",n);if(l[0]==2&&typeof decrypt_std76<"u")return decrypt_std76(l[1],i.content,n.password||"",n);throw new Error("File is password-protected")}function em(e,t){var n="";switch((t||{}).type||"base64"){case"buffer":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];case"base64":n=Qa(e.slice(0,12));break;case"binary":n=e;break;case"array":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];default:throw new Error("Unrecognized type "+(t&&t.type||"undefined"))}return[n.charCodeAt(0),n.charCodeAt(1),n.charCodeAt(2),n.charCodeAt(3),n.charCodeAt(4),n.charCodeAt(5),n.charCodeAt(6),n.charCodeAt(7)]}function nO(e,t){return Ft.find(e,"EncryptedPackage")?tO(e,t):PS(e,t)}function aO(e,t){var n,a=e,i=t||{};return i.type||(i.type=Mt&&Buffer.isBuffer(e)?"buffer":"base64"),n=I4(a,i),eO(n,i)}function US(e,t){var n=0;e:for(;n=2&&i[3]===0||i[2]===0&&(i[3]===8||i[3]===9)))return Kc.to_workbook(a,n);break;case 3:case 131:case 139:case 140:return sx.to_workbook(a,n);case 123:if(i[1]===92&&i[2]===114&&i[3]===116)return dA.to_workbook(a,n);break;case 10:case 13:case 32:return iO(a,n);case 137:if(i[1]===80&&i[2]===78&&i[3]===71)throw new Error("PNG Image File is not a spreadsheet");break}return I9.indexOf(i[0])>-1&&i[2]<=12&&i[3]<=31?sx.to_workbook(a,n):Wf(e,a,n,r)}function oO(e,t,n,a,i,r,c,l){var f=ra(n),T=l.defval,p=l.raw||!Object.prototype.hasOwnProperty.call(l,"raw"),m=!0,g=i===1?[]:{};if(i!==1)if(Object.defineProperty)try{Object.defineProperty(g,"__rowNum__",{value:n,enumerable:!1})}catch{g.__rowNum__=n}else g.__rowNum__=n;if(!c||e[n])for(var S=t.s.c;S<=t.e.c;++S){var x=c?e[n][S]:e[a[S]+f];if(x===void 0||x.t===void 0){if(T===void 0)continue;r[S]!=null&&(g[r[S]]=T);continue}var y=x.v;switch(x.t){case"z":if(y==null)break;continue;case"e":y=y==0?null:void 0;break;case"s":case"d":case"b":case"n":break;default:throw new Error("unrecognized type "+x.t)}if(r[S]!=null){if(y==null)if(x.t=="e"&&y===null)g[r[S]]=null;else if(T!==void 0)g[r[S]]=T;else if(p&&y===null)g[r[S]]=null;else continue;else g[r[S]]=p&&(x.t!=="n"||x.t==="n"&&l.rawNumbers!==!1)?y:Ms(x,y,l);y!=null&&(m=!1)}}return{row:g,isempty:m}}function $h(e,t){if(e==null||e["!ref"]==null)return[];var n={t:"n",v:0},a=0,i=1,r=[],c=0,l="",f={s:{r:0,c:0},e:{r:0,c:0}},T=t||{},p=T.range!=null?T.range:e["!ref"];switch(T.header===1?a=1:T.header==="A"?a=2:Array.isArray(T.header)?a=3:T.header==null&&(a=0),typeof p){case"string":f=xn(p);break;case"number":f=xn(e["!ref"]),f.s.r=p;break;default:f=p}a>0&&(i=0);var m=ra(f.s.r),g=[],S=[],x=0,y=0,w=Array.isArray(e),C=f.s.r,k=0,E={};w&&!e[C]&&(e[C]=[]);var O=T.skipHidden&&e["!cols"]||[],N=T.skipHidden&&e["!rows"]||[];for(k=f.s.c;k<=f.e.c;++k)if(!(O[k]||{}).hidden)switch(g[k]=Un(k),n=w?e[C][k]:e[g[k]+m],a){case 1:r[k]=k-f.s.c;break;case 2:r[k]=g[k];break;case 3:r[k]=T.header[k-f.s.c];break;default:if(n==null&&(n={w:"__EMPTY",t:"s"}),l=c=Ms(n,null,T),y=E[c]||0,!y)E[c]=1;else{do l=c+"_"+y++;while(E[l]);E[c]=y,E[l]=1}r[k]=l}for(C=f.s.r+i;C<=f.e.r;++C)if(!(N[C]||{}).hidden){var B=oO(e,f,C,g,a,r,w,T);(B.isempty===!1||(a===1?T.blankrows!==!1:T.blankrows))&&(S[x++]=B.row)}return S.length=x,S}var bx=/"/g;function cO(e,t,n,a,i,r,c,l){for(var f=!0,T=[],p="",m=ra(n),g=t.s.c;g<=t.e.c;++g)if(a[g]){var S=l.dense?(e[n]||[])[g]:e[a[g]+m];if(S==null)p="";else if(S.v!=null){f=!1,p=""+(l.rawNumbers&&S.t=="n"?S.v:Ms(S,null,l));for(var x=0,y=0;x!==p.length;++x)if((y=p.charCodeAt(x))===i||y===r||y===34||l.forceQuotes){p='"'+p.replace(bx,'""')+'"';break}p=="ID"&&(p='"ID"')}else S.f!=null&&!S.F?(f=!1,p="="+S.f,p.indexOf(",")>=0&&(p='"'+p.replace(bx,'""')+'"')):p="";T.push(p)}return l.blankrows===!1&&f?null:T.join(c)}function zS(e,t){var n=[],a=t??{};if(e==null||e["!ref"]==null)return"";var i=xn(e["!ref"]),r=a.FS!==void 0?a.FS:",",c=r.charCodeAt(0),l=a.RS!==void 0?a.RS:` +`,f=l.charCodeAt(0),T=new RegExp((r=="|"?"\\|":r)+"+$"),p="",m=[];a.dense=Array.isArray(e);for(var g=a.skipHidden&&e["!cols"]||[],S=a.skipHidden&&e["!rows"]||[],x=i.s.c;x<=i.e.c;++x)(g[x]||{}).hidden||(m[x]=Un(x));for(var y=0,w=i.s.r;w<=i.e.r;++w)(S[w]||{}).hidden||(p=cO(e,i,w,m,c,f,r,a),p!=null&&(a.strip&&(p=p.replace(T,"")),(p||a.blankrows!==!1)&&n.push((y++?l:"")+p)));return delete a.dense,n.join("")}function lO(e,t){t||(t={}),t.FS=" ",t.RS=` +`;var n=zS(e,t);return n}function uO(e){var t="",n,a="";if(e==null||e["!ref"]==null)return[];var i=xn(e["!ref"]),r="",c=[],l,f=[],T=Array.isArray(e);for(l=i.s.c;l<=i.e.c;++l)c[l]=Un(l);for(var p=i.s.r;p<=i.e.r;++p)for(r=ra(p),l=i.s.c;l<=i.e.c;++l)if(t=c[l]+r,n=T?(e[p]||[])[l]:e[t],a="",n!==void 0){if(n.F!=null){if(t=n.F,!n.f)continue;a=n.f,t.indexOf(":")==-1&&(t=t+":"+t)}if(n.f!=null)a=n.f;else{if(n.t=="z")continue;if(n.t=="n"&&n.v!=null)a=""+n.v;else if(n.t=="b")a=n.v?"TRUE":"FALSE";else if(n.w!==void 0)a="'"+n.w;else{if(n.v===void 0)continue;n.t=="s"?a="'"+n.v:a=""+n.v}}f[f.length]=t+"="+a}return f}function WS(e,t,n){var a=n||{},i=+!a.skipHeader,r=e||{},c=0,l=0;if(r&&a.origin!=null)if(typeof a.origin=="number")c=a.origin;else{var f=typeof a.origin=="string"?Na(a.origin):a.origin;c=f.r,l=f.c}var T,p={s:{c:0,r:0},e:{c:l,r:c+t.length-1+i}};if(r["!ref"]){var m=xn(r["!ref"]);p.e.c=Math.max(p.e.c,m.e.c),p.e.r=Math.max(p.e.r,m.e.r),c==-1&&(c=m.e.r+1,p.e.r=c+t.length-1+i)}else c==-1&&(c=0,p.e.r=t.length-1+i);var g=a.header||[],S=0;t.forEach(function(y,w){ns(y).forEach(function(C){(S=g.indexOf(C))==-1&&(g[S=g.length]=C);var k=y[C],E="z",O="",N=ht({c:l+S,r:c+w+i});T=u1(r,N),k&&typeof k=="object"&&!(k instanceof Date)?r[N]=k:(typeof k=="number"?E="n":typeof k=="boolean"?E="b":typeof k=="string"?E="s":k instanceof Date?(E="d",a.cellDates||(E="n",k=Ma(k)),O=a.dateNF||vt[14]):k===null&&a.nullError&&(E="e",k=0),T?(T.t=E,T.v=k,delete T.w,delete T.R,O&&(T.z=O)):r[N]=T={t:E,v:k},O&&(T.z=O))})}),p.e.c=Math.max(p.e.c,l+g.length-1);var x=ra(c);if(i)for(S=0;S=0&&e.SheetNames.length>t)return t;throw new Error("Cannot find sheet # "+t)}else if(typeof t=="string"){var n=e.SheetNames.indexOf(t);if(n>-1)return n;throw new Error("Cannot find sheet name |"+t+"|")}else throw new Error("Cannot find sheet |"+t+"|")}function tm(){return{SheetNames:[],Sheets:{}}}function nm(e,t,n,a){var i=1;if(!n)for(;i<=65535&&e.SheetNames.indexOf(n="Sheet"+i)!=-1;++i,n=void 0);if(!n||e.SheetNames.length>=65535)throw new Error("Too many worksheets");if(a&&e.SheetNames.indexOf(n)>=0){var r=n.match(/(^.*?)(\d+)$/);i=r&&+r[2]||0;var c=r&&r[1]||n;for(++i;i<=65535&&e.SheetNames.indexOf(n=c+i)!=-1;++i);}if(YI(n),e.SheetNames.indexOf(n)>=0)throw new Error("Worksheet with name |"+n+"| already exists!");return e.SheetNames.push(n),e.Sheets[n]=t,n}function fO(e,t,n){e.Workbook||(e.Workbook={}),e.Workbook.Sheets||(e.Workbook.Sheets=[]);var a=TO(e,t);switch(e.Workbook.Sheets[a]||(e.Workbook.Sheets[a]={}),n){case 0:case 1:case 2:break;default:throw new Error("Bad sheet visibility setting "+n)}e.Workbook.Sheets[a].Hidden=n}function hO(e,t){return e.z=t,e}function VS(e,t,n){return t?(e.l={Target:t},n&&(e.l.Tooltip=n)):delete e.l,e}function pO(e,t,n){return VS(e,"#"+t,n)}function mO(e,t,n){e.c||(e.c=[]),e.c.push({t,a:n||"SheetJS"})}function gO(e,t,n,a){for(var i=typeof t!="string"?t:xn(t),r=typeof t=="string"?t:Lt(t),c=i.s.r;c<=i.e.r;++c)for(var l=i.s.c;l<=i.e.c;++l){var f=u1(e,c,l);f.t="n",f.F=r,delete f.v,c==i.s.r&&l==i.s.c&&(f.f=n,a&&(f.D=!0))}return e}var pu={encode_col:Un,encode_row:ra,encode_cell:ht,encode_range:Lt,decode_col:Up,decode_row:Bp,split_cell:DE,decode_cell:Na,decode_range:Eo,format_cell:Ms,sheet_add_aoa:K4,sheet_add_json:WS,sheet_add_dom:_S,aoa_to_sheet:ko,json_to_sheet:dO,table_to_sheet:qS,table_to_book:jN,sheet_to_csv:zS,sheet_to_txt:lO,sheet_to_json:$h,sheet_to_html:MN,sheet_to_formulae:uO,sheet_to_row_object_array:$h,sheet_get_cell:u1,book_new:tm,book_append_sheet:nm,book_set_sheet_visibility:fO,cell_set_number_format:hO,cell_set_hyperlink:VS,cell_set_internal_link:pO,cell_add_comment:mO,sheet_set_array_formula:gO,consts:{SHEET_VISIBLE:0,SHEET_HIDDEN:1,SHEET_VERY_HIDDEN:2}};function HS(e,t,n){const a=Fi(e),i=/^[\t\r ]*[=+\-@]/.test(a),r=n&&i?`'${a}`:a;return n&&i||r.includes('"')||r.includes(` +`)||r.includes("\r")||r.includes(t)?`"${r.replaceAll('"','""')}"`:r}function Ns(e,t=";"){return e.map(n=>n.map(a=>HS(a,t,!1)).join(t)).join(` +`)}function Yh(e,t=";"){return e.map(n=>n.map(a=>HS(a,t,!0)).join(t)).join(` +`)}function vO(e,t,n){return t.map((a,i)=>a.map((r,c)=>{const l=pu.encode_cell({r:n[i]??i,c}),f=e[l]?.l?.Target??"",T=je(r);return!T||!g1(f)?r:`${t1(T)}`}))}async function xO(e){const t=Kh(e.bytes,{type:"array",cellDates:!0,cellFormula:!1,bookVBA:!1}),n=new Map((t.Workbook?.Sheets??[]).map(c=>[c.name,Number(c.Hidden??0)])),a=[],i=t.SheetNames.flatMap((c,l)=>{const f=t.Sheets[c],T=pu.sheet_to_json(f,{header:1,defval:"",raw:!1,blankrows:!0,dateNF:"yyyy-mm-dd"}),p=pu.sheet_to_json(f,{header:1,defval:"",raw:!0,blankrows:!0}),m=T.map((x,y)=>({row:x,rowIndex:y})).filter(x=>x.row.some(y=>je(y))).map(x=>x.rowIndex);if(!m.length)return a.push({kind:"empty-sheet",reason:"Leere Excel-Sheets enthalten keine importierbaren Tabellenwerte.",source:{fileName:e.metadata.name,tableIndex:l}}),[];const g=vO(f,m.map(x=>T[x]??[]),m),S=m.map(x=>p[x]??[]);return[vo({sourceFile:e.metadata.name,name:c,index:l,decodedRows:g,rawRows:S,rawText:Ns(g),attributes:{workbookIndex:l,hidden:n.get(c)??0},positionForCell:(x,y)=>({cellReference:pu.encode_cell({r:m[x]??x,c:y})})})]}),r=i.map(c=>`# ${c.name} +${c.rawText}`).join(` + +`);return b1({file:e.metadata,format:"Excel",rawText:r,tables:i,discardedContent:a})}async function yO(e){return w1(await xO(e))}const SO=["CSV","HTML","Excel","JSON","XML"],bO={csv:"CSV",txt:"CSV",html:"HTML",htm:"HTML",xlsx:"Excel",xls:"Excel",json:"JSON",xml:"XML"},wO={"text/csv":"CSV","text/plain":"CSV","text/html":"HTML","application/xhtml+xml":"HTML","application/json":"JSON","text/json":"JSON","application/xml":"XML","text/xml":"XML","application/vnd.ms-excel":"Excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"Excel"};function Vf(e,t){return t.every((n,a)=>e[a]===n)}function Hf(e,t){const n=Uint8Array.from(t,a=>a.charCodeAt(0));e:for(let a=0;a<=e.length-n.length;a+=1){for(let i=0;i13&&a<32)&&(n+=1)}return n/t.length>.1}function EO(e){const t=e.split(/\r?\n/).map(a=>a.trim()).filter(Boolean).slice(0,12);if(!t.length)return;const n=[",",";"," ","|"].map(a=>({delimiter:a,counts:t.map(i=>i.split(a).length-1)})).filter(a=>a.counts[0]>0&&a.counts.every(i=>i===a.counts[0])).sort((a,i)=>i.counts[0]-a.counts[0])[0];if(n)return{signal:"content-structure",format:"CSV",contribution:t.length>1?.82:.58,message:`Konsistente Trennzeichenstruktur mit ${JSON.stringify(n.delimiter)} erkannt.`}}function kO(e){const t=e.replace(/^\uFEFF/,"").trimStart(),n=[],a=/^(?:\{|\[)/.test(t);if(/^]*?)?>/.test(t)&&n.push({signal:"content-structure",format:"XML",contribution:.34,message:"Eine generische Markup-Wurzelstruktur wurde erkannt und muss durch den Parser validiert werden."}),a&&n.push({signal:"content-structure",format:"JSON",contribution:.84,message:"Ein JSON-Objekt- oder Arrayanfang wurde erkannt."}),!a&&!t.startsWith("<")){const r=EO(e);r&&n.push(r)}return n}function GS(e){const{bytes:t}=e;if(Vf(t,[208,207,17,224,161,177,26,225]))return{evidence:[{signal:"file-signature",format:"Excel",contribution:1,message:"Die OLE-Dateisignatur eines klassischen Excel-Dokuments wurde erkannt."}],containerKind:"ole",binary:!0};if(Vf(t,[80,75,3,4])||Vf(t,[80,75,5,6])){const n=Hf(t,"[Content_Types].xml")&&(Hf(t,"xl/workbook.xml")||Hf(t,"xl/workbook.bin"));return{evidence:n?[{signal:"file-signature",format:"Excel",contribution:1,message:"Ein ZIP-basierter Excel-Workbook-Container wurde erkannt."}]:[{signal:"container-signature",contribution:1,message:"Ein ZIP-Container ohne Excel-Workbookstruktur wurde erkannt."}],containerKind:n?"excel-zip":"zip",binary:!0}}return{evidence:[],binary:CO(t)}}function AO(e){const t=GS(e);return{binary:t.binary,containerKind:t.containerKind,signedFormat:t.evidence.find(n=>n.signal==="file-signature")?.format}}function wx(e,t){const n=GS(e),a=[...n.evidence],i=Rp(e.metadata),r=bO[i];r&&a.push({signal:"extension",format:r,contribution:.24,message:`Die Dateiendung .${i} weist auf ${r} hin.`});const c=e.metadata.mediaType?.split(";")[0].trim().toLocaleLowerCase("en-US"),l=c?wO[c]:void 0;if(l&&a.push({signal:"media-type",format:l,contribution:.16,message:`Der deklarierte Medientyp ${c} weist auf ${l} hin.`}),t!==void 0&&!n.binary){const m=kO(t).map(g=>g.format==="XML"&&g.contribution<.5&&(r==="HTML"||l==="HTML")?{...g,format:"HTML",message:"Generisches Markup wurde aufgrund des HTML-Hinweises durch den sicheren HTML-Parser validiert."}:g);a.push(...m)}const f=SO.map(m=>{const g=a.filter(S=>S.format===m);return{format:m,score:Math.min(1,g.reduce((S,x)=>S+x.contribution,0)),evidence:g}}).filter(m=>m.score>0).sort((m,g)=>g.score-m.score||m.format.localeCompare(g.format)),T=f[0];if(!T)return;const p=T.evidence.some(m=>m.signal==="file-signature"||m.signal==="content-structure"&&m.contribution>=.5);return{version:1,selected:T.format,score:T.score,candidates:f,evidence:a,conflicts:a.filter(m=>m.format!==void 0&&m.format!==T.format),structurallyValidated:p,requiresParserValidation:!p,binary:n.binary,containerKind:n.containerKind}}function RO(e,t,n){const a=n.decodeHtml(t),i=a.tables.length?a.tables.map((l,f)=>vo({sourceFile:e.name,name:l.name,index:f,decodedRows:l.rows,rawRows:l.rows,rawText:l.rows.map(T=>T.join(";")).join(` +`),attributes:l.attributes,positionForCell:(T,p)=>({elementSelector:l.cellSelectors[T]?.[p]}),highlightedRows:l.highlightedRows})):[vo({sourceFile:e.name,name:"HTML",index:0,decodedRows:a.fallbackRows,rawRows:a.fallbackRows,rawText:a.fallbackRows.map(l=>l[0]).join(` +`),attributes:{kind:"html-text-fallback",compatibilityProjection:!0}})],r=[];a.removedContentCount&&r.push({severity:"warning",code:"html-active-content-removed",message:`${a.removedContentCount} aktive oder nicht benötigte HTML-Elemente wurden vor der Tabellenauswertung entfernt.`}),a.extractionMode==="bounded-lexical"&&r.push({severity:"info",code:"html-bounded-extraction",message:"Der umfangreiche oder tief verschachtelte HTML-Bericht wurde mit der stack-sicheren Tabellenextraktion verarbeitet."});const c=a.removedContentCount?[{kind:"active-html-content",reason:"Aktive oder nicht tabellarische Elemente werden nicht als importierbare Daten ausgewertet.",count:a.removedContentCount}]:[];return b1({file:e,format:"HTML",rawText:t,tables:i,diagnostics:r,discardedContent:c,transformations:a.removedContentCount?[{id:"html-active-content-sanitizer",version:"1.0.0",kind:"sanitize",lossless:!1}]:[],additionalViews:a.documentText??a.fallbackRows.map(l=>l.join(" ")).join(` +`)?[{kind:"text",id:"view-html-text",name:"HTML-Text",text:a.documentText??a.fallbackRows.map(l=>l.join(" ")).join(` +`),attributes:{sanitized:a.removedContentCount>0}}]:[]})}function DO(e,t,n){return w1(RO(e,t,n))}function mu(e,t="",n={}){return!e||typeof e!="object"||Object.entries(e).forEach(([a,i])=>{const r=t?`${t}.${a}`:a;i&&typeof i=="object"&&!Array.isArray(i)?mu(i,r,n):n[r]=Array.isArray(i)?JSON.stringify(i):i}),n}function IO(e){if(Array.isArray(e)){const t=e.filter(n=>n&&typeof n=="object"&&!Array.isArray(n));if(t.length===e.length){const n=[...new Set(t.flatMap(a=>Object.keys(mu(a))))];return[n,...t.map(a=>{const i=mu(a);return n.map(r=>Fi(i[r]))})]}return[["Index","Value"],...e.map((n,a)=>[String(a+1),Fi(n)])]}if(e&&typeof e=="object"){const t=mu(e);return[["Path","Value"],...Object.entries(t).map(([n,a])=>[n,Fi(a)])]}return[["Value"],[Fi(e)]]}function NO(e,t){const n=JSON.parse(t),a=IO(n),i=Array.isArray(n)?"Array":n&&typeof n=="object"?"Object":"Value",r=Array.isArray(n)?"array":n&&typeof n=="object"?"object":"primitive";return b1({file:e,format:"JSON",rawText:t,tables:[vo({sourceFile:e.name,name:i,index:0,decodedRows:a,rawRows:a,rawText:JSON.stringify(n,null,2),attributes:{rootKind:r,compatibilityProjection:!0},positionForCell:(c,l)=>({objectPath:c>0&&l===1?a[c]?.[0]:void 0})})],additionalViews:[{kind:"object",id:"view-json-root",name:i,rootKind:r,value:Mu(n),attributes:{nativeStructure:!0}}]})}function OO(e,t){return w1(NO(e,t))}function MO(e,t,n){const a=n.decodeXml(t);if(!a.valid)throw new Ia("XML konnte nicht geparst werden.",[{severity:"error",code:"xml-parse-error",message:a.message}]);const i=[["Pfad","Attribut","Text"],...a.rows.map(r=>[r.path,r.attributes,r.text])];return b1({file:e,format:"XML",rawText:t,tables:[vo({sourceFile:e.name,name:a.rootName,index:0,decodedRows:i,rawRows:i,rawText:t,attributes:{rootElement:a.rootName,compatibilityProjection:!0},positionForCell:r=>({objectPath:r>0?i[r]?.[0]:a.rootName})})],additionalViews:[{kind:"hierarchy",id:"view-xml-root",name:a.rootName,attributes:{nativeStructure:!0},nodes:a.rows.map(r=>({path:r.path,name:r.path.split("/").pop()?.replace(/\[\d+\]$/,"")??r.path,value:r.text||void 0,attributes:{...r.attributes?{serialized:r.attributes}:{},...r.attributeValues?{xmlAttributes:r.attributeValues}:{}}}))}]})}function jO(e,t,n){return w1(MO(e,t,n))}const XS=/\|(?:\s*:?-{2,}:?\s*\|)+/;function Cx(e){return e.split("|").map(t=>t.trim()).filter(Boolean)}function Zh(e){const t=XS.exec(e);if(!t)return null;const n=(t[0].match(/:?-{2,}:?/g)??[]).length;if(n<1)return null;const a=e.slice(0,t.index);if(a.lastIndexOf("|",a.length)<0)return null;const r=Cx(a);if(r.length0;){const x=a.lastIndexOf("|",l-1);if(x<0)break;a.slice(x+1,l).trim()&&(f-=1),l=x}const T=f===0?a.slice(0,l).trim():"";let p=e.slice(t.index+t[0].length),m="";if(!p.trimEnd().endsWith("|")){const x=p.lastIndexOf("|");if(x<0)return null;m=p.slice(x+1).trim(),p=p.slice(0,x+1)}const g=Cx(p);if(!g.length||g.length%n!==0)return null;const S=[];for(let x=0;x{if(XS.test(t)||im.test(t))return t;const n=LO(t),a=[];Ex.lastIndex=0;let i;for(;i=Ex.exec(t);){const l=i.index+i[0].indexOf(i[1]);n.some(([f,T])=>l>f&&l{r+=t.slice(c,l)+` +`,c=f}),r+t.slice(c)}).join(` +`)}const Ax=new RegExp("(?{const n=[];let a;for(Ax.lastIndex=0;a=Ax.exec(t);)n.push({index:a.index,value:Number(a[1])});if(n.length<2)return t;const i=new Set;let r=0;for(;rr)for(let T=r;T<=f;T+=1)i.add(n[T].index);r=f+1}if(!i.size)return t;let c="",l=0;return[...i].sort((f,T)=>f-T).forEach(f=>{c+=t.slice(l,f)+` +`,l=f}),c+=t.slice(l),c}).join(` +`)}function PO(e){const t=e.replace(/(\S)\s+(#{1,6}\s+)/g,`$1 +$2`).replace(/(\S)\s+([*-]\s+\[)/g,`$1 +$2`);return KS($S(t)).split(` +`).map(n=>{const a=YS.exec(n);if(!a)return n;const i=a[2].indexOf(": ");return i<0||i>FO?n:`${a[1]} ${a[2].slice(0,i+1)} +${a[2].slice(i+2).trim()}`}).join(` +`)}const YS=/^\s{0,3}(#{1,6})\s+(.*)$/,_O=/^\s{0,3}[-*+]\s+(.*)$/,qO=/^\s{0,3}\d{1,3}[.)]\s+(.*)$/,Jh=/^\s*\|.*\|\s*$/,im=/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/,Rx=/^\s*```/,BO=[/^\s{0,3}#{1,6}\s+\S/m,/\*\*[^*\n]+\*\*/,new RegExp(am),/^\s{0,3}[-*+]\s+\S/m,/^\s{0,3}\d{1,3}[.)]\s+\S/m,/`[^`\n]+`/];function UO(e){if(!e)return!1;if(BO.some(n=>n.test(e))||/\S\s+#{1,6}\s+\S/.test(e)||$S(e)!==e||KS(e)!==e)return!0;const t=e.replace(/\r\n?/g,` +`).split(` +`);return zO(t,0)>=0||t.some(n=>Zh(n)!==null)}function zO(e,t){for(let n=t;nt.trim())}const WO=new RegExp(`(\`[^\`\\n]+\`)|(${am})|(\\*\\*[^*\\n]+\\*\\*)|(__[^_\\n]+__)|(\\*[^*\\n]+\\*)|(_[^_\\n]+_)`);function Os(e){const t=[];let n=e;for(;n;){const a=WO.exec(n);if(!a||a.index===void 0)break;a.index>0&&t.push({kind:"text",text:n.slice(0,a.index)});const i=a[0];if(i.startsWith("`"))t.push({kind:"code",text:i.slice(1,-1)});else if(i.startsWith("[")){const r=i.lastIndexOf("](");t.push({kind:"link",href:i.slice(r+2,-1),children:Os(i.slice(1,r))})}else i.startsWith("**")||i.startsWith("__")?t.push({kind:"strong",children:Os(i.slice(2,-2))}):t.push({kind:"emphasis",children:Os(i.slice(1,-1))});n=n.slice(a.index+i.length)}return n&&t.push({kind:"text",text:n}),t.length?t:[{kind:"text",text:e}]}function ZS(e){if(!e)return e;let t=e;return t=t.replace(/(\S)\s*[\r\n]+\s*([.:;,?!)]+)(?=\s|$)/g,"$1$2"),t=t.replace(/(\S)[\r\n]+\s*([a-z])/g,"$1 $2"),t=t.replace(/\n{3,}/g,` + +`),t.trim()}function sm(e){const t=ZS(e),n=PO(t.replace(/\r\n?/g,` +`)).split(` +`),a=[];let i=[],r=null;const c=()=>{i.length&&(a.push({kind:"paragraph",content:Os(i.join(" ").trim())}),i=[])},l=()=>{r&&(a.push({kind:"list",ordered:r.ordered,items:r.items.map(Os)}),r=null)},f=()=>{c(),l()};for(let T=0;Tt.kind==="table").map(t=>t.table).filter(t=>t.headers.length>0&&t.rows.length>0)}const Qh=["pass","fail","error","unknown","manual","excepted"],HO='id="summary"',GO=8e3,Ix=/\s*([0-9.,]+)\s*<\/div>/gi,XO=/\s*([0-9.,]+)\s*\s*\/\s*([0-9.,]+)\s*<\/span>/i;function Gf(e){const t=e.replace(/[^0-9]/g,"");return t?Number(t):0}function KO(){return{pass:0,fail:0,error:0,unknown:0,manual:0,excepted:0}}function $O(e){const t=je(e).toLocaleLowerCase("en-US");if(t){if(t==="pass"||t==="passed")return"pass";if(t==="fail"||t==="failed")return"fail";if(t==="error")return"error";if(t==="unknown")return"unknown";if(t==="manual")return"manual";if(t==="excepted"||t==="exception")return"excepted"}}function YO(e){const t=e.indexOf(HO);if(t<0)return null;const n=e.slice(t,t+GO),a=KO();let i=0;Ix.lastIndex=0;let r;for(;r=Ix.exec(n);){const l=r[1].toLocaleLowerCase("en-US");a[l]=Gf(r[2]),i+=1}if(il+a[f],0),scoredPassed:c?Gf(c[1]):void 0,scoredTotal:c?Gf(c[2]):void 0}}const ZO=/]*>([\s\S]{0,400}?)<\/title\s*>/i,JO=/^benchmark\s+result\s*[-–—:]?\s*/i,QO=/^xccdf[_.][\w.]*testresult[_.](\d+(?:\.\d+)*)[_.](.+)$/i,eM=/]*\bid\s*=\s*["']coverPageTitle["'][^>]*>([\s\S]{0,4000}?)<\/div\s*>/i,tM=/]*\bid\s*=\s*["']coverPageSubTitle["'][^>]*>([\s\S]{0,4000}?)<\/div\s*>/i,nM=/^for\s+(.+)$/i,aM=/^(?:target\s+)?ip\s*address\s*:\s*(.+)$/i,iM=/^(.*?)\s+v(\d+(?:\.\d+)*)$/,Nx=/^assessment\s+duration\s*:\s*(.+)$/i,sM=/CIS-CAT\s+Pro\s+Assessor\)?\s*v(\d+(?:\.\d+)*)/i,Ox=/]*>([\s\S]{0,400}?)<\/li\s*>/gi,Mx=/]*>([\s\S]{0,400}?)<\/h\1\s*>/gi,rM=/data-score\s*=\s*["']?(-?\d+(?:[.,]\d+)?)["']?/i,oM=/^(\d+)\s+(.+)$/,cM=2e5,lM=[[/^host\s*name$|^hostname$|^system\s*name$/i,"host.name","Assessed host"],[/^operating\s*system$|^os\s*name$|^os$/i,"operating_system.name","Operating system"],[/^ip\s*address(?:es)?$/i,"host.ip_address","IP address"],[/^mac\s*address(?:es)?$/i,"host.mac_address","MAC address"],[/^domain$|^domain\s*name$/i,"host.domain","Host domain"],[/^assessment\s*(?:date|time|timestamp)$|^scan\s*(?:date|time)$/i,"report.generated_at","Report generation date"],[/^benchmark\s*version$/i,"benchmark.version","Benchmark version"],[/^profile$|^selected\s*profile$/i,"benchmark.profile","Benchmark profile"]];function uM(e){return e.toLocaleLowerCase("en-US").replace(/[^a-z0-9]+/g,"_").replace(/^_|_$/g,"")||"value"}function ep(e){return{type:"assessed-system",identity:e.file.name,label:"CIS-CAT assessed system"}}function mi(e){return{type:"benchmark-assessment",identity:e.file.name,label:"CIS-CAT benchmark assessment"}}function ur(e,t,n,a,i,r){const c=typeof i=="number"?i:vi(i);return{version:1,subject:t,property:n,label:a,originalValue:i,normalizedValue:c!==null?c:i,valueType:c!==null?"number":"string",state:"observed",sectionKey:"cis-cat-assessment-summary",source:{fileName:e.file.name,objectPath:r},attributes:{}}}function dM(e){const t=je(sn(ZO.exec(e.rawText)?.[1]??"")).replace(JO,""),n=QO.exec(t);return n?je(n[2].replace(/[_.]+/g," ")):t}function Yl(e,t){t.lastIndex=0;const n=[];let a;for(;a=t.exec(e);)n.push(je(sn(a[a.length-1]??"")));return n.filter(Boolean)}function TM(e){const t=[],n=(c,l,f,T,p)=>{T&&t.push(ur(e,c,l,f,T,p))},a=eM.exec(e.rawText)?.[1];if(a){const c=Yl(a,Mx).flatMap(f=>nM.exec(f)?.[1]??[]);n(ep(e),"host.name","Assessed host",je(c[0]??""),"html/cover/host");const l=Yl(a,Ox).flatMap(f=>aM.exec(f)?.[1]??[]);n(ep(e),"host.ip_address","IP address",je(l[0]??""),"html/cover/ip-address")}const i=tM.exec(e.rawText)?.[1];if(i){const c=Yl(i,Mx)[0]??"",l=iM.exec(c);n(mi(e),"benchmark.name","Benchmark",je(l?.[1]??c),"html/cover/benchmark"),n(mi(e),"benchmark.version","Benchmark version",je(l?.[2]??""),"html/cover/benchmark-version");const f=Yl(i,Ox),T=f.flatMap(m=>Nx.exec(m)?.[1]??[]),p=f.filter(m=>!Nx.test(m));n(mi(e),"benchmark.profile","Benchmark profile",p[0]??"","html/cover/profile"),n(mi(e),"report.generated_at","Report generation date",p[1]??"","html/cover/generated-at"),n(mi(e),"benchmark.assessment_duration","Assessment duration",je(T[0]??""),"html/cover/duration")}const r=sM.exec(e.rawText)?.[1];return n(mi(e),"report.engine_version","CIS-CAT engine version",je(r??""),"html/cover/engine"),t}function fM(e){const t=[];e.tables.forEach(r=>r.rows.forEach(c=>{if(c.cells.length!==2||c.index===r.headerCandidates[0]?.rowIndex)return;const l=je(c.cells[0]?.decodedValue).replace(/:$/,""),f=je(c.cells[1]?.decodedValue);l&&f&&t.push({label:l,value:f,objectPath:`html/tables/${r.index}/rows/${c.index}`})}));const n=e.rawText.slice(0,cM),a=/(?:^|>|\n)\s*([A-Za-z][A-Za-z ]{2,28})\s*:\s*([^<\n]{1,160})/g;let i;for(;i=a.exec(n);){const r=je(i[1]),c=je(i[2]);r&&c&&t.push({label:r,value:c,objectPath:`html/facts/${uM(r)}`})}return t}function hM(e){const t=new Set;return fM(e).flatMap(n=>{const a=lM.find(([r])=>r.test(n.label));if(!a||t.has(a[1]))return[];t.add(a[1]);const i=a[1].startsWith("benchmark.")||a[1]==="report.generated_at"?mi(e):ep(e);return[ur(e,i,a[1],a[2],n.value,n.objectPath)]})}function pM(e){const t=[],n=dM(e);n&&t.push(ur(e,mi(e),"benchmark.name","Benchmark",n,"html/title"));const a=rM.exec(e.rawText)?.[1],i=a===void 0?null:vi(a);i!==null&&t.push(ur(e,mi(e),"benchmark.score","Benchmark score",i,"html/summary/gauge"));const r=YO(e.rawText);return r&&(Qh.forEach(c=>t.push(ur(e,mi(e),`benchmark.result_count.${c}`,`Recommendations ${c}`,r.counts[c],`html/summary/${c}`))),r.scoredTotal!==void 0&&t.push(ur(e,mi(e),"benchmark.scored_total","Scored recommendations",r.scoredTotal,"html/summary/scored-total")),r.scoredPassed!==void 0&&t.push(ur(e,mi(e),"benchmark.scored_passed","Scored recommendations passed",r.scoredPassed,"html/summary/scored-passed"))),t}function mM(e){return e.tables.find(t=>{const n=t.headerCandidates[0]?.headers.map(i=>je(i))??[],a=i=>n.some(r=>i.test(r));return a(/^description$/i)&&a(/^pass$/i)&&a(/^fail$/i)&&a(/^percent$/i)})}function gM(e){const t=mM(e),n=t?.headerCandidates[0];if(!t||!n)return{observations:[]};const a=n.headers.map(T=>je(T)),i=T=>a.findIndex(p=>T.test(p)),r=i(/^description$/i),c=i(/^percent$/i),l=t.rows.filter(T=>T.index!==n.rowIndex);return{observations:l.flatMap(T=>{const p=je(T.cells[r]?.decodedValue),m=oM.exec(p),g=vi(T.cells[c]?.decodedValue);return!m||g===null?[]:[ur(e,{type:"benchmark-section",identity:m[1],label:je(m[2])},`benchmark.section_score.${m[1]}`,je(m[2]),g,`html/tables/${t.index}/rows/${T.index}`)]}),section:{version:1,sectionKey:"cis-cat-section-scores",label:"Benchmark section scores",ordinal:1,state:l.length?"observed":"empty",tables:[{name:"Section scores",sourceTableIndex:t.index,headers:a,rows:l.map(T=>a.map((p,m)=>je(T.cells[m]?.decodedValue)))}],source:{fileName:e.file.name,tableIndex:t.index},attributes:{rowCount:l.length}}}}function vM(e){const t=gM(e),n=new Set,a=[...TM(e),...hM(e),...pM(e),...t.observations].filter(r=>!n.has(r.property)&&n.add(r.property)),i={version:1,sectionKey:"cis-cat-assessment-summary",label:"CIS-CAT assessment summary",ordinal:0,state:a.length?"observed":"empty",tables:[],source:{fileName:e.file.name,objectPath:"html/summary"},attributes:{observationCount:a.length}};return{environmentObservations:a,reportSections:[i,...t.section?[t.section]:[]]}}const xM=/^(\d+(?:\.\d+)+)\s+/,jx=/^assessment\s*results?$|^assessmentresulttable$/i,yM=2e6,Fx=/^(?:show|hide|display|view|anzeigen|einblenden|ausblenden|zeigen?)\b[\s:]*/i,SM=/[\s–—>-]*\b(?:more|less|mehr|weniger)\b[\s:>]*$/i,JS=160,bM=640,wM=80,QS="Result Details",CM=/^rule\s*result\s*xml$/i,EM=/^references?$/i,kM=/_xml_result$/i,eb=/(?:^|\s)referenceList(?:$|\s)/i,AM=/(?:^|\s)bold(?:$|\s)/i,RM=/(?:^|\s)caption(?:$|\s)/i;function gr(e,t){return sn(Kr(e,t))}function Td(e){const t=[],n=[],a=/<\/?div\b[^>]*>/gi;let i;for(;i=a.exec(e);){if(/^<\s*\/div/i.test(i[0])){const c=n.pop();if(!c)continue;t.push({...c,end:a.lastIndex,html:e.slice(c.start,a.lastIndex)});continue}if(/\/\s*>$/.test(i[0]))continue;const r=i[0].replace(/^$/,"");n.push({start:i.index,id:gr(r,"id"),classes:gr(r,"class").split(/\s+/).filter(Boolean)})}return t}function tb(e){return je(sn(e)).replace(/\s+/g," ").toLocaleLowerCase("en-US")}function DM(e){const t=new Map,n=/]*)>([\s\S]*?)<\/a\s*>/gi;let a;for(;a=n.exec(e);){const i=gr(a[1]??"","href");if(!/^#detail-[\w:.-]+$/i.test(i))continue;const r=tb(a[2]??"");r&&!t.has(r)&&t.set(r,i.slice(1))}return t}function qr(e,t,n){return Td(e.html).filter(a=>a.classes.some(i=>i.toLocaleLowerCase("en-US")===t)).find(a=>!n||a.id.endsWith(n))}function IM(e){return e.replace(/]*)>([\s\S]*?)<\/a\s*>/gi,(t,n,a)=>{const i=gr(n,"href"),r=sn(a);return g1(i)?`[${r}](${i})`:r})}function oo(e,t=!0){let n=e.replace(//g," ").replace(/<(?:script|style|iframe|object|embed|svg|form|template|canvas|audio|video)\b[^>]*>[\s\S]*?<\/(?:script|style|iframe|object|embed|svg|form|template|canvas|audio|video)\s*>/gi," ");return t&&(n=n.replace(/]*>[\s\S]*?<\/table\s*>/gi,` +`)),n=IM(n),n=n.replace(/]*>([\s\S]*?)<\/code\s*>/gi,(a,i)=>{const r=sn(i);return r?` +\`\`\` +${r} +\`\`\` +`:""}),n=n.replace(/<(?:p|div)\b([^>]*)>([\s\S]*?)<\/(?:p|div)\s*>/gi,(a,i,r)=>/\bbold\b/i.test(gr(i,"class"))?` +### ${sn(r).replace(/:\s*$/,"")} +`:a),n=n.replace(//gi,` +`).replace(/]*>/gi,` +- `).replace(/<\/(?:p|div|li|ul|ol|h[1-6]|pre)\s*>/gi,` +`).replace(/<(?:p|div|ul|ol|h[1-6]|pre)\b[^>]*>/gi,` +`).replace(/<[^>]*>/g," "),ZS(n.split(/\r\n|\r|\n/).map(a=>sn(a)).join(` +`).replace(/[ \t]+\n/g,` +`).replace(/\n{3,}/g,` + +`))}function bc(e,t){return e.replace(t,"").trim()}function NM(e){const t=[],n=/]*)>([\s\S]*?)<\/ul\s*>/gi;let a;for(;a=n.exec(e);)eb.test(gr(a[1]??"","class"))&&t.push({start:a.index,end:n.lastIndex});return t}function Xf(e,t,n){const a=je(n);!a||a.length>JS||e.push({position:t,label:a})}function OM(e){const t=[],n=NM(e),a=l=>n.some(f=>l>=f.start&&l]*>([\s\S]*?)<\/a\s*>/gi;let r;for(;r=i.exec(e);){if(a(r.index))continue;const l=sn(r[1]??"");if(!Fx.test(l))continue;const f=je(l.replace(Fx,""))||sn((/^[^<]*/.exec(e.slice(i.lastIndex))??[""])[0].slice(0,JS));Xf(t,r.index,f)}const c=/<(b|strong|h[1-6]|span|p|div)\b([^>]*)>/gi;for(;r=c.exec(e);){if(a(r.index))continue;const l=r[1].toLocaleLowerCase("en-US"),f=gr(r[2]??"","class"),T=RM.test(f),p=/^(?:b|strong|h[1-6])$/.test(l)||AM.test(f);if(!T&&!p)continue;const m=e.slice(c.lastIndex,c.lastIndex+bM),g=new RegExp(``,"i").exec(m),S=sn(g?m.slice(0,g.index):m);T?Xf(t,r.index,S.replace(/:$/,"")):S.endsWith(":")&&Xf(t,r.index,S.slice(0,-1))}return t.sort((l,f)=>l.position-f.position)}function nb(e,t){let n=QS;for(const a of e){if(a.position>=t)break;n=a.label}return n}function MM(e){return oo(e).split(` +`).map(t=>je(t).replace(SM,"").replace(/[\s:>]+$/,"")).filter(t=>t&&t!=="-").join(` +`)}function jM(e){return Td(e.html).filter(t=>t.classes.some(n=>/^references?$/i.test(n))).map(t=>({start:t.start,end:t.end}))}function FM(e,t){const n=[],a=jM(e),i=/]*)>([\s\S]*?)<\/ul\s*>/gi;let r;for(;r=i.exec(e.html);){if(!eb.test(gr(r[1]??"","class"))||a.some(f=>r.index>=f.start&&r.indexc.attributes.extractionMode==="bounded-lexical"))return rd(e).map(c=>c.start);const a=[],i=/t.classes.some(n=>n.toLocaleLowerCase("en-US")==="xml")&&kM.test(t.id)).map(t=>({start:t.start,end:t.end}))}function _M(e){const t=je(e.name);if(t&&!/^tabelle\s+\d+$/i.test(t))return t;const n=e.rows[0]?.cells??[],a=je(n[0]?.decodedValue);if(/^criterion:?$/i.test(a))return"Complex Check";const i=n.filter(c=>je(c.decodedValue));return new Set(i.map(c=>je(c.decodedValue))).size===1&&e.rows.length>1&&a.length<=wM?a:t||`Tabelle ${e.index+1}`}function qM(e){return e.rows.map(t=>t.cells.map(n=>n.decodedValue).join("")).join("")}function BM(e,t,n,a){const i=PM(e),r=t.map((T,p)=>({position:T,table:n[p]})).filter(T=>T.table&&T.position>=e.start&&T.position{const p=T.position-e.start;return{tableIndex:T.table.index,insideRuleResultXml:i.some(m=>p>=m.start&&p!T.insideRuleResultXml&&!CM.test(T.section)),c=new Set,l=r.filter(T=>{const p=`${T.section}\0${T.name}\0${T.contentSignature}`;return c.has(p)?!1:(c.add(p),!0)}),f=new Map;return l.map(T=>{const p=`${T.section}\0${T.name}`,m=(f.get(p)??0)+1;f.set(p,m);const g=l.filter(S=>S.section===T.section&&S.name===T.name).length>1;return{tableIndex:T.tableIndex,label:`${T.section} · ${T.name}${g?` ${m}`:""}`}})}function ab(e){return{fragmentId:e,description:"",rationale:"",remediation:"",impact:"",ruleResultXml:"",references:"",controls:"",tables:[]}}function UM(e){if(!e)return"";const t=/]*>([\s\S]*?)<\/pre\s*>/i.exec(e);let n=t?t[1]:e;n=n.replace(/^[\s\S]*?Rule Result XML:\s*/i,"");const a=n.indexOf("=0&&!/a.index===t)?.cells[n]?.rawValue??""}function VM(e){const t=e.headerCandidates[0];return t?{rowIndex:t.rowIndex,values:t.headers.map(je)}:null}function HM(e,t,n,a,i,r){const c=t.rows.find(C=>C.index===n),l=a.findIndex(C=>/^(?:benchmark\s*item|title|recommendation)$/i.test(C)),f=a.findIndex(C=>/^result$/i.test(C)),T=a.findIndex(C=>/^(?:w|weight)$/i.test(C)),p=c.cells[l]?.decodedValue??"",m=c.cells[f]?.decodedValue??"",g=xM.exec(je(p))?.[1]??"",S={fileName:e.file.name,tableIndex:t.index,rowIndex:n,elementSelector:`#${i}`},x=[];g&&x.push(Ti("rule-id","Rule ID",g,g,{...S,columnIndex:l})),x.push(Ti("benchmark-item","Benchmark Item",Kf(t,n,l),p,{...S,columnIndex:l})),x.push(Ti("result","Result",Kf(t,n,f),m,{...S,columnIndex:f})),T>=0&&c.cells[T]?.decodedValue&&x.push(Ti("weight","Weight",Kf(t,n,T),c.cells[T].decodedValue,{...S,columnIndex:T})),r.description&&x.push(Ti("description","Description",r.description,r.description,S)),r.rationale&&x.push(Ti("rationale","Rationale",r.rationale,r.rationale,S)),r.remediation&&x.push(Ti("remediation","Remediation",r.remediation,r.remediation,S)),r.impact&&x.push(Ti("impact","Impact",r.impact,r.impact,S)),r.references&&x.push(Ti("references","References",r.references,r.references,S)),r.controls&&x.push(Ti("control-mappings","Control Mappings",r.controls,r.controls,S));const y=r.tables.map(C=>`source-table:${C.tableIndex} "${C.label.replace(/"/g,"'")}"`).join(` +`);y&&x.push(Ti("results","Results",{fragmentId:r.fragmentId,tables:r.tables.map(C=>({tableIndex:C.tableIndex,label:C.label}))},y,S));const w=WM(r);return w&&x.push(Ti("rule-result-xml","Rule Result XML",{fragmentId:r.fragmentId,ruleResultXml:r.ruleResultXml},w,S)),x}const GM={id:"cis-cat-html-source-extractor",version:"1.3.1",detect(e){if(e.format!=="HTML")return{score:0,evidence:[]};const t=e.tables.find(i=>i.attributes.elementId==="assessmentResultTable"||jx.test(je(i.name))),n=/]*class\s*=\s*(?:"[^"]*\bRule\b[^"]*"|'[^']*\bRule\b[^']*')/i.test(e.rawText),a=/href\s*=\s*(?:"|')#detail-/i.test(e.rawText);return!t||!n||!a?{score:0,evidence:[]}:{score:1,evidence:["CIS-CAT Assessment-Result-Tabelle vorhanden.","Interne Detailverweise und regelgebundene Detailblöcke vorhanden."]}},extract(e){const t=vM(e),n=e.tables.find(x=>x.attributes.elementId==="assessmentResultTable"||jx.test(je(x.name)));if(!n)return{version:1,candidates:[],...t,diagnostics:[]};const a=VM(n);if(!a)return{version:1,candidates:[],...t,diagnostics:[{severity:"warning",code:"cis-cat-result-header-missing",message:"Die CIS-CAT-Ergebnistabelle besitzt keine sicher erkennbare Kopfzeile."}]};const i=a.values.findIndex(x=>/^(?:benchmark\s*item|title|recommendation)$/i.test(x)),r=a.values.findIndex(x=>/^result$/i.test(x));if(i<0||r<0)return{version:1,candidates:[],...t,diagnostics:[{severity:"warning",code:"cis-cat-result-columns-missing",message:"Benchmark Item und Result konnten in der CIS-CAT-Ergebnistabelle nicht gemeinsam gefunden werden."}]};const c=DM(e.rawText),l=wo(e.rawText).text,f=Td(l).filter(x=>x.id&&x.classes.some(y=>y.toLocaleLowerCase("en-US")==="rule")),T=new Map(f.map(x=>[x.id,x])),p=LM(l,e.tables),m=[];let g=0;for(const x of n.rows){if(x.index===a.rowIndex)continue;const y=x.cells[i]?.decodedValue??"",w=String(x.cells[i]?.rawValue??""),C=x.cells[r]?.decodedValue??"";if(!y||!$O(C))continue;const k=/href\s*=\s*["']#(detail-[\w:.-]+)["']/i.exec(w),E=k?k[1]:c.get(tb(y)),O=E?T.get(E):void 0;(!E||!O)&&(g+=1);const N=E??"assessmentResultTable",B=O?zM(O,p,e.tables):ab(N);m.push({version:1,id:`candidate-cis-cat-${n.index}-${x.index}`,source:{fileName:e.file.name,tableIndex:n.index,rowIndex:x.index,elementSelector:`#${N}`},fields:HM(e,n,x.index,a.values,N,B)})}const S=g?[{severity:"warning",code:"cis-cat-linked-detail-missing",message:`${g} CIS-CAT-Ergebniszeile(n) konnten keinem internen Detailblock zugeordnet werden.`,details:{missingDetails:g}}]:[];return{version:1,candidates:m,...t,diagnostics:S}}};function fd(e){const t=new Map,n=new Map,a=new Map,i=/<([a-zA-Z][\w:-]*)\b([^>]*)>/g;let r;for(;r=i.exec(e);){let c,l;for(const T of Cp(r[2]??""))T.name==="id"&&c===void 0&&(c=T.value),T.name==="name"&&l===void 0&&(l=T.value);if(!c&&!l)continue;const f={tagName:r[1],start:r.index,bodyStart:i.lastIndex,selfClosing:/\/\s*>$/.test(r[0])};c&&!t.has(c)&&t.set(c,f),l&&f.tagName.toLowerCase()==="a"&&!n.has(l)&&n.set(l,f);for(const T of new Set([c,l])){if(!T)continue;const p=a.get(T);p?p.count++:a.set(T,{count:1,start:f.start})}}return{byId:t,namedAnchors:n,definitions:a}}function ib(e,t,n,a){if(!e.trim())throw new Ia("PingCastle-Regel ohne Rule ID kann nicht vollständig importiert werden.",[{severity:"error",code:"pingcastle-rule-id-missing",stage:"extraction",source:n,message:"Ein nativer Regelblock enthält keine lesbare Rule ID."}]);const i=e.trim().toLocaleUpperCase("en-US");return t.has(i)?(a.push({severity:"warning",code:"pingcastle-duplicate-rule-id",stage:"extraction",source:n,message:"Eine Rule ID ist innerhalb der Quelle wiederholt. Die erste Darstellung bleibt das Finding; weitere Darstellungen werden nicht als zusätzliche Treffer gezählt.",details:{ruleId:e,retained:"first-presentation"}}),!1):(t.add(i),!0)}function XM(e,t,n){const a=[],i=[],r=p=>p.replace(/[^a-z]/gi,"").toLocaleLowerCase("en-US"),c=new Map;for(const p of n){const m=r(p.fields.find(g=>g.label==="Category")?.decodedValue??"");c.set(m,(c.get(m)??0)+1)}const l=/]*)>([\s\S]*?)<\/h2\s*>/gi;let f,T=!1;for(;f=l.exec(t);){if(!/\bclass\s*=\s*["'][^"']*\bindicator-header\b/i.test(f[1]))continue;const p=sn(f[2]);if(!/rules?\s+matched/i.test(p))continue;const m={fileName:e,objectPath:`html/indicator-headings/${i.length}`},g=/^(.*?)\s+rule\s+details\s*\[\s*(\S+)\s+rules?\s+matched\s+on\s+a\s+total\s+of\s+(\S+)\s*\]/i.exec(p),S=g?.[1]??p,x=g&&/^\d+$/.test(g[2])?Number(g[2]):NaN,y=g&&/^\d+$/.test(g[3])?Number(g[3]):NaN,w=c.get(r(S))??0;i.push([S,g?.[2]??"",g?.[3]??"",w,p]),T||=Number.isFinite(x)&&x>0,(!Number.isSafeInteger(x)||!Number.isSafeInteger(y)||x>y)&&a.push({severity:"warning",code:"pingcastle-rule-count-invalid",stage:"extraction",source:m,message:"Die deklarierte PingCastle-Regelbilanz ist ungültig; Originalangaben bleiben erhalten."}),Number.isSafeInteger(x)&&x!==w&&a.push({severity:"warning",code:"pingcastle-rule-count-mismatch",stage:"extraction",source:m,message:"Die deklarierte Trefferzahl stimmt nicht mit den extrahierten eindeutigen Regeln überein.",details:{category:S,declared:x,actual:w}})}if(!n.length&&(T||a.length))throw new Ia("PingCastle kündigt Regeln an, enthält aber keine auslesbaren Ergebnisse.",[...a,{severity:"error",code:"pingcastle-rule-results-missing",stage:"extraction",message:"Eine erfolgreiche Nullbefund-Verarbeitung ist bei dieser Regelbilanz nicht zulässig.",source:{fileName:e}}]);return{diagnostics:a,...i.length?{section:{version:1,sectionKey:"pingcastle-rule-coverage",label:"PingCastle rule coverage",ordinal:0,state:"observed",tables:[{name:"Declared and extracted rules",headers:["Category","Declared matched","Declared catalog size","Extracted unique rules","Original heading"],rows:i}],source:{fileName:e,objectPath:"html/indicator-headings"},attributes:{derivedColumn:"Extracted unique rules"}}}:{}}}const n0=5e3,sb=1e6;function tp(e){return e.replace(/[^a-zA-Z0-9_-]/g,"-")}function rm(e){return e.replace(/\s+/g," ").replace(/:$/,"").trim().toLocaleLowerCase("en-US")}function Mi(e,t,n,a){return{key:e,label:t,originalValue:n,decodedValue:n,source:a}}function KM(e,t){return{key:"linked-section",label:"Verwandte Daten",originalValue:{sections:e.map(n=>({sectionId:n.sectionId,sectionLabel:n.sectionLabel,prose:n.prose,headers:n.headers,rows:n.rows}))},decodedValue:e.map(n=>n.sectionLabel).join(", "),source:t}}function $M(e,t){const n=Math.min(e.length,t+sb),a=e.slice(t,n),i=/^\s*]*>([\s\S]*?)<\/p\s*>/i.exec(a);if(i)return{value:sn(i[1]??""),rawValue:i[1]??"",end:t+i.index+i[0].length};const r=/^\s*([^<]{1,10000})\s*<\/p\s*>/i.exec(a);return r?{value:sn(r[1]??""),rawValue:r[1]??"",end:t+r.index+r[0].length}:{value:"",rawValue:"",end:t}}function rb(e){const t=[],n=/]*>([\s\S]*?)<\/tr\s*>/gi;let a;for(;a=n.exec(e);){const i=[],r=/]*>([\s\S]*?)<\/t[hd]\s*>/gi;let c;for(;c=r.exec(a[1]??"");)i.push(sn(c[1]??""));i.some(Boolean)&&t.push(i)}return t}function YM(e,t){const n=Math.min(e.length,t+sb),a=e.slice(t,n),i=/^(?:\s|]*>|<\/div\s*>)*]*>([\s\S]*?)<\/table\s*>/i.exec(a);return i?rb(i[1]??""):[]}function Lx(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}const ZM=2e5,JM=8,QM=128,ej=256;function tj(e){const t=[],n=/]*>([\s\S]*?)<\/table\s*>/gi;let a;for(;a=n.exec(e);){const i=rb(a[1]??"");i.length&&t.push(i)}return t}function ob(e){const t=e.replace(/]*>[\s\S]*?<\/table\s*>/gi," ");return sn(t)}const gu='',cb='';function nj(e,t,n){const a=n.namedAnchors.get(t);if(!a)return null;const i=/^\s*<\/a\s*>/i.exec(e.slice(a.bodyStart,a.bodyStart+256)),r=a.bodyStart+(i?.[0].length??0),c=Math.min(e.length,r+ZM),l=e.slice(r,c),f=l.indexOf(gu),T=f>=0?f+gu.length:0,p=l.slice(T),m=p.indexOf(cb),g=p.indexOf(gu),S=[m,g].filter(x=>x>=0).sort((x,y)=>x-y)[0]??-1;return S>=0?p.slice(0,S):p}function om(e,t,n){const a=n.byId.get(t);if(!a)return null;const{tagName:i,start:r,bodyStart:c,selfClosing:l}=a;if(l)return{start:r,bodyStart:c,bodyEnd:c,end:c};const f=new RegExp("<"+Lx(i)+"\\b[^>]*>|<\\/"+Lx(i)+"\\s*>","gi");f.lastIndex=c;let T=1,p;for(;p=f.exec(e);)if(/^<\//.test(p[0])?T-=1:/\/\s*>$/.test(p[0])||(T+=1),T===0)return{start:r,bodyStart:c,bodyEnd:p.index,end:f.lastIndex};return null}function aj(e,t,n){const a=e.slice(t,Math.min(e.length,t+4096)),i=/<\/(?:a|button)\s*>/i.exec(a);return sn(i?a.slice(0,i.index):a.slice(0,256))||n}function lb(e){const t=[],n=new Set,a=/\s*<\/i\s*>/gi;let i;for(;i=a.exec(e);){const r=i[1],c=i[2].toLocaleLowerCase("en-US"),l=c+"|"+r;n.has(l)||(n.add(l),t.push({index:i.index,targetId:r,relation:c,label:aj(e,a.lastIndex,r)}))}return t}function ij(e,t,n){const a=nj(e,t,n);if(a!==null)return{markup:a,label:t};const i=om(e,t,n);if(!i)return null;const r=e.slice(i.bodyStart,i.bodyEnd),c=/]*class\s*=\s*(?:"[^"]*\bmodal-title\b[^"]*"|'[^']*\bmodal-title\b[^']*')[^>]*>([\s\S]*?)<\/h[1-6]\s*>/i.exec(r);return{markup:r,label:sn(c?.[1]??"")||t}}function ub(e,t){if(!t.length)return e;const n=t.map(r=>({start:Math.max(0,r.start),end:Math.min(e.length,r.end)})).filter(r=>r.end>r.start).sort((r,c)=>r.start-c.start);let a="",i=0;return n.forEach(r=>{if(r.end<=i)return;const c=Math.max(i,r.start);a+=e.slice(i,c)+" ".repeat(r.end-c),i=r.end}),a+e.slice(i)}function sj(e,t,n){const a=[],i=[],r=new Set,c=[],l=new Set,f=(p,m)=>{const g=p+"|"+m;l.has(g)||(l.add(g),c.push({code:p,targetId:m}))},T=(p,m,g)=>{if(g>JM){f("depth-limit",p.targetId);return}if(r.size>=QM){f("target-limit",p.targetId);return}if(r.has(p.targetId))return;r.add(p.targetId);const S=n.definitions.get(p.targetId)?.count??0;if(S===0){f("unresolved",p.targetId);return}if(S>1){f("ambiguous",p.targetId);return}const x=ij(e,p.targetId,n);if(!x){f("unresolved",p.targetId);return}const y=x.label===p.targetId?p.label:x.label,w=m?m+" → "+y:y,C=lb(x.markup),k=fd(x.markup),E=C.map(I=>({child:I,span:om(x.markup,I.targetId,k)})).filter(I=>!!I.span),O=C.filter(I=>!E.some(L=>L.child.targetId!==I.targetId&&I.index>=L.span.start&&I.indexI.span),B=ub(x.markup,N),A=ob(B).trim(),z=tj(B),P=z.map(I=>I.map(L=>L.join(" | ")).join(` +`)).join(` + +`),K=[A,P].filter(Boolean).join(` + +`);if(K&&i.push(K),z.length){const I=ej-a.length;z.length>I&&f("table-limit",p.targetId),z.slice(0,Math.max(0,I)).forEach((L,le)=>{const ue=z.length>1;a.push({sectionId:ue?p.targetId+"--table-"+(le+1):p.targetId,sectionLabel:ue?w+" · Tabelle "+(le+1):w,text:L.map(X=>X.join(" | ")).join(` +`),prose:A,headers:L[0]??[],rows:L.slice(1)})})}else A&&a.push({sectionId:p.targetId,sectionLabel:w,text:A,prose:A,headers:["Inhalt"],rows:[[A]]});O.sort((I,L)=>(n.definitions.get(I.targetId)?.start??Number.MAX_SAFE_INTEGER)-(n.definitions.get(L.targetId)?.start??Number.MAX_SAFE_INTEGER)||I.index-L.index).forEach(I=>T(I,w,g+1))};return t.forEach(p=>T(p,"",0)),{sections:a,text:i.join(` + +`),issues:c}}function rj(e){const t=[],n=new Map,a=[],i=fd(e),r=/]*>([\s\S]{0,2048}?)<\/strong\s*>/gi;let c;for(;(c=r.exec(e))&&t.lengthS.join(" | ")).join(` +`);T=T?`${T} +${g}`:g}const m=sj(e,lb(f.rawValue),i);a.push(...m.issues),m.text&&(T=T?`${T} +${m.text}`:m.text),(p.length>1||m.sections.length)&&n.set(c.index,{embedded:p.length>1?p:void 0,linked:m.sections.length?m.sections:void 0})}t.push({index:c.index,label:l,value:T})}return{labels:t,detailsExtras:n,linkIssues:a}}function Px(e,t,n,a){const i=Math.max(0,t-25e4),r=e.slice(i,t),c=new RegExp("<"+n+"\\b([^>]*)>([\\s\\S]*?)<\\/"+n+"\\s*>","gi");let l="",f;for(;f=c.exec(r);){if(a){const T=/class\s*=\s*(?:"([^"]*)"|'([^']*)')/i.exec(f[1]??""),p=T?.[1]??T?.[2]??"";if(!new RegExp("(?:^|\\s)"+a+"(?:\\s|$)","i").test(p))continue}l=sn(f[2]??"")}return l}function oj(e,t,n){const a=Math.max(0,n,t-4e3),i=e.slice(a,t),r=/]*>([\s\S]*?)<\/span\s*>/gi;let c="",l;for(;l=r.exec(i);)c=sn(l[1]??"");return c}function cj(e,t){const n=Math.max(0,t-4e3),a=e.slice(n,t),i=[...a.matchAll(/\+\s*([\d.]+)\s*Point\(s\)/gi)],r=[...a.matchAll(/\bInformative rule\b/gi)],c=i[i.length-1],l=r[r.length-1];return!c&&!l?"":!l||c&&c.index>l.index?c[1]:"0"}function lj(e){return e.replace(/\bhref\s*=\s*"#([a-zA-Z0-9_.:-]+)"/gi,'data-anchor-target="$1"')}function uj(e){return e.replace(/<([a-zA-Z][\w:-]*)\b([^>]*)>/g,(t,n,a)=>{const i=Kr(a,"data-bs-toggle").toLocaleLowerCase("en-US"),r=[Kr(a,"href"),Kr(a,"data-bs-target"),Kr(a,"aria-controls")],c=new Set;if(r.forEach(f=>{const T=/^#?([a-zA-Z0-9_.:-]+)$/.exec(f.trim())?.[1];T&&c.add(T)}),!c.size)return t;const l=i==="modal"?"modal":i==="collapse"?"collapse":"anchor";return t+[...c].map(f=>``).join("")})}function dj(e){return e.replace(//gi,t=>/\bend\s*-->$/i.test(t)?gu:cb)}function Tj(e){const t=dj(lj(uj(sd(e.rawText)))),n=wo(t).text,a=sn(n.slice(0,Math.min(n.length,5e5))),i=w=>w.exec(a)?.[1]??"",r={global:{value:i(/Domain Risk Level\s*:\s*(\d+)\s*\/\s*100/i),source:{fileName:e.file.name,objectPath:"html/risk-score"}},staleObjects:{value:i(/Stale Objects?\s*:\s*(\d+)\s*\/\s*100/i),source:{fileName:e.file.name,objectPath:"html/risk-score/stale-objects"}},privilegedAccounts:{value:i(/Privileged Accounts\s*:\s*(\d+)\s*\/\s*100/i),source:{fileName:e.file.name,objectPath:"html/risk-score/privileged-accounts"}},trusts:{value:i(/Trusts\s*:\s*(\d+)\s*\/\s*100/i),source:{fileName:e.file.name,objectPath:"html/risk-score/trusts"}},anomalies:{value:i(/Anomalies\s*:\s*(\d+)\s*\/\s*100/i),source:{fileName:e.file.name,objectPath:"html/risk-score/anomalies"}}},{labels:c,detailsExtras:l,linkIssues:f}=rj(n),T=c.filter(w=>w.label==="rule id"),p=[],m=[],g=new Set;for(let w=0;wre.index>=C.index&&re.indexO.find(me=>re.includes(me.label)&&me.value)?.value??"",B=Px(n,C.index,"h3"),z=oj(n,C.index,T[w-1]?.index??0)||B||k,K=Px(n,C.index,"h2","indicator-header").replace(/\s+rule details\b[\s\S]*$/i,"").replace(/\s*\[\s*\d+\s+rules?\s+matched[\s\S]*$/i,"").trim(),I={fileName:e.file.name,objectPath:"html/rules/"+k},L=[Mi("risk-id","Rule ID",k,I),Mi("title","Title",z,I),Mi("status","Status","Matched",I)],le=[["description","Description",N("description")],["technical-explanation","Technical explanation",N("technical explanation")],["solution","Advised solution",N("advised solution")],["points-scale","Points Scale",N("points")],["points","Points",cj(n,C.index)],["documentation","Documentation",N("documentation")],["details","Details",N("details")]];B&&B!==z&&le.push(["check-title","Check title",B]),K&&le.push(["category","Category",K]),le.filter(([,,re])=>re).forEach(([re,me,te])=>L.push(Mi(re,me,te,I)));const ue=O.find(re=>re.label==="details"&&re.value),X=ue?l.get(ue.index):void 0,F=[];X?.embedded&&F.push({sectionId:"rule-details-"+tp(k),sectionLabel:"Details",text:"",prose:"",headers:X.embedded[0]??[],rows:X.embedded.slice(1)}),X?.linked&&F.push(...X.linked),F.length&&L.push(KM(F,I)),fb(L,K,r),p.push({version:1,id:"candidate-pingcastle-html-"+tp(k)+"-"+p.length,source:I,fields:L})}const S=f.map(w=>({severity:"warning",code:"pingcastle-linked-section-"+w.code,message:w.code==="unresolved"?"Ein interner PingCastle-Detailverweis konnte nicht aufgelöst werden.":w.code==="ambiguous"?"Ein interner PingCastle-Detailverweis besitzt mehrere gleichnamige Ziele und wurde nicht automatisch aufgelöst.":"Die rekursive PingCastle-Detailauflösung wurde durch ein Ressourcenlimit begrenzt.",stage:"extraction",source:{fileName:e.file.name,objectPath:"html/linked-sections/"+w.targetId},details:{targetId:w.targetId,reason:w.code}}));T.length>n0&&S.push({severity:"warning",code:"pingcastle-rule-limit",message:"Der PingCastle-Bericht enthält mehr als "+n0+" Regelblöcke; die Extraktion wurde begrenzt.",stage:"extraction"});const x=pj(e),y=XM(e.file.name,n,p);return y.section&&x.push({...y.section,ordinal:x.length}),{candidates:p,diagnostics:[...S,...m,...y.diagnostics],reportSections:x,environmentObservations:xj(e,x.filter(w=>w.sectionKey!=="pingcastle-rule-coverage"),r)}}const fj=new Set(["sectionStaleObjects","sectionPrivilegedAccounts","sectionTrusts","sectionAnomaliesanalysis"]);function np(e,t=!1,n=fd(e)){const a=[],i=/]*)>/gi;let r;const c=new Set;for(;r=i.exec(e);){const f=Kr(r[1]??"","id");if(!/^section[a-zA-Z0-9_.:-]+$/i.test(f)||c.has(f))continue;const T=om(e,f,n);T&&(c.add(f),a.push({...T,sectionKey:f}))}a.sort((f,T)=>f.start-T.start||T.end-f.end),a.forEach(f=>{const T=a.filter(p=>p.sectionKey!==f.sectionKey&&p.bodyStart<=f.start&&p.end>=f.end).sort((p,m)=>p.end-p.start-(m.end-m.start))[0];T&&(f.parentSectionKey=T.sectionKey)});const l=new Set;return a.forEach(f=>{(fj.has(f.sectionKey)||f.parentSectionKey&&l.has(f.parentSectionKey))&&l.add(f.sectionKey)}),t?a:a.filter(f=>!l.has(f.sectionKey))}function _x(e){const t=e.headerCandidates[0],n=t?.headers??e.columns.map(i=>i.headerCandidates[0]?.value??`Spalte ${i.index+1}`),a=e.rows.filter(i=>i.index!==t?.rowIndex).map(i=>i.cells.map(r=>r.decodedValue));return{headers:n,rows:a}}function hj(e,t){return/reserved for customers who have purchased a license/i.test(e)?"license-restricted":/access denied/i.test(e)&&!t.some(n=>n.rows.length)?"access-denied":t.some(n=>n.rows.length)?"observed":/\bno\s+[^.\n]{0,160}\s+(?:has|have|were|was)\s+been\s+found\b/i.test(e)||/\bnumber of [^:\n]{0,100}:\s*0\b/i.test(e)?"explicitly-absent":e.trim()?"observed":(t.length,"empty")}function pj(e){const t=wo(e.rawText).text,n=fd(t),a=np(t,!1,n),i=np(t,!0,n),r=rd(t),l=r.map((T,p)=>({span:T,index:p})).filter(({span:T})=>!i.some(p=>T.start>=p.start&&T.end<=p.end)).map(T=>T.index).filter(T=>e.tables[T]).map(T=>{const p=e.tables[T],m=_x(p);return{name:p.name,sourceTableIndex:p.index,headers:m.headers,rows:m.rows}});return[{version:1,sectionKey:"report-overview",label:"Report overview",ordinal:0,state:l.some(T=>T.rows.length)?"observed":"empty",tables:l,source:{fileName:e.file.name,objectPath:"html/report-overview"},attributes:{tableCount:l.length}},...a.map((T,p)=>{const m=a.filter(C=>C.parentSectionKey===T.sectionKey),g=ub(t.slice(T.bodyStart,T.bodyEnd),m.map(C=>({start:C.start-T.bodyStart,bodyStart:C.bodyStart-T.bodyStart,bodyEnd:C.bodyEnd-T.bodyStart,end:C.end-T.bodyStart}))),S=sn(/]*>([\s\S]*?)<\/h[1-6]\s*>/i.exec(g)?.[1]??"")||T.sectionKey,x=ob(g.replace(/]*>[\s\S]*?<\/h[1-6]\s*>/gi," ")).trim(),w=r.map((C,k)=>({span:C,index:k})).filter(({span:C})=>C.start>=T.bodyStart&&C.end<=T.bodyEnd&&!m.some(k=>C.start>=k.start&&C.end<=k.end)).map(C=>C.index).filter(C=>e.tables[C]).map(C=>{const k=e.tables[C],E=_x(k);return{name:k.name,sourceTableIndex:k.index,headers:E.headers,rows:E.rows}});return{version:1,sectionKey:T.sectionKey,parentSectionKey:T.parentSectionKey,label:S,ordinal:p+1,state:hj(x,w),prose:x||void 0,tables:w,source:{fileName:e.file.name,objectPath:`html/sections/${T.sectionKey}`},attributes:{tableCount:w.length}}})]}function $i(e){return e.toLocaleLowerCase("en-US").replace(/[^a-z0-9]+/g,".").replace(/^\.|\.$/g,"")||"value"}function mj(e,t,n){const a=rm(n),i={domain:"domain.fqdn","netbios name":"domain.netbios_name","domain functional level":"domain.functional_level","forest functional level":"forest.functional_level","creation date":"domain.created_at","dc count":"domain.controller_count","number of dc":"domain.controller_count","schema version":"forest.schema_version","recycle bin enabled":"domain.recycle_bin_enabled"};return(/domaininformation/i.test(e)||/domain\s*information|directory/i.test(t))&&i[a]?i[a]:{"operating system":"operating_system.name","nb os":"operating_system.count","trust partner":"trust.partner","trust direction":"trust.direction","trust type":"trust.type","password policy":"password_policy.name","minimum password length":"password_policy.minimum_length","password history":"password_policy.history_length","maximum password age":"password_policy.maximum_age","certificate authority":"pki.certificate_authority.name","certificate template":"pki.certificate_template.name"}[a]}function Lc(e){return e.toLocaleLowerCase("en-US").replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"value"}function gj(e){const t=wo(e.rawText).text,n=np(t,!0),a=[],i=/]*>([\s\S]*?)<\/h2\s*>/gi;let r;for(;r=i.exec(t);){const l=sn(r[1]??"").trim();l&&a.push({start:r.index,label:l})}const c=new Map;return rd(t).forEach((l,f)=>{const p=n.filter(S=>l.start>=S.bodyStart&&l.end<=S.bodyEnd).sort((S,x)=>x.end-x.start-(S.end-S.start))[0];if(!p)return;const m=a.filter(S=>S.start>=p.bodyStart&&S.start{const f=n.filter(T=>l.start>=T.bodyStart&&l.startT.end-T.start-(p.end-p.start))[0];return f?[{sectionKey:f.sectionKey,label:l.label}]:[]})}}function db(e){return/domaininformation/i.test(e)?"domain-information":/computerinformation|computer/i.test(e)?"computer-information":/user/i.test(e)?"user-information":/admingroups/i.test(e)?"admin-groups":/controlpathsanalysis/i.test(e)?"control-paths-analysis":/infrastructure/i.test(e)?"infrastructure":/anomalies/i.test(e)?"anomalies":/passwordpolicies/i.test(e)?"password-policies":/^sectiongpo$/i.test(e)?"gpo":/trust/i.test(e)?"trusts-details":/pki|certificate/i.test(e)?"pki":void 0}function vj(e,t,n,a){const i=new Set(a.map(rm));if(/neverexpiresuser/i.test(e))return"user-information.password-age-distribution";if(/enabledtrusteddelegationcomputer/i.test(e))return"computer-information.account-analysis";if(/userinformation/i.test(e)&&i.has("nb user accounts"))return"user-information.account-analysis";if(/userinformation/i.test(e)&&/^account\s+list$/i.test(n))return"user-information.honey-pot";const r=db(e);return r?t?`${r}.${Lc(t)}`:r:"pingcastle-table-row"}function ap(e){const t=e.trim();return/^(?:true|yes)$/i.test(t)?{normalizedValue:!0,valueType:"boolean"}:/^(?:false|no)$/i.test(t)?{normalizedValue:!1,valueType:"boolean"}:/^-?\d+(?:\.\d+)?$/.test(t)?{normalizedValue:Number(t),valueType:"number"}:/^\d{4}-\d{2}-\d{2}(?:[ T].*)?Z?$/i.test(t)?{normalizedValue:t,valueType:"datetime"}:{normalizedValue:t,valueType:"string"}}function ks(e,t){e.push({version:1,attributes:{},...t})}function xj(e,t,n){const a=[],i=sn(wo(e.rawText).text),r=gj(e),c=/Date:\s*(\d{4}-\d{2}-\d{2})\s*-\s*Engine version:\s*([^\s<]+)/i.exec(i);c&&(ks(a,{subject:{type:"scanner-report",identity:e.file.name},property:"report.generated_at",label:"Report generation date",originalValue:c[1],normalizedValue:c[1],valueType:"datetime",state:"observed",observedAt:c[1],source:{fileName:e.file.name,objectPath:"html/report-metadata/date"}}),ks(a,{subject:{type:"scanner-report",identity:e.file.name},property:"report.engine_version",label:"PingCastle engine version",originalValue:c[2],normalizedValue:c[2],valueType:"string",state:"observed",source:{fileName:e.file.name,objectPath:"html/report-metadata/engine-version"}})),[["risk.domain","Domain Risk Level",n.global],["risk.stale_objects","Stale Objects score",n.staleObjects],["risk.privileged_accounts","Privileged Accounts score",n.privilegedAccounts],["risk.trusts","Trusts score",n.trusts],["risk.anomalies","Anomalies score",n.anomalies]].forEach(([p,m,g])=>{g?.value&&ks(a,{subject:{type:"active-directory-environment"},property:p,label:m,originalValue:g.value,normalizedValue:Number(g.value),valueType:"number",state:"observed",source:g.source,attributes:{maximum:100}})}),t.forEach(p=>{p.tables.forEach((m,g)=>{const S=m.sourceTableIndex===void 0?void 0:r.tableLabels.get(m.sourceTableIndex),x=vj(p.sectionKey,S,m.name,m.headers),y=x==="pingcastle-table-row"?{type:"report-section",identity:p.sectionKey,label:p.label}:{type:x,identity:`${p.sectionKey}:${Lc(S??m.name)}`,label:S??m.name};if(ks(a,{subject:y,property:`inventory.${$i(p.sectionKey)}.${$i(m.name)}.row_count`,label:`${m.name} row count`,originalValue:m.rows.length,normalizedValue:m.rows.length,valueType:"number",state:m.rows.length?"observed":p.state==="observed"?"empty":p.state,sectionKey:p.sectionKey,source:{fileName:e.file.name,tableIndex:m.sourceTableIndex,objectPath:`html/sections/${p.sectionKey}/tables/${g}/row-count`}}),!m.rows.length){ks(a,{subject:y,property:`section.${$i(p.sectionKey)}.table.${g}.presence`,label:m.name,originalValue:null,valueType:"object",state:p.state==="observed"?"empty":p.state,sectionKey:p.sectionKey,source:{fileName:e.file.name,tableIndex:m.sourceTableIndex,objectPath:`html/sections/${p.sectionKey}/tables/${g}`}});return}m.rows.forEach((w,C)=>{const k=w.map(O=>typeof O=="string"?O:String(O??"")),E=k.find(O=>O.trim())||`${p.sectionKey}:row-${C+1}`;k.forEach((O,N)=>{const B=m.headers[N]||`Column ${N+1}`;if(!O.trim())return;const A=ap(O),z=mj(p.sectionKey,m.name,B);ks(a,{subject:{type:x,identity:E,label:E},property:z??`pingcastle.${$i(p.sectionKey)}.${$i(m.name)}.${$i(B)}`,label:B,originalValue:O,...A,state:"observed",sectionKey:p.sectionKey,source:{fileName:e.file.name,tableIndex:m.sourceTableIndex,rowIndex:C+1,columnIndex:N},attributes:{tableName:m.name,...S?{subsectionLabel:S}:{}}})})})})});const l=new Set([...r.tableLabels.entries()].map(([p,m])=>{const g=t.find(S=>S.tables.some(x=>x.sourceTableIndex===p));return g?`${g.sectionKey}\0${m}`:""})),f=new Set(["sectionDomainInformation\0Entra ID Configuration","sectionAnomalies\0Backup","sectionAnomalies\0LAPS","sectionAnomalies\0Windows Event Forwarding (WEF)","sectionAnomalies\0krbtgt (Used for Golden ticket attacks)"]);return r.headings.forEach(({sectionKey:p,label:m})=>{const g=`${p}\0${m}`;if(l.has(g)||f.has(g)||!t.some(y=>y.sectionKey===p))return;const S=db(p);if(!S)return;const x=`${S}.${Lc(m)}`;ks(a,{subject:{type:x,identity:`${p}:${Lc(m)}`,label:m},property:`section.${$i(p)}.subsection.${$i(m)}.presence`,label:m,originalValue:null,valueType:"object",state:"observed",sectionKey:p,source:{fileName:e.file.name,objectPath:`html/sections/${p}/subsections/${Lc(m)}`},attributes:{subsectionLabel:m}})}),[[/Last backup date:\s*([^\s]+(?:\s+[^\s]+)?)/i,"backup.last_detected_at","Last detected AD backup","datetime"],[/Legacy LAPS installation date:\s*(Never|\d{4}-\d{2}-\d{2}(?:[ T][0-9:.+-]+Z?)?)/i,"laps.legacy.installation_date","Legacy LAPS installation date","datetime"],[/Windows LAPS installation date:\s*(Never|\d{4}-\d{2}-\d{2}(?:[ T][0-9:.+-]+Z?)?)/i,"laps.windows.installation_date","Windows LAPS installation date","datetime"],[/Number of WEF configuration found:\s*(\d+)/i,"logging.wef.configuration_count","WEF configuration count","number"],[/Kerberos password last changed:\s*([^\s]+(?:\s+[^\s]+)?)/i,"kerberos.krbtgt.password_last_changed","krbtgt password last changed","datetime"],[/Kerberos password last changed:[\s\S]{0,200}?version:\s*(\d+)/i,"kerberos.krbtgt.version","krbtgt version","number"]].forEach(([p,m,g,S])=>{const x=p.exec(i)?.[1]?.trim();if(!x)return;const y=/^never$/i.test(x),w=S==="number"?{normalizedValue:Number(x),valueType:S}:{normalizedValue:x,valueType:S},C=m==="backup.last_detected_at"?["anomalies.backup","sectionAnomalies"]:m.startsWith("laps.")?["anomalies.laps","sectionAnomalies"]:m==="logging.wef.configuration_count"?["anomalies.windows-event-forwarding-wef","sectionAnomalies"]:m.startsWith("kerberos.krbtgt.")?["anomalies.krbtgt-used-for-golden-ticket-attacks","sectionAnomalies"]:["active-directory-environment",void 0];ks(a,{subject:{type:C[0]},property:m,label:g,originalValue:x,...w,state:y?"explicitly-absent":"observed",sectionKey:C[1],source:{fileName:e.file.name,objectPath:`html/facts/${m}`}})}),/No Entra ID configuration has been found in this domain/i.test(i)&&ks(a,{subject:{type:"domain-information.entra-id-configuration"},property:"entra.configuration_detected",label:"Entra ID configuration detected",originalValue:!1,normalizedValue:!1,valueType:"boolean",state:"explicitly-absent",sectionKey:"sectionDomainInformation",source:{fileName:e.file.name,objectPath:"html/facts/entra-configuration"}}),a}function cm(e){return e.views.find(t=>t.kind==="hierarchy")}function Tb(e){const t=new Map;return cm(e)?.nodes.forEach(n=>{const a=/^(.*\/RiskRules\[\d+\]\/HealthcheckRiskRule\[\d+\])(?:\/([^/]+)\[\d+\])?/i.exec(n.path);if(!a)return;const i=a[1],r=a[2],c=t.get(i)??{path:i,direct:new Map,details:[]};r?n.path.slice(i.length+1).includes("/")?/\/(?:Details|ExtraDetails)\[\d+\]\//i.test(n.path)&&Ni(n)&&c.details.push(n):c.direct.set(r.toLocaleLowerCase("en-US"),n):c.root=n,t.set(i,c)}),[...t.values()]}function Ni(e){return typeof e?.value=="string"?e.value.trim():e?.value==null?"":String(e.value)}function yj(e,t){return cm(e)?.nodes.find(n=>new RegExp("^HealthcheckData/"+t+"\\[\\d+\\]$","i").test(n.path))}function Sj(e){const t=n=>{const a=yj(e,n),i=Ni(a);return a&&i?{value:i,source:a.source}:void 0};return{global:t("GlobalScore"),staleObjects:t("StaleObjectsScore"),privilegedAccounts:t("PrivilegiedGroupScore"),trusts:t("TrustScore"),anomalies:t("AnomalyScore")}}function bj(e,t){const n=e.replace(/[^a-z]/gi,"").toLocaleLowerCase("en-US");if(n==="staleobjects")return t.staleObjects;if(n==="privilegedaccounts"||n==="privilegiedaccounts")return t.privilegedAccounts;if(n==="trusts")return t.trusts;if(n==="anomalies")return t.anomalies}function fb(e,t,n){n.global?.value&&e.push(Mi("global-score","Domain Risk Level",n.global.value,n.global.source));const a=bj(t,n);a?.value&&e.push(Mi("category-score","Category Score",a.value,a.source))}function wj(e){const t=e.filter(r=>/\/Details\[\d+\]\//i.test(r.path)).map(Ni).filter(Boolean),n=e.filter(r=>/\/ExtraDetails\[\d+\]\//i.test(r.path)),i=[...new Set(n.map(r=>/^(.*\/DetailItemBase\[\d+\])/i.exec(r.path)?.[1]).filter(r=>!!r))].map(r=>{const c=n.filter(T=>T.path.startsWith(r+"/")),l=Ni(c.find(T=>/\/Name\[\d+\]$/i.test(T.path))),f=c.filter(T=>/\/(?:Value\[\d+\]|Values\[\d+\]\/string\[\d+\])$/i.test(T.path)).map(Ni).filter(Boolean);return l&&f.length?l+": "+f.join(", "):""}).filter(Boolean);return[...t,...i]}function Cj(e){const t=Tb(e),n=Sj(e),a=[],i=new Set,r=[];for(const m of t){if(a.length>=n0)break;const g=m.direct.get("riskid"),S=Ni(g);if(!ib(S,i,g?.source??{fileName:e.file.name,objectPath:m.path},r))continue;const x=m.direct.get("rationale"),y=m.direct.get("notice"),w=g?.source??m.root?.source??{fileName:e.file.name,objectPath:m.path},C=[Mi("risk-id","Rule ID",S,w),Mi("rationale","Title",Ni(x)||Ni(y)||S,x?.source??w),Mi("status","Status","Matched",w)];[["category","Category","Category"],["model","Model","Model"],["points","Points","Points"],["notice","Evidence","Notice"],["noticetooltip","Evidence","NoticeTooltip"]].forEach(([O,N,B])=>{const A=m.direct.get(O),z=Ni(A);z&&C.push(Mi(B,N,z,A?.source??w))});const E=wj(m.details);E.length&&C.push(Mi("Details","Details",E.join(` +`),m.details[0]?.source??w)),fb(C,Ni(m.direct.get("category")),n),a.push({version:1,id:"candidate-pingcastle-xml-"+tp(S)+"-"+a.length,source:w,fields:C})}const c=[...r,{severity:"warning",code:"pingcastle-xml-results-unavailable",message:"PingCastle-XML wird als eigenständiger Import verarbeitet. Results sind nur aus dem zugehörigen HTML-Bericht verfügbar.",stage:"extraction",source:{fileName:e.file.name,objectPath:"HealthcheckData/RiskRules"}}];t.length>n0&&c.push({severity:"warning",code:"pingcastle-rule-limit",message:"Der PingCastle-Bericht enthält mehr als "+n0+" RiskRules; die Extraktion wurde begrenzt.",stage:"extraction"});const l=cm(e)?.nodes.filter(m=>!/\/RiskRules\[\d+\](?:\/|$)/i.test(m.path))??[],f=new Set(l.map(m=>m.path.slice(0,m.path.lastIndexOf("/")))),T=[];for(const m of l){const g=Ni(m),S=m.attributes.xmlAttributes,x=S&&typeof S=="object"&&!Array.isArray(S)?Object.entries(S).filter(w=>typeof w[1]=="string"):[],y={version:1,subject:{type:"pingcastle-xml-node",identity:m.path},property:`pingcastle.xml.${$i(m.path)}`,label:m.name,sectionKey:"HealthcheckData",source:m.source,attributes:{xmlPath:m.path}};(g||!f.has(m.path)&&!x.length&&!m.attributes.serialized)&&T.push({...y,originalValue:g||null,...g?ap(g):{valueType:"object"},state:g?"observed":"empty"});for(const[w,C]of x)T.push({...y,property:`${y.property}.attribute.${$i(w)}`,label:`${m.name} @${w}`,originalValue:C,...ap(C),state:C.length?"observed":"empty",source:{...m.source,objectPath:`${m.path}/@${w}`},attributes:{...y.attributes,attributeName:w}});!S&&typeof m.attributes.serialized=="string"&&m.attributes.serialized&&(T.push({...y,property:`${y.property}.serialized.attributes`,label:`${m.name} attributes`,originalValue:m.attributes.serialized,valueType:"string",state:"unsupported"}),c.push({severity:"warning",code:"pingcastle-xml-attributes-unstructured",stage:"extraction",source:m.source,message:"XML-Attribute liegen nur als Anzeigezeichenkette vor. Der Originalwert bleibt erhalten, eine Attributnormalisierung erfolgt nicht."}))}const p={version:1,sectionKey:"HealthcheckData",label:"PingCastle HealthcheckData",ordinal:0,state:T.some(m=>m.state==="observed")?"observed":"empty",tables:[{name:"HealthcheckData context",headers:["Path","Value"],rows:T.map(m=>[m.source.objectPath??"",m.originalValue])}],source:{fileName:e.file.name,objectPath:"HealthcheckData"},attributes:{representation:"xml-hierarchy"}};return{candidates:a,diagnostics:c,reportSections:[p],environmentObservations:T}}function qx(e){return e.format==="XML"&&e.tables.some(t=>String(t.attributes.rootElement??"").toLocaleLowerCase("en-US")==="healthcheckdata")}const Ej={id:"pingcastle-healthcheck-source-extractor",version:"2.2.1",detect(e){if(qx(e)){const r=Tb(e).length;return{score:r?1:.9,evidence:["XML-Wurzelelement HealthcheckData erkannt.",...r?[r+" native PingCastle-RiskRule-Struktur(en) erkannt."]:[]]}}if(e.format!=="HTML"||!/ping[\s_-]*castle/i.test(e.rawText.slice(0,5e5)))return{score:0,evidence:[]};const t=e.views.find(r=>r.kind==="text"),n=t?.kind==="text"?t.text:"",a=/\bRule\s*ID\s*:/i.test(n),i=/rules?\s+matched|healthcheck/i.test(n.slice(0,2e6));return{score:a?1:i?.85:.7,evidence:["PingCastle-Marker im HTML-Bericht erkannt.",...a?["Native PingCastle-Regelblöcke mit Rule ID erkannt."]:[]]}},extract(e){return{version:1,...qx(e)?Cj(e):Tj(e)}}};function an(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}const Pc={depth:128,values:1e6,characters:16*1024*1024,string:1e6};class Zi extends Error{}function hb(e,t){let n=t,a=0;const i=()=>{throw new Zi("Unsupported, malformed or oversized static report data.")},r=()=>{n-t>Pc.characters&&i()},c=()=>{for(;n{const p=e[n++];let m="";for(;nPc.string&&i();let g=e[n++];if(g===p)return m;if(p==="`"&&g==="$"&&e[n]==="{"&&i(),g==="\\"){if(g=e[n++],g===void 0&&i(),g==="\r"||g===` +`){g==="\r"&&e[n]===` +`&&n++;continue}const S={n:` +`,r:"\r",t:" ",b:"\b",f:"\f",v:"\v",0:"\0"};if(g==="x"||g==="u"){const x=g==="u"&&e[n]==="{";x&&n++;const y=x?e.indexOf("}",n)-n:g==="x"?2:4;(y<1||y>6)&&i();const w=e.slice(n,n+y);(w.length!==y||!/^[\da-f]+$/i.test(w))&&i();const C=Number.parseInt(w,16);C>1114111&&i(),m+=String.fromCodePoint(C),n+=y+(x?1:0)}else(/[1-9]/.test(g)||g==="0"&&/\d/.test(e[n]??""))&&i(),m+=S[g]??g}else p!=="`"&&g.charCodeAt(0)<32&&i(),p==="`"&&g==="\r"&&(e[n]===` +`&&n++,g=` +`),m+=g}return i()},f=p=>{(p>Pc.depth||++a>Pc.values)&&i(),c();const m=e[n];if(m==='"'||m==="'"||m==="`")return l();if(m==="{"){n++;const x=Object.create(null);for(c();e[n]!=="}";){c();const y=e[n]==='"'||e[n]==="'",w=y?l():/^[A-Za-z_$][\w$]*/.exec(e.slice(n,n+256))?.[0];if(w===void 0)return i();if(y||(n+=w.length),Object.hasOwn(x,w)&&i(),c(),e[n++]!==":"&&i(),x[w]=f(p+1),c(),e[n]==="}")break;e[n++]!==","&&i(),c()}return n++,x}if(m==="["){n++;const x=[];for(c();e[n]!=="]"&&(x.push(f(p+1)),c(),e[n]!=="]");)e[n++]!==","&&i(),c();return n++,x}const g=/^(?:true|false|null|!\s*[01]|-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)/.exec(e.slice(n,n+128))?.[0];if(!g)return i();if(n+=g.length,g==="null")return null;if(g==="true"||/^!\s*0$/.test(g))return!0;if(g==="false"||/^!\s*1$/.test(g))return!1;const S=Number(g);return Number.isFinite(S)?S:i()};c(),e[n]!=="{"&&i();const T=f(0);return c(),n{if(++r>Pc.depth)throw new Zi("Static report script nesting limit exceeded.");try{for(n++;n{let T=1;for(;ne.length)throw new Zi("Invalid assignment locator.");n=p.start,yield p,a="";continue}a=T,n+=T.length,i=!/^(?:return|throw|case|typeof|void|delete|new|yield|await|in|of|instanceof)$/.test(T);continue}if(!t&&f==="="&&a&&!/[=!<>]/.test(e[n-1]??"")&&!/[=>]/.test(e[n+1]??"")){const p=/^\s*/.exec(e.slice(n+1))[0].length+n+1;e[p]==="{"&&(yield{start:p,binding:a})}a="",i=/[\d)\]}]/.test(f),n++}}const lm={FailedCount:"Failed",PassedCount:"Passed",ErrorCount:"Error",InvestigateCount:"Investigate",SkippedCount:"Skipped",NotRunCount:"NotRun"};function kj(e,t){const n=Array.isArray(e.Tests)?e.Tests:[],a=new Map;for(const i of n)an(i)&&typeof i.Result=="string"&&a.set(i.Result,(a.get(i.Result)??0)+1);return Object.entries({TotalCount:n.length,...Object.fromEntries(Object.entries(lm).map(([i,r])=>[i,a.get(r)??0]))}).flatMap(([i,r])=>{if(!(i in e))return[];const c=e[i];return typeof c!="number"||!Number.isSafeInteger(c)||c<0?[{severity:"warning",code:"maester-count-invalid",stage:"extraction",message:`Die deklarierte Maester-Zahl ${i} ist keine gültige Testanzahl.`,details:{objectPath:`${t}.${i}`}}]:c===r?[]:[{severity:"warning",code:"maester-count-mismatch",stage:"extraction",message:`Maester ${i}: ${c} deklariert, ${r} aus Einzeltests gezählt. Originalwerte bleiben erhalten.`,details:{objectPath:`${t}.${i}`,counter:i,declared:c,actual:r}}]})}const Aj={TenantId:{property:"entra.tenant_id",label:"Entra tenant ID"},TenantName:{property:"entra.tenant_name",label:"Entra tenant name"},ExecutedAt:{property:"report.generated_at",label:"Scan time",valueType:"datetime"},CurrentVersion:{property:"report.engine_version",label:"Maester version"},TotalDuration:{property:"maester.duration",label:"Scan duration",valueType:"duration"},Result:{property:"maester.result",label:"Reported overall result",valueType:"enum"},TotalCount:{property:"maester.tests.declared_total",label:"Reported test count"},...Object.fromEntries(Object.entries(lm).map(([e,t])=>[e,{property:`maester.tests.declared_${t.toLowerCase()}`,label:`Reported ${t} count`}]))};function Bx(e,t,n,a){const i=[],r=[],c=`maester-context-${a}`,l={type:"maester-report",identity:typeof t.TenantId=="string"?t.TenantId:n},f=typeof t.ExecutedAt=="string"&&!Number.isNaN(Date.parse(t.ExecutedAt))?new Date(t.ExecutedAt).toISOString():void 0,T=Object.entries(t).filter(([m])=>m!=="Tests");if(!T.length)return{reportSections:i,environmentObservations:r};i.push({version:1,sectionKey:c,label:"Maester report context",ordinal:a,state:"observed",tables:[{name:"Report metadata",headers:["Property","Original value"],rows:T.map(([m,g])=>[m,g])}],source:{fileName:e,objectPath:n},attributes:{kind:"maester-report-context"}});for(const[m,g]of T){const S=Aj[m],x=g===null||g===""||Array.isArray(g)&&g.length===0,y=g!==null&&typeof g=="object"?"object":typeof g=="number"?"number":typeof g=="boolean"?"boolean":"string";r.push({version:1,subject:l,property:S?.property??`maester.source.${m}`,label:S?.label??m.replace(/([a-z])([A-Z])/g,"$1 $2"),originalValue:g,normalizedValue:g,valueType:S?.valueType??y,state:x?"empty":"observed",observedAt:f,sectionKey:c,source:{fileName:e,objectPath:`${n}.${m}`},attributes:{sourceField:m,declared:m.endsWith("Count")}})}for(const[m,g,S,x]of[["SystemInfo","MachineName","maester.runner.host","Scanner host"],["SystemInfo","OSDescription","maester.runner.os","Scanner operating system"],["PowerShellInfo","Version","maester.powershell.version","PowerShell version"]]){const y=t[m];if(!an(y)||!(g in y))continue;const w=y[g];r.push({version:1,subject:l,property:S,label:x,originalValue:w,normalizedValue:w,valueType:w!==null&&typeof w=="object"?"object":"string",state:w===null||w===""?"empty":"observed",observedAt:f,sectionKey:c,source:{fileName:e,objectPath:`${n}.${m}.${g}`},attributes:{sourceField:`${m}.${g}`,scope:"scanner-runtime"}})}if(!Array.isArray(t.Tests))return{reportSections:i,environmentObservations:r};const p=Array.isArray(t.Tests)?t.Tests:[];for(const[m,g]of Object.entries({total:"",...Object.fromEntries(Object.values(lm).map(S=>[S.toLowerCase(),S]))})){const S=g?p.filter(x=>an(x)&&x.Result===g).length:p.length;r.push({version:1,subject:l,property:`maester.tests.actual_${m}`,label:`Counted ${m} tests`,originalValue:S,normalizedValue:S,valueType:"number",state:"observed",observedAt:f,sectionKey:c,source:{fileName:e,objectPath:`${n}.Tests`},attributes:{derived:!0,derivation:"count-test-entries",status:g}})}return{reportSections:i,environmentObservations:r}}const $f=25e4,Ux=new WeakMap,Rj=/^\{\s*["']?(?:Result|Tests|Tenants|TenantId|TenantName|TotalCount|FailedCount|ExecutedAt|MaesterConfig)["']?\s*:/,Dj=/["']?(?:Tests|Tenants|FailedCount|MaesterConfig)["']?\s*:/;function*Ij(e){try{yield*pb(e)}catch(t){throw t instanceof Zi?new Ia("Die eingebettete Scriptstruktur überschreitet die sichere Lesegrenze.",[{severity:"error",code:"maester-script-limit",stage:"extraction",message:"Die eingebettete Scriptstruktur ist zu tief verschachtelt."}]):t}}function zx(e){if(e.format!=="HTML")return{roots:[],recognized:!1,diagnostics:[]};const t=Ux.get(e);if(t)return t;const n={roots:[],recognized:!1,diagnostics:[]};let a=0;for(const i of e.rawText.matchAll(/]*)>([\s\S]*?)<\/script\s*>/gi)){const r=i[2],c=/\btype\s*=\s*["']application\/json["']/i.test(i[1])?[{start:r.search(/\S/),binding:"json-data"}]:Ij(r);let l=-1;for(const{start:f,binding:T}of c){const p=/^(?:testResults|maesterData|maesterReportData)$/i.test(T),m=p||Dj.test(r.slice(f,f+512));if(!(f32){n.recognized=!0,n.diagnostics.push({severity:"error",code:"maester-payload-limit",stage:"extraction",message:"Zu viele mögliche Maester-Datenobjekte im Bericht."});break}try{const g=hb(r,f);l=g.end;const S=g.value;if(Array.isArray(S.Tenants)){if(n.recognized=!0,n.roots.length)throw new Zi("Ambiguous report roots.");n.envelope=Object.fromEntries(Object.entries(S).filter(([x])=>x!=="Tenants"));for(const[x,y]of S.Tenants.entries()){if(!an(y)||!Array.isArray(y.Tests))throw new Zi("Invalid tenant tests.");n.roots.push({value:y,path:`$.Tenants[${x}]`})}}else if(Array.isArray(S.Tests)&&("Result"in S||"EndOfJson"in S)){if(n.recognized=!0,n.roots.length)throw new Zi("Ambiguous report roots.");n.roots.push({value:S,path:"$"})}else if(m)throw new Zi("Invalid report shape.")}catch(g){if(!(g instanceof Zi))throw g;m&&(n.recognized=!0,n.diagnostics.push({severity:"error",code:"maester-payload-invalid",stage:"extraction",message:"Maester-Daten erkannt, aber nicht sicher vollständig lesbar. Nur statische Datenobjekte ohne Ausdrücke sind zulässig; beschädigte, mehrdeutige oder zu große Berichte werden nicht importiert."}))}}}}return!n.recognized&&/maester/i.test(e.rawText)&&/\b(?:testResults|maesterData)\s*=/.test(e.rawText)&&(n.recognized=!0,n.diagnostics.push({severity:"error",code:"maester-payload-invalid",stage:"extraction",message:"Ein Maester-Bericht wurde erkannt, seine Ergebnisdaten liegen aber nicht als unterstütztes statisches Datenobjekt vor."})),Ux.set(e,n),n}function vu(e,t,n,a,i,r=ts(i)){return{key:n,label:a,originalValue:i,decodedValue:r,source:{fileName:e,objectPath:`${t}.${n}`}}}function qn(e,t,n,a,i,r,c){r!==void 0&&e.push(vu(t,n,a,i,r,c))}function Nj(e,t,n,a){const i=an(t.ResultDetail)?t.ResultDetail:{},r=[];qn(r,e,n,"Id","ID",t.Id),qn(r,e,n,"Title","Title",t.Title),(t.Title===void 0||t.Title===null||t.Title==="")&&qn(r,e,n,"Name","Title",t.Name),qn(r,e,n,"Result","Result",t.Result),qn(r,e,n,"Severity","Severity",t.Severity),(t.Severity===void 0||t.Severity===null||t.Severity==="")&&i.Severity!==void 0&&qn(r,e,`${n}.ResultDetail`,"Severity","Severity",i.Severity),qn(r,e,n,"Tag","Tag",t.Tag),qn(r,e,n,"Block","Block",t.Block),qn(r,e,n,"Duration","Duration",t.Duration),qn(r,e,`${n}.ResultDetail`,"TestDescription","Description",i.TestDescription,ga(i.TestDescription)),qn(r,e,`${n}.ResultDetail`,"TestResult","ResultDetail",i.TestResult,ga(i.TestResult)),qn(r,e,`${n}.ResultDetail`,"TestSkipped","TestSkipped",i.TestSkipped),qn(r,e,`${n}.ResultDetail`,"SkippedReason","SkippedReason",i.SkippedReason),qn(r,e,n,"ErrorRecord","ErrorMessage",t.ErrorRecord),qn(r,e,n,"Name","Name",t.Name),qn(r,e,n,"HelpUrl","HelpUrl",t.HelpUrl),qn(r,e,n,"ScriptBlockFile","TestScriptFile",t.ScriptBlockFile),qn(r,e,n,"ScriptBlock","TestScript",t.ScriptBlock),qn(r,e,`${n}.ResultDetail`,"Service","Service",i.Service);const c=new Set(["Id","Title","Result","Severity","Tag","Block","Duration","ErrorRecord","Name","HelpUrl","ScriptBlockFile","ScriptBlock","ResultDetail"]);for(const[f,T]of Object.entries(t))c.has(f)||r.push(vu(e,n,f,f,T));const l=new Set(["TestDescription","TestResult","TestSkipped","SkippedReason","Service"]);for(const[f,T]of Object.entries(i))l.has(f)||r.push(vu(e,`${n}.ResultDetail`,f,`ResultDetail.${f}`,T));return t.ResultDetail!==void 0&&!an(t.ResultDetail)&&r.push(vu(e,n,"ResultDetail","ResultDetail",t.ResultDetail)),{version:1,id:`maester-test-${a}`,source:{fileName:e,objectPath:n},fields:r}}const Oj={id:"maester-html-source-extractor",version:"1.1.0",detect(e){const t=zx(e),n=t.roots.reduce((a,i)=>a+(Array.isArray(i.value.Tests)?i.value.Tests.length:0),0);return t.recognized&&(n>0||t.diagnostics.length>0)?{score:1,toolId:"maester",evidence:[`Strukturiertes Maester-Ergebnisobjekt mit ${n} Testeinträgen erkannt.`]}:{score:0,evidence:[]}},extract(e){const t=zx(e);if(t.diagnostics.some(f=>f.severity==="error"))throw new Ia("Maester-HTML konnte nicht sicher vollständig gelesen werden.",t.diagnostics);if(t.roots.reduce((f,T)=>f+(Array.isArray(T.value.Tests)?T.value.Tests.length:0),0)>$f)throw new Ia("Maester-Testlimit überschritten.",[{severity:"error",code:"maester-test-limit",stage:"extraction",message:`Mehr als ${$f} Tests. Der Bericht wird nicht still gekürzt.`}]);const a=[],i=[...t.diagnostics],r=[],c=[];if(t.envelope){const f=Bx(e.file.name,t.envelope,"$",0);r.push(...f.reportSections),c.push(...f.environmentObservations)}let l=0;for(const f of t.roots){const T=Array.isArray(f.value.Tests)?f.value.Tests:[];i.push(...kj(f.value,f.path));const p=Bx(e.file.name,f.value,f.path,r.length);r.push(...p.reportSections),c.push(...p.environmentObservations);for(let m=0;m)`),Fj=(e,t)=>{if(!e.startsWith(mb,t))return;let n=t-1;for(;n>=0&&/\s/.test(e[n]);)n--;if(e[n]===".")return;const a=jj.exec(e.slice(t));return a?{start:t+a[0].length,binding:a[1]??`${a[2]}[${JSON.stringify(a[3])}]`}:void 0},Wx=new WeakMap;function As(e,t){throw new Ia(t,[{severity:"error",stage:"extraction",code:e,message:t}])}function Vx(e){const t=Wx.get(e);if(t)return t;const n={indicators:[],categoryNames:new Map,recognized:!1,diagnostics:[]};if(e.format!=="HTML")return n;const a=new Set,i=new Set;try{const r=sd(e.rawText),c=/|<(script|style|textarea|title|xmp|iframe|noembed|noframes)\b[^>]*>([\s\S]*?)(?:<\/\1\s*>|$)/gi;for(const l of r.matchAll(c))if(l[1]?.toLowerCase()==="script")for(const{start:f,binding:T}of pb(l[2],Fj)){if(T!=="reportJSON"&&!T.startsWith("Category_"))continue;n.recognized=!0,a.has(T)&&As("purple-knight-binding-duplicate","PurpleKnight contains conflicting report assignments."),a.add(T);const{value:p}=hb(l[2],f);if(T==="reportJSON")(!Array.isArray(p.reportResultsList)||p.reportResultsList.some(m=>!an(m)||!an(m.ReportResults)))&&As("purple-knight-payload-invalid","PurpleKnight report summary is malformed."),n.root=p;else{n.indicators.length>=Mj&&As("purple-knight-indicator-limit","PurpleKnight indicator limit exceeded; no results were silently truncated."),(!an(p.ResIndicator)||!an(p.ExecutionResult))&&As("purple-knight-indicator-invalid","A PurpleKnight indicator is malformed.");const m=p.ResIndicator.ShortName;(typeof m!="string"||!m.trim())&&As("purple-knight-id-missing","A PurpleKnight indicator has no native rule ID."),i.has(m)&&n.diagnostics.push({severity:"warning",code:"purple-knight-id-duplicate",stage:"extraction",message:"PurpleKnight contains repeated native rule IDs. All occurrences were retained."}),i.add(m),p.IndicatorReportObjects!=null&&(!Array.isArray(p.IndicatorReportObjects)||p.IndicatorReportObjects.some(S=>!Array.isArray(S)))&&As("purple-knight-detail-invalid","A PurpleKnight result table is malformed.");const g=JSON.parse(T.slice(T.indexOf("[")+1,-1));n.indicators.push({value:p,path:`$.${T}`,identity:g})}}}catch(r){if(!(r instanceof Zi))throw r;n.recognized&&As("purple-knight-payload-invalid","PurpleKnight data could not be read completely. Only bounded static report objects are supported.")}if(n.recognized&&!n.root&&As("purple-knight-summary-missing","PurpleKnight indicator data has no readable report summary."),n.root){const r=n.root.reportResultsList;!n.indicators.length&&(!r.length||r.some(l=>!an(l)||!an(l.ReportResults)||l.ReportResults.TotalCount!==0))&&As("purple-knight-results-missing","PurpleKnight announces results but no indicators could be read.");const c=an(n.root.GeneralConfig)?n.root.GeneralConfig:{};for(const l of Array.isArray(c.Categories)?c.Categories:[])an(l)&&typeof l.ID=="number"&&typeof l.Name=="string"&&n.categoryNames.set(l.ID,l.Name)}return Wx.set(e,n),n}function Lj(e){return e.replace(/[^a-zA-Z0-9_-]/g,"-")}const gb={id:"generic-table-source-extractor",version:"1.0.0",fallback:!0,detect(e){const t=e.tables.length;return t?{score:.1,evidence:[`${t} kompatible Tabellenansicht(en) vorhanden.`]}:{score:0,evidence:[]}},extract(e){return{version:1,candidates:e.tables.flatMap(n=>{const a=n.headerCandidates[0];return n.rows.filter(i=>i.index!==a?.rowIndex&&i.cells.some(r=>r.decodedValue.trim())).map(i=>({version:1,id:`candidate-${Lj(n.id)}-${i.index}`,source:{fileName:e.file.name,tableIndex:n.index,rowIndex:i.index},fields:i.cells.map(r=>({key:`column-${r.source.columnIndex??0}`,label:a?.headers[r.source.columnIndex??0]||`Spalte ${(r.source.columnIndex??0)+1}`,originalValue:r.rawValue,decodedValue:r.decodedValue,source:{...r.source,fileName:e.file.name}}))}))}),diagnostics:[]}}},Pj=/^(ad|aad|entra)\s+category\s+score:\s*(.+)$/i,_j=/^(ad|aad|entra(?:\s*id)?):\s*(.+)$/i,qj=/^tool\s+edition$/i,Bj=[/^ad:\s*security\s+posture\s+score$/i,/^ad:\s*ioes?\s+found$/i,/^ad:\s*number\s+of\s+domains$/i,/^ad:\s*forest\s+name$/i,/^ad\s+category\s+score:/i,/^selected\s+indicators$/i],Yf={type:"active-directory-environment"};function Hx(e){return{type:"purple-knight-assessment",identity:e,label:"Purple Knight assessment"}}function Zl(e){return e.toLocaleLowerCase("en-US").replace(/[^a-z0-9]+/g,"_").replace(/^_|_$/g,"")||"value"}function Gx(e){return/^ad$/i.test(e)?"ad":"entra"}const Uj=[[/^generated\s+date$/i,{property:"report.generated_at",label:"Report generation date",valueType:"datetime",subject:Yf}],[/^ad:\s*forest\s+name$/i,{property:"forest.name",label:"Forest name",valueType:"string",subject:Yf}],[/^ad:\s*number\s+of\s+domains$/i,{property:"domain.count",label:"Number of domains",valueType:"number",subject:Yf}]];function zj(e,t){const n=Uj.find(([r])=>r.test(e));if(n)return n[1];const a=Pj.exec(e);if(a){const r=je(a[2]);return{property:`purple_knight.${Gx(a[1])}.category_score.${Zl(r)}`,label:r,valueType:"number",subject:{type:"security-domain",identity:Zl(r),label:r}}}const i=_j.exec(e);return i?{property:`purple_knight.${Gx(i[1])}.${Zl(i[2])}`,label:je(i[2]),valueType:"string",subject:Hx(t)}:{property:`purple_knight.${Zl(e)}`,label:je(e),valueType:"string",subject:Hx(t)}}function ip(e,t,n){const a=zj(e,n.fileName),i=a.valueType==="datetime"?null:vi(t),r=i!==null?{normalizedValue:i,valueType:"number"}:{normalizedValue:t,valueType:t!==null&&typeof t=="object"?"object":a.valueType};return{version:1,subject:a.subject,property:a.property,label:a.label,originalValue:t,...r,state:t===null||t===""?"empty":"observed",sectionKey:"purple-knight-assessment-summary",source:n,attributes:{sourceMetric:e}}}function Xx(e,t){return ip(e.key,e.value,{fileName:t,tableIndex:e.tableIndex,rowIndex:e.rowIndex,columnIndex:e.columnIndex})}function vb(e){return e.rows.flatMap(t=>{const n=je(t.cells[0]?.decodedValue);return n?[{key:n,value:t.cells[1]?.rawValue??null,tableIndex:e.index,rowIndex:t.index,columnIndex:1}]:[]})}function Kx(e){if(e.format!=="HTML")return e.tables.find(t=>{const n=vb(t).map(a=>a.key);return Bj.filter(a=>n.some(i=>a.test(i))).length>=2})}const Wj={id:"purple-knight-summary-source-extractor",version:"1.1.0",detect(e){return Kx(e)?{score:1,toolId:"purple-knight",evidence:["PurpleKnight summary metrics recognized."]}:{score:0,evidence:[]}},extract(e){const t=Kx(e);if(!t)return{version:1,candidates:[],diagnostics:[]};const n=vb(t),a=n.find(c=>qj.test(c.key)),i=n.filter(c=>c!==a),r=[...a?[Xx(a,e.file.name)]:[],...i.map(c=>Xx(c,e.file.name))];return{version:1,candidates:gb.extract({...e,tables:e.tables.filter(c=>c.index!==t.index)}).candidates,reportSections:[{version:1,sectionKey:"purple-knight-assessment-summary",label:"Purple Knight assessment summary",ordinal:0,state:i.length?"observed":"empty",tables:[{name:"Assessment summary",sourceTableIndex:t.index,headers:["Metric","Value"],rows:i.map(c=>[c.key,c.value])}],source:{fileName:e.file.name,tableIndex:t.index},attributes:{metricCount:i.length}}],environmentObservations:r,diagnostics:[]}}};function xb(e,t){if(e.IsFailedToRun===!0)return"Failed to run";if(e.IsAborted===!0)return"Canceled";if(e.Selected===!1)return"Not selected";if(e.IsEvaluated===!1)return"Not Relevant";if(e.IsFailed===!0&&typeof e.ExposureType=="string"&&/IOE/i.test(e.ExposureType))return"IOE Found";if(e.IsFailed===!0&&typeof e.ExposureType=="string"&&/IOC/i.test(e.ExposureType))return"IOC Found";const n=t.Status??e.State;return typeof n=="string"?n.replace(/([a-z])([A-Z])/g,"$1 $2"):""}const Vj={TotalScore:"Security posture score",TotalCount:"Total indicators",TotalEvaluatedCount:"Evaluated",PassedCount:"Passed",IOEsCount:"IOEs found",IOCsCount:"IOCs found",FailedToRunCount:"Failed to run",AbortedCount:"Canceled",UnselectedCount:"Not selected",NotRelevant:"Not relevant",TestExecutionTime:"Scan duration",TotalSelectedCount:"Selected indicators"};function Zf(e,t,n){return typeof e!="number"||!Number.isSafeInteger(e)||e<0?[{severity:"warning",code:"purple-knight-count-invalid",stage:"extraction",message:"A declared PurpleKnight count is invalid.",details:{objectPath:n}}]:e===t?[]:[{severity:"warning",code:"purple-knight-count-mismatch",stage:"extraction",message:`PurpleKnight declares ${e} results; ${t} were independently counted.`,details:{objectPath:n,declared:e,actual:t}}]}function Hj(e,t,n){const a="purple-knight-assessment-summary",i="$.reportJSON",r=[{version:1,sectionKey:a,label:"PurpleKnight assessment summary",ordinal:0,state:"observed",tables:[{name:"Report metadata",headers:["Property","Original value"],rows:Object.entries(t)}],source:{fileName:e,objectPath:i},attributes:{kind:"purple-knight-report-context"}}],c=Object.entries(t).map(([m,g])=>({version:1,sectionKey:a,subject:{type:"purple-knight-report",identity:i},property:`purple_knight.source.${m}`,label:m,originalValue:g,normalizedValue:g,valueType:g!==null&&typeof g=="object"?"object":typeof g=="number"?"number":typeof g=="boolean"?"boolean":"string",state:g===null||g===""?"empty":"observed",source:{fileName:e,objectPath:`${i}.${m}`},attributes:{sourceField:m}})),l=[],f=(m,g,S)=>{g!==void 0&&c.push(ip(m,g,{fileName:e,objectPath:S}))};f("Tool version",t.AppVersion,`${i}.AppVersion`),f("Tool edition",t.Edition,`${i}.Edition`);const T=Array.isArray(t.reportResultsList)?t.reportResultsList:[],p=new Map(n.map(m=>[m.identity,m]));for(const[m,g]of T.entries()){if(!an(g)||!an(g.ReportResults))continue;const S=`${i}.reportResultsList[${m}]`,x=g.ADType==="AD"?"AD":/^(?:AAD|Entra)$/i.test(String(g.ADType))?"Entra":"Other",y=g.ReportResults;f("Generated date",y.GeneratedOn,`${S}.ReportResults.GeneratedOn`);for(const[O,N]of Object.entries(Vj))f(O==="TotalSelectedCount"&&T.length===1?"Selected indicators":`${x}: ${N}`,y[O],`${S}.ReportResults.${O}`);f(`${x}: Forest name`,g.ForestName,`${S}.ForestName`),Array.isArray(g.SelectedDomains)&&c.push({...ip(`${x}: Number of domains`,g.SelectedDomains,{fileName:e,objectPath:`${S}.SelectedDomains`}),normalizedValue:g.SelectedDomains.length,valueType:"number",attributes:{derived:!0,derivation:"array-length"}}),f(`${x}: Domains`,g.SelectedDomains,`${S}.SelectedDomains`),f("Requested by",g.UserName,`${S}.UserName`);const w=new Set;for(const[O,N]of(Array.isArray(g.ReportCategories)?g.ReportCategories:[]).entries()){if(!an(N))continue;const B=an(N.Category)?N.Category:{};if(typeof B.Name=="string"&&f(`${x} category score: ${B.Name}`,B.Score,`${S}.ReportCategories[${O}].Category.Score`),Array.isArray(N.Indicators))for(const A of N.Indicators)typeof A=="string"&&w.add(A)}const C=T.length===1?n:[...w].flatMap(O=>p.has(O)?[p.get(O)]:[]),k={TotalCount:C.length,PassedCount:0,IOEsCount:0,IOCsCount:0,FailedToRunCount:0,AbortedCount:0,UnselectedCount:0,NotRelevant:0,TotalEvaluatedCount:0},E={Pass:"PassedCount",Passed:"PassedCount","IOE Found":"IOEsCount","IOC Found":"IOCsCount","Failed to run":"FailedToRunCount",Canceled:"AbortedCount","Not selected":"UnselectedCount","Not Relevant":"NotRelevant"};for(const O of C){const N=an(O.value.ResIndicator)?O.value.ResIndicator:{},B=xb(N,an(O.value.ExecutionResult)?O.value.ExecutionResult:{});Object.hasOwn(E,B)&&k[E[B]]++,N.IsEvaluated===!0&&k.TotalEvaluatedCount++}for(const[O,N]of Object.entries(k))O in y&&l.push(...Zf(y[O],N,`${S}.ReportResults.${O}`));for(const O of w)p.has(O)||l.push({severity:"warning",code:"purple-knight-reference-missing",stage:"extraction",message:"A report category references a missing indicator.",details:{objectPath:`${S}.ReportCategories`}})}for(const m of n){const g=Array.isArray(m.value.IndicatorReportObjects)?m.value.IndicatorReportObjects:[];"TotalResultsCount"in m.value&&l.push(...Zf(m.value.TotalResultsCount,g.length,`${m.path}.TotalResultsCount`)),an(t.IndicatorsTotalCount)&&m.identity in t.IndicatorsTotalCount&&l.push(...Zf(t.IndicatorsTotalCount[m.identity],g.length,`${i}.IndicatorsTotalCount[${JSON.stringify(m.identity)}]`))}return{reportSections:r,environmentObservations:c,diagnostics:l}}const Gj=["ShortName","Name","SI version","Target","Status","Runtime","Score","Severity","Weight","Category","MITRE ATT&CK_1","MITRE ATT&CK_2","MITRE ATT&CK_3","MITRE ATT&CK_4","ANSSI_1","ANSSI_2","ANSSI_3","ANSSI_4","MITRE D3FEND_1","MITRE D3FEND_2","Description","Likelihood of compromise","Result message","Number of results","Result","Remediation"];function Jf(e,t,n,a,i,r=ts(i),c){return{key:n,label:a,originalValue:i,decodedValue:r,source:{fileName:e,objectPath:t,columnIndex:c}}}function yb(e){const t=Array.isArray(e.Targets)?e.Targets.map(ts).filter(Boolean):[];return t.includes("AAD")&&t.includes("AD")?"Hybrid (AD)":t.join(", ")}function Xj(e,t){const n=typeof e.CategoryID=="number"?t.get(e.CategoryID)??"":"";return yb(e)==="Hybrid (AD)"&&n==="Hybrid"?"Hybrid (AD)":n||ts(e.CategoryID)}function Kj(e){if(typeof e.StartTime!="string"||typeof e.CompletionTime!="string")return"";const t=T=>{const p=T.match(/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(?:\.(\d+))?Z$/);if(!p)return;const m=Date.parse(`${p[1]}Z`);if(!Number.isFinite(m))return;const g=BigInt((p[2]??"").slice(0,7).padEnd(7,"0"));return BigInt(m)*10000n+g},n=t(e.StartTime),a=t(e.CompletionTime);if(n===void 0||a===void 0||aString(T).padStart(2,"0")).join(":")}function Qf(e,t,n){const i=(Array.isArray(e.SecurityFrameworks)?e.SecurityFrameworks:[]).flatMap(r=>an(r)&&r.Name===t&&Array.isArray(r.Tags)?r.Tags:[]);return Array.from({length:n},(r,c)=>i[c]??null)}function $j(e,t,n){const a=an(t.ResIndicator)?t.ResIndicator:{},i=typeof a.ShortName=="string"?a.ShortName.trim():"",c=(Array.isArray(t.IndicatorReportObjects)?t.IndicatorReportObjects:[]).filter(Array.isArray);if(!i||!c.length)return;const l=c[0].map((f,T)=>{const p=ts(f),m=p.indexOf(":");return m>0?p.slice(0,m).trim():`Column ${T+1}`});return{version:1,name:i,headers:l,rows:c.map(f=>l.map((T,p)=>{const m=typeof f[p]=="string"?f[p]:ts(f[p]),g=`${T}:`;return m.startsWith(g)?m.slice(g.length).replace(/^ /,""):m})),source:{fileName:e,objectPath:`${n}.IndicatorReportObjects`},attributes:{kind:"finding-result",findingReference:i}}}function Yj(e,t,n,a,i){const r=an(t.ResIndicator)?t.ResIndicator:{},c=an(t.ExecutionResult)?t.ExecutionResult:{},l=Array.isArray(t.IndicatorReportObjects)&&t.IndicatorReportObjects.length>0,f=[...Qf(r,"MITRE ATT&CK",4),...Qf(r,"ANSSI",4),...Qf(r,"MITRE D3FEND",2)],T=[{key:"ShortName",value:r.ShortName??null},{key:"Name",value:r.Name??null},{key:"Version",value:r.Version??null},{key:"Targets",value:r.Targets??null,decoded:yb(r)},{key:"Status",value:t,decoded:xb(r,c)},{key:"Runtime",value:r,decoded:Kj(r)},{key:"Score",value:c.Score??null},{key:"Severity",value:r.Severity??null},{key:"Weight",value:r.Weight??null},{key:"CategoryID",value:r,decoded:Xj(r,a)},...f.map((x,y)=>({key:`Framework_${y+1}`,value:x})),{key:"Description",value:r.Description??null,decoded:ga(r.Description)},{key:"LikelihoodOfCompromise",value:r.LikelihoodOfCompromise??null,decoded:ga(r.LikelihoodOfCompromise)},{key:"ResultMessage",value:c.ResultMessage??null},{key:"TotalResultsCount",value:t.TotalResultsCount??null},{key:"Result",value:t.IndicatorReportObjects??null,decoded:l?ts(r.ShortName):""},{key:"Remediation",value:c.Remediation??null,decoded:ga(c.Remediation)}],p={Status:n,Runtime:`${n}.ResIndicator`,CategoryID:`${n}.ResIndicator`,Score:`${n}.ExecutionResult.Score`,ResultMessage:`${n}.ExecutionResult.ResultMessage`,Remediation:`${n}.ExecutionResult.Remediation`,TotalResultsCount:`${n}.TotalResultsCount`,Result:`${n}.IndicatorReportObjects`},m=["MITRE ATT&CK","ANSSI","MITRE D3FEND"].flatMap((x,y)=>{const C=(Array.isArray(r.SecurityFrameworks)?r.SecurityFrameworks:[]).flatMap((k,E)=>an(k)&&k.Name===x&&Array.isArray(k.Tags)?k.Tags.map((O,N)=>`${n}.ResIndicator.SecurityFrameworks[${E}].Tags[${N}]`):[]);return Array.from({length:y===2?2:4},(k,E)=>C[E])}),g=T.map((x,y)=>{const w=/^Framework_(\d+)$/.exec(x.key),C=w?m[Number(w[1])-1]:p[x.key]??`${n}.ResIndicator.${x.key}`,k=Jf(e,C??n,x.key,Gj[y],x.value,x.decoded??ts(x.value),y);return x.value===null&&((w?m[Number(w[1])-1]:x.key==="Result"?Object.hasOwn(t,"IndicatorReportObjects"):x.key==="TotalResultsCount"?Object.hasOwn(t,x.key):["Score","ResultMessage","Remediation"].includes(x.key)?Object.hasOwn(c,x.key):Object.hasOwn(r,x.key))||(k.source.objectPath=void 0)),k}),S=new Set(g.map(x=>x.source.objectPath));for(const[x,y]of[["ResIndicator",r],["ExecutionResult",c]])for(const[w,C]of Object.entries(y)){const k=`${n}.${x}[${JSON.stringify(w)}]`;S.has(`${n}.${x}.${w}`)||g.push(Jf(e,k,`source-${x}-${w}`,`Source ${x}.${w}`,C))}for(const[x,y]of Object.entries(t))["ResIndicator","ExecutionResult","IndicatorReportObjects","TotalResultsCount"].includes(x)||g.push(Jf(e,`${n}[${JSON.stringify(x)}]`,`source-${x}`,`Source ${x}`,y));return{version:1,id:`purple-knight-indicator-${i}`,source:{fileName:e,objectPath:n},fields:g}}const Zj={id:"purple-knight-html-source-extractor",version:"1.2.0",detect(e){const t=Vx(e);return t.recognized?{score:1,toolId:"purple-knight",evidence:[`Sicher eingebettetes PurpleKnight-Reportmodell mit ${t.indicators.length} Indikatoren erkannt.`]}:{score:0,evidence:[]}},extract(e){const t=Vx(e),n=t.indicators.map((r,c)=>Yj(e.file.name,r.value,r.path,t.categoryNames,c)),a=t.indicators.flatMap(r=>{const c=$j(e.file.name,r.value,r.path);return c?[c]:[]}),i=t.root?Hj(e.file.name,t.root,t.indicators):{reportSections:[],environmentObservations:[],diagnostics:[]};return{version:1,candidates:n,supportingTables:a,...i,diagnostics:[...t.diagnostics,...i.diagnostics]}}};function Jj(e){return e.replace(/[^a-zA-Z0-9_-]/g,"-")}function Qj(e,t,n){return(t&&typeof t=="object"&&!Array.isArray(t)?Object.entries(t):[["value",t]]).map(([i,r])=>({key:i,label:i,originalValue:r,decodedValue:Fi(r),source:{fileName:e,objectPath:`${n}.${i}`}}))}function eF(e,t){return(Array.isArray(t.value)?t.value:[t.value]).map((a,i)=>{const r=Array.isArray(t.value)?`$[${i}]`:"$";return{version:1,id:`candidate-${Jj(t.id)}-${i}`,source:{fileName:e.file.name,objectPath:r},fields:Qj(e.file.name,a,r)}})}const tF={id:"native-object-source-extractor",version:"1.0.0",detect(e){const t=e.views.filter(n=>n.kind==="object").length;return t?{score:1,evidence:[`${t} native Objekt- oder Arrayansicht(en) vorhanden.`]}:{score:0,evidence:[]}},extract(e){return{version:1,candidates:e.views.filter(n=>n.kind==="object").flatMap(n=>eF(e,n)),diagnostics:[]}}},Sb=[Ej,GM,Zj,Wj,Oj,tF,gb];function nF(e,t=Sb){if(!t.length)throw new Error("Für die Quellenextraktion ist mindestens ein registrierter Extractor erforderlich.");const n=t.map(i=>({extractor:i,match:i.detect(e)}));return n.filter(i=>!i.extractor.fallback&&i.match.score>0).sort((i,r)=>r.match.score-i.match.score||i.extractor.id.localeCompare(r.extractor.id))[0]??n.find(i=>i.extractor.fallback)??n.sort((i,r)=>r.match.score-i.match.score||i.extractor.id.localeCompare(r.extractor.id))[0]}function aF(e,t=Sb){const{extractor:n,match:a}=nF(e,t),i={kind:"source-extractor",id:n.id,version:n.version},r=n.extract(e),c=r.diagnostics.some(l=>l.severity==="error")?"failed":r.diagnostics.some(l=>l.severity==="warning")?"partial":"complete";return{...r,extractor:i,match:a,processing:{stage:"extraction",status:c,processor:i,diagnosticCodes:r.diagnostics.map(l=>l.code)}}}const Vr={maximumFileBytes:100*1024*1024,maximumDecodedCharacters:64*1024*1024,maximumTables:1e4,maximumRowsPerTable:25e4,maximumTotalRows:5e5,maximumColumnsPerTable:2e3,maximumCellCharacters:1e6,maximumTotalCellCharacters:64*1024*1024,maximumMarkupElements:5e5,maximumJsonDepth:256,maximumZipEntries:2e4,maximumZipEntryUncompressedBytes:128*1024*1024,maximumZipUncompressedBytes:512*1024*1024,maximumZipCompressionRatio:200};function iF(e){return{...Vr,...e}}function Jt(e,t,n){throw new Ia(t,[{severity:"error",code:e,message:t,details:n}])}function sF(e){const t=Math.max(0,e.length-65557);for(let n=e.length-22;n>=t;n-=1)if(e[n]===80&&e[n+1]===75&&e[n+2]===5&&e[n+3]===6)return n;return-1}function rF(e,t){if(e.length<4||e[0]!==80||e[1]!==75)return;const n=new DataView(e.buffer,e.byteOffset,e.byteLength),a=sF(e);a<0&&Jt("zip-directory-missing","Der ZIP-Container besitzt kein gültiges Zentralverzeichnis.",{sizeBytes:e.length});const i=n.getUint16(a+10,!0),r=n.getUint32(a+12,!0),c=n.getUint32(a+16,!0);(i===65535||r===4294967295||c===4294967295)&&Jt("zip64-not-accepted","ZIP64-Archive werden innerhalb der aktuellen Importgrenzen nicht akzeptiert.",{entryCount:i}),i>t.maximumZipEntries&&Jt("zip-entry-limit",`Das Archiv enthält mehr als ${t.maximumZipEntries} Einträge.`,{entryCount:i,limit:t.maximumZipEntries}),c+r>e.length&&Jt("zip-directory-invalid","Das ZIP-Zentralverzeichnis liegt außerhalb der tatsächlichen Datei.",{directoryOffset:c,directorySize:r,sizeBytes:e.length});let l=c,f=0,T=0;for(let m=0;me.length||n.getUint32(l,!0)!==33639248)&&Jt("zip-directory-invalid","Ein ZIP-Zentralverzeichniseintrag ist beschädigt.",{entryIndex:m});const g=n.getUint16(l+8,!0),S=n.getUint16(l+10,!0),x=n.getUint32(l+20,!0),y=n.getUint32(l+24,!0);(g&1)!==0&&Jt("zip-encryption-rejected","Verschlüsselte ZIP-Inhalte werden nicht verarbeitet.",{entryIndex:m}),[0,8].includes(S)||Jt("zip-compression-method-rejected","Das Archiv verwendet ein nicht zugelassenes Kompressionsverfahren.",{entryIndex:m,compressionMethod:S}),(x===4294967295||y===4294967295)&&Jt("zip64-not-accepted","ZIP64-Einträge werden innerhalb der aktuellen Importgrenzen nicht akzeptiert.",{entryIndex:m}),y>t.maximumZipEntryUncompressedBytes&&Jt("zip-entry-size-limit","Ein einzelner Archivinhalt überschreitet das Entpacklimit.",{entryIndex:m,uncompressedBytes:y,limit:t.maximumZipEntryUncompressedBytes}),f+=x,T+=y,T>t.maximumZipUncompressedBytes&&Jt("zip-uncompressed-size-limit","Die erwartete entpackte Archivgröße überschreitet das Limit.",{uncompressedBytes:T,limit:t.maximumZipUncompressedBytes});const w=n.getUint16(l+28,!0),C=n.getUint16(l+30,!0),k=n.getUint16(l+32,!0),E=l+46+w+C+k;(E>e.length||E>c+r)&&Jt("zip-directory-invalid","Ein ZIP-Zentralverzeichniseintrag liegt außerhalb des Zentralverzeichnisses.",{entryIndex:m});const O=new TextDecoder("utf-8",{fatal:!1}).decode(e.subarray(l+46,l+46+w)).replaceAll("\\","/"),N=O.split("/");(O.startsWith("/")||N.includes(".."))&&Jt("zip-entry-path-rejected","Archivpfade dürfen das Archivverzeichnis nicht verlassen.",{entryIndex:m}),O.toLocaleLowerCase("en-US").endsWith("vbaproject.bin")&&Jt("excel-vba-content-rejected","Excel-Dateien mit eingebettetem VBA-Projekt werden nicht verarbeitet.",{entryIndex:m}),l=E}l!==c+r&&Jt("zip-directory-invalid","Die Größe des ZIP-Zentralverzeichnisses ist inkonsistent.",{expectedEnd:c+r,actualEnd:l});const p=T/Math.max(1,f);p>t.maximumZipCompressionRatio&&Jt("zip-compression-ratio-limit","Das Kompressionsverhältnis des Archivs ist ungewöhnlich hoch.",{ratio:Math.round(p*100)/100,limit:t.maximumZipCompressionRatio})}function oF(e,t){(!Number.isSafeInteger(e.metadata.sizeBytes)||e.metadata.sizeBytes<0||e.metadata.sizeBytes!==e.bytes.byteLength)&&Jt("file-size-mismatch","Dateimetadaten und tatsächliche Byteanzahl stimmen nicht überein.",{declaredBytes:e.metadata.sizeBytes,actualBytes:e.bytes.byteLength}),e.bytes.byteLength>t.maximumFileBytes&&Jt("file-size-limit",`Die Datei überschreitet das Limit von ${t.maximumFileBytes} Bytes.`,{actualBytes:e.bytes.byteLength,limit:t.maximumFileBytes}),e.bytes[0]===80&&e.bytes[1]===75&&rF(e.bytes,t)}function cF(e){let t=0,n=0,a=!1,i=!1;for(const r of e){if(i){i=!1;continue}if(r==="\\"&&a){i=!0;continue}if(r==='"'){a=!a;continue}a||(r==="{"||r==="["?(t+=1,n=Math.max(n,t)):(r==="}"||r==="]")&&(t=Math.max(0,t-1)))}return n}function lF(e,t,n){if(e.length>n.maximumDecodedCharacters&&Jt("decoded-text-limit","Der dekodierte Text überschreitet das Zeichenlimit.",{characters:e.length,limit:n.maximumDecodedCharacters}),e.includes("\0")&&Jt("null-byte-rejected","Textimporte mit Nullbytes werden nicht verarbeitet.",{extension:t}),t==="xml"&&/n.maximumJsonDepth&&Jt("json-depth-limit","Die JSON-Verschachtelung überschreitet das Limit.",{depth:a,limit:n.maximumJsonDepth})}if(["xml","html","htm"].includes(t)){const a=(e.match(/<\/?[A-Za-z_][^>]*>/g)??[]).length;a>n.maximumMarkupElements&&Jt("markup-element-limit","Das Markup enthält zu viele Elemente.",{elementCount:a,limit:n.maximumMarkupElements})}if(["csv","txt"].includes(t)){const a=1+(e.match(/\r\n|\r|\n/g)??[]).length;a>n.maximumTotalRows&&Jt("row-limit","Die Textdatei enthält zu viele physische Zeilen.",{rows:a,limit:n.maximumTotalRows})}}function uF(e,t){e.tables.length>t.maximumTables&&Jt("table-limit","Der Import enthält zu viele Tabellen.",{tables:e.tables.length,limit:t.maximumTables});let n=0,a=0;e.tables.forEach(i=>{i.rows.length>t.maximumRowsPerTable&&Jt("rows-per-table-limit",`Die Tabelle „${i.name}“ enthält zu viele Zeilen.`,{table:i.name,rows:i.rows.length,limit:t.maximumRowsPerTable}),i.columns.length>t.maximumColumnsPerTable&&Jt("column-limit",`Die Tabelle „${i.name}“ enthält zu viele Spalten.`,{table:i.name,columns:i.columns.length,limit:t.maximumColumnsPerTable}),n+=i.rows.length,i.rows.forEach(r=>r.cells.forEach(c=>{c.decodedValue.length>t.maximumCellCharacters&&Jt("cell-size-limit","Eine Tabellenzelle überschreitet das Zeichenlimit.",{table:i.name,row:r.index,column:c.source.columnIndex??0,characters:c.decodedValue.length,limit:t.maximumCellCharacters}),a+=c.decodedValue.length,a>t.maximumTotalCellCharacters&&Jt("total-cell-size-limit","Die Gesamtgröße der Tabellenzellen überschreitet das Limit.",{characters:a,limit:t.maximumTotalCellCharacters})}))}),n>t.maximumTotalRows&&Jt("row-limit","Der Import enthält insgesamt zu viele Zeilen.",{rows:n,limit:t.maximumTotalRows})}function dF(e){return e==="Excel"?"xlsx":e.toLocaleLowerCase("en-US")}function TF(e){const t=[];return e.conflicts.length&&t.push({severity:"warning",code:"format-evidence-conflict",stage:"format-decoding",message:`Inhalt oder Dateisignatur wurde als ${e.selected} erkannt; abweichende Endungs- oder Medientyphinweise wurden nicht als Parserentscheidung übernommen.`,details:{selectedFormat:e.selected,conflicts:e.conflicts.map(n=>({signal:n.signal,format:n.format??null}))}}),e.requiresParserValidation&&t.push({severity:"info",code:"format-parser-validation",stage:"format-decoding",message:`Die Formaterkennung für ${e.selected} beruhte auf schwachen Hinweisen und wurde durch den erfolgreichen sicheren Parserlauf validiert.`}),t}function fF(e,t,n){if(!e.intermediate)return e;const a=TF(t),i=[...e.intermediate.diagnostics,...a],r=e.intermediate.status==="failed"?"failed":e.intermediate.status==="partial"||a.some(l=>l.severity==="warning")?"partial":"complete",c=e.intermediate.processing.map(l=>l.stage==="format-decoding"?{...l,status:"complete",diagnosticCodes:a.map(f=>f.code)}:l);return{...e,intermediate:{...e.intermediate,status:r,file:{...e.intermediate.file,encoding:n??e.intermediate.file.encoding},diagnostics:i,processing:c,formatDetection:t}}}function wc(e,t,n){return new Ia(t,[{severity:"error",code:e,message:t,stage:"format-decoding",details:n}])}async function hF(e,t,n){const a=Rp(e.metadata),i=iF(t.resourcePolicy);oF(e,i);let r,c,l;try{const x=AO(e),y=wx(e);if(x.containerKind==="zip")throw wc("unsupported-container","ZIP-Container ohne erkannte Excel-Workbookstruktur werden noch nicht importiert.",{containerKind:"zip"});if(x.binary&&x.signedFormat!=="Excel")throw wc("unsupported-binary-format","Die Binärdatei besitzt keine unterstützte und validierte Dateisignatur.");if(y?.selected==="Excel"&&y.structurallyValidated)c=y,r=await yO(e);else{const w=n.textDecoder.decode(e.bytes);l=w.encoding;const C=wx(e,w.text);if(!C)throw wc("unsupported-import-format","Das Dateiformat konnte nicht sicher einem unterstützten Format zugeordnet werden.");if(C.binary)throw wc("unsupported-binary-format","Die Binärdatei besitzt keine unterstützte und validierte Dateisignatur.");if(C.selected==="Excel")throw wc("excel-signature-mismatch","Eine als Excel deklarierte Datei besitzt keine gültige Excel-Dateisignatur.");c=C,lF(w.text,dF(c.selected),i),c.selected==="JSON"?r=OO(e.metadata,w.text):c.selected==="XML"?r=jO(e.metadata,w.text,n.markup):c.selected==="HTML"?r=DO(e.metadata,w.text,n.markup):r=mC(e.metadata,w.text,t.delimiter)}}catch(x){if(x instanceof Ia)throw x;const y=x instanceof Error?x.message:"Unbekannter Parserfehler";throw new Ia(`Die Datei „${e.metadata.name}“ konnte nicht verarbeitet werden.`,[{severity:"error",code:"file-parse-error",message:y,details:{extension:a}}],{cause:x})}if(r=fF(r,c,l),r.intermediate&&uF(r.intermediate,i),!t.profiles.length)throw new Ia("Für den Import ist mindestens ein Profil erforderlich.",[{severity:"error",code:"missing-import-profile",message:"Die Importengine wurde ohne verfügbares Importprofil aufgerufen."}]);if(r.intermediate){const x=aF(r.intermediate),y=Math.max(-1,...r.intermediate.tables.map(C=>C.index))+1,w=(x.supportingTables??[]).map((C,k)=>{const E=[C.headers,...C.rows.map(O=>O.map(ts))];return es(C.name,E,Ns(E),e.metadata.name,{sourceFile:e.metadata.name,sourceSheet:C.name,sourceTableIndex:y+k})});r={...r,sheets:[...r.sheets,...w],extraction:x,intermediate:{...r.intermediate,diagnostics:[...r.intermediate.diagnostics,...x.diagnostics],processing:[...r.intermediate.processing,x.processing]}}}const f=r.sheets.some(x=>x.rows.some(y=>y.some(w=>w.trim()))),T=!!(r.extraction&&(r.extraction.candidates.length||r.extraction.reportSections?.length||r.extraction.environmentObservations?.length));if(!f&&!T)throw new Ia("Die Datei enthält keine auswertbaren Tabellen.",[{severity:"error",code:"empty-import",message:"Der Parser und die registrierten Quellenextraktoren haben keine auswertbaren Inhalte geliefert."}]);const p=r.intermediate?eC(r.intermediate,r.extraction):void 0,m=p?s4(p,t.profiles):t.profiles.find(x=>x.definition.fallback)??t.profiles[0],g=r.extraction?a4(r.extraction,m,p):void 0;g&&r.intermediate&&(r={...r,mapping:g,intermediate:{...r.intermediate,diagnostics:[...r.intermediate.diagnostics,...g.diagnostics],processing:[...r.intermediate.processing,g.processing]}});const S=m.prioritizeSheets(r.sheets);return{...r,sheets:S,profileId:m.id,profileVersion:m.version,scanTool:m.name,recognition:p,mapping:g}}async function pF(e,t){return hF(await C8(e),t,q8)}class bb{get(t){try{return window.localStorage.getItem(t)}catch{return null}}set(t,n){try{window.localStorage.setItem(t,n)}catch{}}remove(t){try{window.localStorage.removeItem(t)}catch{}}}const eh=e=>`ASSESSOR:reviews:${e}`,mF=e=>`exxTableReader:reviews:${e}`;class gF{constructor(t){this.storage=t}storage;async load(t){try{const n=this.storage.get(eh(t)),a=n??this.storage.get(mF(t))??"{}",i=JSON.parse(a);return n===null&&a!=="{}"&&this.storage.set(eh(t),a),i}catch{return{}}}async save(t,n){this.storage.set(eh(t),JSON.stringify(n))}}const vF={now:()=>new Date};function xF(e,t,n=vF){return{app:"ASSESSOR",kind:"snapshot",version:2,createdAt:n.now().toISOString(),dataset:e,reviews:t}}function th(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function yF(e){try{const t=JSON.parse(e);return!th(t)||!["ASSESSOR","exxTableReader"].includes(String(t.app))||t.kind!=="snapshot"||t.version!==2||!th(t.dataset)||!Array.isArray(t.dataset.sheets)||!th(t.reviews)||typeof t.dataset.fileName!="string"||typeof t.dataset.profileId!="string"?null:{...t,app:"ASSESSOR"}}catch{return null}}function a0(e,t){return e.lastIndex=0,e.test(t)}const $x=new WeakMap,SF=[/^fail(?:ed)?$/,/^not passed?$/,/^nicht bestanden$/,/^ioes? (?:found|detected)$/,/^matched$/,/^detected$/,/^open$/,/^offen$/,/^investigate$/,/^warning$/];function bF(e){let t=$x.get(e);return t||(t=e.fields.map(n=>ga(n.value).toLowerCase().replace(/[^a-z0-9]+/g," ").trim()),$x.set(e,t)),t}function wF(e,t,n){const a=i=>e.fields.some(r=>i.test(r.label.trim())&&!["","no","none","false","0"].includes(ga(r.value).trim().toLowerCase()));return n==="passed"?t==="pass"||t==="passed":n==="not-configured"?t==="not configured":n==="no-baseline-rule"?t==="no baseline rule":n==="not-comparable"?t==="not comparable":n==="conflicts"?t==="conflicts"||a(/^conflict$/i):n==="duplicates"?t==="duplicates"||a(/^duplicates$/i):n!=="deviation"?!1:["fail","failed","misconfigured"].includes(t??"")}function CF(e,t){return e?.analysis.headers.find(n=>t.some(a=>a0(a,je(n))))??""}function Yx(e,t){return e.length?new RegExp(e.map(n=>`(?:${n.source})`).join("|"),"i"):t}function EF(e,t){return t==="file-name"?[e.fileName]:t==="raw-text"?[e.rawText.slice(0,25e4)]:t==="table-name"?e.sheets.map(n=>n.name):t==="header"?e.sheets.flatMap(n=>n.analysis.headers):e.sheets.flatMap(n=>n.rows.slice(0,80).flat())}function kF(e,t){if(e.fallback)return 1;const n=e.sourceSignals.reduce((a,i)=>EF(t,i.scope).some(r=>a0(i.pattern,r))?a+i.contribution:a,0);return Math.round(Math.min(1,n)*1e3)}function Zx(e,t){return t.reduce((n,a)=>a0(a.pattern,e)?n+a.contribution:n,0)}function Jx(e,t){const n=je(t.name),a=e.fieldRules.reduce((i,r)=>r.headers.some(c=>t.analysis.headers.some(l=>a0(c.pattern,je(l))))?i+12:i,0);return Zx(n,e.tableRules.preferredNames)*1e3-Zx(n,e.tableRules.discouragedNames)*1e3+a+Math.min(t.analysis.records.length,500)/10-(t.hidden?100:0)}function I1(e){const t=new WeakMap,n=(r,c)=>{const l=r.fields.find(S=>/^status$/i.test(S.label.trim()))?.value.trim().toLowerCase();if(r.fields.some(S=>/^category$/i.test(S.label.trim())&&/^gpos$/i.test(ga(S.value).trim())||/^(?:source|quelle):\s*scan$/i.test(S.label.trim())&&/^gpos(?:\s|·|$)/i.test(ga(S.value).trim()))&&["deviation","passed","not-configured","no-baseline-rule","not-comparable","conflicts","duplicates"].includes(c))return wF(r,l,c);if(["not-configured","conflicts","duplicates"].includes(c))return l===c.replace("-"," ");if(c==="no-baseline-rule")return l==="no baseline rule";if(c==="not-comparable")return l==="not comparable";const T=e.presentation.statusFilters.find(S=>S.value===c),p=e.presentation.statusHeaders,m=p?.map(S=>r.fields.find(x=>x.value.trim()&&a0(S,x.label.trim()))).find(Boolean),g=p?.length?m?[ga(m.value).trim().toLowerCase()]:[]:bF(r);return c==="deviation"&&!T?g.some(S=>SF.some(x=>a0(x,S))):T?g.some(S=>T.patterns.some(x=>a0(x,S))):!0},a=e.presentation.statusFilters.map(({value:r,label:c})=>({value:r,label:c})),i=a.some(r=>r.value==="deviation")?a:[...a.filter(r=>r.value==="all"),{value:"deviation",label:"Deviation"},...a.filter(r=>r.value!=="all")];return{id:e.id,name:e.name,version:e.version,definition:e,detect:r=>kF(e,r),prioritizeSheets:r=>e.fallback?r:[...r].sort((c,l)=>Jx(e,l)-Jx(e,c)||(c.hidden??0)-(l.hidden??0)||(c.workbookIndex??0)-(l.workbookIndex??0)),defaults:r=>({titleColumn:CF(r,e.presentation.titleHeaders),sortColumn:"all",sortDirection:e.presentation.sortDirection,statusFilter:"deviation"}),matchesStatus:(r,c)=>{if(c==="all")return!0;let l=t.get(r);l||(l=new Map,t.set(r,l));const f=l.get(c);if(f!==void 0)return f;const T=n(r,c);return(c==="deviation"||e.presentation.statusFilters.some(p=>p.value===c))&&l.set(c,T),T},presentation:{severityFieldPattern:Yx(e.presentation.severityHeaders,/$a/),titleFieldPattern:Yx(e.presentation.titleHeaders,/$a/),statusFilters:i}}}const gi=I1(Dp),AF=I1(Zy),RF=I1(Jy),DF=I1(Qy),IF=I1(e4),NF=[IF,DF,AF,RF,gi];function Qx(e,t){const n=["Source: File","Source: Sheet"],a=[],i=new Set(n);e.forEach(S=>S.sheets.forEach(x=>x.analysis.headers.forEach(y=>{i.has(y)||(i.add(y),a.push(y))})));const r=[[...n,...a]];e.forEach(S=>S.sheets.forEach(x=>x.analysis.records.forEach(y=>{const w=new Map(y.fields.map(C=>[C.label,C.value]));r.push([S.fileName,x.name,...a.map(C=>w.get(C)??"")])})));const c=[...new Set(e.map(S=>S.scanTool).filter(Boolean))],l=c.length>1,f=l?"Multiple Tools":t.name,T=`${f} · ${e.length} files`,p=es(`${f} · All Records`,r,Ns(r),T,{isProjectSheet:!0}),m=e.flatMap(S=>S.sheets.map(x=>({...x,name:`${S.fileName.replace(/\.[^.]+$/,"")} · ${x.name}`,sourceFile:S.fileName,sourceSheet:x.sourceSheet??x.name}))),g=t.prioritizeSheets([p,...m]);return{fileName:T,fileSize:e.reduce((S,x)=>S+x.fileSize,0),lastModified:Math.max(...e.map(S=>S.lastModified),0),format:`Project · ${f}`,rawText:e.map(S=>`# Datei: ${S.fileName} +${S.rawText}`).join(` + +`),sheets:g,profileId:l?"generic":t.id,scanTool:l?c.join(", "):t.name}}const d1={id:"policy-baseline-evaluation",version:"1.9.0"},OF={version:"1.1.0"},MF=new Set(["fail","warning"]);function wb(e,t){return e||MF.has(t)}const Ya={deviation:"Deviation",passed:"Passed","not-configured":"Not configured","no-baseline-rule":"No baseline rule","not-comparable":"Not comparable",conflicts:"Conflicts",duplicates:"Duplicates","review-required":"Review required"},jF={misconfigured:Ya.deviation,match:Ya.passed,"not-configured":Ya["not-configured"],conflict:Ya.conflicts,duplicate:Ya.duplicates,"review-required":Ya["review-required"]};function Jl(e){const{baseline:t,actual:n,relation:a}=e.comparator;if(e.baselineVariantAssessment){if(e.baselineVariantAssessment.decision!=="all-fail"||e.classification!=="confirmed_configured_deviation"||a!=="different")return;const i=e.customerState==="missing"&&e.baselineVariantAssessment.variants.length>0&&e.baselineVariantAssessment.variants.every(r=>{const c=r.comparator.baseline;return c?.kind==="registry-state"&&c.state==="key-present"||c?.kind==="text"&&c.value===""});return e.customerState==="missing"?i?"misconfigured":"not-configured":["configured","conflicted"].includes(e.customerState)?"misconfigured":void 0}if(!(e.baselineState!=="explicit-recommendation"||!t||t.kind==="none"||t.kind==="text"&&!t.value.trim()||e.diagnosticCodes.includes("policy-evaluation-baseline-consensus-conflict")||e.classification!=="confirmed_configured_deviation"||!["different","weaker"].includes(a))){if(e.customerState==="missing"&&(!n||n.kind==="none"))return"not-configured";if(e.customerState==="configured"&&n&&n.kind!=="none")return"misconfigured"}}const e3={critical:0,high:1,medium:2,low:3,info:4,unknown:5};function sp(e){return e3[e]??e3.unknown}const Cb={critical:"Critical",high:"High",medium:"Medium",low:"Low",info:"Info",unknown:"Unknown"};function Eb(e){const t=je(e).toLocaleLowerCase("de-DE");return/critical|kritisch/.test(t)?"critical":/\bhigh\b|\bhoch\b/.test(t)?"high":/medium|mittel|moderate/.test(t)?"medium":/\blow\b|niedrig/.test(t)?"low":/info/.test(t)?"info":"unknown"}const FF=/^(?:severity|schweregrad|criticality|kritikalit(?:ae|ä)t|risk|risiko|priority|priorit(?:ae|ä)t)$/i;function kb(e){return FF.test(je(e))}function LF(e){return e.findIndex(t=>kb(t))}const PF="1.3.0",Ab=[{profileId:"generic",profileVersion:"1.0.0",mappingVersion:"1.0.0",normalizationVersion:"1.0.0",presentationVersion:"1.0.0",compatibilityKey:"generic-canonical-v1",changeClass:"compatible",reimportRequired:!1,affectedDimensions:[],current:!0},{profileId:"purple-knight",profileVersion:"1.0.0",mappingVersion:"1.0.0",normalizationVersion:"1.0.0",presentationVersion:"1.0.0",compatibilityKey:"purple-knight-canonical-v1",changeClass:"semantic-breaking",reimportRequired:!0,affectedDimensions:["outcome","isIoe"],current:!1},{profileId:"purple-knight",profileVersion:"1.1.0",mappingVersion:"1.1.0",normalizationVersion:"1.1.0",presentationVersion:"1.1.0",compatibilityKey:"purple-knight-canonical-v1.1",changeClass:"semantic-breaking",reimportRequired:!0,affectedDimensions:["outcome","isIoe"],current:!1},{profileId:"purple-knight",profileVersion:"1.2.0",mappingVersion:"1.1.0",normalizationVersion:"1.1.0",presentationVersion:"1.1.0",compatibilityKey:"purple-knight-canonical-v1.1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["environment-context"],current:!1},{profileId:"purple-knight",profileVersion:"1.3.0",mappingVersion:"1.1.0",normalizationVersion:"1.1.0",presentationVersion:"1.1.0",compatibilityKey:"purple-knight-canonical-v1.1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["environment-context","evidence","import-diagnostics"],current:!0},{profileId:"pingcastle",profileVersion:"1.0.0",mappingVersion:"1.0.0",normalizationVersion:"1.0.0",presentationVersion:"1.0.0",compatibilityKey:"pingcastle-canonical-v1",changeClass:"semantic-breaking",reimportRequired:!0,affectedDimensions:["outcome","isIoe"],current:!1},{profileId:"pingcastle",profileVersion:"1.1.0",mappingVersion:"1.1.0",normalizationVersion:"1.1.0",presentationVersion:"1.1.0",compatibilityKey:"pingcastle-canonical-v1.1",changeClass:"semantic-breaking",reimportRequired:!1,affectedDimensions:["outcome","isIoe"],current:!1},{profileId:"pingcastle",profileVersion:"1.2.0",mappingVersion:"1.1.0",normalizationVersion:"1.1.0",presentationVersion:"1.2.0",compatibilityKey:"pingcastle-canonical-v1.1",changeClass:"presentation-only",reimportRequired:!0,affectedDimensions:["evidence","presentation"],current:!1},{profileId:"pingcastle",profileVersion:"1.3.0",mappingVersion:"1.1.0",normalizationVersion:"1.1.0",presentationVersion:"1.2.0",compatibilityKey:"pingcastle-canonical-v1.1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["environment-context","evidence","presentation"],current:!1},{profileId:"pingcastle",profileVersion:"1.4.0",mappingVersion:"1.2.0",normalizationVersion:"1.1.0",presentationVersion:"1.2.0",compatibilityKey:"pingcastle-canonical-v1.1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["environment-context"],current:!1},{profileId:"pingcastle",profileVersion:"1.5.0",mappingVersion:"1.2.0",normalizationVersion:"1.1.0",presentationVersion:"1.2.0",compatibilityKey:"pingcastle-canonical-v1.1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["environment-context","evidence","import-diagnostics"],current:!0},{profileId:"cis-cat",profileVersion:"1.2.0",mappingVersion:"1.2.0",normalizationVersion:"1.2.0",presentationVersion:"1.2.0",compatibilityKey:"cis-cat-canonical-v1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["evidence"],current:!1},{profileId:"cis-cat",profileVersion:"1.3.0",mappingVersion:"1.3.0",normalizationVersion:"1.3.0",presentationVersion:"1.3.0",compatibilityKey:"cis-cat-canonical-v1",changeClass:"compatible",reimportRequired:!1,affectedDimensions:["evidence","presentation"],current:!1},{profileId:"cis-cat",profileVersion:"1.4.0",mappingVersion:"1.3.0",normalizationVersion:"1.3.0",presentationVersion:"1.3.0",compatibilityKey:"cis-cat-canonical-v1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["environment-context"],current:!0},{profileId:"maester",profileVersion:"1.0.0",mappingVersion:"1.0.0",normalizationVersion:"1.0.0",presentationVersion:"1.0.0",compatibilityKey:"maester-canonical-v1",changeClass:"compatible",reimportRequired:!1,affectedDimensions:[],current:!1},{profileId:"maester",profileVersion:"1.1.0",mappingVersion:"1.1.0",normalizationVersion:"1.0.0",presentationVersion:"1.1.0",compatibilityKey:"maester-canonical-v1",changeClass:"compatible",reimportRequired:!0,affectedDimensions:["evidence","environment-context","presentation"],current:!0}],Rb=(e,t)=>`${e.trim().toLocaleLowerCase("en-US")}@${t.trim()}`,_F=new Map(Ab.map(e=>[Rb(e.profileId,e.profileVersion),e]));function qF(e,t){if(!(!e||!t))return _F.get(Rb(e,t))}function Db(e){if(e)return Ab.find(t=>t.current&&t.profileId===e)}function t3(e,t){const n=qF(e??t.profileId,t.profileVersion),a=Db(e??t.profileId);return!n||!a?"unknown":(t.compatibilityKey??n.compatibilityKey)!==a.compatibilityKey?"incompatible":n.current?"current":n.reimportRequired||a.reimportRequired?"reimport-recommended":"compatible-older"}function Ib(e,t,n){if(!(typeof e!="number"||!Number.isFinite(e)||en))return e}function Y0(e,t,n){const a=Ib(e,t,n);return a!==void 0&&Number.isInteger(a)?a:void 0}function n3(e){return typeof e=="boolean"?e:void 0}function BF(e){if(typeof e!="string")return;const t=e.trim();return/^\d+(?:\.\d+){1,3}(?:[-+][a-z0-9.-]+)?$/i.test(t)?t:void 0}const UF=[{toolId:"pingcastle",property:"report.engine_version",title:"PingCastle engine version",subjectType:"scanner-report",disclosureClass:"technical-metadata",disclose:BF},...["risk.domain","risk.global","risk.stale_objects","risk.privileged_accounts","risk.trusts","risk.anomalies"].map(e=>({toolId:"pingcastle",property:e,title:e==="risk.domain"||e==="risk.global"?"Domain risk score":`${e.slice(5).replaceAll("_"," ")} score`,subjectType:"active-directory-environment",disclosureClass:"aggregate",disclose:t=>Ib(t,0,100)})),{toolId:"pingcastle",property:"domain.functional_level",title:"Domain functional level",subjectType:"active-directory-environment",disclosureClass:"technical-metadata",disclose:e=>Y0(e,2e3,9999)},{toolId:"pingcastle",property:"forest.functional_level",title:"Forest functional level",subjectType:"active-directory-environment",disclosureClass:"technical-metadata",disclose:e=>Y0(e,2e3,9999)},{toolId:"pingcastle",property:"forest.schema_version",title:"Forest schema version",subjectType:"active-directory-environment",disclosureClass:"technical-metadata",disclose:e=>Y0(e,0,1e4)},{toolId:"pingcastle",property:"domain.controller_count",title:"Domain controller count",subjectType:"active-directory-environment",disclosureClass:"aggregate",disclose:e=>Y0(e,0,1e6)},{toolId:"pingcastle",property:"domain.recycle_bin_enabled",title:"AD Recycle Bin enabled",subjectType:"active-directory-environment",disclosureClass:"configuration-state",disclose:n3},{toolId:"pingcastle",property:"entra.configuration_detected",title:"Entra ID configuration detected",subjectType:"active-directory-environment",disclosureClass:"configuration-state",disclose:n3},{toolId:"pingcastle",property:"logging.wef.configuration_count",title:"WEF configuration count",subjectType:"active-directory-environment",disclosureClass:"aggregate",disclose:e=>Y0(e,0,1e6)},{toolId:"pingcastle",property:"kerberos.krbtgt.version",title:"krbtgt version",subjectType:"active-directory-environment",disclosureClass:"technical-metadata",disclose:e=>Y0(e,0,1e6)}];new Map(UF.map(e=>[`${e.toolId}\0${e.property}`,e]));function um(e){return e==="failed"?"fail":e==="passed"?"pass":e==="error"?"execution_error":e==="not-run"?"not_run":e==="not-applicable"?"not_applicable":e==="manual"?"informational":e==="investigate"?"warning":"unknown"}function zF(e){return e==="error"?"failed":e==="not-run"?"not-run":e==="unknown"?"unknown":"completed"}function WF(e,t={}){const n=new Map,a=new Map,i=r=>{const c=a.get(r.run.id);if(c!==void 0)return c;const f=new Set(r.results.flatMap(T=>T.baselineId?[T.baselineId]:[])).size||r.run.baselineAnalysisIds.length;return a.set(r.run.id,f),f};for(const r of e){const c=r.run.evaluator.version===d1.version,l=t.allowPreviousVersionForDisplay&&["1.3.3","1.4.0"].includes(r.run.evaluator.version);if(r.run.evaluator.id!==d1.id||!c&&!l)continue;const f=n.get(r.run.aggregationRunId),T=f?.run.evaluator.version===r.run.evaluator.version,p=f?.run.evaluator.version==="1.3.3"&&r.run.evaluator.version==="1.4.0";(!f||c&&!T||p||T&&(i(r)>i(f)||i(r)===i(f)&&`${r.run.completedAt}${r.run.id}`>`${f.run.completedAt}${f.run.id}`))&&n.set(r.run.aggregationRunId,r)}return[...n.values()].sort((r,c)=>r.run.completedAt.localeCompare(c.run.completedAt))}const VF="assessor-result-db-jsonl",HF="1.1.0",GF=1e3;function Nb(e){return Object.entries(e).filter(([,t])=>t!==void 0)}function XF(e){const t=new Set(["projectId","assessmentId","scanRunId","scanRunIds","evaluationRunId"]);return Object.fromEntries(Nb(e).filter(([n])=>t.has(n)))}function KF(e){const t=new Set(["projectId","assessmentId","scanRunId","scanRunIds","evaluationRunId","offset","limit"]);return Object.fromEntries(Nb(e).filter(([n])=>!t.has(n)))}function $F(e){if(e.sourceKind!=="environment-observation")return e;if(!e.supplementalDisclosurePolicyVersion||!e.supplementalDisclosureClass)throw new Error("An unclassified supplemental result cannot be exported.");const t={...e};return delete t.affectedAsset,delete t.environmentAttributes,delete t.environmentOriginalValue,delete t.environmentSectionKey,delete t.environmentSubjectIdentity,delete t.sourceLocator,delete t.sourceObservedAt,delete t.sourceViewId,t}function YF(e,t,n){return`${[{recordType:"manifest",format:VF,schemaVersion:HF,generatedAt:n,resultCount:t.length,scope:XF(e),filters:KF(e)},...t.map((i,r)=>({recordType:"result",position:r+1,result:$F(i)}))].map(i=>JSON.stringify(i)).join(` +`)} +`}function ZF(e){return`assessor-result-db-filtered-${e.replace(/\.\d{3}Z$/,"Z").replaceAll(":","-")}.jsonl`}async function dm(e,t,n=GF){const a={...t,offset:void 0,limit:void 0},i=[];let r;for(;r===void 0||i.length0?t:void 0}function QF(e,t,n,a,i=JF){const r=a3(e),c=a3(n),l=i3(t),f=i3(a);return!!(r&&r===c&&l!==void 0&&f!==void 0&&Math.abs(l-f)<=i)}function Z0(e){return e&&Date.parse(e)||0}function J0(e){if(!e)return null;const t=new Date(e);if(Number.isNaN(t.getTime()))return null;const n=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),i=String(t.getDate()).padStart(2,"0");return`${n}-${a}-${i}`}function s3(e){return`${e}T12:00:00.000Z`}function eL(e){return e.id==="generic"||e.id==="unknown"}function Ob(e){const t=new Map;for(const n of e)eL(n.detectedTool)||t.set(n.detectedTool.id,n.detectedTool);return t.size===1?[...t.values()][0]:t.size>1?{id:"multiple",name:"Multiple Tools"}:e[0]?.detectedTool??{id:"generic",name:"Assessment data"}}function tL(e,t){const n=new Map;for(const i of e){const r=n.get(i.scanRunId)??[];r.push(i),n.set(i.scanRunId,r)}const a=new Set([...n.values()].map(i=>Ob(i).id));return t.length&&a.add("gpo-backup"),a.size}function ho(e,t=[],n=[],a=[]){const i=new Map(t.map(T=>[T.id,T])),r=new Map(n.map(T=>[T.id,T])),c=new Map,l=(T,p=s3(T))=>{const m=c.get(T);if(m)return m;const g={key:T,assessmentIds:new Set,scanRunIds:new Set,files:[],gpoBackups:[],effectiveAt:p};return c.set(T,g),g};for(const T of e){const p=r.get(T.scanRunId),m=p?i.get(p.assessmentId):void 0,g=T.lastModifiedAt??T.importedAt,S=J0(m?.effectiveAt)??J0(g);if(!S)continue;const x=l(S,m?.effectiveAt??g);x.files.push(T),x.scanRunIds.add(T.scanRunId),p&&x.scanRunIds.add(p.id),m&&x.assessmentIds.add(m.id)}for(const T of n){const p=i.get(T.assessmentId);if([...c.values()].some(x=>x.scanRunIds.has(T.id)))continue;const g=J0(p?.effectiveAt)??J0(T.completedAt??T.startedAt??T.importedAt);if(!g)continue;const S=l(g,p?.effectiveAt??T.completedAt??T.startedAt??T.importedAt);S.scanRunIds.add(T.id),p&&S.assessmentIds.add(p.id)}for(const T of t){if(!T.effectiveAt)continue;const p=J0(T.effectiveAt);if(!p)continue;l(p,T.effectiveAt).assessmentIds.add(T.id)}for(const T of a){let p=T.assessmentId?[...c.values()].find(m=>m.assessmentIds.has(T.assessmentId)):void 0;if(!p&&T.assessmentId){const m=i.get(T.assessmentId),g=J0(m?.effectiveAt);g&&(p=l(g,m.effectiveAt),p.assessmentIds.add(T.assessmentId))}!p&&c.size===1&&(p=[...c.values()][0]),p&&p.gpoBackups.push(T)}const f=[...c.values()].map(T=>{const p=[...T.files].sort((S,x)=>Z0(x.lastModifiedAt??x.importedAt)-Z0(S.lastModifiedAt??S.importedAt)),m=[...p.map(S=>S.importedAt),...T.gpoBackups.map(S=>S.submittedAt)].reduce((S,x)=>Z0(x)>Z0(S)?x:S,T.effectiveAt),g=[...T.scanRunIds];return{id:`timeslot-${T.key}`,scanRunId:g[0]??"",scanRunIds:g,assessmentIds:[...T.assessmentIds],tool:Ob(p),files:p,gpoBackups:T.gpoBackups.slice(),sourceCount:tL(p,T.gpoBackups),fileCount:p.length,fileNames:p.map(S=>S.fileName),formats:[...new Set(p.map(S=>S.format))],sizeBytes:p.reduce((S,x)=>S+x.sizeBytes,0)+T.gpoBackups.reduce((S,x)=>S+x.sizeBytes,0),fileDate:s3(T.key),importedAt:m,possibleDuplicateGroupIds:[]}}).sort((T,p)=>Z0(p.fileDate)-Z0(T.fileDate));for(let T=0;T0&&Object.values(e.weights).every(t=>Number.isFinite(t)&&t>0)}function Hu(e){const t=e.filter(a=>a.score!==void 0&&Number.isFinite(a.score)&&a.score>=0&&a.score<=100&&Number.isFinite(a.weight??1)&&(a.weight??1)>0),n=t.reduce((a,i)=>a+(i.weight??1),0);return n?t.reduce((a,i)=>a+i.score*(i.weight??1),0)/n:void 0}function Gu(e){const t=new Map;for(const n of e){const a=t.get(n.toolId);a?a.push(n):t.set(n.toolId,[n])}return[...t].map(([n,a])=>{const i=new Set(a.map(c=>JSON.stringify([c.policy.version,c.policy.weights[n]??c.policy.defaultWeight]))),r=[...new Set(a.flatMap(c=>c.issues))];return i.size!==1&&r.push("Scoring policies differ"),{toolId:n,scans:a,score:i.size===1?Hu(a):void 0,weight:a[0].policy.weights[n]??a[0].policy.defaultWeight,methods:[...new Set(a.map(c=>c.method))],issues:r}})}function jb(e,t){const n=(l,f)=>l.comparisonKey!==void 0&&l.comparisonKey===f.comparisonKey&&l.processingKey===f.processingKey&&l.evaluationScopeKey!==void 0&&l.evaluationScopeKey===f.evaluationScopeKey&&l.observedAt!==void 0&&f.observedAt!==void 0&&Date.parse(f.observedAt)>Date.parse(l.observedAt)&&l.issues.length===0&&f.issues.length===0&&l.method===f.method&&l.policy.version===f.policy.version&&(l.policy.weights[l.toolId]??l.policy.defaultWeight)===(f.policy.weights[f.toolId]??f.policy.defaultWeight),a=e.flatMap(l=>{const f=t.filter(T=>n(l,T));return f.length===1&&e.filter(T=>n(T,f[0])).length===1&&l.score!==void 0&&f[0].score!==void 0?[{left:l,right:f[0]}]:[]}),i=Hu(Gu(a.map(l=>l.left))),r=Hu(Gu(a.map(l=>l.right))),c=e.filter(l=>!t.some(f=>l.comparisonKey!==void 0&&l.comparisonKey===f.comparisonKey&&f.observedAt!==void 0&&l.observedAt!==void 0&&Date.parse(f.observedAt)>Date.parse(l.observedAt)&&f.assessed>0&&!f.issues.includes("Source integrity diagnostic")));return{baselineScore:i,currentScore:r,change:i===void 0||r===void 0?void 0:r-i,comparable:a.length,scopeChanged:a.length!==e.length||a.length!==t.length,awaitingRevalidation:c.map(l=>({assessmentId:l.assessmentId,runIds:l.runIds,observedAt:l.observedAt,occurrenceIds:l.openOccurrenceIds}))}}function nL(e){if(po(e.tool.id)!=="pingcastle"||!e.property.startsWith("pingcastle.xml.")||e.property.includes(".attribute."))return e;const t=e.attributes.xmlPath,n=typeof t=="string"?/^\/?HealthcheckData\[\d+\]\/([A-Za-z]+)\[\d+\]$/.exec(t)?.[1]:void 0,a=n?{GlobalScore:"risk.global",DomainFQDN:"domain.fqdn",GenerationDate:"report.generated_at",EngineVersion:"report.engine_version"}[n]:void 0;return a?{...e,property:a}:e}function po(e){const t=e.toLowerCase().replace(/[^a-z0-9]/g,"");return{purpleknight:"purple-knight",pingcastle:"pingcastle",ciscat:"cis-cat",ciscatpro:"cis-cat",maester:"maester",gpos:"group-policy",gpoanalysis:"group-policy",grouppolicy:"group-policy"}[t]??e.toLowerCase()}function Fb(e){return e.normalizedValue===void 0?e.originalValue:e.normalizedValue}function aL(e){const t=typeof e=="number"?e:typeof e=="string"&&/^\s*\d+(?:\.\d+)?\s*%?\s*$/.test(e)?Number(e.replace("%","").trim()):NaN;return Number.isFinite(t)&&t>=0&&t<=100?t:void 0}function Ql(e,t){for(const n of t){const a=[...new Set(e.filter(i=>i.property===n&&i.state==="observed").map(Fb).filter(i=>typeof i=="string"&&!!i.trim()).map(i=>i.trim()))];if(a.length)return a.length===1?a[0]:void 0}}function nh(e){return e.outcome?.normalizedValue??um(e.status.normalizedValue??"unknown")}function Q0(e,t){const n=new Map;for(const a of e){const i=t(a),r=n.get(i);r?r.push(a):n.set(i,[a])}return n}function Lb(e,t=ei){const n=new Map(t.map(l=>[po(l.id),l.securityScoring])),a=[];for(const l of e){const f=new Map(l.scanRuns.filter(y=>!y.supersededByScanRunId).map(y=>[y.id,y])),T=Q0(l.environmentObservations??[],y=>y.importFileId),p=Q0(l.findingOccurrences,y=>y.importFileId),m=Q0(l.diagnostics,y=>y.importFileId),g=l.assessment.scoringPolicy??T1(),S=Mb(g),x=S?g:T1();for(const y of l.importFiles){const w=f.get(y.scanRunId);if(!w)continue;const C=po(y.detectedTool.id==="unknown"?w.tool.id:y.detectedTool.id),k=n.get(C),E=k?.native.kind==="mapped"?k.native:void 0,O=(T.get(y.id)??[]).filter(Ne=>Ne.scanRunId===w.id&&po(Ne.tool.id)===C),N=O.map(nL),B=(p.get(y.id)??[]).filter(Ne=>Ne.scanRunId===w.id),A=[],z=N.filter(Ne=>E?.properties.includes(Ne.property)),P=z.map(Ne=>Ne.state==="observed"?aL(Fb(Ne)):void 0),K=[...new Set(P)],I=N.some(Ne=>E?.incompatibleProperties?.includes(Ne.property)),L=K.length===1&&!I?K[0]:void 0;I&&A.push("Native report has multiple assessment scopes"),z.length&&L===void 0&&A.push("Native score unavailable or conflicting");let le=0,ue=0,X=0;const F=[];for(const Ne of B){const Ve=nh(Ne);Ve!=="not_applicable"&&X++,Ve==="pass"?le++:Ve!=="execution_error"&&Ve!=="not_run"&&Ve!=="not_applicable"&&wb(!!Ne.isIoe,Ve)&&(ue++,F.push(Ne.id))}const re=le+ue,me=k?.resultPopulation??"unknown",te=re>0&&(me==="complete"||me==="unknown"&&le>0),Ce=E?.direction==="lower-is-better",ee=L!==void 0?Ce?"inverted-native":"native":te?"pass-rate":"unavailable";let M=L!==void 0?Ce?100-L:L:te?100*le/re:void 0;S||(M=void 0,A.push("Unsupported scoring policy")),M===void 0&&A.push("Evidence present, not scoreable"),re/count-mismatch|coverage-mismatch|summary-mismatch|duplicate.*id|repeated.*id/.test(Ne.code))&&A.push("Source integrity diagnostic");const Y=Ql(N,k?.targets??[]),Z=k?.benchmark?Ql(N,k.benchmark):"default",J=Ql(N,["report.generated_at"]),he=J&&/T\d{2}:\d{2}:\d{2}/.test(J)&&Number.isFinite(Date.parse(J))?J:void 0,ge=Y&&Z?JSON.stringify([C,Y.toLowerCase(),Z]):void 0;(!ge||!he)&&A.push("Scan identity or time not verified");const de=y.processedWith,fe=Ql(N,["report.engine_version"])??y.detectedTool.version??w.tool.version;fe||A.push("Scanner version unavailable");const ye=JSON.stringify([fe??null,de.profileId,de.profileVersion,de.mappingVersion,de.normalizationVersion??null,k?.version??null]),qe=B.length&&B.every(Ne=>Ne.sourceIdentity.canonicalRuleId??Ne.sourceIdentity.originalRuleId)?JSON.stringify(B.map(Ne=>JSON.stringify([Ne.sourceIdentity.canonicalRuleId??Ne.sourceIdentity.originalRuleId,Ne.affectedAsset?.normalizedValue??null,nh(Ne)])).sort()):void 0,ae=qe?JSON.stringify(B.map(Ne=>{const Ve=nh(Ne);return JSON.stringify([Ne.sourceIdentity.canonicalRuleId??Ne.sourceIdentity.originalRuleId,Ve==="pass"||Ve==="fail"||Ve==="warning"?"evaluated":Ve])}).sort()):void 0;a.push({id:y.id,assessmentId:l.assessment.id,toolId:C,toolName:y.detectedTool.name,runIds:[w.id],importFileIds:[y.id],occurrenceIds:B.map(Ne=>Ne.id),resultSignature:qe,evaluationScopeKey:ae,contentSha256:y.sha256&&/^[a-f0-9]{64}$/i.test(y.sha256)?y.sha256.toLowerCase():void 0,comparisonKey:ge,observedAt:he,processingKey:ye,policy:x,score:M,nativeValue:L,nativeProperty:O.find(Ne=>Ne.id===z[0]?.id)?.property,method:ee,passed:le,deviations:ue,assessed:re,eligible:X,openOccurrenceIds:F,issues:A})}}const i=[...Q0(a,l=>l.runIds.length===1?JSON.stringify([l.assessmentId,l.toolId,l.runIds[0],l.processingKey]):JSON.stringify(["file",l.id])).values()].flatMap(l=>{const f=l.filter(w=>w.nativeValue!==void 0&&w.assessed===0),T=l.filter(w=>w.assessed>0),p=new Set(T.map(w=>w.resultSignature).filter(w=>!!w)),m=new Set(T.map(w=>JSON.stringify([w.passed,w.deviations,w.eligible]))),g=T.length===1||T.every(w=>w.resultSignature!==void 0)&&p.size===1&&m.size===1;if(f.length!==1||!T.length||!g)return l;const S=f[0],x=[...T].sort((w,C)=>C.eligible-w.eligible||w.id.localeCompare(C.id))[0],y=!!(S.comparisonKey&&S.observedAt);return[{...S,importFileIds:[...new Set(l.flatMap(w=>w.importFileIds))],occurrenceIds:x.occurrenceIds,resultSignature:x.resultSignature,evaluationScopeKey:x.evaluationScopeKey,contentSha256:void 0,passed:x.passed,deviations:x.deviations,assessed:x.assessed,eligible:x.eligible,openOccurrenceIds:x.openOccurrenceIds,issues:[...new Set(l.flatMap(w=>w.issues).filter(w=>!y||w!=="Scan identity or time not verified"))]}]}),c=[...Q0(i,l=>l.comparisonKey&&l.observedAt?JSON.stringify([l.assessmentId,l.comparisonKey,l.observedAt,l.processingKey]):l.contentSha256?JSON.stringify([l.assessmentId,l.toolId,"hash",l.contentSha256,l.processingKey]):JSON.stringify(["file",l.id])).values()].map(l=>{const T=[...l].sort((y,w)=>+(w.nativeValue!==void 0)-+(y.nativeValue!==void 0)||w.assessed-y.assessed||y.id.localeCompare(w.id))[0],p=new Set(l.flatMap(y=>y.nativeValue===void 0?[]:[y.nativeValue])),m=new Set(l.filter(y=>y.assessed>0).map(y=>JSON.stringify([y.passed,y.deviations,y.eligible]))),g=new Set(l.flatMap(y=>y.resultSignature?[y.resultSignature]:[])),S=p.size>1||m.size>1||g.size>1,x=[...l].sort((y,w)=>w.eligible-y.eligible)[0];return{...T,passed:x.passed,deviations:x.deviations,assessed:x.assessed,eligible:x.eligible,evaluationScopeKey:x.evaluationScopeKey,runIds:[...new Set(l.flatMap(y=>y.runIds))],importFileIds:l.flatMap(y=>y.importFileIds),occurrenceIds:l.flatMap(y=>y.occurrenceIds),openOccurrenceIds:x.openOccurrenceIds,score:S?void 0:T.score,issues:[...new Set([...l.flatMap(y=>y.issues),...S?["Conflicting representations of the same scan"]:[]])]}});return[...Q0(c,l=>l.comparisonKey&&l.observedAt?JSON.stringify([l.assessmentId,l.comparisonKey]):JSON.stringify(["file",l.id])).values()].flatMap(l=>{const f=[...l].sort((p,m)=>Date.parse(m.observedAt??"")-Date.parse(p.observedAt??"")||p.id.localeCompare(m.id)),T=f[0];return f.filter(p=>!T.observedAt||!p.observedAt||Date.parse(p.observedAt)===Date.parse(T.observedAt))})}function xu(e){return e===null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):JSON.stringify(e)}function hd(e){return typeof e.value=="object"&&e.value!==null&&typeof e.rawValue=="string"?e.rawValue:xu(e.value)}const Pb="Verwandte Daten";function _b(e){if(typeof e!="object"||e===null||Array.isArray(e))return[];const t=e.sections;if(!Array.isArray(t))return[];const n=[];for(const a of t){if(typeof a!="object"||a===null||Array.isArray(a))continue;const i=a;typeof i.sectionId!="string"||!Array.isArray(i.headers)||!Array.isArray(i.rows)||n.push({sectionId:i.sectionId,sectionLabel:typeof i.sectionLabel=="string"?i.sectionLabel:i.sectionId,prose:typeof i.prose=="string"?i.prose:"",headers:i.headers.map(xu),rows:i.rows.map(r=>Array.isArray(r)?r.map(xu):[xu(r)])})}return n}function qb(e){return"pingcastle-section-"+e}function Bb(e,t){return e+"::"+t}function iL(e,t){return _b(e).map(n=>Bb(t,n.sectionId))}function sL(e,t){return e.map(n=>{if(n.label!==Pb)return n;const a=iL(n.value,t);return a.length?{...n,value:a.join(", ")}:n})}const rL=/^(severity|criticality|priority)$/i;function oL(e,t){const n=t.severity?.normalizedValue;return!n||n==="unknown"||e.some(a=>rL.test(a.label.trim())&&hd(a))?e:[...e,{key:"derived-severity",label:"Severity",value:n,path:"derived/severity"}]}function cL(e){return new Map(e.map(t=>[t.id,oL(sL(t.originalFields,t.importFileId),t)]))}function Tm(e,t){return t.get(e.id)??e.originalFields}function ah(e,t){const n=new Map;for(const a of e)for(const i of Tm(a,t)){const r=i.columnIndex??Number.MAX_SAFE_INTEGER;n.set(i.label,Math.min(n.get(i.label)??r,r))}return[...n.entries()].sort((a,i)=>a[1]-i[1]||a[0].localeCompare(i[0])).map(([a])=>a)}function r3(e,t,n){const a=[...e].sort((i,r)=>(i.sourcePosition.rowIndex??0)-(r.sourcePosition.rowIndex??0));return[t,...a.map(i=>{const r=new Map(Tm(i,n).map(c=>[c.label,hd(c)]));return t.map(c=>r.get(c)??"")})]}function o3(e){return[...e].sort((t,n)=>(t.sourcePosition.rowIndex??0)-(n.sourcePosition.rowIndex??0))}function ih(e,t){return{...e,analysis:{...e.analysis,records:e.analysis.records.map((n,a)=>{const i=t[a];return i?{...n,findingOccurrenceId:i.id,findingDefinitionId:i.definitionId,scanRunId:i.scanRunId,importFileId:i.importFileId}:n})}}}function lL(e){const t=new Map;for(const i of e)for(const r of i.fields){const c=r.columnIndex??Number.MAX_SAFE_INTEGER;t.set(r.label,Math.min(t.get(r.label)??c,c))}const n=[...t.entries()].sort((i,r)=>i[1]-r[1]||i[0].localeCompare(r[0])).map(([i])=>i),a=[...e].sort((i,r)=>i.index-r.index);return{rows:[n,...a.map(i=>{const r=new Map(i.fields.map(c=>[c.label,hd(c)]));return n.map(c=>r.get(c)??"")})],highlightedRows:[!1,...a.map(i=>i.highlighted??!1)]}}function uL(e){const t=new Map;for(const n of e)if(n.sourceIdentity.tool.id==="pingcastle"){for(const a of n.originalFields)if(a.label===Pb)for(const i of _b(a.value)){const r=Bb(n.importFileId,i.sectionId);t.has(r)||t.set(r,i)}}return[...t.entries()].flatMap(([n,a])=>{const i=a.rows.length?[a.headers,...a.rows]:a.prose?[["Inhalt"],[a.prose]]:[];if(!i.length)return[];const r=a.sectionLabel.split("→").at(-1)?.replace(/\s*·\s*Tabelle\s+\d+$/i,"").trim()??"";let c=a.rows.length?a.prose.trim():"";return r&&c.toLocaleLowerCase("en-US").startsWith(r.toLocaleLowerCase("en-US"))&&(c=c.slice(r.length).trim()),c=c.replace(/(?:^|\s+)Close\s*$/i,"").trim(),[es("PingCastle · "+a.sectionLabel,i,Ns(i),a.sectionLabel,{id:qb(n),isProjectSheet:!1,...c?{resultPreamble:c}:{}})]})}function dL(e){const t=new Map;for(const n of e)for(const a of ho(n.importFiles))a.tool.id!=="generic"&&a.tool.id!=="unknown"&&t.set(a.tool.id,a.tool);return t.size===1?[...t.values()][0]:t.size>1?{id:"multiple",name:"Multiple Tools"}:{id:"generic",name:"Tabular Data"}}function TL(e){if(!e.length)return null;const t=e[0].project,n=e.flatMap(A=>A.scanRuns),a=e.flatMap(A=>A.importFiles),i=e.flatMap(A=>A.sourceTables),r=e.flatMap(A=>A.findingOccurrences);if(!n.length||!r.length&&!e.some(A=>A.environmentObservations?.length))return null;const c=new Map(a.map(A=>[A.id,A])),l=new Map(n.map(A=>[A.id,A])),f=new Map(i.map(A=>[A.id,A])),T=new Map,p=new Map;for(const A of r)if(A.sourceTableId!==void 0){const z=T.get(A.sourceTableId);z?z.push(A):T.set(A.sourceTableId,[A])}else{const z=p.get(A.importFileId);z?z.push(A):p.set(A.importFileId,[A])}const m=cL(r),g=[],S=[];for(const A of i){const z=T.get(A.id)??[];if(!z.length&&!A.rows?.length)continue;const P=z.length?{rows:r3(z,ah(z,m),m),highlightedRows:void 0}:lL(A.rows??[]),{rows:K,highlightedRows:I}=P,L=c.get(A.importFileId),le=L?l.get(L.scanRunId):void 0,ue=L?.fileName??t.name,X=le?.importedAt.slice(0,10)??"",F=[le?.tool.name,X,A.name].filter(Boolean).join(" · "),re=ih(es(F,K,Ns(K),ue,{id:Ou(ue,F,A.id),sourceFile:ue,sourceSheet:A.name,sourceTableIndex:A.index,toolId:le?.tool.id},I),o3(z));(z.length?g:S).push(re)}for(const A of a){const z=p.get(A.id)??[];if(!z.length)continue;const P=ah(z,m),K=r3(z,P,m),I=l.get(A.scanRunId),L=I?.importedAt.slice(0,10)??"",le=[I?.tool.name,L,A.format].filter(Boolean).join(" · ");g.push(ih(es(le,K,Ns(K),A.fileName,{id:Ou(A.fileName,le,A.id),sourceFile:A.fileName,sourceSheet:A.format,toolId:I?.tool.id}),o3(z)))}const x=ah(r,m),w=[[...["Source: File","Source: Sheet","Source: Scan"],...x]];for(const A of r){const z=c.get(A.importFileId),P=A.sourceTableId!==void 0?f.get(A.sourceTableId):void 0,K=l.get(A.scanRunId),I=new Map(Tm(A,m).map(L=>[L.label,hd(L)]));w.push([z?.fileName??"",P?.name??"",K?K.tool.name+" · "+K.importedAt:"",...x.map(L=>I.get(L)??"")])}const C=dL(e),k=t.name+" · All Records",E=ih(es(k,w,Ns(w),t.name,{isProjectSheet:!0}),r);r.length||(E.analysis.records=[]);const O=Math.max(...a.map(A=>Date.parse(A.lastModifiedAt??A.importedAt)),0),N=uL(r),B=new Set(a.map(A=>A.processedWith.profileVersion).filter(Boolean));return{fileName:t.name+" · All Scans",fileSize:a.reduce((A,z)=>A+z.sizeBytes,0),lastModified:O,format:"Project · "+C.name,rawText:"",sheets:[E,...g,...S,...N],profileId:C.id==="unknown"||C.id==="multiple"?"generic":C.id,profileVersion:B.size===1?[...B][0]:B.size>1?"gemischt":void 0,scanTool:C.name,securityScoring:{policy:e[0].assessment.scoringPolicy??T1(),scans:Lb(e)}}}function rp(e){return Array.isArray(e)?e.map(rp):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,rp(n)])):e}function o0(e){return JSON.stringify(rp(e))}function Ub(e){return[...new Set(e)].sort((t,n)=>t.localeCompare(n))}function fL(e){if(e){if(e.kind==="none")return{kind:"none"};if(e.kind==="string")return{kind:"text",value:e.value};if(e.kind==="multi-string")return{kind:"string-set",values:Ub(e.values)};if(e.kind==="binary")return{kind:"binary",hexadecimal:e.hexadecimal.toLocaleLowerCase("en-US")};if(e.kind==="uint32")return{kind:"integer",value:String(e.value)};if(e.kind==="uint64"&&/^\d+$/.test(e.value))return{kind:"integer",value:BigInt(e.value).toString()}}}function Xu(e){if(e){if(e.kind==="registry-policy")return e.operation==="delete-value"?{kind:"registry-state",state:"absent"}:e.operation==="delete-all-values"?{kind:"registry-state",state:"key-empty"}:e.operation==="create-key"?{kind:"registry-state",state:"key-present"}:e.operation!=="set-value"?void 0:fL(e.data);if(e.kind==="registry")return{kind:"text",value:`${e.typeCode},${e.rawData}`};if(e.kind==="scalar")return{kind:"text",value:e.raw};if(e.kind==="principal-set")return{kind:"string-set",values:Ub(e.principals)};if(e.kind==="audit-flags")return{kind:"audit-flags",success:e.success,failure:e.failure}}}function eu(e){if(!(e.kind!=="integer"||!/^-?\d+$/.test(e.value)))return BigInt(e.value)}function c3(e,t,n){return e===t?"match":e>t===n?"stronger":"weaker"}function l3(e){return e.kind==="string-set"?new Set(e.values):void 0}function u3(e,t){return[...t].every(n=>e.has(n))}function hL(e,t,n){const a=u3(e,t),i=u3(t,e);return a&&i?"match":n==="exact"?"different":n==="superset"?a?"stronger":i?"weaker":"different":i?"stronger":a?"weaker":"different"}function pL(e,t,n){if(e.success===t.success&&e.failure===t.failure)return"match";if(n==="exact")return"different";const a=(!t.success||e.success)&&(!t.failure||e.failure),i=(!e.success||t.success)&&(!e.failure||t.failure);return a?"stronger":i?"weaker":"different"}function mL(e,t,n){const a=Xu(e),i=Xu(t);let r="incomparable";const c=[];if(!a||!i)c.push("policy-comparator-value-unsupported");else if(n.kind==="equality")r=o0(a)===o0(i)?"match":"different";else if(n.kind==="minimum"||n.kind==="maximum"){const l=eu(a),f=eu(i);l===void 0||f===void 0?c.push("policy-comparator-integer-required"):r=c3(l,f,n.kind==="minimum")}else if(n.kind==="enum"){const l=a.kind==="text"?a.value:void 0,f=i.kind==="text"?i.value:void 0,T=l===void 0?-1:n.orderedValues.indexOf(l),p=f===void 0?-1:n.orderedValues.indexOf(f);T<0||p<0||new Set(n.orderedValues).size!==n.orderedValues.length?c.push("policy-comparator-enum-value-unsupported"):r=c3(BigInt(T),BigInt(p),n.direction==="higher-is-stronger")}else if(n.kind==="bitmask"){const l=eu(a),f=eu(i);l===void 0||f===void 0||l<0n||f<0n?c.push("policy-comparator-bitmask-required"):l===f?r="match":n.mode==="exact"?r="different":(l&f)===f?r="stronger":(l&f)===l?r="weaker":r="different"}else if(n.kind==="set"){const l=l3(a),f=l3(i);!l||!f?c.push("policy-comparator-set-required"):r=hL(l,f,n.mode)}else a.kind!=="audit-flags"||i.kind!=="audit-flags"?c.push("policy-comparator-audit-flags-required"):r=pL(a,i,n.mode);return{version:1,comparator:n,relation:r,actual:a,baseline:i,diagnosticCodes:c}}const Ku={Fail:6,"Review required":5,Pass:4,"Not configured":3,"No baseline rule":2,"Not comparable":1,Conflicts:0,Duplicates:0};function gL(e){const t={Fail:0,Pass:0,Conflicts:0,Duplicates:0,"Not configured":0,"Review required":0,"No baseline rule":0,"Not comparable":0},n=new Set,a=new Set,i=new Map;for(const r of e){const c=r.settingKey??JSON.stringify([r.sources[0]?.projectId,r.sources[0]?.assessmentId,r.scope,r.identity]);if((r.conflict||r.status==="Conflicts")&&n.add(c),(r.duplicate||r.status==="Duplicates")&&a.add(c),r.status==="Conflicts"||r.status==="Duplicates")continue;const l=i.get(c);(!l||Ku[r.status]>Ku[l])&&i.set(c,r.status)}return i.forEach(r=>{t[r]+=1}),t.Conflicts=n.size,t.Duplicates=a.size,t}function vL(e){const t=new Set,n=new Set;for(const a of e.filter(i=>i.status==="Fail"))for(const i of a.sources){t.add(JSON.stringify([i.projectId,i.assessmentId,a.scope,a.identity]));const r=N1(i);r&&n.add(r)}return{settings:t.size,backups:n.size}}function N1(e){return e.policyBackupInstanceId?JSON.stringify([e.projectId,e.assessmentId,e.policyBackupInstanceId]):void 0}const d3=e=>e.replace(/\//g,"\\").toLowerCase();function f1(e){const t=Xu(e);if(t)return o0({value:e.kind==="registry-policy"&&e.data?.kind==="multi-string"?e.data:t,...e.kind==="registry-policy"||e.kind==="registry"?{type:e.typeCode}:{}})}function xL(e){if(e.policyScope!=="computer"&&e.policyScope!=="user"||e.policyDeliveryMechanism==="group-policy-preference")return;const t=e.policyValues;if(t?.length){if(e.policyDeliveryMechanism==="registry-policy"){const n=t.filter(i=>i.kind==="registry-policy");if(n.length!==t.length||n.some(i=>i.operation!=="set-value"))return;const a=new Set(n.map(i=>JSON.stringify([d3(i.key),d3(i.valueName??"")])));return a.size===1?`${e.policyScope}:registry:${[...a][0]}`:void 0}return e.policyIdentityStatus==="resolved"&&e.policyIdentityKey?`${e.policyScope}:${e.policyIdentityKey}`:void 0}}function op(e){return JSON.stringify([e.projectId,e.assessmentId,e.policyScope,e.policyIdentityKey])}function yL(e){const t=new Map;for(const n of e){if(n.policyIdentityStatus==="resolved"||!n.policyIdentityKey||!n.policyScope)continue;const a=op(n);t.set(a,[...t.get(a)??[],n])}return[...t].map(([n,a])=>({id:`not-comparable:${n}`,status:"Not comparable",title:a[0].title,scope:a[0].policyScope,identity:a[0].policyIdentityKey,importedAt:_c(a),sources:a,settingKey:n,conflict:!1,duplicate:!1}))}function SL(e){const t=e.identity.target;return t.valueName||("section"in t?`${t.section} · ${t.key}`:t.key)}function _c(e){return e.reduce((t,n)=>n.importedAt>t?n.importedAt:t,"")}function bL(e,t){const n=new Set((e.baselineVariantAssessment?.actualValues??[]).map(f1).filter(r=>r!==void 0));if(n.size<2)return!1;const a=new Map;for(const r of t){const c=N1(r);if(!c)continue;const l=a.get(c)??new Set;(!r.policyValues?.length||!["configured","instruction"].includes(r.policyState??""))&&l.add(void 0);for(const f of r.policyValues??[])l.add(f1(f));a.set(c,l)}const i=new Set;for(const r of a.values()){if(r.size!==1||r.has(void 0))continue;const c=r.values().next().value;n.has(c)&&i.add(c)}return i.size>1}function wL(e,t,n){if(!e.baselineVariantAssessment)return{conflict:n?.status==="Conflicts",duplicate:n?.status==="Duplicates"};const a=t.length>0&&t.every(c=>c.policyScope===e.identity.scope&&c.policyIdentityKey===e.identity.id),i=new Set(t.flatMap(c=>{const l=N1(c);return l?[l]:[]}));return{conflict:e.customerState==="conflicted"||e.customerState==="indeterminate"&&a&&i.size>1&&bL(e,t),duplicate:e.customerState==="configured"&&a&&i.size>1&&t.every(c=>!!c.policyBackupInstanceId)}}function zb(e,t){const n=[...new Map(e.filter(x=>x.sourceKind==="policy-observation").map(x=>[x.sourceResultId,x])).values()],a=new Map(n.map(x=>[x.sourceResultId,x])),i=new Map;for(const x of n){const y=xL(x);if(!y||x.policyValues?.some(k=>!f1(k)))continue;const w=JSON.stringify([x.projectId,x.assessmentId,y]),C=i.get(w)??[];C.push(x),i.set(w,C)}const r=[],c=[];for(const[x,y]of i){const w=new Set(y.flatMap(k=>k.policyValues.map(f1)));if(w.size<2&&y.length<2)continue;const C=w.size>1?"Conflicts":"Duplicates";c.push({key:x,group:y,status:C})}const l=new Set,f=new Set;for(const x of t){const y=[...new Set(x.results.flatMap(C=>C.observationIds))].flatMap(C=>a.has(C)?[a.get(C)]:[]),w=_c(y);for(const C of x.results){const k=C.id??JSON.stringify([C.baselineAnalysisId,C.baselineLabel,C.identity?.id,C.observationIds]);if(f.has(k)||(f.add(k),C.observationIds.some(I=>!a.has(I))))continue;const E=C.observationIds.map(I=>a.get(I)),O=new Set(C.observationIds),N=c.filter(I=>I.group.some(L=>O.has(L.sourceResultId))),B=N[0],A=C.diagnosticCodes.includes("policy-evaluation-baseline-consensus-conflict"),z=C.comparator.baseline,P=z!==void 0&&z.kind!=="none"&&!(z.kind==="text"&&!z.value.trim());let K;C.baselineVariantAssessment?K=Jl(C)==="not-configured"?"Not configured":Jl(C)==="misconfigured"?"Fail":C.baselineVariantAssessment.decision==="all-pass"&&C.classification==="configured_match"?"Pass":"Review required":A?K="Conflicts":C.baselineState==="explicit-recommendation"&&P&&C.customerState==="configured"&&C.comparator.actual!==void 0&&C.classification==="configured_match"&&C.comparator.relation==="match"?K="Pass":Jl(C)==="misconfigured"?K="Fail":Jl(C)==="not-configured"?K="Not configured":K="Review required",r.push({id:k,status:K,title:SL(C),scope:C.identity.scope,identity:C.identity.id,importedAt:_c(E)||w,evaluatedAt:x.run.completedAt,sources:E,comparison:C,settingKey:JSON.stringify([x.run.projectId,x.run.aggregationRunId,C.identity.scope,C.identity.id]),...wL(C,E,B)});for(const I of N)l.add(I.key)}}const T=new Set(t.flatMap(x=>x.results.map(y=>y.identity.id))),p=new Set(t.flatMap(x=>x.results.flatMap(y=>y.observationIds))),m=new Map;for(const x of n){if(x.policyIdentityStatus!=="resolved"||!x.policyIdentityKey||T.has(x.policyIdentityKey)||p.has(x.sourceResultId))continue;const y=op(x);m.set(y,[...m.get(y)??[],x])}const g=new Set([...m.values()].flat().map(x=>x.sourceResultId)),S=new Map;for(const{key:x,group:y,status:w}of c){if(l.has(x))continue;const C=new Set(y.map(E=>g.has(E.sourceResultId)?op(E):void 0)),k=C.size===1?[...C][0]:void 0;if(k&&m.has(k)){S.set(k,w);continue}r.push({id:`${w}:${x}`,status:w,title:y[0].title,scope:y[0].policyScope,identity:y[0].policyIdentityKey??x,importedAt:_c(y),sources:y,settingKey:x,conflict:w==="Conflicts",duplicate:w==="Duplicates"})}for(const[x,y]of m){const w=S.get(x);r.push({id:`no-baseline-rule:${x}`,status:"No baseline rule",title:y[0].title,scope:y[0].policyScope,identity:y[0].policyIdentityKey,importedAt:_c(y),sources:y,settingKey:x,conflict:w==="Conflicts",duplicate:w==="Duplicates"})}return r.push(...yL(n)),r}const T3=new Set(["set-value","delete-value","delete-all-values","create-key"]);function CL(e,t,n){let a=mL(e,t,n);return e.kind==="registry-policy"&&!T3.has(e.operation)?a={...a,relation:"incomparable",diagnosticCodes:["policy-comparator-customer-value-ambiguous"]}:t.kind==="registry-policy"&&!T3.has(t.operation)?a={...a,relation:"incomparable",diagnosticCodes:["policy-comparator-baseline-unavailable"]}:e.kind==="registry-policy"&&t.kind==="registry-policy"&&a.relation!=="incomparable"&&e.operation==="set-value"&&t.operation==="set-value"&&(e.typeCode!==t.typeCode||e.data?.kind==="multi-string"&&o0(e.data)!==o0(t.data))&&(a={...a,relation:"different"}),a}function fm(e){const t=e.variants.length,n=` (${t} assessed baseline variant${t===1?"":"s"}; backup configuration only)`;return e.decision==="all-pass"?"Matches every assessed baseline variant"+n:e.decision==="all-fail"?"Differs from every assessed baseline variant"+n:e.decision==="mixed"?"Review required: baseline variant results differ"+n:"Review required: comparison evidence or applicability is incomplete"+n}var Br={},sh={},f3;function EL(){return f3||(f3=1,(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.CHAR=` +\r -퟿-�𐀀-􏿿`,e.S=` \r +`,e.NAME_START_CHAR=":A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿",e.NAME_CHAR="-"+e.NAME_START_CHAR+".0-9·̀-ͯ‿-⁀",e.CHAR_RE=new RegExp("^["+e.CHAR+"]$","u"),e.S_RE=new RegExp("^["+e.S+"]+$","u"),e.NAME_START_CHAR_RE=new RegExp("^["+e.NAME_START_CHAR+"]$","u"),e.NAME_CHAR_RE=new RegExp("^["+e.NAME_CHAR+"]$","u"),e.NAME_RE=new RegExp("^["+e.NAME_START_CHAR+"]["+e.NAME_CHAR+"]*$","u"),e.NMTOKEN_RE=new RegExp("^["+e.NAME_CHAR+"]+$","u");var t=9,n=10,a=13,i=32;e.S_LIST=[i,n,a,t];function r(T){return T>=i&&T<=55295||T===n||T===a||T===t||T>=57344&&T<=65533||T>=65536&&T<=1114111}e.isChar=r;function c(T){return T===i||T===n||T===a||T===t}e.isS=c;function l(T){return T>=65&&T<=90||T>=97&&T<=122||T===58||T===95||T===8204||T===8205||T>=192&&T<=214||T>=216&&T<=246||T>=248&&T<=767||T>=880&&T<=893||T>=895&&T<=8191||T>=8304&&T<=8591||T>=11264&&T<=12271||T>=12289&&T<=55295||T>=63744&&T<=64975||T>=65008&&T<=65533||T>=65536&&T<=983039}e.isNameStartChar=l;function f(T){return l(T)||T>=48&&T<=57||T===45||T===46||T===183||T>=768&&T<=879||T>=8255&&T<=8256}e.isNameChar=f})(sh)),sh}var rh={},h3;function kL(){return h3||(h3=1,(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.CHAR="-퟿-�𐀀-􏿿",e.RESTRICTED_CHAR="-\b\v\f--„†-Ÿ",e.S=` \r +`,e.NAME_START_CHAR=":A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿",e.NAME_CHAR="-"+e.NAME_START_CHAR+".0-9·̀-ͯ‿-⁀",e.CHAR_RE=new RegExp("^["+e.CHAR+"]$","u"),e.RESTRICTED_CHAR_RE=new RegExp("^["+e.RESTRICTED_CHAR+"]$","u"),e.S_RE=new RegExp("^["+e.S+"]+$","u"),e.NAME_START_CHAR_RE=new RegExp("^["+e.NAME_START_CHAR+"]$","u"),e.NAME_CHAR_RE=new RegExp("^["+e.NAME_CHAR+"]$","u"),e.NAME_RE=new RegExp("^["+e.NAME_START_CHAR+"]["+e.NAME_CHAR+"]*$","u"),e.NMTOKEN_RE=new RegExp("^["+e.NAME_CHAR+"]+$","u");var t=9,n=10,a=13,i=32;e.S_LIST=[i,n,a,t];function r(m){return m>=1&&m<=55295||m>=57344&&m<=65533||m>=65536&&m<=1114111}e.isChar=r;function c(m){return m>=1&&m<=8||m===11||m===12||m>=14&&m<=31||m>=127&&m<=132||m>=134&&m<=159}e.isRestrictedChar=c;function l(m){return m===9||m===10||m===13||m>31&&m<127||m===133||m>159&&m<=55295||m>=57344&&m<=65533||m>=65536&&m<=1114111}e.isCharAndNotRestricted=l;function f(m){return m===i||m===n||m===a||m===t}e.isS=f;function T(m){return m>=65&&m<=90||m>=97&&m<=122||m===58||m===95||m===8204||m===8205||m>=192&&m<=214||m>=216&&m<=246||m>=248&&m<=767||m>=880&&m<=893||m>=895&&m<=8191||m>=8304&&m<=8591||m>=11264&&m<=12271||m>=12289&&m<=55295||m>=63744&&m<=64975||m>=65008&&m<=65533||m>=65536&&m<=983039}e.isNameStartChar=T;function p(m){return T(m)||m>=48&&m<=57||m===45||m===46||m===183||m>=768&&m<=879||m>=8255&&m<=8256}e.isNameChar=p})(rh)),rh}var oh={},p3;function AL(){return p3||(p3=1,(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.NC_NAME_START_CHAR="A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌-‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿",e.NC_NAME_CHAR="-"+e.NC_NAME_START_CHAR+".0-9·̀-ͯ‿-⁀",e.NC_NAME_START_CHAR_RE=new RegExp("^["+e.NC_NAME_START_CHAR+"]$","u"),e.NC_NAME_CHAR_RE=new RegExp("^["+e.NC_NAME_CHAR+"]$","u"),e.NC_NAME_RE=new RegExp("^["+e.NC_NAME_START_CHAR+"]["+e.NC_NAME_CHAR+"]*$","u");function t(a){return a>=65&&a<=90||a===95||a>=97&&a<=122||a>=192&&a<=214||a>=216&&a<=246||a>=248&&a<=767||a>=880&&a<=893||a>=895&&a<=8191||a>=8204&&a<=8205||a>=8304&&a<=8591||a>=11264&&a<=12271||a>=12289&&a<=55295||a>=63744&&a<=64975||a>=65008&&a<=65533||a>=65536&&a<=983039}e.isNCNameStartChar=t;function n(a){return t(a)||a===45||a===46||a>=48&&a<=57||a===183||a>=768&&a<=879||a>=8255&&a<=8256}e.isNCNameChar=n})(oh)),oh}var m3;function RL(){if(m3)return Br;m3=1,Object.defineProperty(Br,"__esModule",{value:!0}),Br.SaxesParser=Br.EVENTS=void 0;const e=EL(),t=kL(),n=AL();var a=e.isS,i=e.isChar,r=e.isNameStartChar,c=e.isNameChar,l=e.S_LIST,f=e.NAME_RE,T=t.isChar,p=n.isNCNameStartChar,m=n.isNCNameChar,g=n.NC_NAME_RE;const S="http://www.w3.org/XML/1998/namespace",x="http://www.w3.org/2000/xmlns/",y={__proto__:null,xml:S,xmlns:x},w={__proto__:null,amp:"&",gt:">",lt:"<",quot:'"',apos:"'"},C=-1,k=-2,E=0,O=1,N=2,B=3,A=4,z=5,P=6,K=7,I=8,L=9,le=10,ue=11,X=12,F=13,re=14,me=15,te=16,Ce=17,ee=18,M=19,Y=20,Z=21,J=22,he=23,ge=24,de=25,fe=26,ye=27,qe=28,ae=29,Ne=30,Ve=31,tt=32,We=33,Le=34,_e=35,Xe=36,pt=37,Pt=38,Kt=39,Dt=40,dt=41,jt=42,Gt=43,ln=44,Et=9,_t=10,pe=13,He=32,Je=33,rt=34,Ye=38,mt=39,Qe=45,qt=47,ot=59,Pe=60,Me=61,Ke=62,st=63,Vt=91,Xt=93,Fn=133,Sa=8232,Zn=W=>W===rt||W===mt,ba=[rt,mt],Wn=[...ba,Vt,Ke],Ln=[...ba,Pe,Xt],Si=[Me,st,...l],wa=[...l,Ke,Ye,Pe];function ti(W,D,j){switch(D){case"xml":j!==S&&W.fail(`xml prefix must be bound to ${S}.`);break;case"xmlns":j!==x&&W.fail(`xmlns prefix must be bound to ${x}.`);break}switch(j){case x:W.fail(D===""?`the default namespace may not be set to ${j}.`:`may not assign a prefix (even "xmlns") to the URI ${x}.`);break;case S:switch(D){case"xml":break;case"":W.fail(`the default namespace may not be set to ${j}.`);break;default:W.fail("may not assign the xml namespace to another prefix.")}break}}function Pn(W,D){for(const j of Object.keys(D))ti(W,j,D[j])}const Vn=W=>g.test(W),q=W=>f.test(W),ne=0,V=1,G=2;Br.EVENTS=["xmldecl","text","processinginstruction","doctype","comment","opentagstart","attribute","opentag","closetag","cdata","error","end","ready"];const Q={xmldecl:"xmldeclHandler",text:"textHandler",processinginstruction:"piHandler",doctype:"doctypeHandler",comment:"commentHandler",opentagstart:"openTagStartHandler",attribute:"attributeHandler",opentag:"openTagHandler",closetag:"closeTagHandler",cdata:"cdataHandler",error:"errorHandler",end:"endHandler",ready:"readyHandler"};class ie{constructor(D){this.opt=D??{},this.fragmentOpt=!!this.opt.fragment;const j=this.xmlnsOpt=!!this.opt.xmlns;if(this.trackPosition=this.opt.position!==!1,this.fileName=this.opt.fileName,j){this.nameStartCheck=p,this.nameCheck=m,this.isName=Vn,this.processAttribs=this.processAttribsNS,this.pushAttrib=this.pushAttribNS,this.ns=Object.assign({__proto__:null},y);const _=this.opt.additionalNamespaces;_!=null&&(Pn(this,_),Object.assign(this.ns,_))}else this.nameStartCheck=r,this.nameCheck=c,this.isName=q,this.processAttribs=this.processAttribsPlain,this.pushAttrib=this.pushAttribPlain;this.stateTable=[this.sBegin,this.sBeginWhitespace,this.sDoctype,this.sDoctypeQuote,this.sDTD,this.sDTDQuoted,this.sDTDOpenWaka,this.sDTDOpenWakaBang,this.sDTDComment,this.sDTDCommentEnding,this.sDTDCommentEnded,this.sDTDPI,this.sDTDPIEnding,this.sText,this.sEntity,this.sOpenWaka,this.sOpenWakaBang,this.sComment,this.sCommentEnding,this.sCommentEnded,this.sCData,this.sCDataEnding,this.sCDataEnding2,this.sPIFirstChar,this.sPIRest,this.sPIBody,this.sPIEnding,this.sXMLDeclNameStart,this.sXMLDeclName,this.sXMLDeclEq,this.sXMLDeclValueStart,this.sXMLDeclValue,this.sXMLDeclSeparator,this.sXMLDeclEnding,this.sOpenTag,this.sOpenTagSlash,this.sAttrib,this.sAttribName,this.sAttribNameSawWhite,this.sAttribValue,this.sAttribValueQuoted,this.sAttribValueClosed,this.sAttribValueUnquoted,this.sCloseTag,this.sCloseTagSawWhite],this._init()}get closed(){return this._closed}_init(){var D;this.openWakaBang="",this.text="",this.name="",this.piTarget="",this.entity="",this.q=null,this.tags=[],this.tag=null,this.topNS=null,this.chunk="",this.chunkPosition=0,this.i=0,this.prevI=0,this.carriedFromPrevious=void 0,this.forbiddenState=ne,this.attribList=[];const{fragmentOpt:j}=this;this.state=j?F:E,this.reportedTextBeforeRoot=this.reportedTextAfterRoot=this.closedRoot=this.sawRoot=j,this.xmlDeclPossible=!j,this.xmlDeclExpects=["version"],this.entityReturnState=void 0;let{defaultXMLVersion:_}=this.opt;if(_===void 0){if(this.opt.forceXMLVersion===!0)throw new Error("forceXMLVersion set but defaultXMLVersion is not set");_="1.0"}this.setXMLVersion(_),this.positionAtNewLine=0,this.doctype=!1,this._closed=!1,this.xmlDecl={version:void 0,encoding:void 0,standalone:void 0},this.line=1,this.column=0,this.ENTITIES=Object.create(w),(D=this.readyHandler)===null||D===void 0||D.call(this)}get position(){return this.chunkPosition+this.i}get columnIndex(){return this.position-this.positionAtNewLine}on(D,j){this[Q[D]]=j}off(D){this[Q[D]]=void 0}makeError(D){var j;let _=(j=this.fileName)!==null&&j!==void 0?j:"";return this.trackPosition&&(_.length>0&&(_+=":"),_+=`${this.line}:${this.column}`),_.length>0&&(_+=": "),new Error(_+D)}fail(D){const j=this.makeError(D),_=this.errorHandler;if(_===void 0)throw j;return _(j),this}write(D){if(this.closed)return this.fail("cannot write after close; assign an onready handler.");let j=!1;D===null?(j=!0,D=""):typeof D=="object"&&(D=D.toString()),this.carriedFromPrevious!==void 0&&(D=`${this.carriedFromPrevious}${D}`,this.carriedFromPrevious=void 0);let _=D.length;const se=D.charCodeAt(_-1);!j&&(se===pe||se>=55296&&se<=56319)&&(this.carriedFromPrevious=D[_-1],_--,D=D.slice(0,_));const{stateTable:xe}=this;for(this.chunk=D,this.i=0;this.i<_;)xe[this.state].call(this);return this.chunkPosition+=_,j?this.end():this}close(){return this.write(null)}getCode10(){const{chunk:D,i:j}=this;if(this.prevI=j,this.i=j+1,j>=D.length)return C;const _=D.charCodeAt(j);if(this.column++,_<55296){if(_>=He||_===Et)return _;switch(_){case _t:return this.line++,this.column=0,this.positionAtNewLine=this.position,_t;case pe:return D.charCodeAt(j+1)===_t&&(this.i=j+2),this.line++,this.column=0,this.positionAtNewLine=this.position,k;default:return this.fail("disallowed character."),_}}if(_>56319)return _>=57344&&_<=65533||this.fail("disallowed character."),_;const se=65536+(_-55296)*1024+(D.charCodeAt(j+1)-56320);return this.i=j+2,se>1114111&&this.fail("disallowed character."),se}getCode11(){const{chunk:D,i:j}=this;if(this.prevI=j,this.i=j+1,j>=D.length)return C;const _=D.charCodeAt(j);if(this.column++,_<55296){if(_>31&&_<127||_>159&&_!==Sa||_===Et)return _;switch(_){case _t:return this.line++,this.column=0,this.positionAtNewLine=this.position,_t;case pe:{const xe=D.charCodeAt(j+1);(xe===_t||xe===Fn)&&(this.i=j+2)}case Fn:case Sa:return this.line++,this.column=0,this.positionAtNewLine=this.position,k;default:return this.fail("disallowed character."),_}}if(_>56319)return _>=57344&&_<=65533||this.fail("disallowed character."),_;const se=65536+(_-55296)*1024+(D.charCodeAt(j+1)-56320);return this.i=j+2,se>1114111&&this.fail("disallowed character."),se}getCodeNorm(){const D=this.getCode();return D===k?_t:D}unget(){this.i=this.prevI,this.column--}captureTo(D){let{i:j}=this;const{chunk:_}=this;for(;;){const se=this.getCode(),xe=se===k,Ae=xe?_t:se;if(Ae===C||D.includes(Ae))return this.text+=_.slice(j,this.prevI),Ae;xe&&(this.text+=`${_.slice(j,this.prevI)} +`,j=this.i)}}captureToChar(D){let{i:j}=this;const{chunk:_}=this;for(;;){let se=this.getCode();switch(se){case k:this.text+=`${_.slice(j,this.prevI)} +`,j=this.i,se=_t;break;case C:return this.text+=_.slice(j),!1}if(se===D)return this.text+=_.slice(j,this.prevI),!0}}captureNameChars(){const{chunk:D,i:j}=this;for(;;){const _=this.getCode();if(_===C)return this.name+=D.slice(j),C;if(!c(_))return this.name+=D.slice(j,this.prevI),_===k?_t:_}}skipSpaces(){for(;;){const D=this.getCodeNorm();if(D===C||!a(D))return D}}setXMLVersion(D){this.currentXMLVersion=D,D==="1.0"?(this.isChar=i,this.getCode=this.getCode10):(this.isChar=T,this.getCode=this.getCode11)}sBegin(){this.chunk.charCodeAt(0)===65279&&(this.i++,this.column++),this.state=O}sBeginWhitespace(){const D=this.i,j=this.skipSpaces();switch(this.prevI!==D&&(this.xmlDeclPossible=!1),j){case Pe:if(this.state=me,this.text.length!==0)throw new Error("no-empty text at start");break;case C:break;default:this.unget(),this.state=F,this.xmlDeclPossible=!1}}sDoctype(){var D;const j=this.captureTo(Wn);switch(j){case Ke:{(D=this.doctypeHandler)===null||D===void 0||D.call(this,this.text),this.text="",this.state=F,this.doctype=!0;break}case C:break;default:this.text+=String.fromCodePoint(j),j===Vt?this.state=A:Zn(j)&&(this.state=B,this.q=j)}}sDoctypeQuote(){const D=this.q;this.captureToChar(D)&&(this.text+=String.fromCodePoint(D),this.q=null,this.state=N)}sDTD(){const D=this.captureTo(Ln);D!==C&&(this.text+=String.fromCodePoint(D),D===Xt?this.state=N:D===Pe?this.state=P:Zn(D)&&(this.state=z,this.q=D))}sDTDQuoted(){const D=this.q;this.captureToChar(D)&&(this.text+=String.fromCodePoint(D),this.state=A,this.q=null)}sDTDOpenWaka(){const D=this.getCodeNorm();switch(this.text+=String.fromCodePoint(D),D){case Je:this.state=K,this.openWakaBang="";break;case st:this.state=ue;break;default:this.state=A}}sDTDOpenWakaBang(){const D=String.fromCodePoint(this.getCodeNorm()),j=this.openWakaBang+=D;this.text+=D,j!=="-"&&(this.state=j==="--"?I:A,this.openWakaBang="")}sDTDComment(){this.captureToChar(Qe)&&(this.text+="-",this.state=L)}sDTDCommentEnding(){const D=this.getCodeNorm();this.text+=String.fromCodePoint(D),this.state=D===Qe?le:I}sDTDCommentEnded(){const D=this.getCodeNorm();this.text+=String.fromCodePoint(D),D===Ke?this.state=A:(this.fail("malformed comment."),this.state=I)}sDTDPI(){this.captureToChar(st)&&(this.text+="?",this.state=X)}sDTDPIEnding(){const D=this.getCodeNorm();this.text+=String.fromCodePoint(D),D===Ke&&(this.state=A)}sText(){this.tags.length!==0?this.handleTextInRoot():this.handleTextOutsideRoot()}sEntity(){let{i:D}=this;const{chunk:j}=this;e:for(;;)switch(this.getCode()){case k:this.entity+=`${j.slice(D,this.prevI)} +`,D=this.i;break;case ot:{const{entityReturnState:_}=this,se=this.entity+j.slice(D,this.prevI);this.state=_;let xe;se===""?(this.fail("empty entity name."),xe="&;"):(xe=this.parseEntity(se),this.entity=""),(_!==F||this.textHandler!==void 0)&&(this.text+=xe);break e}case C:this.entity+=j.slice(D);break e}}sOpenWaka(){const D=this.getCode();if(r(D))this.state=Le,this.unget(),this.xmlDeclPossible=!1;else switch(D){case qt:this.state=Gt,this.xmlDeclPossible=!1;break;case Je:this.state=te,this.openWakaBang="",this.xmlDeclPossible=!1;break;case st:this.state=he;break;default:this.fail("disallowed character in tag name"),this.state=F,this.xmlDeclPossible=!1}}sOpenWakaBang(){switch(this.openWakaBang+=String.fromCodePoint(this.getCodeNorm()),this.openWakaBang){case"[CDATA[":!this.sawRoot&&!this.reportedTextBeforeRoot&&(this.fail("text data outside of root node."),this.reportedTextBeforeRoot=!0),this.closedRoot&&!this.reportedTextAfterRoot&&(this.fail("text data outside of root node."),this.reportedTextAfterRoot=!0),this.state=Y,this.openWakaBang="";break;case"--":this.state=Ce,this.openWakaBang="";break;case"DOCTYPE":this.state=N,(this.doctype||this.sawRoot)&&this.fail("inappropriately located doctype declaration."),this.openWakaBang="";break;default:this.openWakaBang.length>=7&&this.fail("incorrect syntax.")}}sComment(){this.captureToChar(Qe)&&(this.state=ee)}sCommentEnding(){var D;const j=this.getCodeNorm();j===Qe?(this.state=M,(D=this.commentHandler)===null||D===void 0||D.call(this,this.text),this.text=""):(this.text+=`-${String.fromCodePoint(j)}`,this.state=Ce)}sCommentEnded(){const D=this.getCodeNorm();D!==Ke?(this.fail("malformed comment."),this.text+=`--${String.fromCodePoint(D)}`,this.state=Ce):this.state=F}sCData(){this.captureToChar(Xt)&&(this.state=Z)}sCDataEnding(){const D=this.getCodeNorm();D===Xt?this.state=J:(this.text+=`]${String.fromCodePoint(D)}`,this.state=Y)}sCDataEnding2(){var D;const j=this.getCodeNorm();switch(j){case Ke:{(D=this.cdataHandler)===null||D===void 0||D.call(this,this.text),this.text="",this.state=F;break}case Xt:this.text+="]";break;default:this.text+=`]]${String.fromCodePoint(j)}`,this.state=Y}}sPIFirstChar(){const D=this.getCodeNorm();this.nameStartCheck(D)?(this.piTarget+=String.fromCodePoint(D),this.state=ge):D===st||a(D)?(this.fail("processing instruction without a target."),this.state=D===st?fe:de):(this.fail("disallowed character in processing instruction name."),this.piTarget+=String.fromCodePoint(D),this.state=ge)}sPIRest(){const{chunk:D,i:j}=this;for(;;){const _=this.getCodeNorm();if(_===C){this.piTarget+=D.slice(j);return}if(!this.nameCheck(_)){this.piTarget+=D.slice(j,this.prevI);const se=_===st;se||a(_)?this.piTarget==="xml"?(this.xmlDeclPossible||this.fail("an XML declaration must be at the start of the document."),this.state=se?We:ye):this.state=se?fe:de:(this.fail("disallowed character in processing instruction name."),this.piTarget+=String.fromCodePoint(_));break}}}sPIBody(){if(this.text.length===0){const D=this.getCodeNorm();D===st?this.state=fe:a(D)||(this.text=String.fromCodePoint(D))}else this.captureToChar(st)&&(this.state=fe)}sPIEnding(){var D;const j=this.getCodeNorm();if(j===Ke){const{piTarget:_}=this;_.toLowerCase()==="xml"&&this.fail("the XML declaration must appear at the start of the document."),(D=this.piHandler)===null||D===void 0||D.call(this,{target:_,body:this.text}),this.piTarget=this.text="",this.state=F}else j===st?this.text+="?":(this.text+=`?${String.fromCodePoint(j)}`,this.state=de);this.xmlDeclPossible=!1}sXMLDeclNameStart(){const D=this.skipSpaces();if(D===st){this.state=We;return}D!==C&&(this.state=qe,this.name=String.fromCodePoint(D))}sXMLDeclName(){const D=this.captureTo(Si);if(D===st){this.state=We,this.name+=this.text,this.text="",this.fail("XML declaration is incomplete.");return}if(a(D)||D===Me){if(this.name+=this.text,this.text="",!this.xmlDeclExpects.includes(this.name))switch(this.name.length){case 0:this.fail("did not expect any more name/value pairs.");break;case 1:this.fail(`expected the name ${this.xmlDeclExpects[0]}.`);break;default:this.fail(`expected one of ${this.xmlDeclExpects.join(", ")}`)}this.state=D===Me?Ne:ae}}sXMLDeclEq(){const D=this.getCodeNorm();if(D===st){this.state=We,this.fail("XML declaration is incomplete.");return}a(D)||(D!==Me&&this.fail("value required."),this.state=Ne)}sXMLDeclValueStart(){const D=this.getCodeNorm();if(D===st){this.state=We,this.fail("XML declaration is incomplete.");return}a(D)||(Zn(D)?this.q=D:(this.fail("value must be quoted."),this.q=He),this.state=Ve)}sXMLDeclValue(){const D=this.captureTo([this.q,st]);if(D===st){this.state=We,this.text="",this.fail("XML declaration is incomplete.");return}if(D===C)return;const j=this.text;switch(this.text="",this.name){case"version":{this.xmlDeclExpects=["encoding","standalone"];const _=j;this.xmlDecl.version=_,/^1\.[0-9]+$/.test(_)?this.opt.forceXMLVersion||this.setXMLVersion(_):this.fail("version number must match /^1\\.[0-9]+$/.");break}case"encoding":/^[A-Za-z][A-Za-z0-9._-]*$/.test(j)||this.fail("encoding value must match /^[A-Za-z0-9][A-Za-z0-9._-]*$/."),this.xmlDeclExpects=["standalone"],this.xmlDecl.encoding=j;break;case"standalone":j!=="yes"&&j!=="no"&&this.fail('standalone value must match "yes" or "no".'),this.xmlDeclExpects=[],this.xmlDecl.standalone=j;break}this.name="",this.state=tt}sXMLDeclSeparator(){const D=this.getCodeNorm();if(D===st){this.state=We;return}a(D)||(this.fail("whitespace required."),this.unget()),this.state=ye}sXMLDeclEnding(){var D;this.getCodeNorm()===Ke?(this.piTarget!=="xml"?this.fail("processing instructions are not allowed before root."):this.name!=="version"&&this.xmlDeclExpects.includes("version")&&this.fail("XML declaration must contain a version."),(D=this.xmldeclHandler)===null||D===void 0||D.call(this,this.xmlDecl),this.name="",this.piTarget=this.text="",this.state=F):this.fail("The character ? is disallowed anywhere in XML declarations."),this.xmlDeclPossible=!1}sOpenTag(){var D;const j=this.captureNameChars();if(j===C)return;const _=this.tag={name:this.name,attributes:Object.create(null)};switch(this.name="",this.xmlnsOpt&&(this.topNS=_.ns=Object.create(null)),(D=this.openTagStartHandler)===null||D===void 0||D.call(this,_),this.sawRoot=!0,!this.fragmentOpt&&this.closedRoot&&this.fail("documents may contain only one root."),j){case Ke:this.openTag();break;case qt:this.state=_e;break;default:a(j)||this.fail("disallowed character in tag name."),this.state=Xe}}sOpenTagSlash(){this.getCode()===Ke?this.openSelfClosingTag():(this.fail("forward-slash in opening tag not followed by >."),this.state=Xe)}sAttrib(){const D=this.skipSpaces();D!==C&&(r(D)?(this.unget(),this.state=pt):D===Ke?this.openTag():D===qt?this.state=_e:this.fail("disallowed character in attribute name."))}sAttribName(){const D=this.captureNameChars();D===Me?this.state=Kt:a(D)?this.state=Pt:D===Ke?(this.fail("attribute without value."),this.pushAttrib(this.name,this.name),this.name=this.text="",this.openTag()):D!==C&&this.fail("disallowed character in attribute name.")}sAttribNameSawWhite(){const D=this.skipSpaces();switch(D){case C:return;case Me:this.state=Kt;break;default:this.fail("attribute without value."),this.text="",this.name="",D===Ke?this.openTag():r(D)?(this.unget(),this.state=pt):(this.fail("disallowed character in attribute name."),this.state=Xe)}}sAttribValue(){const D=this.getCodeNorm();Zn(D)?(this.q=D,this.state=Dt):a(D)||(this.fail("unquoted attribute value."),this.state=jt,this.unget())}sAttribValueQuoted(){const{q:D,chunk:j}=this;let{i:_}=this;for(;;)switch(this.getCode()){case D:this.pushAttrib(this.name,this.text+j.slice(_,this.prevI)),this.name=this.text="",this.q=null,this.state=dt;return;case Ye:this.text+=j.slice(_,this.prevI),this.state=re,this.entityReturnState=Dt;return;case _t:case k:case Et:this.text+=`${j.slice(_,this.prevI)} `,_=this.i;break;case Pe:this.text+=j.slice(_,this.prevI),this.fail("disallowed character.");return;case C:this.text+=j.slice(_);return}}sAttribValueClosed(){const D=this.getCodeNorm();a(D)?this.state=Xe:D===Ke?this.openTag():D===qt?this.state=_e:r(D)?(this.fail("no whitespace between attributes."),this.unget(),this.state=pt):this.fail("disallowed character in attribute name.")}sAttribValueUnquoted(){const D=this.captureTo(wa);switch(D){case Ye:this.state=re,this.entityReturnState=jt;break;case Pe:this.fail("disallowed character.");break;case C:break;default:this.text.includes("]]>")&&this.fail('the string "]]>" is disallowed in char data.'),this.pushAttrib(this.name,this.text),this.name=this.text="",D===Ke?this.openTag():this.state=Xe}}sCloseTag(){const D=this.captureNameChars();D===Ke?this.closeTag():a(D)?this.state=ln:D!==C&&this.fail("disallowed character in closing tag.")}sCloseTagSawWhite(){switch(this.skipSpaces()){case Ke:this.closeTag();break;case C:break;default:this.fail("disallowed character in closing tag.")}}handleTextInRoot(){let{i:D,forbiddenState:j}=this;const{chunk:_,textHandler:se}=this;e:for(;;)switch(this.getCode()){case Pe:{if(this.state=me,se!==void 0){const{text:xe}=this,Ae=_.slice(D,this.prevI);xe.length!==0?(se(xe+Ae),this.text=""):Ae.length!==0&&se(Ae)}j=ne;break e}case Ye:this.state=re,this.entityReturnState=F,se!==void 0&&(this.text+=_.slice(D,this.prevI)),j=ne;break e;case Xt:switch(j){case ne:j=V;break;case V:j=G;break;case G:break;default:throw new Error("impossible state")}break;case Ke:j===G&&this.fail('the string "]]>" is disallowed in char data.'),j=ne;break;case k:se!==void 0&&(this.text+=`${_.slice(D,this.prevI)} +`),D=this.i,j=ne;break;case C:se!==void 0&&(this.text+=_.slice(D));break e;default:j=ne}this.forbiddenState=j}handleTextOutsideRoot(){let{i:D}=this;const{chunk:j,textHandler:_}=this;let se=!1;e:for(;;){const xe=this.getCode();switch(xe){case Pe:{if(this.state=me,_!==void 0){const{text:Ae}=this,Fe=j.slice(D,this.prevI);Ae.length!==0?(_(Ae+Fe),this.text=""):Fe.length!==0&&_(Fe)}break e}case Ye:this.state=re,this.entityReturnState=F,_!==void 0&&(this.text+=j.slice(D,this.prevI)),se=!0;break e;case k:_!==void 0&&(this.text+=`${j.slice(D,this.prevI)} +`),D=this.i;break;case C:_!==void 0&&(this.text+=j.slice(D));break e;default:a(xe)||(se=!0)}}se&&(!this.sawRoot&&!this.reportedTextBeforeRoot&&(this.fail("text data outside of root node."),this.reportedTextBeforeRoot=!0),this.closedRoot&&!this.reportedTextAfterRoot&&(this.fail("text data outside of root node."),this.reportedTextAfterRoot=!0))}pushAttribNS(D,j){var _;const{prefix:se,local:xe}=this.qname(D),Ae={name:D,prefix:se,local:xe,value:j};if(this.attribList.push(Ae),(_=this.attributeHandler)===null||_===void 0||_.call(this,Ae),se==="xmlns"){const Fe=j.trim();this.currentXMLVersion==="1.0"&&Fe===""&&this.fail("invalid attempt to undefine prefix in XML 1.0"),this.topNS[xe]=Fe,ti(this,xe,Fe)}else if(D==="xmlns"){const Fe=j.trim();this.topNS[""]=Fe,ti(this,"",Fe)}}pushAttribPlain(D,j){var _;const se={name:D,value:j};this.attribList.push(se),(_=this.attributeHandler)===null||_===void 0||_.call(this,se)}end(){var D,j;this.sawRoot||this.fail("document must contain a root element.");const{tags:_}=this;for(;_.length>0;){const xe=_.pop();this.fail(`unclosed tag: ${xe.name}`)}this.state!==E&&this.state!==F&&this.fail("unexpected end.");const{text:se}=this;return se.length!==0&&((D=this.textHandler)===null||D===void 0||D.call(this,se),this.text=""),this._closed=!0,(j=this.endHandler)===null||j===void 0||j.call(this),this._init(),this}resolve(D){var j,_;let se=this.topNS[D];if(se!==void 0)return se;const{tags:xe}=this;for(let Ae=xe.length-1;Ae>=0;Ae--)if(se=xe[Ae].ns[D],se!==void 0)return se;return se=this.ns[D],se!==void 0?se:(_=(j=this.opt).resolvePrefix)===null||_===void 0?void 0:_.call(j,D)}qname(D){const j=D.indexOf(":");if(j===-1)return{prefix:"",local:D};const _=D.slice(j+1),se=D.slice(0,j);return(se===""||_===""||_.includes(":"))&&this.fail(`malformed name: ${D}.`),{prefix:se,local:_}}processAttribsNS(){var D;const{attribList:j}=this,_=this.tag;{const{prefix:Ae,local:Fe}=this.qname(_.name);_.prefix=Ae,_.local=Fe;const Oe=_.uri=(D=this.resolve(Ae))!==null&&D!==void 0?D:"";Ae!==""&&(Ae==="xmlns"&&this.fail('tags may not have "xmlns" as prefix.'),Oe===""&&(this.fail(`unbound namespace prefix: ${JSON.stringify(Ae)}.`),_.uri=Ae))}if(j.length===0)return;const{attributes:se}=_,xe=new Set;for(const Ae of j){const{name:Fe,prefix:Oe,local:Ue}=Ae;let Ge,kt;Oe===""?(Ge=Fe==="xmlns"?x:"",kt=Fe):(Ge=this.resolve(Oe),Ge===void 0&&(this.fail(`unbound namespace prefix: ${JSON.stringify(Oe)}.`),Ge=Oe),kt=`{${Ge}}${Ue}`),xe.has(kt)&&this.fail(`duplicate attribute: ${kt}.`),xe.add(kt),Ae.uri=Ge,se[Fe]=Ae}this.attribList=[]}processAttribsPlain(){const{attribList:D}=this,j=this.tag.attributes;for(const{name:_,value:se}of D)j[_]!==void 0&&this.fail(`duplicate attribute: ${_}.`),j[_]=se;this.attribList=[]}openTag(){var D;this.processAttribs();const{tags:j}=this,_=this.tag;_.isSelfClosing=!1,(D=this.openTagHandler)===null||D===void 0||D.call(this,_),j.push(_),this.state=F,this.name=""}openSelfClosingTag(){var D,j,_;this.processAttribs();const{tags:se}=this,xe=this.tag;xe.isSelfClosing=!0,(D=this.openTagHandler)===null||D===void 0||D.call(this,xe),(j=this.closeTagHandler)===null||j===void 0||j.call(this,xe),(this.tag=(_=se[se.length-1])!==null&&_!==void 0?_:null)===null&&(this.closedRoot=!0),this.state=F,this.name=""}closeTag(){const{tags:D,name:j}=this;if(this.state=F,this.name="",j===""){this.fail("weird empty close tag."),this.text+="";return}const _=this.closeTagHandler;let se=D.length;for(;se-- >0;){const xe=this.tag=D.pop();if(this.topNS=xe.ns,_?.(xe),xe.name===j)break;this.fail("unexpected close tag.")}se===0?this.closedRoot=!0:se<0&&(this.fail(`unmatched closing tag: ${j}.`),this.text+=``)}parseEntity(D){if(D[0]!=="#"){const _=this.ENTITIES[D];return _!==void 0?_:(this.fail(this.isName(D)?"undefined entity.":"disallowed character in entity name."),`&${D};`)}let j=NaN;return D[1]==="x"&&/^#x[0-9a-f]+$/i.test(D)?j=parseInt(D.slice(2),16):/^#[0-9]+$/.test(D)&&(j=parseInt(D.slice(1),10)),this.isChar(j)?String.fromCodePoint(j):(this.fail("malformed character entity."),`&${D};`)}}return Br.SaxesParser=ie,Br}var DL=RL();const IL=new Set(["AppLockerPolicy","RuleCollection","FilePublisherRule","FilePathRule","FileHashRule"]),g3={AppLockerPolicy:"AppLocker policy",RuleCollection:"Rule collection",FilePublisherRule:"Publisher rule",FilePathRule:"Path rule",FileHashRule:"Hash rule",Id:"Rule ID",UserOrGroupSid:"User/group SID",EnforcementMode:"Enforcement mode",FilePublisherCondition:"Publisher condition",FilePathCondition:"Path condition",FileHashCondition:"Hash condition",FileHash:"Hash",PublisherName:"Publisher",ProductName:"Product",BinaryName:"Binary",BinaryVersionRange:"Version range",LowSection:"Minimum",HighSection:"Maximum",SourceFileName:"Source name",SourceFileLength:"Source length"};function v3(e){return Object.hasOwn(g3,e)?g3[e]:e.replace(/([a-z0-9])([A-Z])/g,"$1 $2")}function Wb(e,t=0){const n=" ".repeat(t);return[`${n}${v3(e.name)}`,...Object.entries(e.attributes).map(([a,i])=>`${n} ${v3(a)}: ${i||"Not set"}`),...e.children.flatMap(a=>typeof a=="string"?[`${n} ${a}`]:Wb(a,t+1))]}function Vb(e){if(e.length>262144||!e.trimStart().startsWith("<"))return;const t=new DL.SaxesParser({xmlns:!1}),n=[];let a,i=0;const r=()=>{throw new Error("Unsupported policy display XML")};t.on("error",r),t.on("doctype",r),t.on("processinginstruction",r),t.on("opentag",l=>{(++i>2e3||n.length>=32||Object.keys(l.attributes).length>128)&&r(),(l.name.includes(":")||Object.keys(l.attributes).some(T=>T.includes(":")||T==="xmlns"))&&r();const f={name:l.name,attributes:l.attributes,children:[]};n.length?n[n.length-1].children.push(f):((a||!IL.has(l.name))&&r(),a=f),n.push(f)});const c=l=>{l.trim()&&n.length&&n[n.length-1].children.push(l.trim())};t.on("text",c),t.on("cdata",c),t.on("closetag",()=>{n.pop()});try{return t.write(e).close(),a?Wb(a).join(` +`):void 0}catch{return}}function x3(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/^./,t=>t.toUpperCase())}function NL(e){return e===null?"Not set":typeof e=="string"||typeof e=="number"||typeof e=="boolean"?String(e):""}function yu(e,t=0){const n=NL(e);if(n)return(Vb(n)??n).split(` +`);if(Array.isArray(e))return e.length?e.flatMap(r=>yu(r,t+1)):["Not set"];if(!e||typeof e!="object"||t>5)return[String(e??"Not set")];const a=e,i=Object.keys(a);return"value"in a&&i.every(r=>r==="kind"||r==="value")?yu(a.value,t+1):i.filter(r=>r!=="kind"&&r!=="valueName").flatMap(r=>{const c=yu(a[r],t+1);return c.length===1?[`${x3(r)}: ${c[0]}`]:[`${x3(r)}:`,...c.map(l=>` ${l}`)]})}function c0(e){const t=e.trim();if(!t)return"Not set";try{return yu(JSON.parse(t)).join(` +`)}catch{return Vb(e)??e}}function cp(e){let t;return c0(e).split(` +`).map(n=>{const a=n.length-n.trimStart().length;return n.trim()&&t!==void 0&&a<=t&&(t=void 0),/^\s*(?:Operation|Data):/.test(n)&&(t=a),{text:n,emphasized:t!==void 0}})}function lp(e,t=0){if(!e||t>5)return;if(Array.isArray(e)){for(const a of e){const i=lp(a,t+1);if(i)return i}return}if(typeof e!="object")return;const n=e;if(typeof n.valueName=="string"&&n.valueName.trim())return n.valueName.trim();for(const a of Object.values(n)){const i=lp(a,t+1);if(i)return i}}function hm(e){try{return lp(JSON.parse(e))}catch{return}}function OL(e){const t=e.comparator.baseline;if(e.baselineVariantAssessment){if(e.baselineVariantAssessment.decision==="unavailable")return"";if(!t||e.baselineVariantAssessment.decision==="mixed")return"Establish the applicable baseline template before changing this setting. Compare the individual recommendations below; do not combine their values into a new baseline."}if(e.baselineState!=="explicit-recommendation"||!t||t.kind==="none"||e.diagnosticCodes.includes("policy-evaluation-baseline-consensus-conflict"))return"";const n=e.identity.target,a="section"in n?`${n.section} · ${n.key}`:`${n.hive}\\${n.key}${n.valueName!==void 0?`\\${n.valueName}`:""}`,i=e.comparator.comparator,r=i.kind==="minimum"?"Minimum":i.kind==="maximum"?"Maximum":(i.kind==="audit-flags"||i.kind==="bitmask")&&i.mode==="contains-baseline"||i.kind==="set"&&i.mode==="superset"?"Must include":i.kind==="set"&&i.mode==="subset"?"Allowed values":"Expected",c=t.kind==="text"&&t.value===""?"Empty string":c0(JSON.stringify(t));return`${e.identity.scope==="user"?"User":"Computer"} policy: ${a} +${r}: ${c}`}function up(e,t=[]){const n=new Map(t.map(({analysis:i})=>{const r=new Map;for(const c of i.admxCatalog.languageResources){const l=c.admxFileName.toLowerCase();r.set(l,[...r.get(l)??[],c])}for(const c of r.values())c.sort((l,f)=>{const T=p=>p.toLowerCase()==="en-us"?0:/^en(?:-|$)/i.test(p)?1:2;return T(l.locale)-T(f.locale)||l.locale.localeCompare(f.locale)});return[i.id,{baselineId:i.baselineId,catalogId:i.admxCatalog.id,settings:new Map((i.settings??[]).map(c=>[c.id,c])),policies:new Map(i.admxCatalog.policies.map(c=>[c.technicalId,c])),resources:r}]})),a=new Map;for(const i of e)for(const r of i.results){let c="",l="";const f=n.get(r.baselineAnalysisId),T=r.identity.admx;if(f?.baselineId===r.baselineId&&T?.status==="matched"&&T.catalogId===f.catalogId){const p=f.policies.get(T.reference.technicalId),m=p?.sourcePath.split(/[\\/]/).pop()?.toLowerCase();if(m&&p?.explainTextResourceId){const g=f.resources.get(m)??[],S=g.find(w=>w.strings[p.explainTextResourceId]?.trim()),x=g.filter(w=>w.locale===S?.locale&&w.strings[p.explainTextResourceId]?.trim());c=new Set(x.map(w=>w.strings[p.explainTextResourceId].trim())).size===1?S?.strings[p.explainTextResourceId]?.trim()??"":"",c&&S&&(l=`Imported baseline ADML · ${S.locale} · ${S.admxFileName}`)}}if(r.baselineVariantAssessment){const p=r.baselineVariantAssessment,m=p.variants.map(S=>{const x=f?.baselineId===r.baselineId?f.settings.get(S.settingId):void 0,y=x?.identity.status==="resolved"&&x.identity.identity.id===r.identity.id?[...new Set(x.template?.names.map(P=>P.value)??[])]:[],w=y.length?y.join(" / "):"Template name unavailable",C=S.comparator.baseline,k=C?.kind==="string-set"&&!C.values.length?"Empty account list":C?.kind==="text"&&C.value===""?"Empty string":C?c0(JSON.stringify(C)):"Unavailable",E=S.comparator.relation==="match"?"Match":S.comparator.relation==="different"?r.customerState==="missing"?"Missing required value or key":"Different":"Unavailable",O=S.comparator.actual,N=O?.kind==="string-set"&&C?.kind==="string-set"?O.values.filter(P=>!C.values.includes(P)):[],B=O?.kind==="string-set"&&C?.kind==="string-set"?C.values.filter(P=>!O.values.includes(P)):[],A=S.baselineValues[0],z=A?.kind==="registry-policy"||A?.kind==="registry"?` +Registry type: ${A.typeCode}`:"";return`${r.baselineLabel} — ${w} +Setting reference: ${S.settingId} +Value comparison: ${E} +Expected: ${k}${z}`+(N.length?` +Additional entries: ${N.join(", ")}`:"")+(B.length?` +Missing entries: ${B.join(", ")}`:"")}),g=r.baselineTemplateSelection?.status==="selected"?"Only templates matching the explicit comparison context were assessed. This does not prove GPO application to a device.":r.baselineTemplateSelection?.status==="no-match"?"No template matches the explicit comparison context. Individual value comparisons do not establish Pass or Fail.":"The customer GPO target role is not established. All retained candidate recommendations were compared independently; no role was inferred from OS inventory or domain functional level.";c=[c,fm(p),g,"This assesses imported backup configuration against the referenced baseline set, not effective device security. Different baseline variants are not evidence of a customer GPO conflict.",`Baseline recommendations + +${m.join(` + +`)}`].filter(Boolean).join(` + +`)}else if(r.baselineTemplateSelection||r.diagnosticCodes.includes("policy-evaluation-baseline-consensus-conflict")){const p=new Set;let m=0;const g=r.baselineTemplateSelection?.candidateSettingIds??r.baselineSettingIds??[];if(f?.baselineId===r.baselineId)for(const x of new Set(g)){const y=f.settings.get(x);if(!y||y.baselineId!==r.baselineId||y.identity.status!=="resolved"||y.identity.identity.id!==r.identity.id)continue;const w=y.observation.values.map(O=>{const N=Xu(O);return N?.kind==="string-set"&&!N.values.length?"Empty account list":c0(JSON.stringify(N??O))}).join("; ");m++;const C=[...new Set(y.template?.names.map(O=>O.value)??[])],k=C.length?C.join(" / "):r.baselineTemplateSelection?"Template name unavailable":"",E=r.baselineTemplateSelection?.status==="selected"&&r.baselineSettingIds.includes(x);p.add(`${r.baselineLabel}${k?` — ${k}`:""}: ${w}${E?" (selected)":""}`)}const S=p.size?`Baseline recommendations + +${[...p].join(` + +`)}${mO1(t.sourceLocator?.objectPath)).join(` +`)}function Hb(e,t){if(!t||e.length!==1||!t.variants.length)return;const n=e[0],a=t.variants.map(i=>i.baselineValues.length===1?CL(n,i.baselineValues[0],i.comparator.comparator).relation:"incomparable");return a.every(i=>i==="match")?"aligned":a.every(i=>i==="different")?"conflicting":"review"}function FL(e,t){if(e.kind!=="registry-policy"||t.kind!=="registry-policy")return new Set;if(e.operation!==t.operation)return new Set(["operation"]);if(e.operation!=="set-value"||t.operation!=="set-value")return new Set;const n=new Set;return o0(e.data)!==o0(t.data)&&n.add("data"),e.typeCode!==t.typeCode&&n.add("typeCode"),n}function LL(e,t){if(Hb(e,t)!=="conflicting"||e.length!==1||!t)return;const n=e[0],a=t.variants.filter(T=>T.baselineValues.length===1),i=a.map(T=>FL(n,T.baselineValues[0])),r=[...i[0]??[]].filter(T=>i.every(p=>p.has(T))),c=a.map(T=>{const p=T.baselineValues[0];if(n.kind!=="principal-set"||p.kind!=="principal-set")return new Set;const m=new Set(p.principals);return new Set(n.principals.filter(g=>!m.has(g)))}),l=[...c[0]??[]].filter(T=>c.every(p=>p.has(T))),f=n.kind==="principal-set"&&a.every(T=>T.baselineValues[0]?.kind==="principal-set");return r.length||l.length?{deviationFields:r.length?[r]:void 0,deviationItems:l.length?[l]:void 0}:f?{}:{deviationFields:[["value"]]}}function Gb(e,t){return e.map(n=>{const a=n.policyValues??[],i=LL(a,t);return{id:JSON.stringify([n.projectId,n.assessmentId,n.sourceResultId]),backupKey:N1(n),backupInstanceId:n.policyBackupInstanceId,gpoId:n.policyGpoId,nativeBackupId:n.policyNativeBackupId,sourceReference:O1(n.sourceLocator?.objectPath),sequence:n.policySourceSequence,values:a,baselineRelation:Hb(a,t),...i}})}const y3=new WeakMap;function Xb(e){const t=y3.get(e);if(t)return t;const n=new Map;for(const i of e){const r=i.backupKey?`backup:${i.backupKey}`:`unassigned:${i.id}`;let c=n.get(r);c||(c={id:r,identified:!!i.backupKey,label:i.gpoId?`GPO ${i.gpoId}`:i.backupInstanceId?`GPO backup ${i.nativeBackupId??i.backupInstanceId}`:"Unassigned GPO source",backupLabel:i.gpoId?`Backup: ${i.nativeBackupId??i.backupInstanceId??"Unknown"}`:"",observations:[]},n.set(r,c)),c.observations.push(i)}const a=[...n.values()];for(const i of a)i.observations=[...new Map(i.observations.map(c=>[c.id,c])).values()],new Set(i.observations.map(c=>c.sourceReference.replace(/#(?:records|lines)=.*$/,""))).size===1&&i.observations.every(c=>c.sequence!==void 0)&&i.observations.sort((c,l)=>c.sequence-l.sequence);return y3.set(e,a),a}function Kb(e,t=[],n=[]){if(!e||typeof e!="object"||Array.isArray(e)||e.kind!=="registry-policy")return cp(JSON.stringify(e)).map(r=>{const c=r.text.trim();return t.includes("value")||n.includes(c)?{...r,deviating:!0}:r});const a=[],i=(r,c=!1,l)=>a.push({text:r,emphasized:c,...t.includes("value")||l&&t.includes(l)?{deviating:!0}:{}});if(i(`Operation: ${String(e.operation??"Unknown")}`,!0,"operation"),typeof e.key=="string"&&i(`Key: ${e.key}`),typeof e.valueName=="string"&&i(`Value name: ${e.valueName===""?"(Default)":e.valueName}`),"data"in e){const r=e.data,c=r&&typeof r=="object"&&!Array.isArray(r)?"value"in r?r.value:"values"in r?r.values:r:r;i(`Data: ${JSON.stringify(c)}`,!0,"data")}"typeCode"in e&&i(`Type code: ${String(e.typeCode)}`,!1,"typeCode");for(const[r,c]of Object.entries(e))["kind","operation","key","valueName","data","typeCode"].includes(r)||a.push(...cp(JSON.stringify({[r]:c})).map(l=>t.includes("value")?{...l,deviating:!0}:l));return a}function PL(e){if(e.status!=="Fail")return[];const t=new Map;for(const n of e.sources){const a=N1(n);if(!a||t.has(a))continue;const i=O1(n.sourceLocator?.objectPath),c=[/^(\{[0-9a-f-]+\})\//i.exec(i)?.[1],n.policyBackupInstanceId,n.importedAt].filter(Boolean).join(" · ");t.set(a,{id:a,label:c})}return[...t.values()]}const pd="GPO conflict details",h1="GPO duplicate details";function $u(e){return JSON.stringify(e).replace(/\s/g,t=>`\\u${t.charCodeAt(0).toString(16).padStart(4,"0")}`)}const _L={0:"REG_NONE",1:"REG_SZ",2:"REG_EXPAND_SZ",3:"REG_BINARY",4:"REG_DWORD",5:"REG_DWORD_BIG_ENDIAN",7:"REG_MULTI_SZ",11:"REG_QWORD"},qL={REG_NONE:"No defined type",REG_SZ:"String",REG_EXPAND_SZ:"Expandable string",REG_BINARY:"Binary",REG_DWORD:"32-bit number",REG_DWORD_BIG_ENDIAN:"32-bit number (big-endian)",REG_MULTI_SZ:"Multi-string",REG_QWORD:"64-bit number"};function BL(e){const t=/^(REG_[A-Z_]+) \(\d+\)$/.exec(e);return t?`${qL[t[1]]??"Registry value"} (${t[1]})`:e}function UL(e){const t=new Map(e.split(` +`).map(n=>{const a=n.indexOf(":");return a<0?["",""]:[n.slice(0,a),n.slice(a+1).trim()]}));return{title:t.get("Value name")||t.get("Setting")||"Conflicting setting",scope:t.get("Scope")||"",...t.get("Registry path")?{registryPath:t.get("Registry path")}:{},...t.get("Value name")?{valueName:t.get("Value name")}:{}}}function zL(e){let t=e+1,n="";for(;t>0;)t-=1,n=String.fromCharCode(65+t%26)+n,t=Math.floor(t/26);return`Variant ${n}`}function WL(e,t){const[n,a]=e.tables;if(n.name!==(t?"Duplicate setting":"Conflicting variants")||a.name!=="Source references")return;const i=n.headers.indexOf("Variant"),r=n.headers.indexOf("Value"),c=n.headers.indexOf("Type"),l=a.headers.indexOf("Source"),f=a.headers.indexOf("Variant"),T=a.headers.indexOf("Source path"),p=a.headers.indexOf("Backup"),m=a.headers.indexOf("Record"),g=[r,c,l,T,p,m];if(t||g.push(i,f),g.some(y=>y<0))return;const S=new Map;for(const y of a.rows){const w={label:y[l],sourcePath:O1(y[T]),backupId:y[p],recordId:y[m]},C=t?["Shared value"]:y[f].split(",").map(k=>k.trim()).filter(Boolean);for(const k of C){const E=S.get(k)??[];E.push(w),S.set(k,E)}}const x=UL(e.context);return{kind:"variant-comparison",mode:t?"duplicate":"conflict",...x,sourceCount:a.rows.length,variants:n.rows.map((y,w)=>({label:t?"Shared value":zL(w),value:y[r],typeLabel:BL(y[c]),sources:S.get(t?"Shared value":y[i])??[]}))}}function $b(e){return e.conflict||e.status==="Conflicts"?Zb(e,!1):void 0}function Yb(e){return e.duplicate||e.status==="Duplicates"?Zb(e,!0):void 0}function Zb(e,t){if(e.sources.length<2)return;const n=new Map,a=[];for(const[p,m]of e.sources.entries()){const g=`Source ${p+1}`,S=new Set;for(const x of m.policyValues??[]){const y=f1(x);if(!y)return;let w=n.get(y);if(!w){const C=x.kind==="registry-policy"?x.data:x,k="typeCode"in x?x.typeCode:void 0;w={label:`Variant ${n.size+1}`,value:c0(JSON.stringify(C??x)),type:k===void 0?x.kind:`${_L[k]??"Unknown"} (${k})`,sources:new Set},n.set(y,w)}w.sources.add(g),S.add(w.label)}if(!S.size)return;a.push([g,...t?[]:[[...S].join(", ")],O1(m.sourceLocator?.objectPath),m.policyBackupInstanceId??"",m.sourceResultId])}if(t?n.size!==1:n.size<2)return;const i=[...n.values()],r=new Set(i.map(p=>p.value)).size>1,c=new Set(i.map(p=>p.type)).size>1,l=r&&c?"Values and types differ":c?"Types differ":"Values differ",f=e.sources[0].policyValues?.[0],T=[`Setting: ${e.title}`,`Scope: ${e.scope}`,f?.kind==="registry-policy"?`Registry path: ${f.key} +Value name: ${f.valueName||"(Default)"}`:""].filter(Boolean).join(` +`);return{version:1,summary:t?`1 setting · ${a.length} sources. Identical value and type.`:`${i.length} variants · ${a.length} sources. ${l}.`,context:T,tables:[{name:t?"Duplicate setting":"Conflicting variants",headers:[...t?[]:["Variant"],"Value","Type","Sources"],rows:i.map(p=>[...t?[]:[p.label],p.value,p.type,String(p.sources.size)]),emphasis:t?[]:[...r?["Value"]:[],...c?["Type"]:[]]},{name:"Source references",headers:["Source",...t?[]:["Variant"],"Source path","Backup","Record"],rows:a,emphasis:[]}]}}const S3=new WeakMap;function Jb(e){const t=S3.get(e);if(t)return t;const n=e.fields.filter(i=>[pd,h1].includes(i.label)&&i.value);if(n.length!==1||n[0].value.length>10*1024*1024)return[];const a=n[0].label===h1;try{const i=JSON.parse(n[0].value);if(!i||typeof i!="object"||!("version"in i)||i.version!==1||!("summary"in i)||typeof i.summary!="string"||!("context"in i)||typeof i.context!="string"||!("tables"in i)||!Array.isArray(i.tables)||i.tables.length!==2)return[];const r=[];for(const[c,l]of i.tables.entries()){if(!l||l.name!==(c===0?a?"Duplicate setting":"Conflicting variants":"Source references")||!Array.isArray(l.headers)||l.headers.length<1||l.headers.length>8||!l.headers.every(m=>typeof m=="string")||!Array.isArray(l.rows)||!l.rows.length||l.rows.length>2e4||!l.rows.every(m=>Array.isArray(m)&&m.length===l.headers.length&&m.every(g=>typeof g=="string"))||!Array.isArray(l.emphasis)||!l.emphasis.every(m=>m==="Value"||m==="Type")||a&&(l.emphasis.length>0||c===0&&l.rows.length!==1||c===1&&l.rows.length<2))return[];const f=[l.headers,...l.rows],T=l.rows.map((m,g)=>{const S=l4({headers:l.headers,row:m,index:g,sheetName:l.name,sourceFile:e.id});return S.fields=l.headers.map((x,y)=>({index:y,label:x,value:m[y]})),S.filled=S.fields.filter(x=>x.value!==""),S}),p={id:`${e.id}:gpo-${a?"duplicate":"conflict"}:${c}`,name:l.name,rows:f,raw:"",toolId:"group-policy",sourceSheet:l.name,analysis:{headerIndex:0,headers:l.headers,records:T,columns:[],signals:[],title:""}};p.resultEmphasisColumns=l.emphasis,c===0&&(p.resultPreamble=i.context),r.push(p)}return r[0].resultVariantComparison=WL(i,a),S3.set(e,r),r}catch{return[]}}function VL(e,t){const n=new Map;for(const i of e){const r=i.entry.settingKey??i.entry.id,c=n.get(r)??[];c.push(i),n.set(r,c)}const a=i=>[...new Set(i.filter(Boolean))];return[...n.values()].map(i=>{i.sort((E,O)=>E.entry.id.localeCompare(O.entry.id));const r=i[0],c=a(i.map(E=>E.entry.comparison?.baselineLabel??""));if(i.length===1)return{...r,baselineLabels:c};const l=new Set(i.map(E=>E.entry.comparison?.baselineId)).size,f=i.map(E=>E.importedAt).sort().at(-1)??"",T=(E,O)=>E.row[t.indexOf(O)]??"",p=i.map(E=>T(E,"Status")).reduce((E,O)=>Ku[O]>Ku[E]?O:E),m=[...new Map(i.flatMap(E=>E.entry.sources).map(E=>[JSON.stringify([E.projectId,E.assessmentId,E.sourceResultId]),E])).values()],g=i.map(E=>E.historical?void 0:E.entry.comparison?.baselineVariantAssessment),S={...r.entry,status:p,sources:m,conflict:i.some(E=>E.entry.conflict),duplicate:i.some(E=>E.entry.duplicate)},x=$b(S),y=Yb(S),w=g.every(E=>E&&E.decision!=="unavailable"&&E.variants.length)?{variants:g.flatMap(E=>E.variants)}:void 0,C=E=>i.map(O=>{const N=T(O,E);return N?`${O.entry.comparison?.baselineLabel??"Comparison"} +${N}`:""}).filter(Boolean).join(` + +`),k=t.map(E=>{const O=a(i.map(N=>T(N,E)));return E==="Status"?p:E==="Imported"?f:E==="Source: Scan"?f?`GPOs · ${f}`:"GPOs":E==="Evaluated"?O.sort().at(-1)??"":E===pd?x?$u(x):"":E===h1?y?$u(y):"":E==="Conflict"&&x?x.summary:E==="Duplicates"&&y?y.summary:E==="Baseline"?c.join(` +`):E==="Comparison"?`Overall verdict: ${p} · ${l} baseline packages +`+i.map(N=>`${N.entry.comparison?.baselineLabel??"Comparison"}: ${T(N,"Status")} — ${T(N,E)}`).join(` +`):E==="Description"?C(E):E==="Baseline value"&&O.length&&(O.length>1||i.some(N=>!T(N,E)))?JSON.stringify(i.map(N=>({baseline:N.entry.comparison?.baselineLabel,expected:N.entry.comparison?.comparator.baseline??N.entry.comparison?.baselineVariantAssessment?.variants.map(B=>({settingId:B.settingId,value:B.comparator.baseline,relation:B.comparator.relation}))??"Unavailable"}))):E==="Remediation"&&!O.length?"":E==="Remediation"&&(O.length>1||i.some(N=>!T(N,E)))?`Establish the applicable baseline template before changing this setting. The recommendations below are separate comparisons. + +`+C(E):E==="Configured Value"&&O.length>1?JSON.stringify(m.flatMap(N=>N.policyValues??[])):O.join(` + +`)});return{...r,row:k,baselineLabels:c,reviewMembers:i.map(E=>({baseline:E.entry.comparison?.baselineLabel??"Comparison",row:E.row})),importedAt:f,sourceEvidence:Gb(m,w),failingBackupSources:[...new Map(i.flatMap(E=>E.failingBackupSources).map(E=>[E.id,E])).values()]}})}function b3(e){return e===void 0?"":e===null?"null":typeof e=="object"?JSON.stringify(e):String(e)}const Qb={registry:"registry","local-users-groups":"local users and groups",services:"services","drive-maps":"drive maps"};function HL(e){const t=r=>[...new Set(e.flatMap(c=>r(c)!==void 0?[String(r(c))]:[]))].sort(),n=t(r=>r.policyPreferenceCse).map(r=>Qb[r]??r),a=t(r=>r.policyPreferenceAction),i=t(r=>r.policyPreferenceTargeting);return[n.length?`Group Policy Preference (${n.join(", ")})`:"Group Policy Preference","no comparable technical policy setting, so it is not compared with a Microsoft baseline",a.length?`action: ${a.join(", ")}`:"",i.includes("present")?"item-level targeting: present, effective application unknown":i.length?"item-level targeting: none":""].filter(Boolean).join(". ")+"."}function GL(e,t,n,a=[],i=up(a)){const r=zb(n,a);if(!r.length)return e;const c=new Map(a.filter(y=>y.run.evaluator?.version&&y.run.evaluator.version!==d1.version).flatMap(y=>y.results.map(w=>[w.id,y.run.evaluator.version]))),l=["Title","Category","Status","Scope","Configured Value","Baseline value","Baseline","Comparison","Registry path","Sources","Technical Identity","Imported","Diagnostics","Policy type","Policy section","Description","Remediation","Description source","Conflict",pd,"Duplicates",h1,"Evaluated","Source: Scan","Evaluation readiness","Historical result"],f=VL(r.map(y=>{const w=y.comparison,C=w&&c.get(w.id),k=C?`Re-evaluation required: historical result from engine ${C}; current engine is ${d1.version}. Re-evaluate in Data Hub before using this result as a current assessment.`:"",E=$b(y),O=Yb(y),N=w?.comparator.actual??(w?.customerState==="missing"?"Not configured":y.sources.flatMap(P=>P.policyValues??[])),B=w?.identity.target,A=y.sources.flatMap(P=>P.policyValues??[]).find(P=>P&&typeof P=="object"&&!Array.isArray(P)&&P.kind==="registry-policy"),z=B&&"hive"in B&&B.hive?`${B.hive}\\${B.key}`:A&&typeof A=="object"&&!Array.isArray(A)?`${y.scope==="user"?"HKEY_CURRENT_USER":"HKEY_LOCAL_MACHINE"}\\${A.key}`:"";return{entry:y,historical:!!C,importedAt:y.importedAt,failingBackupSources:PL(y),sourceEvidence:Gb(y.sources,C?void 0:w?.baselineVariantAssessment),row:[y.title,"GPOs",C?"Review required":y.status,y.scope,b3(N),b3(w?.comparator.baseline??w?.baselineVariantAssessment?.variants.map(P=>({settingId:P.settingId,value:P.comparator.baseline,relation:P.comparator.relation}))),w?.baselineLabel??"",C?"Historical comparison — re-evaluation required":w?.baselineVariantAssessment?fm(w.baselineVariantAssessment):w?.baselineTemplateSelection?.status==="no-match"?"No baseline template matches the specified comparison context":w?.diagnosticCodes.includes("policy-evaluation-template-context-required")?"Different template recommendations; customer target role not established":w?.diagnosticCodes.includes("policy-evaluation-baseline-consensus-conflict")?"Conflicting baseline recommendations":y.status==="Not comparable"?HL(y.sources):y.status==="No baseline rule"?"No applicable Microsoft baseline rule for this technical setting; retained for inspection without a verdict":y.conflict||y.status==="Conflicts"?"Different values or types for the same setting":y.duplicate||y.status==="Duplicates"?"Identical setting in multiple source entries":w?.customerState==="missing"?"Baseline setting is not configured":y.status==="Pass"?"Matches baseline":"Differs from baseline",z,jL(y.sources),y.identity,y.importedAt,[...new Set([...w?.diagnosticCodes??[],...y.sources.flatMap(P=>P.policyDiagnosticCodes??[])])].join(", "),B?.kind??y.sources[0]?.policyDeliveryMechanism??"",B&&"section"in B?B.section:Qb[y.sources[0]?.policyPreferenceCse??""]??y.sources[0]?.policyPreferenceCse??"",w?i.get(w.id)?.description||(i.get(w.id)?.descriptionLoadFailed?"Baseline description could not be loaded. The saved comparison is retained.":"Description unavailable in the referenced baseline metadata."):"",w?i.get(w.id)?.remediation??"":"",w?i.get(w.id)?.source??"":"",E?.summary??(w?.baselineVariantAssessment&&y.conflict?"Conflicting customer states; see original GPO source instructions.":""),E?$u(E):"",O?.summary??(w?.baselineVariantAssessment&&y.duplicate?"Same setting contributed by multiple GPO backups.":""),O?$u(O):"",y.evaluatedAt??"",y.importedAt?`GPOs · ${y.importedAt}`:"GPOs",k,C?`${y.status} · Engine ${C}`:""]}}),l),T=f.map(y=>y.row),p=[l,...T],m=es("GPOs",p,Ns(p),t,{id:`gpo-policy-observations-${t}`,sourceFile:t,sourceSheet:"GPOs",toolId:"group-policy"});if(m.analysis.records.forEach((y,w)=>{y.policyFailingBackupSources=f[w].failingBackupSources,y.policySourceEvidence=f[w].sourceEvidence,y.policyBaselineLabels=f[w].baselineLabels,f[w].reviewMembers&&(y.id=`gpo-work-setting:${encodeURIComponent(f[w].entry.settingKey)}`,y.policyReviewMembers=f[w].reviewMembers.map(C=>({baseline:C.baseline,id:_h({sourceFile:t,sheetName:"GPOs",headers:l,row:C.row})})))}),!e){const y=Math.max(...f.map(w=>Date.parse(w.importedAt)).filter(Number.isFinite),0);return{fileName:`${t} · GPOs`,fileSize:0,lastModified:y,format:"GPO Backup",rawText:"",sheets:[m],profileId:"generic",profileVersion:"gpo-work-comparison-1.2.1",scanTool:"GPOs"}}const[g,...S]=e.sheets,x=g?.isProjectSheet?(()=>{const y=g.rows[0]??[],w=[...y];for(const N of l)w.includes(N)||w.push(N);const C=g.rows.slice(1).map(N=>{const B=new Map(y.map((A,z)=>[A,N[z]??""]));return w.map(A=>B.get(A)??"")}),k=T.map(N=>{const B=new Map(l.map((A,z)=>[A,N[z]??""]));return B.set("Source: File",t),B.set("Source: Sheet","GPOs"),w.map(A=>B.get(A)??"")}),E=[w,...C,...k],O=es(g.name,E,Ns(E),g.sourceFile??t,{id:g.id,sourceFile:g.sourceFile,sourceSheet:g.sourceSheet,isProjectSheet:!0});return O.analysis.records=O.analysis.records.map((N,B)=>{const A=g.analysis.records[B],z=B-g.analysis.records.length,P=m.analysis.records[z];if(!A&&P?.policyReviewMembers)for(const K of f[z].reviewMembers??[]){const I=new Map(l.map((L,le)=>[L,K.row[le]??""]));I.set("Source: File",t),I.set("Source: Sheet","GPOs"),P.policyReviewMembers.push({baseline:K.baseline,id:_h({sourceFile:g.sourceFile??t,sheetName:g.name,headers:w,row:w.map(L=>I.get(L)??"")})})}return A?{...N,findingOccurrenceId:A.findingOccurrenceId,findingDefinitionId:A.findingDefinitionId,scanRunId:A.scanRunId,importFileId:A.importFileId,policyFailingBackupSources:A.policyFailingBackupSources,policySourceEvidence:A.policySourceEvidence,policyBaselineLabels:A.policyBaselineLabels,policyReviewMembers:A.policyReviewMembers}:{...N,...P?.policyReviewMembers?{id:P.id,policyReviewMembers:P.policyReviewMembers}:{},policyFailingBackupSources:f[B-g.analysis.records.length]?.failingBackupSources,policySourceEvidence:f[B-g.analysis.records.length]?.sourceEvidence,policyBaselineLabels:f[B-g.analysis.records.length]?.baselineLabels}}),O})():g;return{...e,sheets:x?[x,m,...S]:[m],scanTool:e.scanTool==="GPOs"?e.scanTool:"Multiple Tools"}}function XL(e,t){const n=new Set(t),a=e.scanRuns.filter(m=>n.has(m.id));if(!a.length)return null;const i=e.importFiles.filter(m=>n.has(m.scanRunId)),r=new Set(i.map(m=>m.id)),c=e.sourceTables.filter(m=>r.has(m.importFileId)),l=new Set(c.map(m=>m.id)),f=e.findingOccurrences.filter(m=>n.has(m.scanRunId)),T=new Set(f.map(m=>m.id)),p=new Set(f.map(m=>m.definitionId));return{...e,scanRuns:a,importFiles:i,sourceTables:c,findingDefinitions:e.findingDefinitions.filter(m=>p.has(m.id)),findingOccurrences:f,evidence:e.evidence.filter(m=>T.has(m.occurrenceId)),reviews:e.reviews.filter(m=>m.target.kind==="definition"?p.has(m.target.definitionId):T.has(m.target.occurrenceId)),diagnostics:e.diagnostics.filter(m=>r.has(m.importFileId)&&(m.sourceTableId===void 0||l.has(m.sourceTableId))),environmentObservations:e.environmentObservations?.filter(m=>n.has(m.scanRunId)&&r.has(m.importFileId)),reportSections:e.reportSections?.filter(m=>n.has(m.scanRunId)&&r.has(m.importFileId))}}function e6(e,t,n){const a=n===void 0?void 0:new Set(e.filter(i=>n.has(i.run.id)).map(i=>i.run.aggregationRunId));return WF(e.filter(i=>(a===void 0||a.has(i.run.aggregationRunId))&&i.results.some(r=>r.observationIds.some(c=>t.has(c)))&&i.results.every(r=>r.observationIds.every(c=>t.has(c)))),{allowPreviousVersionForDisplay:!0})}async function ch(e,t,n,a){const i=await e.listProjectAssessments(t),r=a?i.filter(C=>a.includes(C.id)):i,c=await Promise.all(r.map(C=>e.loadAssessmentModel(C.id))),l=n?.length?c.map(C=>XL(C,n)).filter(C=>C!==null):c,f=[...new Set((a?r:l).map(C=>"assessment"in C?C.assessment.id:C.id))],T=e.queryUnifiedResults&&f.length?await dm(C=>e.queryUnifiedResults(C),{audience:"internal-analysis",projectId:t,assessmentIds:f,sourceKind:["policy-observation"]}):[],p=TL(l);if(p?.securityScoring){const C=new Set(f),k=l.map(A=>Date.parse(A.assessment.effectiveAt??A.assessment.createdAt)).filter(Number.isFinite),E=k.length?Math.min(...k):void 0,O=E===void 0?[]:i.filter(A=>!C.has(A.id)&&Date.parse(A.effectiveAt??A.createdAt)[A.assessment.id,A])),B=new Map;for(const A of O.sort((z,P)=>Date.parse(z.effectiveAt??z.createdAt)-Date.parse(P.effectiveAt??P.createdAt)))try{const z=N.get(A.id)??await e.loadAssessmentModel(A.id);for(const P of Lb([z]))B.set(P.comparisonKey??`unverified:${P.toolId}:${P.contentSha256??P.id}`,P)}catch{p.securityScoring.historyUnavailable=!0}O.length&&(p.securityScoring.baseline=[...B.values()])}const[m,g]=T.length&&e.listPolicyEvaluations?await Promise.all([e.listPolicyEvaluations(t),e.getPolicyAnalysisOverview?.(t)]):[],S=e6(m?.records??[],new Set(T.map(C=>C.sourceResultId)),g?new Set(g.current.evaluationRunIds):void 0),x=l[0]?.project.name??i.find(C=>f.includes(C.id))?.name??t,y=up(S);if(e.listMicrosoftSecurityBaselineAnalyses){const C=new Map;for(const k of S)for(const E of new Set(k.results.map(O=>O.baselineId)))C.set(E,[...C.get(E)??[],{...k,results:k.results.filter(O=>O.baselineId===E)}]);for(const[k,E]of C)try{const O=await e.listMicrosoftSecurityBaselineAnalyses(k);for(const[N,B]of up(E,O.records))y.set(N,B)}catch{for(const O of E)for(const N of O.results){const B=y.get(N.id);B&&y.set(N.id,{...B,descriptionLoadFailed:!0})}}}const w=GL(p,x,T,S,y);return w&&!w.securityScoring&&(w.securityScoring={policy:l[0]?.assessment.scoringPolicy??T1(),scans:[]}),{models:l,assessmentIds:f,dataset:w}}const w3="ASSESSOR.importFingerprints.v1",C3="ASSESSOR.lastImportReport.v1";function E3(e,t,n){return{...e,phase:"preview",preview:t,error:n}}function t6(e){if(e.mapping&&e.recognition){const t=new Set(e.recognition.tables.filter(n=>n.selected).map(n=>n.tableIndex));return e.mapping.candidates.filter(n=>n.source.tableIndex===void 0||t.has(n.source.tableIndex)).length}return e.mapping?.candidates.length??e.sheets.reduce((t,n)=>t+n.analysis.records.length,0)}function n6(e){return e.sheets.reduce((t,n)=>t+n.analysis.records.length,0)}function a6(e){const t=e.recognition;return Number(t?.source.requiresConfirmation??!1)+(t?.tables.filter(n=>n.requiresConfirmation).length??0)}function KL(e){return[...(e.intermediate?.diagnostics??[]).filter(t=>t.severity==="warning").map(t=>t.message),...(e.intermediate?.discardedContent??[]).map(t=>t.reason)]}function $L(e,t,n,a){const i=e.recognition,r=KL(e),c=i?.fields.filter(f=>f.appliedRole==="additional").map(f=>f.sourceHeader).filter((f,T,p)=>!!f&&p.indexOf(f)===T)??[],l=a6(e);return{id:`${t.sha256}:${t.fileName}`,...t,status:n?"duplicate":r.length||l||a?"warning":"ready",selected:!n,duplicateOf:n,possibleDuplicateOf:a,format:e.format,toolId:i?.source.selected.toolId??e.profileId,toolName:i?.source.selected.toolName??e.scanTool,confidence:i?.source.selected.confidence.level,confidenceScore:i?.source.selected.confidence.score,tableCount:e.sheets.length,recordCount:t6(e),rowCount:n6(e),warningMessages:r,errorMessages:[],unassignedFields:c,mappingsToConfirm:l,dataset:e}}function YL(e,t){return e.map(n=>(t.reimport||t.singleFile)&&n.status!=="error"&&n.dataset?{...n,selected:!0}:n)}function ZL(e,t){return{id:`${e.sha256}:${e.fileName}`,...e,status:"error",selected:!1,tableCount:0,recordCount:0,rowCount:0,warningMessages:[],errorMessages:[t],unassignedFields:[],mappingsToConfirm:0}}function JL(e,t=[]){const n=e.dataset?.recognition;if(!n)return{...e,mappingsToConfirm:0};const a={sourceTool:n.source.requiresConfirmation?{toolId:n.source.selected.toolId,toolName:n.source.selected.toolName}:void 0,tableSelections:Object.fromEntries(n.tables.filter(f=>f.requiresConfirmation).map(f=>[f.tableId,f.selected])),fieldRoles:n.fields.filter(f=>f.requiresConfirmation).map(f=>({tableId:f.tableId,columnIndex:f.columnIndex,role:f.proposedRole??f.appliedRole}))},i=t.length?xv(e.dataset,a,t):{...e.dataset,recognition:i4(n,a)},r=i.mapping?.fieldDecisions.filter(f=>f.requiresConfirmation&&f.sourceScope.tableIndex===void 0).map(f=>({decisionId:f.id,role:f.proposedRole??f.appliedRole}))??[],c=t.length&&r.length?xv(e.dataset,{...a,candidateFieldRoles:r},t):i,l=a6(c);return{...e,status:l||e.warningMessages.length||e.possibleDuplicateOf?"warning":"ready",mappingsToConfirm:l,recordCount:t6(c),rowCount:n6(c),dataset:c}}function k3(e,t){if(!e)return;const n=e.source.decisionSource==="user-confirmed"?{toolId:e.source.selected.toolId,toolName:e.source.selected.toolName}:void 0,a=e.tables.filter(l=>l.decisionSource==="user-confirmed"),i=a.length?Object.fromEntries(a.map(l=>[l.tableId,l.selected])):void 0,r=e.fields.filter(l=>l.decisionSource==="user-confirmed").map(l=>({tableId:l.tableId,columnIndex:l.columnIndex,role:l.appliedRole})),c=t?.fieldDecisions.filter(l=>l.decisionSource==="user-confirmed"&&l.sourceScope.tableIndex===void 0).map(l=>({decisionId:l.id,role:l.appliedRole}))??[];return n||i||r.length||c.length?{sourceTool:n,tableSelections:i,fieldRoles:r.length?r:void 0,candidateFieldRoles:c.length?c:void 0}:void 0}function A3(e,t,n=new Date().toISOString()){const a=e.entries.map(i=>({fileName:i.fileName,sha256:i.sha256,status:t.has(i.id)?"imported":i.status==="error"?"failed":"skipped",messages:[...i.warningMessages,...i.errorMessages],recordCount:t.has(i.id)?i.recordCount:0}));return{version:1,batchId:e.batchId,completedAt:n,importedFiles:a.filter(i=>i.status==="imported").length,importedRecords:a.reduce((i,r)=>i+r.recordCount,0),skippedFiles:a.filter(i=>i.status==="skipped").length,failedFiles:a.filter(i=>i.status==="failed").length,duplicateFiles:e.entries.filter(i=>i.status==="duplicate").length,warningCount:e.entries.reduce((i,r)=>i+r.warningMessages.length,0),entries:a}}function lh(e){const t=()=>{try{const n=JSON.parse(e.getItem(w3)??"[]");return Array.isArray(n)?n.filter(a=>typeof a=="object"&&a!==null&&"sha256"in a):[]}catch{return[]}};return{load:t,record(n,a=new Date().toISOString()){const i=new Map(t().map(c=>[c.sha256,c]));n.forEach(c=>{const l=i.get(c.sha256);i.set(c.sha256,l?{...l,...c,lastImportedAt:a,importCount:l.importCount+1}:{...c,firstImportedAt:a,lastImportedAt:a,importCount:1})});const r=[...i.values()].sort((c,l)=>c.sha256.localeCompare(l.sha256));return e.setItem(w3,JSON.stringify(r)),r}}}async function QL(e){const t=await crypto.subtle.digest("SHA-256",await e.arrayBuffer());return[...new Uint8Array(t)].map(n=>n.toString(16).padStart(2,"0")).join("")}function eP(e,t,n){const a={...e.reviews,[t]:{...hr(),...e.reviews[t],...n}},i=Object.values(a).some(r=>r.include);return{reviews:a,actionOnly:e.actionOnly&&i}}function i6(e,t){return[...new Map((e.policyReviewMembers??[]).map(n=>[n.id,n])).values()].flatMap(n=>t[n.id]&&!Jc(t[n.id],hr())?[{...n,review:t[n.id]}]:[])}const R3={"question-needed":"markerQuestion","permission-blocked":"markerBlocked","quick-win":"markerQuickwin","external-team":"markerExternal","not-relevant":"markerNotRelevant"},tP={Open:"open","In Review":"in-progress","Clarification Needed":"deferred",Actionable:"accepted",Blocked:"deferred",Done:"resolved","Not Relevant":"not-relevant"},nP={unreviewed:"Open",open:"Open","in-progress":"In Review",accepted:"Actionable",deferred:"Blocked",resolved:"Done","not-relevant":"Not Relevant"},aP={Critical:"critical",High:"high",Medium:"medium",Low:"low",None:"none"};function Ur(e){return e===""?void 0:e}function dp(e){return e.kind==="occurrence"?`occurrence:${e.occurrenceId}`:`definition:${e.definitionId}`}function Su(e){const t=new Set(e.markers);return{...hr(),riskAcceptance:e.riskAcceptance,include:e.includeInActionPlan,status:e.workflowLabel??nP[e.workflowStatus],priority:e.priority[0].toUpperCase()+e.priority.slice(1),owner:e.owner??"",due:e.dueAt??"",prerequisites:e.prerequisites??"",access:e.requiredAccess??"",nextStep:e.nextStep??"",evidence:e.acceptanceEvidence??"",comment:e.comment??"",markerQuestion:t.has("question-needed"),markerBlocked:t.has("permission-blocked"),markerQuickwin:t.has("quick-win"),markerExternal:t.has("external-team"),markerNotRelevant:t.has("not-relevant")}}function D3(e,t,n,a){const i=new Set(Object.keys(R3)),r=(n?.markers??[]).filter(c=>!i.has(c));for(const[c,l]of Object.entries(R3))e[l]&&r.push(c);return{...n,id:n?.id??`review-${t.kind}-${t.kind==="occurrence"?t.occurrenceId:t.definitionId}`,target:t,workflowStatus:tP[e.status]??"open",workflowLabel:e.status,priority:aP[e.priority]??"medium",includeInActionPlan:e.include,owner:Ur(e.owner),dueAt:Ur(e.due),comment:Ur(e.comment),prerequisites:Ur(e.prerequisites),requiredAccess:Ur(e.access),nextStep:Ur(e.nextStep),acceptanceEvidence:Ur(e.evidence),riskAcceptance:e.riskAcceptance,markers:r,createdAt:n?.createdAt??a,updatedAt:a,revision:(n?.revision??0)+1}}function Jc(e,t){return Object.keys(hr()).every(n=>n==="riskAcceptance"?JSON.stringify(e.riskAcceptance)===JSON.stringify(t.riskAcceptance):e[n]===t[n])}function bu(e){const t=new Map;for(const n of e.sheets.flatMap(a=>a.analysis.records)){if(!n.findingOccurrenceId)continue;const a=t.get(n.findingOccurrenceId)??[];a.includes(n.id)||a.push(n.id),t.set(n.findingOccurrenceId,a)}return t}function uh(e,t,n){const a={...n};for(const r of e.sheets.flatMap(c=>c.analysis.records)){if(a[r.id]||!r.policyReviewMembers)continue;const c=i6(r,n);c.length&&c.every(l=>!l.review.riskAcceptance&&Jc(l.review,c[0].review))&&(a[r.id]={...c[0].review})}const i=new Map;for(const r of t){const c=dp(r.target),l=i.get(c);(!l||r.revision>l.revision)&&i.set(c,r)}for(const[r,c]of bu(e)){const l=e.sheets.flatMap(p=>p.analysis.records).find(p=>p.findingOccurrenceId===r)?.findingDefinitionId,f=i.get(`occurrence:${r}`)??(l?i.get(`definition:${l}`):void 0),T=f?Su(f):c.map(p=>n[p]).find(Boolean);T&&c.forEach(p=>{a[p]=T})}return{reviews:a,persisted:i}}function s6(e){const t=je(e??"");if(!t)return"";const n=t.replace(/\.[^.]+$/,""),a=/[([{]([^)\]}]+)[)\]}]\s*$/.exec(n);return(a?a[1].trim():n.trim())||t}const I3={legacy:"unknown",outcome:"unknown",technical:"unknown"},iP=[{pattern:/^not configured$/,legacy:"open",outcome:"informational"},{pattern:/^no baseline rule$/,legacy:"open",outcome:"informational"},{pattern:/^not comparable$/,legacy:"open",outcome:"informational"},{pattern:/^misconfigured$/,legacy:"failed"},{pattern:/failed\s*to\s*run|execution.?error|technical.?error/,legacy:"error"},{pattern:/not\s*(?:applicable|relevant)|irrelevant|nicht\s*(?:anwendbar|relevant)/,legacy:"not-applicable"},{pattern:/not\s*(?:run|selected|executed)|nicht\s*(?:ausgef(?:ue|ü)hrt|ausgew(?:ae|ä)hlt)|skipped|cancell?ed|abgebrochen/,legacy:"not-run"},{pattern:/not\s*pass(?:ed)?|nicht\s*bestanden/,legacy:"failed"},{pattern:/ioe(?:s)?\s*(?:found|detected)|indicator\s*of\s*exposure/,legacy:"failed"},{pattern:/resolved|closed|behoben/,legacy:"resolved"},{pattern:/^pass(?:ed)?$|bestanden/,legacy:"passed"},{pattern:/^fail(?:ed)?$|fehlgeschlagen/,legacy:"failed"},{pattern:/matched|detected|gefunden/,legacy:"open",outcome:"warning"},{pattern:/error|fehler/,legacy:"error"},{pattern:/manual/,legacy:"manual"},{pattern:/investigate|pr(?:ue|ü)fen/,legacy:"investigate"},{pattern:/^conflicts?$|^duplicates?$/,legacy:"open",outcome:"warning"},{pattern:/open|offen/,legacy:"open"},{pattern:/pass/,legacy:"passed"},{pattern:/fail/,legacy:"failed"}],sP=new Map(ei.map(e=>[e.id,e]));function N3(e,t){return{legacy:e,outcome:t??um(e),technical:zF(e)}}function rP(e,t){const n=je(t);if(!n)return I3;const i=(e?sP.get(e)?.normalization.status:void 0)?.find(c=>c.patterns.some(l=>l.test(n)));if(i)return N3(i.normalizedValue);const r=iP.find(c=>c.pattern.test(n.toLocaleLowerCase("de-DE")));return r?N3(r.legacy,r.outcome):I3}const oP=new Map(ei.map(e=>[e.name.toLocaleLowerCase("en-US"),e.id])),cP=/^(?:quelle|source):\s*scan$/i;function oa(e,t){const n=e.fields.find(i=>cP.test(i.label.trim())&&i.value),a=je(n?.value.split(/\s*(?:\u00c2\u00b7|\u00b7)\s*/)[0]??"").toLocaleLowerCase("en-US");return a==="gpos"?"group-policy":oP.get(a)??t}function Yu(e,t){if(je(t??""))return rP(e,t).outcome}const lP=/^rule\s*id$/i,uP=/^benchmark\s*item$/i,dh=/^\s*(\d+(?:\.\d+)+)(?=\s|$)/;function dP(e,t){if(oa(e,t)!=="cis-cat")return"";const n=e.fields.find(i=>lP.test(i.label.trim())&&i.value)?.value??"",a=e.fields.find(i=>uP.test(i.label.trim())&&i.value)?.value??"";return dh.exec(n)?.[1]??dh.exec(a)?.[1]??dh.exec(e.title)?.[1]??""}function M1(e,t){const n=dP(e,t);if(!n)return[];const a=n.split(".");return a.slice(0,-1).map((i,r)=>`CIS ${a.slice(0,r+1).join(".")}`)}function md(e=4){const t=new WeakMap;return(n,a,i)=>{const r=t.get(n)??[],c=r.findIndex(f=>f.keys.length===a.length&&f.keys.every((T,p)=>Object.is(T,a[p])));if(c>=0){const[f]=r.splice(c,1);return r.unshift(f),f.value}const l=i();return r.unshift({keys:a,value:l}),r.length=Math.min(r.length,e),t.set(n,r),l}}const r6="derived:security-domain",gd=[{id:"identity",label:"Identity & Account Hygiene",glyph:"user",pattern:/account|identity|user|password|stale|inactive|honey\s*pot/i},{id:"privilege",label:"Privilege & Attack Paths",glyph:"shield",pattern:/privileg|admin|delegat|control\s*path|attack\s*path|tier\s*0|pim/i},{id:"authentication",label:"Authentication & Access",glyph:"lock",pattern:/authenticat|\bmfa\b|conditional\s*access|kerberos|sign[ -]?in|break[ -]?glass/i},{id:"infrastructure",label:"AD Infrastructure & PKI",glyph:"server",pattern:/domain\s*controller|forest|\btrust|certificate|\bpki\b|\bdns\b|replication|schema/i},{id:"hardening",label:"System Hardening",glyph:"code",pattern:/cis-cat|benchmark|hardening|firewall|attack\s*surface|\basr\b|defender|operating\s*system/i},{id:"gpo",label:"GPO & Baseline",glyph:"policy",pattern:/\bgpo\b|group\s*policy|baseline|policy\s*(?:setting|deviation|conflict)|duplicates?/i},{id:"cloud",label:"Cloud & Applications",glyph:"cloud",pattern:/\bcloud\b|\bentra\b|application|\bapps?\b|exchange|teams|sharepoint|guest|intune|purview/i},{id:"recovery",label:"Monitoring & Recovery",glyph:"chart",pattern:/audit|monitor|logging|\bwef\b|backup|recover|recycle\s*bin|sensor|event\s*log/i}],lo={id:"unclassified",label:"Unclassified"},O3=new WeakMap;function TP(e){let t=O3.get(e);if(t===void 0){const n=e.fields;t={text:[e.title,...n.filter(a=>/^(?:title|name|finding|description|category|subcategory|sub-category|categories|control area|policy section|policy type)$/i.test(a.label.trim())).map(a=>a.value)].join(" "),explicitGpo:n.some(a=>/^category$/i.test(a.label.trim())&&/^gpos?$/i.test(a.value.trim()))},O3.set(e,t)}return t}function pm(e){const t=TP(e);return t.explicitGpo?"gpo":gd.find(n=>n.pattern.test(t.text))?.id??lo.id}function fP(e){const t=new Map([...gd.map(n=>[n.id,[]]),[lo.id,[]]]);return e.forEach(n=>t.get(pm(n)).push(n)),t}const Tp=24,hP=10,o6="derived:gpo-failing-backup",c6="__all_counted_gpo_backups__",pP=[{value:"deviation",label:Ya.deviation},{value:"passed",label:Ya.passed},{value:"not-configured",label:Ya["not-configured"]},{value:"no-baseline-rule",label:Ya["no-baseline-rule"]},{value:"not-comparable",label:Ya["not-comparable"]},{value:"conflicts",label:Ya.conflicts},{value:"duplicates",label:Ya.duplicates}],fp=["result status","category","security domain","baseline","comparison","conflict","description source","diagnostics","duplicates","gpo backups with failing settings","imported","policy section","policy type","source: scan"],l6=new Set(fp),mP=new Set([...l6].filter(e=>e!=="result status"&&e!=="category"&&e!=="security domain"&&e!=="source: scan")),u6={severity:"Severity",status:"Status",category:"Category",asset:"Affected Object",score:"Score","framework-reference":"Framework","rule-id":"Rule ID"},gP=new Set(["title","description","recommendation","evidence"]),vP=/^(?:remediation|remediation\s*guidance|recommended\s*action|recommendation|advised\s*solution|solution|fix|description|beschreibung|rationale|explanation|technical\s*explanation|evidence|nachweis|proof|result\s*detail|resultdetail|details?|title|titel|l(?:oe|ö)sung|ma(?:ss|ß)nahme)$/i,xP={severity:100,status:95,category:90,asset:80,score:75,"framework-reference":70,"rule-id":30},d6=[{pattern:/^(?:severity|schweregrad|criticality|kritikalit(?:ae|ä)t)$/i,priority:98},{pattern:/^(?:category|kategorie)$/i,priority:92},{pattern:/^security\s+domain$/i,priority:91.5},{pattern:/^cis\s+category$/i,priority:91},{pattern:/^mitre\s*att&?ck$/i,priority:88},{pattern:/^mitre\s*d3fend$/i,priority:86},{pattern:/^(?:target|ziel|betroffenes objekt|asset)$/i,priority:84},{pattern:/^result\s*message$/i,priority:82}];function M3(e,t){const n=d6.find(a=>a.pattern.test(je(e)));return n?n.priority:xP[t??"additional"]??50}function j1(e){return je(e).toLocaleLowerCase("de-DE")}function mm(e,t){return je(e.fields[t]?.value)}function wu(e){const t=je(e),n=/^(\d{4})-(\d{2})-(\d{2})/.exec(t);if(n)return Date.UTC(Number(n[1]),Number(n[2])-1,Number(n[3]));const a=/^(\d{1,2})[./-](\d{1,2})[./-](\d{4})$/.exec(t);if(a)return Date.UTC(Number(a[3]),Number(a[2])-1,Number(a[1]));const i=Date.parse(t);return Number.isFinite(i)?i:null}function yP(e,t){return e==="severity"||kb(t)}function T6(e,t){return e?Eb(t):j1(t)}function hp(e,t){return e.derivedKind==="policy-failing-backup"?t:T6(e.severityScale,t)}function SP(e){if(!e.some(a=>a.policyFailingBackupSources!==void 0))return null;const t=new Map;let n=0;for(const a of e){a.policyFailingBackupSources?.length&&(n+=1);for(const i of a.policyFailingBackupSources??[]){const r=t.get(i.id);r?r.count+=1:t.set(i.id,{value:i.id,label:i.label,count:1})}}return{id:o6,label:"GPO backups with failing settings",source:"derived",kind:"category",derivedKind:"policy-failing-backup",preserveEmptyValues:!0,description:"Sources linked to Fail comparisons in the loaded Work scope, as counted in Processing. A source may also contain a passing member value. Selecting a source sets Result Status to All; other Work filters still apply. Option counts are comparison rows. Historical evaluations retain their review status.",values:[{value:c6,label:`All counted GPOs (${t.size})`,count:n},...[...t.values()].sort((a,i)=>a.label.localeCompare(i.label)||a.value.localeCompare(i.value))]}}function bP(e){if(!e.length)return null;const t=new Map;e.forEach(a=>{const i=pm(a);t.set(i,(t.get(i)??0)+1)});const n=gd.map(a=>({value:a.id,label:a.label,count:t.get(a.id)??0}));return t.has(lo.id)&&n.push({value:lo.id,label:lo.label,count:t.get(lo.id)}),{id:r6,label:"Security Domain",source:"derived",kind:"category",derivedKind:"security-domain",preserveEmptyValues:!0,values:n}}function wP(e,t){return t<0||!e.some(n=>n.policyBaselineLabels!==void 0)?null:{id:`field:${t}`,label:"Baseline",source:"derived",kind:"category",derivedKind:"policy-baseline",values:F1(e.flatMap(n=>n.policyBaselineLabels??[]))}}function F1(e,t=!1){const n=new Map;e.forEach(i=>{const r=je(i);if(!r)return;const c=T6(t,r),l=t?Cb[c]??r:r,f=n.get(c);n.set(c,{label:f?.label??l,count:(f?.count??0)+1})});const a=[...n.entries()].map(([i,r])=>({value:i,label:r.label,count:r.count}));return t?a.sort((i,r)=>sp(i.value)-sp(r.value)):a.sort((i,r)=>r.count-i.count||i.label.localeCompare(r.label,"en-US"))}function CP(e,t,n,a=t.length,i=!1){const r=n==="category"&&t.length>0&&t.length0;if(t.length<2&&!r&&!c||e.type==="Text"&&n!=="category"||e.type==="leer")return!1;const l=new Set;for(const m of t)if(l.add(j1(m)),l.size>Tp)return!1;const f=l.size,T=t.reduce((m,g)=>m+g.length,0)/t.length;return f<2&&!r&&!c||f>Tp||T>72?!1:n==="severity"||n==="status"||n==="category"||n==="asset"||n==="framework-reference"||f<=10||f/t.length<=.5}function EP(e,t,n,a,i){const r=i.map(T=>mm(T,t)).filter(Boolean),c=e.type==="Zahl"?r.map(vi).filter(T=>T!==null):r.map(wu).filter(T=>T!==null);if(c.length<2)return null;const{minimum:l,maximum:f}=c.reduce((T,p)=>({minimum:Math.min(T.minimum,p),maximum:Math.max(T.maximum,p)}),{minimum:Number.POSITIVE_INFINITY,maximum:Number.NEGATIVE_INFINITY});return l===f?null:{id:`field:${t}`,label:u6[n??"additional"]??e.header,kind:e.type==="Zahl"?"number-range":"date-range",source:"field",values:[],columnIndex:t,role:n,confidence:a,minimum:l,maximum:f}}function Th(e){return j1(e).replace(/[\s_-]*\d+$/,"")}function f6(e,t){const n=new Set;return t.forEach(a=>{const i=mm(e,a);i&&n.add(i)}),[...n]}function kP(e,t,n){const a=t?.recognition?.fields.filter(l=>l.tableId===e.id)??[],i=new Map;e.analysis.columns.forEach(l=>{if(l.type==="Zahl"||l.type==="Datum")return;const f=Th(l.header);i.set(f,(i.get(f)??0)+1)});const r=new Set,c=new Map;return e.analysis.columns.flatMap((l,f)=>{const T=a.find(E=>E.columnIndex===f),m=(T?.appliedRole==="additional"?void 0:T?.appliedRole)??(/^(?:category|kategorie)$/i.test(je(l.header))?"category":void 0);if(m==="score"||j1(l.header)==="score")return[];if(m&&gP.has(m))return[];if(vP.test(je(l.header)))return[];if(n&&(m==="status"||/^(?:status|ergebnis|result)$/i.test(je(l.header))))return[];if(/^(?:quelle|source):\s*(?:datei|blatt|file|sheet)$/i.test(je(l.header))&&e.analysis.columns.some(E=>/^(?:quelle|source):\s*scan$/i.test(je(E.header))))return[];if(l.type==="Zahl")return[];if(l.type==="Datum"){const E=EP(l,f,m,T?.confidence.level,e.analysis.records);return E?[{...E,priority:M3(E.label,m)}]:[]}if(l.type==="Text"&&m!=="category"||l.type==="leer")return[];const g=Th(l.header),S=(i.get(g)??0)>1;if(S&&r.has(g))return[];const x=S?e.analysis.columns.flatMap((E,O)=>E.type!=="Zahl"&&E.type!=="Datum"&&Th(E.header)===g?[O]:[]):[f];if(/^(?:quelle|source):\s*scan$/i.test(je(l.header)))return[];let w=S?c.get(g):void 0;if(w||(w=e.analysis.records.flatMap(E=>f6(E,x)),S&&c.set(g,w)),!CP(l,w,m,e.analysis.records.length,e.toolId==="group-policy"))return[];S&&r.add(g);const C=u6[m??"additional"]??(S?je(l.header).replace(/[\s_-]*\d+$/,""):l.header),k=yP(m,l.header);return[{id:`field:${x.join("+")}`,label:C,kind:"category",source:"field",values:F1(w,k),columnIndex:f,columnIndexes:x,role:m,severityScale:k,confidence:T?.confidence.level,priority:M3(C,m)}]})}function AP(e,t,n=!1){const a=t.presentation.statusFilters.filter(i=>i.value!=="all");return a.length?{id:"profile:status",label:"Result Status",kind:"category",source:"profile-status",preserveEmptyValues:n,values:a.map(i=>({value:i.value,label:i.label,count:e.analysis.records.filter(r=>t.matchesStatus(r,i.value)).length})).filter(i=>n||i.count>0)}:null}function fh(e){const t=F1(e.values);return t.length<2||t.length>Tp?null:{...e,kind:"category",values:t}}const RP=md();function DP(e,t,n){return RP(e,[t,n],()=>{const a=AP(e,n,e.toolId==="group-policy"||!!t?.sheets?.some(f=>f.toolId==="group-policy")),i=e.analysis.records.flatMap(f=>M1(f,n.id)),r=F1(i),c=r.length?{id:"derived:cis-benchmark-category",label:"CIS Category",kind:"category",source:"derived",values:r,derivedKind:"cis-benchmark-category",fallbackToolId:n.id}:null,l=kP(e,t,!!a).sort((f,T)=>T.priority-f.priority||f.label.localeCompare(T.label,"en-US")).map(({priority:f,...T})=>T);return{profileFacet:a,cisCategories:c,fields:l}})}function h6(e){return je(e.fields.find(t=>/^(?:quelle|source):\s*scan$/i.test(je(t.label)))?.value)}const j3=new WeakMap;function IP(e){let t=j3.get(e);return t||(t=F1(e.map(h6).filter(Boolean)),j3.set(e,t)),t}function NP(e,t,n){const i=t?.sheets?.find(f=>f.isProjectSheet&&f.analysis.records.length)?.analysis.records??e.analysis.records,r=IP(i),c=je(t?.scanTool||n.name||e.toolId||""),l=r.length?r:c?[{value:j1(c),label:c,count:i.length}]:[];return l.length?{id:"provenance:source-scan",label:"Source: Scan",kind:"category",source:"provenance",values:l}:null}function p6(e,t){if(!(!e||t?.isProjectSheet))return e.sheets.find(n=>n.isProjectSheet&&n.analysis.records.length)}const F3=new WeakMap;function m6(e,t,n,a){if(e.toolId)return e.toolId;const i=n?.["provenance:source-scan"];if(!i?.values?.length)return;const r=[...i.values].sort().join("\0");let c=F3.get(e.analysis.records);c||(c=new Map,F3.set(e.analysis.records,c));const l=c.get(r);if(l!==void 0)return l||void 0;const f=t.find(g=>g.id==="provenance:source-scan");if(!f)return;const T=e.analysis.records.filter(g=>p1(g,[f],{[f.id]:i},a));if(!T.length){c.set(r,!1);return}const p=new Set(T.map(g=>oa(g,e.toolId)).filter(Boolean)),m=p.size===1?[...p][0]:void 0;return c.set(r,m??!1),m}const OP=md(),MP=[];function l0(e,t,n,a,i){return e?.analysis.records.length?OP(e,[t,n,a,i],()=>jP(e,t,n,a,i)):MP}function jP(e,t,n,a,i){if(!e?.analysis.records.length)return[];const{profileFacet:r,cisCategories:c,fields:l}=DP(e,t,n),f=NP(e,t,n),T=e.analysis.records.map(k=>a[k.id]).filter(k=>!!k),p=[fh({id:"review:status",label:"Review Status",source:"review",reviewField:"status",values:T.map(k=>k.status).filter(Boolean)}),fh({id:"review:priority",label:"Priority",source:"review",reviewField:"priority",values:T.map(k=>k.priority).filter(Boolean)}),fh({id:"review:owner",label:"Owner",source:"review",reviewField:"owner",values:T.map(k=>k.owner).filter(Boolean)})].filter(k=>!!k),m=wP(e.analysis.records,e.analysis.headers.indexOf("Baseline")),g=[r,bP(e.analysis.records),SP(e.analysis.records),m,c,...l.filter(k=>!m||k.label!=="Baseline"),...p,f].filter(k=>!!k),S=i??e.toolId,x=S==="group-policy"?g.filter(k=>l6.has(je(k.label).toLocaleLowerCase("en-US"))).map(k=>{if(k.source==="profile-status"){const E=new Map(k.values.map(O=>[O.value,O]));return{...k,contextToolId:"group-policy",preserveEmptyValues:!0,values:pP.map(O=>({...O,count:E.get(O.value)?.count??0}))}}return{...k,contextToolId:"group-policy"}}).sort((k,E)=>fp.indexOf(je(k.label).toLocaleLowerCase("en-US"))-fp.indexOf(je(E.label).toLocaleLowerCase("en-US"))):g.filter(k=>!mP.has(je(k.label).toLocaleLowerCase("en-US"))),y=x.find(k=>/^(?:quelle|source):\s*scan$/i.test(je(k.label))),w=S==="group-policy"?13:hP,C=x.filter(k=>k.id!==y?.id).slice(0,Math.max(0,w-(y?1:0)));return y&&C.push(y),C}function FP(e){return e.source==="profile-status"||d6.some(t=>t.pattern.test(je(e.label)))}function LP(e){let t=0;for(;te.filters[i.id]&&i.source!=="profile-status"),n=e.facets.filter(i=>i.kind==="category"&&i.id!=="provenance:source-scan"),a=new Map(n.map(i=>[i.id,new Map]));for(const i of e.records){const r=t.filter(l=>!p1(i,[l],{[l.id]:e.filters[l.id]},e.reviews));if(r.length>1)continue;const c=e.matchesStatus(i,e.statusFilter);for(const l of n){if(r.length&&r[0].id!==l.id)continue;const f=l.source==="profile-status"?l.values.filter(p=>e.matchesStatus(i,p.value)).map(p=>p.value):c?[...new Set(x6(i,l,e.reviews).map(p=>hp(l,p)))]:[],T=a.get(l.id);for(const p of f)p&&T.set(p,(T.get(p)??0)+1)}}return e.facets.map(i=>{const r=a.get(i.id);return r?{...i,values:i.values.map(c=>({...c,count:r.get(c.value)??0})).filter(c=>i.preserveEmptyValues||c.count>0||(i.source==="profile-status"?c.value===e.statusFilter:e.filters[i.id]?.values?.includes(c.value)))}:i})}function v6(e,t,n){return t.source==="field"&&t.columnIndex!==void 0?mm(e,t.columnIndex):t.source==="provenance"?t.id==="provenance:source-scan"?h6(e)||(t.values.length===1?t.values[0]?.label??"":""):s6(e.sourceFile):t.source==="review"&&t.reviewField?je(n[e.id]?.[t.reviewField]):""}function x6(e,t,n){if(t.derivedKind==="policy-baseline")return e.policyBaselineLabels??[];if(t.derivedKind==="security-domain")return[pm(e)];if(t.derivedKind==="policy-failing-backup"){const i=e.policyFailingBackupSources;return i?.length?[c6,...i.map(r=>r.id)]:[]}if(t.source==="derived"&&t.derivedKind==="cis-benchmark-category")return M1(e,t.fallbackToolId);if(t.source==="field"&&t.columnIndexes?.length)return f6(e,t.columnIndexes);const a=v6(e,t,n);return a?[a]:[""]}function p1(e,t,n,a){if(!n||!Object.keys(n).length)return!0;const i=new Map(t.map(r=>[r.id,r]));return Object.entries(n).every(([r,c])=>{const l=i.get(r);if(!l||l.source==="profile-status")return!0;const f=v6(e,l,a);if(c.values?.length){const T=c.values.map(m=>hp(l,m));if(!x6(e,l,a).map(m=>hp(l,m)).some(m=>T.includes(m)))return!1}if(l.kind==="number-range"){const T=vi(f);if(T===null)return!1;const p=c.minimum?vi(c.minimum):null,m=c.maximum?vi(c.maximum):null;if(p!==null&&Tm)return!1}if(l.kind==="date-range"){const T=wu(f);if(T===null)return!1;const p=c.minimum?wu(c.minimum):null,m=c.maximum?wu(c.maximum):null;if(p!==null&&Tm)return!1}return!0})}const PP=md(),_P=[];function y6(e){return[e.activeProfile,e.dataset,e.reviews,e.search,e.sortColumn,e.sortDirection,e.statusFilter,e.actionOnly,e.pathFindingIds?.length?e.pathFindingIds:void 0,JSON.stringify(e.facetFilters??{})]}function gm(e,t){return e?PP(e,y6(t),()=>qP(e,t)):_P}function qP(e,t){if(!e)return[];const n=l0(e,t.dataset,t.activeProfile,t.reviews),i=m6(e,n,t.facetFilters,t.reviews)==="group-policy"?l0(e,t.dataset,t.activeProfile,t.reviews,"group-policy"):n,r=t.pathFindingIds?.length?new Set(t.pathFindingIds):void 0,c=e.analysis.records.filter(p=>r&&!r.has(p.id)||t.actionOnly&&!t.reviews[p.id]?.include||!t.activeProfile.matchesStatus(p,t.statusFilter)||!p1(p,i,t.facetFilters,t.reviews)?!1:t.search?p.fields.some(m=>ga(m.value).toLocaleLowerCase("en-US").includes(t.search)):!0);if(t.sortColumn==="all"){const p=LF(e.analysis.headers);if(p<0)return c;const m=new Map(c.map(g=>[g,sp(Eb(ga(g.fields[p]?.value)))]));return c.sort((g,S)=>m.get(g)-m.get(S)||g.index-S.index)}const l=e.analysis.headers.indexOf(t.sortColumn);if(l<0)return c;const f=t.sortDirection==="asc"?1:-1,T=new Map(c.map(p=>[p,vi(p.fields[l]?.value)]));return c.sort((p,m)=>{const g=T.get(p),S=T.get(m);return g===null&&S===null?p.index-m.index:g===null?1:S===null?-1:(g-S)*f||p.index-m.index})}function BP(e,t){if(!e.dataset?.sheets.some(a=>a.id===t.activeSheetId))return e;const n=Object.fromEntries(Object.entries(t.facetFilters).map(([a,i])=>[a,{...i,...i.values?{values:[...i.values]}:{}}]));return{...e,...t,facetFilters:n,pathFindingIds:[...t.pathFindingIds]}}const UP={dataset:null,activeSheetId:"",view:"columns",search:"",sortColumn:"all",sortDirection:"desc",titleColumn:"",statusFilter:"deviation",facetFilters:{},pathFindingIds:[],actionOnly:!1,selectedRecordId:"",reviews:{},projectId:"",status:"Ready",theme:"dark",delimiter:"auto",sidebarCollapsed:!1,backendStatus:"checking"};function S6(e,t){return!!(e?.length||t?.length)}function zP(e,t,n){if(!t?.length&&n?.length)return`${e}::assessments::${[...new Set(n)].sort().join("|")}`;if(!t?.length)return e;const a=[...new Set(t)].sort();return`${e}::timeslot::${a.join("|")}`}const Yr=NF,Cc=new gF(new bb),Hi=new qi,vm=H.createContext(null),L3=new WeakMap;function WP(e){const t=L3.get(e);if(t)return t;const n=[...new Set(e.sheets.map(l=>l.toolId).filter(l=>!!l))].map(l=>Yr.find(f=>f.id===l)).filter(l=>!!(l&&l.id!=="generic")),a=e.sheets.some(l=>l.toolId==="group-policy");if(n.length<2&&!a)return n[0]??gi;const i=[gi,...n],r=[...new Map(i.flatMap(l=>l.presentation.statusFilters).map(l=>[l.value,l])).values()],c={...gi,id:"multiple",name:"Multiple Tools",version:n.map(l=>`${l.id}@${l.version}`).sort().join("+"),matchesStatus:(l,f)=>i.filter(T=>T.presentation.statusFilters.some(p=>p.value===f)).some(T=>T.matchesStatus(l,f)),presentation:{...gi.presentation,statusFilters:r}};return L3.set(e,c),c}function qc(e){return e?e.profileId==="generic"&&new Set(e.sheets.map(t=>t.toolId).filter(Boolean)).size>1?WP(e):Yr.find(t=>t.id===e.profileId)??gi:gi}function hh(e,t){return t?.toolId?Yr.find(n=>n.id===t.toolId)??gi:qc(e)}function eo(e,t){return"deviation"}function P3(e){return e!=="system"?e:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"}function VP({children:e}){const[t,n]=H.useState({phase:"idle"}),[a,i]=H.useState(),[r,c]=H.useState(),[l,f]=H.useState(),[T,p]=H.useState(""),m=H.useRef(0),g=H.useRef(new Map),S=H.useRef(new Map),[x,y]=H.useState(()=>{const I=localStorage.getItem("ASSESSOR.theme")??localStorage.getItem("exxTableReader.theme")??"dark";return localStorage.setItem("ASSESSOR.theme",I),document.documentElement.dataset.theme=P3(I),{...UP,theme:I}});H.useEffect(()=>{if(!T)return;const I=()=>{Cc.save(T,x.reviews)};if("requestIdleCallback"in window){const le=window.requestIdleCallback(I,{timeout:750});return()=>{window.cancelIdleCallback(le),I()}}const L=globalThis.setTimeout(I,150);return()=>{globalThis.clearTimeout(L),I()}},[x.reviews,T]),H.useEffect(()=>{if(!x.dataset||!x.projectId||x.backendStatus!=="connected")return;const I=globalThis.setTimeout(()=>{for(const[L,le]of bu(x.dataset)){const ue=le.map(te=>x.reviews[te]).find(Boolean);if(!ue)continue;const X=`occurrence:${L}`,F=g.current.get(X);if(F&&Jc(ue,Su(F)))continue;const me=(S.current.get(X)??Promise.resolve()).catch(()=>{}).then(async()=>{const te=g.current.get(X);if(te&&Jc(ue,Su(te)))return;const Ce=D3({...ue,riskAcceptance:te?.riskAcceptance},{kind:"occurrence",occurrenceId:L},te,new Date().toISOString());await Hi.saveReview(Ce,te?.revision??0),g.current.set(dp(Ce.target),Ce)}).catch(()=>{y(te=>te.projectId===x.projectId?{...te,status:"Review could not be saved to the database. The local copy was kept."}:te)});S.current.set(X,me)}},350);return()=>globalThis.clearTimeout(I)},[x.backendStatus,x.dataset,x.projectId,x.reviews]),H.useEffect(()=>{let I=!0;const L=async()=>{try{const X=await Hi.health();I&&y(F=>{const re=X.status==="ok"?"connected":"unavailable";return F.backendStatus===re?F:{...F,backendStatus:re}})}catch{I&&y(X=>X.backendStatus==="unavailable"?X:{...X,backendStatus:"unavailable"})}};L();const le=globalThis.setInterval(()=>{L()},1e4),ue=()=>{L()};return globalThis.addEventListener("focus",ue),()=>{I=!1,globalThis.clearInterval(le),globalThis.removeEventListener("focus",ue)}},[]);const w=H.useCallback(async(I,L,le,ue)=>{const X=[...I];if(X.length){n({phase:"preparing",targetProjectId:L,targetAssessmentId:le,replacesScanRunId:ue}),y(F=>({...F,status:`Checking ${X.length===1?X[0].name:`${X.length} files`}...`}));try{if(ue&&x.backendStatus!=="connected")throw new Error("A safe reimport requires the connected backend to verify the exact SHA-256 identity of the original scan. No data was imported.");if(X.length===1&&X[0].name.toLocaleLowerCase("en-US").endsWith(".json")){const M=yF(await X[0].text());if(M){const Y=hu(M.dataset.fileName,M.dataset.fileSize,M.dataset.lastModified),Z=qc(M.dataset),J=M.dataset.sheets[0],he=Z.defaults(J);y(ge=>({...ge,dataset:M.dataset,activeSheetId:J?.id??"",reviews:M.reviews,projectId:Y,titleColumn:he.titleColumn,sortColumn:he.sortColumn,sortDirection:he.sortDirection,facetFilters:{},pathFindingIds:[],statusFilter:eo(J,he.statusFilter),selectedRecordId:J?.analysis.records[0]?.id??"",actionOnly:!1,view:"columns",status:"Snapshot loaded"})),p(Y),n({phase:"idle"}),await Cc.save(Y,M.reviews);return}}let F;if(x.backendStatus==="connected"){if(F=await Hi.previewImportBatch(X,x.delimiter,L,le,ue),ue&&F.replacesScanRunId!==ue)throw new Error("The backend does not support the current safe reimport contract. Restart the local app and backend before retrying.")}else{const M=new Date().toISOString(),Y=`batch-${Date.now()}-${Math.random().toString(16).slice(2)}`,Z=await Promise.all(X.map(QL)),J=new Map(lh(localStorage).load().map(de=>[de.sha256,de])),he=new Map,ge=[];for(let de=0;deM.selected&&M.dataset&&M.status!=="error"),Ce=re.some(M=>M.status==="error"),ee=re.some(M=>M.duplicateOf||M.possibleDuplicateOf);if(te.length>0&&!Ce&&!ee&&te.every(M=>M.mappingsToConfirm===0)){const M=te.map(Xe=>Xe.dataset),Y=[...new Set(M.map(Xe=>Xe.profileId).filter(Xe=>Xe!=="generic"))],Z=Y.length===1?Yr.find(Xe=>Xe.id===Y[0])??gi:gi,J=M.length===1?M[0]:Qx(M,Z),he=te.map(Xe=>({entryId:Xe.id,sha256:Xe.sha256,fileName:Xe.fileName,sizeBytes:Xe.sizeBytes,lastModified:Xe.lastModified,recognitionOverrides:k3(Xe.dataset?.recognition,Xe.dataset?.mapping)}));let ge;if(x.backendStatus==="connected"){if(ue&&F.replacesScanRunId!==ue)throw new Error("The reimport preview is not bound to the selected scan. Restart the local app and backend before retrying.");const Xe=await Hi.completeImportBatch(F.batchId,he,L,le,ue);if(ue&&Xe.replacedScanRunId!==ue)throw new Error("The backend did not confirm the selected replacement target.");ge=Xe.projectId}else lh(localStorage).record(he.map(({entryId:Xe,recognitionOverrides:pt,...Pt})=>Pt));const de=new Set(te.map(Xe=>Xe.id)),fe=A3(F,de);localStorage.setItem(C3,JSON.stringify(fe));const ye=ge??L??hu(J.fileName,J.fileSize,J.lastModified),qe=ge?await ch(Hi,ge):void 0,ae=qe?.dataset??J,Ne=await Cc.load(ye),Ve=qe?uh(ae,qe.models.flatMap(Xe=>Xe.reviews),Ne):{reviews:Ne,persisted:new Map};g.current=Ve.persisted;const tt=Ve.reviews,We=ae.sheets[0],_e=qc(ae).defaults(We);y(Xe=>({...Xe,dataset:ae,activeSheetId:We?.id??"",reviews:tt,projectId:ye,search:"",actionOnly:!1,view:"columns",selectedRecordId:We?.analysis.records[0]?.id??"",titleColumn:_e.titleColumn,sortColumn:_e.sortColumn,sortDirection:_e.sortDirection,statusFilter:eo(We,_e.statusFilter),facetFilters:{},pathFindingIds:[],status:`${fe.importedFiles} file${fe.importedFiles===1?"":"s"} imported · ${fe.importedRecords.toLocaleString("en-US")} records`})),p(ye),n({phase:"idle"}),globalThis.dispatchEvent(new CustomEvent("assessor:datahub-changed",{detail:{projectId:ye}}))}else{n(Y=>E3(Y,me));const M=F.entries.filter(Y=>Y.dataset&&Y.status!=="duplicate").length;y(Y=>({...Y,status:`${X.length} file${X.length===1?"":"s"} checked · ${M} preselected`}))}}catch(F){const re=F instanceof Error?F.message:"Unknown error";console.error(F),n(me=>E3(me,{version:1,batchId:`failed-${Date.now()}`,createdAt:new Date().toISOString(),entries:[]},re)),y(me=>({...me,status:`Import check failed: ${re}`}))}}},[x.backendStatus,x.delimiter]),C=H.useCallback((I,L)=>{n(le=>le.preview?{...le,preview:{...le.preview,entries:le.preview.entries.map(ue=>ue.id===I&&ue.status!=="error"&&ue.dataset?{...ue,selected:L}:ue)}}:le)},[]),k=H.useCallback(I=>{n(L=>L.preview?{...L,preview:{...L.preview,entries:L.preview.entries.map(le=>le.id===I?JL(le,Yr):le)}}:L)},[]),E=H.useCallback(()=>{n({phase:"idle"})},[]),O=H.useCallback(async()=>{const I=t.preview,L=t.targetProjectId,le=t.targetAssessmentId,ue=t.replacesScanRunId;if(!I)return;const X=I.entries.filter(F=>F.selected&&F.dataset&&F.status!=="error");if(!X.length){n(F=>({...F,error:"Select at least one successfully checked file."}));return}if(X.some(F=>F.mappingsToConfirm>0)){n(F=>({...F,error:"Confirm all suggested source, sheet, and field mappings first."}));return}n(F=>({...F,phase:"committing",error:void 0}));try{const F=X.map(Ne=>Ne.dataset),re=[...new Set(F.map(Ne=>Ne.profileId).filter(Ne=>Ne!=="generic"))],me=re.length===1?Yr.find(Ne=>Ne.id===re[0])??gi:gi,te=F.length===1?F[0]:Qx(F,me),Ce=X.map(Ne=>({entryId:Ne.id,sha256:Ne.sha256,fileName:Ne.fileName,sizeBytes:Ne.sizeBytes,lastModified:Ne.lastModified,recognitionOverrides:k3(Ne.dataset?.recognition,Ne.dataset?.mapping)}));let ee;if(x.backendStatus==="connected"){if(ue&&I.replacesScanRunId!==ue)throw new Error("The reimport preview is not bound to the selected scan. Restart the local app and backend before retrying.");const Ne=await Hi.completeImportBatch(I.batchId,Ce,L,le,ue);if(ue&&Ne.replacedScanRunId!==ue)throw new Error("The backend did not confirm the selected replacement target.");ee=Ne.projectId}else lh(localStorage).record(Ce.map(({entryId:Ne,recognitionOverrides:Ve,...tt})=>tt));const M=new Set(X.map(Ne=>Ne.id)),Y=A3(I,M);localStorage.setItem(C3,JSON.stringify(Y));const Z=ee??L??hu(te.fileName,te.fileSize,te.lastModified),J=ee?await ch(Hi,ee):void 0,he=J?.dataset??te,ge=await Cc.load(Z),de=J?uh(he,J.models.flatMap(Ne=>Ne.reviews),ge):{reviews:ge,persisted:new Map};g.current=de.persisted;const fe=de.reviews,ye=he.sheets[0],ae=qc(he).defaults(ye);y(Ne=>({...Ne,dataset:he,activeSheetId:ye?.id??"",reviews:fe,projectId:Z,search:"",actionOnly:!1,view:"columns",selectedRecordId:ye?.analysis.records[0]?.id??"",titleColumn:ae.titleColumn,sortColumn:ae.sortColumn,sortDirection:ae.sortDirection,statusFilter:eo(ye,ae.statusFilter),facetFilters:{},pathFindingIds:[],status:`${Y.importedFiles} file${Y.importedFiles===1?"":"s"} imported · ${Y.importedRecords.toLocaleString("en-US")} records`})),p(Z),n({phase:"report",preview:I,report:Y}),globalThis.dispatchEvent(new CustomEvent("assessor:datahub-changed",{detail:{projectId:Z}}))}catch(F){const re=F instanceof Error?F.message:"Unknown error";console.error(F),n(me=>({...me,phase:"preview",error:`Import not executed: ${re}`})),y(me=>({...me,status:`Import not executed: ${re}`}))}},[t.preview,x.backendStatus]),N=H.useCallback(async(I,L,le)=>{const ue=++m.current,X=zP(I,L,le);i(I),c(L?.length?[...new Set(L)]:void 0),f(le),y(F=>({...F,dataset:null,activeSheetId:"",projectId:I,status:"Loading saved client …"}));try{const{models:F,dataset:re,assessmentIds:me}=await ch(Hi,I,L,le);if(ue!==m.current)return!1;if(!F.length)return g.current=new Map,y(J=>({...J,status:"This client does not have a scan report yet."})),!1;if(!re)return g.current=new Map(F.flatMap(J=>J.reviews).map(J=>[dp(J.target),J])),f(me),p(X),y(J=>({...J,reviews:{},selectedRecordId:"",status:"Client opened. No displayable results are available in the selected timeslot yet."})),!0;const te=await Cc.load(X),Ce=uh(re,F.flatMap(J=>J.reviews),te);g.current=Ce.persisted;const ee=Ce.reviews;if(ue!==m.current)return!1;const M=re.sheets[0],Z=qc(re).defaults(M);return y(J=>({...J,dataset:re,activeSheetId:M?.id??"",reviews:ee,projectId:I,search:"",actionOnly:!1,view:"columns",selectedRecordId:M?.analysis.records[0]?.id??"",titleColumn:Z.titleColumn,sortColumn:Z.sortColumn,sortDirection:Z.sortDirection,statusFilter:eo(M,Z.statusFilter),facetFilters:{},pathFindingIds:[],status:F[0].project.name+" · "+re.scanTool+" · "+F.length.toLocaleString("en-US")+" scan report"+(F.length===1?"":"s")+" · "+M.analysis.records.length.toLocaleString("en-US")+" records loaded"})),f(me),p(X),!0}catch(F){if(ue!==m.current)return!1;const re=F instanceof Error?F.message:"Unknown loading error";return y(me=>({...me,dataset:null,activeSheetId:"",status:"Client could not be loaded: "+re})),!1}},[]),B=H.useCallback((I,L)=>{y(le=>{const ue=le.dataset?.sheets.flatMap(te=>te.analysis.records).find(te=>te.id===I),X=ue?.findingOccurrenceId&&le.dataset?bu(le.dataset).get(ue.findingOccurrenceId)??[I]:[I];let F={reviews:le.reviews,actionOnly:le.actionOnly};for(const te of X)F=eP(F,te,L);const{reviews:re,actionOnly:me}=F;return{...le,reviews:re,actionOnly:me}})},[]),A=H.useCallback(I=>{localStorage.setItem("ASSESSOR.theme",I),document.documentElement.dataset.theme=P3(I),y(L=>({...L,theme:I}))},[]),z=x.dataset?.sheets.find(I=>I.id===x.activeSheetId)??x.dataset?.sheets[0],P=hh(x.dataset,z),K=H.useMemo(()=>({...x,activeSheet:z,activeProfile:P,importWorkflow:t,importFiles:w,setImportEntrySelected:C,confirmImportEntry:k,commitImportBatch:O,closeImportWorkflow:E,setActiveSheet:I=>y(L=>{const le=L.dataset?.sheets.find(X=>X.id===I),ue=hh(L.dataset,le).defaults(le);return{...L,activeSheetId:I,selectedRecordId:le?.analysis.records[0]?.id??"",titleColumn:ue.titleColumn,sortColumn:ue.sortColumn,sortDirection:ue.sortDirection,statusFilter:eo(le,ue.statusFilter),facetFilters:{},pathFindingIds:[]}}),setView:I=>y(L=>({...L,view:I})),setSearch:I=>y(L=>({...L,search:I,selectedRecordId:""})),setSortColumn:I=>y(L=>({...L,sortColumn:I})),toggleSortDirection:()=>y(I=>({...I,sortDirection:I.sortDirection==="asc"?"desc":"asc"})),setTitleColumn:I=>y(L=>({...L,titleColumn:I})),setStatusFilter:I=>y(L=>({...L,statusFilter:I})),setFacetFilter:(I,L)=>y(le=>{const ue={...le.facetFilters};return!L||!L.values?.length&&!L.minimum&&!L.maximum?delete ue[I]:ue[I]=L,{...le,facetFilters:ue,selectedRecordId:""}}),setActionOnly:I=>y(L=>({...L,actionOnly:I})),setPathFindingIds:I=>y(L=>{const le=[...new Set(I.filter(Boolean))],ue=le.includes(L.selectedRecordId)?L.selectedRecordId:L.activeSheetId?L.dataset?.sheets.find(X=>X.id===L.activeSheetId)?.analysis.records.find(X=>le.includes(X.id))?.id??"":"";return{...L,pathFindingIds:le,selectedRecordId:ue}}),applyViewBookmark:I=>y(L=>BP(L,I)),targetProjectId:a,activeScanRunIds:r,activeAssessmentIds:l,workScopeId:T,setTargetProjectId:I=>{i(I),I||(c(void 0),f(void 0))},openProject:N,setSelectedRecord:I=>y(L=>({...L,selectedRecordId:I})),updateReview:B,recordRiskAcceptance:async(I,L)=>{const le=x.dataset?.sheets.flatMap(te=>te.analysis.records).find(te=>te.id===I);if(!a||!le?.findingOccurrenceId||x.backendStatus!=="connected")throw new Error("Connect to the backend and open a saved finding before recording risk acceptance.");const ue=le.findingOccurrenceId,X=`occurrence:${ue}`,F=g.current,me=(S.current.get(X)??Promise.resolve()).catch(()=>{}).then(async()=>{let te=F.get(X);const Ce={...hr(),...x.reviews[I],riskAcceptance:te?.riskAcceptance};if(!te||!Jc(Ce,Su(te))){const M=D3(Ce,{kind:"occurrence",occurrenceId:ue},te,new Date().toISOString());te=(await Hi.saveReview(M,te?.revision??0)).review,F.set(X,te)}const ee=await Hi.recordRiskAcceptance(a,ue,L,te.revision);F.set(X,ee.review),y(M=>{if(M.dataset!==x.dataset)return M;const Y={...M.reviews};for(const Z of bu(M.dataset).get(ue)??[])Y[Z]={...hr(),...Y[Z],riskAcceptance:ee.review.riskAcceptance};return{...M,reviews:Y}})});return S.current.set(X,me),me},snapshot:()=>x.dataset?xF(x.dataset,x.reviews):null,setTheme:A,setDelimiter:I=>y(L=>({...L,delimiter:I})),toggleSidebar:()=>y(I=>({...I,sidebarCollapsed:!I.sidebarCollapsed})),setSidebarCollapsed:I=>y(L=>L.sidebarCollapsed===I?L:{...L,sidebarCollapsed:I}),resetFilters:()=>y(I=>{const L=hh(I.dataset,z),le=L.defaults(z),ue=eo(z,le.statusFilter),X=gm(z,{activeProfile:L,search:"",sortColumn:le.sortColumn,sortDirection:le.sortDirection,statusFilter:ue,facetFilters:{},dataset:I.dataset,actionOnly:I.actionOnly,reviews:I.reviews}),F=X.some(re=>re.id===I.selectedRecordId);return{...I,search:"",sortColumn:le.sortColumn,sortDirection:le.sortDirection,titleColumn:le.titleColumn,statusFilter:ue,facetFilters:{},pathFindingIds:[],selectedRecordId:F?I.selectedRecordId:X[0]?.id??""}}),toggleWorkspace:()=>y(I=>Object.values(I.reviews).some(L=>L.include)?{...I,actionOnly:!I.actionOnly,view:"columns"}:I)}),[P,l,r,z,E,O,k,w,t,C,A,x,B,a,T,N]);return d.jsx(vm.Provider,{value:K,children:e})}function ca(){const e=H.useContext(vm);if(!e)throw new Error("useApp must be used within AppProvider.");return e}function HP({active:e,children:t}){const n=ca(),a=H.useRef(n);return e&&(a.current=n),d.jsx(vm.Provider,{value:a.current,children:t})}const GP="workspace-command-band";var vd=Xy();function Ua({title:e,onClose:t,dismissible:n=!0,className:a="",children:i}){const r=d.jsx("div",{className:"dialog-backdrop",role:"presentation",onMouseDown:n?t:void 0,children:d.jsxs("section",{className:`dialog-window ${a}`.trim(),role:"dialog","aria-modal":"true","aria-label":typeof e=="string"?e:void 0,onMouseDown:c=>c.stopPropagation(),children:[d.jsxs("header",{children:[d.jsx("h2",{children:e}),n&&d.jsx("button",{type:"button",onClick:t,"aria-label":"Close window",children:"×"})]}),d.jsx("div",{className:"dialog-body",children:i})]})});return vd.createPortal(r,document.body)}function b6(){return d.jsxs("span",{className:"import-spinner","aria-hidden":"true",children:[d.jsx("i",{}),d.jsx("i",{}),d.jsx("i",{}),d.jsx("i",{})]})}function w6({label:e}){return d.jsxs("div",{className:"import-progress",role:"status","aria-live":"polite",children:[d.jsx(b6,{}),d.jsx("strong",{children:e})]})}function xd({label:e}){return e?d.jsx(Ua,{title:"Processing",dismissible:!1,onClose:()=>{},children:d.jsx(w6,{label:e})}):null}function _3({variant:e="default",targetProjectId:t,targetAssessmentId:n,replacesScanRunId:a,label:i}){const r=H.useRef(null),{importFiles:c}=ca(),l=e==="open-data";return d.jsxs(d.Fragment,{children:[d.jsx("input",{ref:r,className:"hidden-input",type:"file",multiple:!0,accept:".xlsx,.xls,.csv,.json,.assessor-snapshot.json,.exx-snapshot.json,.xml,.txt,.html,.htm",onChange:f=>{f.target.files?.length&&c(f.target.files,t,n,a),f.target.value=""}}),d.jsxs("button",{className:l?"empty-open-data":"btn primary",type:"button",onClick:()=>r.current?.click(),children:[l&&d.jsx("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:d.jsx("path",{d:"M4 7h16v14H4zM8 7V3h8v4",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinejoin:"round"})}),d.jsx("span",{children:i??(l?"Open Data":"Open File")})]})]})}const C6="The stored source file is missing. Upload the unchanged original GPO ZIP or backup folder for this import. Saved results remain available.",E6="The stored source cannot be accessed. Check the backend storage connection and permissions. Saved results remain available.",XP=/^(?:con|prn|aux|nul|clock\$|com[1-9]|lpt[1-9])(?:\..*)?$/i,KP=/[\u0000-\u001f\u007f\u202a-\u202e\u2066-\u2069\u2044\u2215\u29f8]/;function k6(e){if(!e||e.length>4096||e!==e.normalize("NFC")||KP.test(e)||e.startsWith("/")||e.startsWith("\\")||/^[a-z]:/i.test(e))return null;const n=e.replace(/\\/g,"/").split("/");return n.some(a=>!a||a==="."||a===".."||a.length>255||a!==a.trim()||a.endsWith(".")||a.includes(":")||XP.test(a))?null:n.join("/")}function $P(e){return k6(e)?.toLowerCase()??null}class YP extends Error{constructor(t,n){super(n),this.code=t,this.name="GpoFolderTransportError"}code}const A6=2048,ZP=Uint32Array.from({length:256},(e,t)=>{let n=t;for(let a=0;a<8;a+=1)n=n>>>1^3988292384&-(n&1);return n>>>0});function Ji(e,t){throw new YP(e,t)}function JP(e){let t=4294967295;for(const n of e)t=t>>>8^ZP[(t^n)&255];return(t^4294967295)>>>0}function QP(e){const t=e.replaceAll("\\","/"),n=k6(t);return(!n||n!==t)&&Ji("gpo-folder-path-rejected","Der ausgewählte GPO-Ordner enthält einen unsicheren oder nicht kanonischen relativen Pfad."),n}function e_(e){const t=new Set(e.map(n=>n.relativePath.split("/")[0]));return t.size===1?[...t][0]:void 0}function t_(e){return`${(e??"gpo-backup-folder").normalize("NFC").replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").slice(0,120)||"gpo-backup-folder"}.gpo-backup.zip`}function n_(e,t,n){return e.setUint32(t,67324752,!0),e.setUint16(t+4,20,!0),e.setUint16(t+6,A6,!0),e.setUint16(t+8,n.compressionMethod,!0),e.setUint32(t+14,n.crc32,!0),e.setUint32(t+18,n.payloadBytes.byteLength,!0),e.setUint32(t+22,n.uncompressedBytes,!0),e.setUint16(t+26,n.encodedPath.byteLength,!0),t+30}function a_(e,t,n,a){return e.setUint32(t,33639248,!0),e.setUint16(t+4,20,!0),e.setUint16(t+6,20,!0),e.setUint16(t+8,A6,!0),e.setUint16(t+10,n.compressionMethod,!0),e.setUint32(t+16,n.crc32,!0),e.setUint32(t+20,n.payloadBytes.byteLength,!0),e.setUint32(t+24,n.uncompressedBytes,!0),e.setUint16(t+28,n.encodedPath.byteLength,!0),e.setUint32(t+42,a,!0),t+46}function i_(e,t){const n=e.reduce((p,m)=>p+30+m.encodedPath.byteLength+m.payloadBytes.byteLength,0),a=e.reduce((p,m)=>p+46+m.encodedPath.byteLength,0),i=n+a+22;(!Number.isSafeInteger(i)||i>t||i>4294967295)&&Ji("gpo-folder-transport-size-limit","Der ausgewählte GPO-Ordner überschreitet das zulässige Transportlimit.");const r=new Uint8Array(i),c=new DataView(r.buffer),l=[];let f=0;for(const p of e)l.push(f),f=n_(c,f,p),r.set(p.encodedPath,f),f+=p.encodedPath.byteLength,r.set(p.payloadBytes,f),f+=p.payloadBytes.byteLength;const T=f;return e.forEach((p,m)=>{f=a_(c,f,p,l[m]),r.set(p.encodedPath,f),f+=p.encodedPath.byteLength}),c.setUint32(f,101010256,!0),c.setUint16(f+8,e.length,!0),c.setUint16(f+10,e.length,!0),c.setUint32(f+12,a,!0),c.setUint32(f+16,T,!0),r}function q3(e,t,n,a){const i=e??t;return(!Number.isSafeInteger(i)||i<1||i>n)&&Ji("gpo-folder-limit-invalid",`${a} ist ungueltig.`),i}async function s_(e){if(typeof CompressionStream>"u")return{payloadBytes:e,compressionMethod:0};const t=new CompressionStream("deflate-raw"),n=t.readable.getReader(),a=[],i=(async()=>{let l=0;for(;;){const p=await n.read();if(p.done)break;a.push(p.value),l+=p.value.byteLength}const f=new Uint8Array(l);let T=0;for(const p of a)f.set(p,T),T+=p.byteLength;return f})(),r=t.writable.getWriter();await r.write(e.slice()),await r.close();const c=await i;return c.byteLengthVr.maximumZipEntries||e.length>65535)&&Ji("gpo-folder-entry-limit","Der ausgewählte GPO-Ordner enthält zu viele Dateien.");const i=e.reduce((r,c)=>((!Number.isSafeInteger(c.sizeBytes)||c.sizeBytes<0||c.sizeBytes>Vr.maximumZipEntryUncompressedBytes)&&Ji("gpo-folder-entry-size-invalid","Eine Datei des GPO-Ordners besitzt eine ungültige oder zu große Dateigröße."),r+c.sizeBytes),0);return(!Number.isSafeInteger(i)||i>n)&&Ji("gpo-folder-source-size-limit","Der ausgewählte GPO-Ordner überschreitet das zulässige Uploadlimit."),{maximumSourceBytes:n,maximumTransportBytes:a}}async function B3(e,t={}){const{maximumTransportBytes:n}=R6(e,t),a=new TextEncoder,i=new Set,r=[];for(const l of e){const f=QP(l.relativePath),T=$P(f);(!T||i.has(T))&&Ji("gpo-folder-path-collision","Dateipfade des GPO-Ordners kollidieren nach sicherer Unicode-/Groß-/Kleinschreibungsnormalisierung."),i.add(T);const p=a.encode(f);(!p.byteLength||p.byteLength>65535)&&Ji("gpo-folder-path-size-limit","Ein relativer GPO-Dateipfad ist für den Transportcontainer zu lang.");const m=await l.readBytes();(!(m instanceof Uint8Array)||m.byteLength!==l.sizeBytes)&&Ji("gpo-folder-file-size-mismatch","Deklarierte und gelesene Größe einer GPO-Datei stimmen nicht überein.");const g=await s_(m);r.push({relativePath:f,encodedPath:p,...g,uncompressedBytes:m.byteLength,crc32:JP(m)})}r.sort((l,f)=>l.relativePathf.relativePath?1:0);const c=e_(r);return{fileName:t_(c),bytes:i_(r,n),fileCount:r.length,sourceBytes:r.reduce((l,f)=>l+f.uncompressedBytes,0),rootName:c}}const tu=new qi,r_={queued:"Queued",running:"Processing",succeeded:"Processed successfully",partial:"Imported with review items","dead-letter":"Failed","upload-required":"Upload required","storage-unavailable":"Storage unavailable","recovery-required":"Recovery pending"},o_={"gpo-inventory-memory-limit":"Speichergrenze des isolierten Analyse-Workers überschritten","gpo-inventory-time-limit":"Time limit of the isolated analysis worker exceeded","gpo-inventory-source-size-limit":"GPO package exceeds the allowed input size","gpo-analysis-reference-missing":"Stored analysis source is not available","gpo-analysis-persistence-invalid":"Analysis result could not be saved safely"};function c_(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function U3(e){return new Intl.DateTimeFormat("en-US",{dateStyle:"short",timeStyle:"medium"}).format(new Date(e))}async function z3(e){R6(e.map(a=>({relativePath:a.relativePath,sizeBytes:a.file.size})));const n=(await Promise.all(e.map(async({file:a,relativePath:i})=>{try{const r=new Uint8Array(await a.arrayBuffer());return r.byteLength!==a.size?void 0:{relativePath:i,sizeBytes:a.size,readBytes:async()=>r}}catch{return}}))).filter(a=>a!==void 0);return{sources:n,unreadableEntries:e.length-n.length}}async function l_(e){const t=[];let n=0;const a=async(i,r)=>{try{for await(const c of i.values()){const l=`${r}/${c.name}`;if(c.kind==="directory")await a(c,l);else try{t.push({file:await c.getFile(),relativePath:l})}catch{n+=1}}}catch{n+=1}};return await a(e,e.name),{files:t,unreadableEntries:n}}function xm({restoreArtifactId:e,disabled:t=!1,projectId:n,assessmentId:a,showStatus:i=!0,label:r="Import GPO Folder",archiveLabel:c="Import GPO ZIP"}){const l=H.useRef(null),f=H.useRef(null),[T,p]=H.useState(!1),[m,g]=H.useState(null),[S,x]=H.useState([]),[y,w]=H.useState(),[C,k]=H.useState(),[E,O]=H.useState(),[N,B]=H.useState(),A=H.useCallback(async()=>{try{const X=await tu.listProjectGpoBackupStatus(n);x(X.records),w(void 0)}catch(X){w(X instanceof Error?X.message:"The GPO status could not be loaded.")}},[n]);H.useEffect(()=>{const X=l.current;X&&(X.setAttribute("webkitdirectory",""),X.setAttribute("directory",""))},[]),H.useEffect(()=>{if(!i)return;A();const X=F=>{F instanceof CustomEvent&&F.detail?.projectId&&F.detail.projectId!==n||A()};return globalThis.addEventListener("focus",X),globalThis.addEventListener("assessor:gpo-changed",X),()=>{globalThis.removeEventListener("focus",X),globalThis.removeEventListener("assessor:gpo-changed",X)}},[A,n,i]);const z=S.some(X=>X.state==="queued"||X.state==="running");H.useEffect(()=>{if(!E&&!(i&&z))return;const X=globalThis.setInterval(()=>{A()},2e3);return()=>globalThis.clearInterval(X)},[z,A,E,i]),H.useEffect(()=>{if(!E)return;const X=S.find(F=>F.artifactId===E.artifactId&&F.jobId===E.jobId);X&&!["queued","running"].includes(X.state)&&(O(void 0),B(void 0))},[E,S]);const P=async X=>{k(X.artifactId),B("Starting GPO processing"),g(null);try{const F=await tu.retryGpoBackup(n,X.artifactId);O({artifactId:F.artifactId,jobId:F.jobId}),B("Processing GPO backup"),g({tone:"success",message:"The GPO analysis job was requeued."}),await A()}catch(F){B(void 0),g({tone:"error",message:F instanceof Error?F.message:"The GPO analysis job could not be restarted."})}finally{k(void 0)}},K=async X=>{if(globalThis.confirm(`Permanently delete the failed GPO import "${X.fileName}" from ASSESSOR? The source files on your machine remain unchanged.`)){k(X.artifactId),g(null);try{const F=await tu.deleteGpoBackup(n,X.artifactId);g({tone:"success",message:F.storageRemoval==="complete"?"Failed GPO import and its stored package copy were deleted.":"The database entry was deleted; the package copy is in the secure deletion queue."}),await A()}catch(F){g({tone:"error",message:F instanceof Error?F.message:"The failed GPO import could not be deleted."})}finally{k(void 0)}}},I=async(X,F)=>{B("Uploading GPO backup");const re=await tu.submitGpoBackup(n,X,a,e);O({artifactId:re.artifactId,jobId:re.jobId}),B("Processing GPO backup"),g({tone:"success",message:re.sourceRestored||e?"Original GPO source restored. Saved results are preserved.":F(re.deduplicated)}),globalThis.dispatchEvent(new CustomEvent("assessor:gpo-changed",{detail:{projectId:n,jobId:re.jobId}})),await A()},L=async X=>{p(!0),B("Preparing GPO backup"),g(null);try{if(X.some(Ce=>!Ce.webkitRelativePath))throw new Error("Please select a complete GPO backup folder.");const F=await z3(X.map(Ce=>({file:Ce,relativePath:Ce.webkitRelativePath})));if(!F.sources.length)throw new Error("Keine Datei des ausgewaehlten GPO-Ordners konnte gelesen werden.");const re=await B3(F.sources),me=new Uint8Array(re.bytes.byteLength);me.set(re.bytes);const te=new File([me.buffer],re.fileName,{type:"application/zip"});await I(te,Ce=>Ce?`GPO backup folder already exists · analysis job confirmed (${re.fileCount} files${F.unreadableEntries?`; ${F.unreadableEntries} unreadable skipped`:""}).`:`GPO backup folder accepted · analysis job queued (${re.fileCount} files${F.unreadableEntries?`; ${F.unreadableEntries} unreadable skipped`:""}).`)}catch(F){B(void 0),g({tone:"error",message:F instanceof Error?F.message:"GPO backup folder could not be imported."})}finally{p(!1)}},le=async()=>{const X=globalThis.showDirectoryPicker;if(!X){l.current?.click();return}p(!0),B("Preparing GPO backup"),g(null);try{const F=await X({mode:"read"}),re=await l_(F);if(!re.files.length)throw new Error("Keine Datei des ausgewaehlten GPO-Backupordners konnte gelesen werden.");const me=await z3(re.files),te=re.unreadableEntries+me.unreadableEntries;if(!me.sources.length)throw new Error("Keine Datei des ausgewaehlten GPO-Backupordners konnte gelesen werden.");const Ce=await B3(me.sources),ee=new Uint8Array(Ce.bytes.byteLength);ee.set(Ce.bytes);const M=new File([ee.buffer],Ce.fileName,{type:"application/zip"});await I(M,Y=>Y?`GPO backup folder already exists · analysis job confirmed (${Ce.fileCount} files${te?`; ${te} unreadable skipped`:""}).`:`GPO backup folder accepted · analysis job queued (${Ce.fileCount} files${te?`; ${te} unreadable skipped`:""}).`)}catch(F){if(F instanceof DOMException&&F.name==="AbortError"){B(void 0);return}B(void 0),g({tone:"error",message:F instanceof Error?F.message:"GPO backup folder could not be imported."})}finally{p(!1)}},ue=async X=>{p(!0),B("Uploading GPO backup"),g(null);try{if(!X.name.toLocaleLowerCase("en-US").endsWith(".zip"))throw new Error("Please select a ZIP file containing a GPO backup.");await I(X,F=>F?"GPO backup ZIP already exists · analysis job confirmed.":"GPO backup ZIP accepted · analysis job queued.")}catch(F){B(void 0),g({tone:"error",message:F instanceof Error?F.message:"GPO backup ZIP could not be imported."})}finally{p(!1)}};return d.jsxs(d.Fragment,{children:[d.jsxs("span",{className:`gpo-folder-actions${e?" gpo-source-recovery":""}`,children:[d.jsx("input",{ref:l,className:"hidden-input",type:"file",multiple:!0,onChange:X=>{const F=X.currentTarget,re=Array.from(F.files??[]);re.length&&L(re).finally(()=>{F.value=""})}}),d.jsx("input",{ref:f,className:"hidden-input",type:"file",accept:".zip,application/zip",onChange:X=>{const F=X.currentTarget,re=F.files?.[0];re&&ue(re).finally(()=>{F.value=""})}}),d.jsx("button",{className:"btn primary",type:"button",disabled:T||t,onClick:()=>{le()},children:T?"Checking GPO …":r}),d.jsx("button",{className:"btn primary",type:"button",disabled:T||t,onClick:()=>f.current?.click(),children:T?"Checking GPO …":c}),m&&d.jsx("span",{className:`gpo-folder-feedback ${m.tone}`,role:m.tone==="error"?"alert":"status",children:m.message})]}),i&&d.jsxs("section",{className:"gpo-status-panel","aria-label":"GPO processing status","aria-live":"polite",children:[d.jsxs("div",{className:"gpo-status-heading",children:[d.jsx("strong",{children:"GPO Processing"}),d.jsx("button",{className:"btn compact",type:"button",onClick:()=>{A()},children:"Refresh"})]}),y&&d.jsx("p",{className:"gpo-folder-feedback error",role:"alert",children:y}),!y&&S.length===0&&d.jsx("p",{className:"gpo-status-empty",children:"No tenant GPO backup snapshots for this client yet."}),S.length>0&&d.jsx("div",{className:"gpo-status-list",children:S.map(X=>d.jsxs("article",{className:`gpo-status-item state-${X.state}`,children:[d.jsxs("div",{children:[d.jsx("strong",{children:X.fileName}),d.jsxs("span",{children:[c_(X.sizeBytes)," · Received ",U3(X.submittedAt)]})]}),d.jsxs("div",{className:"gpo-status-result",children:[d.jsx("strong",{children:r_[X.state]}),X.state==="storage-unavailable"&&d.jsx("span",{children:E6}),X.state==="upload-required"&&d.jsxs(d.Fragment,{children:[d.jsx("span",{children:C6}),d.jsx(xm,{projectId:n,assessmentId:X.assessmentId,restoreArtifactId:X.artifactId,showStatus:!1,label:"Upload original folder",archiveLabel:"Upload original ZIP"})]}),d.jsxs("span",{children:["Attempt ",X.attempts,"/",X.maxAttempts," · updated ",U3(X.updatedAt)]}),X.gpoCount>0&&d.jsxs("span",{children:["1 tenant GPO backup · ",X.gpoCount," GPO",X.gpoCount===1?"":"s"," detected"]}),X.lastErrorCode&&d.jsxs("span",{className:"gpo-status-error",children:["Last error: ",o_[X.lastErrorCode]??"Technical analysis error"," ",d.jsx("code",{children:X.lastErrorCode})]}),X.state==="dead-letter"&&d.jsxs("div",{className:"gpo-status-actions",children:[d.jsx("button",{className:"btn compact",type:"button",disabled:C===X.artifactId,onClick:()=>{P(X)},children:"Retry"}),d.jsx("button",{className:"btn compact danger",type:"button",disabled:C===X.artifactId,onClick:()=>{K(X)},children:"Delete Import"})]})]})]},X.artifactId))})]}),d.jsx(xd,{label:N})]})}const u_={queued:"Queued",running:"Processing",succeeded:"Ready",partial:"Limited analysis","dead-letter":"Failed","recovery-required":"Recovery pending","upload-required":"Upload required","storage-unavailable":"Storage unavailable"};function d_(e){const t=new Set(e.flatMap(a=>a.reasons??["engine-version"]));return[...t.has("engine-version")?[`Engine ${[...new Set(e.map(a=>`${a.previousVersion} → ${a.currentVersion}`))].join(", ")}`]:[],...t.has("baseline-analysis")?["Updated Microsoft baseline analysis"]:[]].join(" · ")}function T_({projectId:e,record:t,imported:n,busy:a,onEvaluate:i,onReprocess:r,onRetry:c,onDelete:l}){const f=["queued","running"].includes(t.jobStatus??t.state),T=t.state==="upload-required"||t.state==="storage-unavailable",p=["dead-letter","recovery-required"].includes(t.state)||T,m=t.analysisUpdate,g=!!t.evaluationUpdates?.length||!!m,S=m?`Analyzer ${m.previousAnalyzerVersion} → ${m.currentAnalyzerVersion}`:d_(t.evaluationUpdates??[]);return d.jsxs("div",{className:"tenant-report-row tenant-report-gpo",role:"row",children:[d.jsx("span",{className:"tenant-gpo-source-marker","aria-label":"Policy analysis source",children:"G"}),d.jsxs("span",{className:"tenant-report-copy",children:[d.jsx("b",{children:"GPO Backup"}),d.jsxs("small",{children:[t.fileName," · ",t.gpoCount.toLocaleString("en-US")," GPO",t.gpoCount===1?"":"s"]}),T&&d.jsx("small",{role:"status",children:t.state==="upload-required"?C6:E6}),T&&g&&!m&&d.jsxs("small",{role:"status",children:["Re-evaluation required · ",S,". Retained inputs can still be re-evaluated."]}),g&&!T&&d.jsxs("small",{role:"status",children:[m?"Reprocessing required":"Re-evaluation required"," · ",S,". Saved results are historical. ",m?"Reprocess the stored source":"Re-evaluate retained inputs","; no file upload is required for this update."]})]}),d.jsx("span",{className:"tenant-report-imported",children:n}),d.jsx("b",{className:"tenant-report-status","data-status":g&&!f&&!p?"re-evaluation-required":t.state,children:g&&!f&&!p?m?"Reprocessing required":"Re-evaluation required":u_[t.state]}),d.jsxs("span",{className:"tenant-gpo-row-actions",children:[t.state==="upload-required"&&d.jsx(xm,{projectId:e,assessmentId:t.assessmentId,restoreArtifactId:t.artifactId,showStatus:!1,disabled:a,label:"Upload original folder",archiveLabel:"Upload original ZIP"}),m?!T&&d.jsx("button",{className:"btn compact",type:"button",disabled:a||f||p,onClick:r,children:"Reprocess"}):g&&d.jsx("button",{className:"btn compact",type:"button",disabled:a||f||p&&!T,onClick:i,children:"Re-evaluate"}),t.state==="dead-letter"&&d.jsx("button",{className:"btn compact",type:"button",disabled:a,onClick:c,children:"Retry"}),d.jsx("button",{className:"btn compact danger",type:"button",disabled:a||f,onClick:l,children:"Delete"})]})]})}const Ec=new qi,W3=()=>({productFamily:"",productVersion:"",role:"",scope:"computer"}),V3=()=>({name:"",domainKey:"",supersedesProfileId:"",operatingSystem:W3(),includeProduct:!1,product:W3()});function H3(e,t){return[e,t.productFamily,t.productVersion,t.role,t.scope].map(n=>n.trim().toLocaleLowerCase("en-US").replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")).join(":")}function G3(e){return e.length>22?`${e.slice(0,10)}…${e.slice(-8)}`:e}function ph(e){return e==="completed"?"Completed":e==="blocked"?"Blocked":e==="review-only"?"Run as review-only":"Run"}function nu({codes:e}){return e.length?d.jsx("span",{className:"policy-action-reasons",children:e.map(t=>d.jsx("code",{children:t},t))}):null}function f_({projectId:e,overview:t,onChanged:n}){const[a,i]=H.useState(V3),[r,c]=H.useState(),[l,f]=H.useState(),[T,p]=H.useState(),m=new Map(t.profiles.map(C=>[C.id,C])),g=async(C,k,E,O)=>{c(C),f(O),p(void 0);try{return await k(),p({tone:"success",message:E}),await n(),!0}catch(N){return p({tone:"error",message:N instanceof Error?N.message:"The policy action failed."}),!1}finally{c(void 0),f(void 0)}},S=async C=>{C.preventDefault();const k=a.operatingSystem,E=[{id:H3("operating-system",k),kind:"operating-system",productFamily:k.productFamily.trim(),productVersion:k.productVersion.trim(),role:k.role.trim(),scope:k.scope}];if(a.includeProduct){const N=a.product;E.push({id:H3("product",N),kind:"product",productFamily:N.productFamily.trim(),productVersion:N.productVersion.trim(),role:N.role.trim(),scope:N.scope})}await g("create-profile",()=>Ec.createEnvironmentProfile(e,{name:a.name.trim(),domainKey:a.domainKey.trim()||void 0,supersedesProfileId:a.supersedesProfileId||void 0,contexts:E}),"Environment profile persisted.","Saving profile")&&i(V3())},x=(C,k)=>{i(E=>({...E,[C]:{...E[C],...k}}))},y=a.name.trim()&&a.operatingSystem.productFamily.trim()&&a.operatingSystem.productVersion.trim()&&a.operatingSystem.role.trim(),w=!a.includeProduct||a.product.productFamily.trim()&&a.product.productVersion.trim()&&a.product.role.trim();return d.jsxs("section",{className:"policy-orchestration","aria-label":"Policy analysis orchestration",children:[d.jsxs("div",{className:"datahub-section-heading",children:[d.jsxs("div",{children:[d.jsx("span",{children:"Analysis Workflow"}),d.jsx("h3",{children:"Profiles and Runs"})]}),d.jsx("strong",{children:t.profiles.length})]}),d.jsx("p",{className:"policy-analysis-muted",children:"Only actions derived from persisted project and catalog evidence are offered. Review-only runs remain ineligible for findings unless every downstream invariant is satisfied."}),T&&d.jsxs("div",{className:`tenant-save-feedback ${T.tone}`,role:T.tone==="error"?"alert":"status",children:[d.jsx("span",{"aria-hidden":"true",children:T.tone==="success"?"✓":"!"}),d.jsx("strong",{children:T.message})]}),d.jsxs("details",{className:"policy-profile-editor",children:[d.jsx("summary",{children:"Create Environment Profile"}),d.jsxs("form",{onSubmit:C=>{S(C)},children:[d.jsxs("label",{children:["Profile name",d.jsx("input",{className:"input",required:!0,maxLength:160,value:a.name,onChange:C=>i(k=>({...k,name:C.target.value}))})]}),d.jsxs("label",{children:["Domain key ",d.jsx("span",{children:"optional"}),d.jsx("input",{className:"input",maxLength:255,value:a.domainKey,onChange:C=>i(k=>({...k,domainKey:C.target.value}))})]}),d.jsxs("label",{children:["Supersedes ",d.jsx("span",{children:"optional"}),d.jsxs("select",{className:"input",value:a.supersedesProfileId,onChange:C=>i(k=>({...k,supersedesProfileId:C.target.value})),children:[d.jsx("option",{value:"",children:"New profile chain"}),t.profiles.filter(C=>C.active).map(C=>d.jsxs("option",{value:C.id,children:[C.name," · revision ",C.revision]},C.id))]})]}),d.jsxs("fieldset",{children:[d.jsx("legend",{children:"Operating system context"}),d.jsxs("label",{children:["Product family",d.jsx("input",{className:"input",required:!0,maxLength:160,placeholder:"Windows Server",value:a.operatingSystem.productFamily,onChange:C=>x("operatingSystem",{productFamily:C.target.value})})]}),d.jsxs("label",{children:["Version",d.jsx("input",{className:"input",required:!0,maxLength:80,placeholder:"2025",value:a.operatingSystem.productVersion,onChange:C=>x("operatingSystem",{productVersion:C.target.value})})]}),d.jsxs("label",{children:["Role",d.jsx("input",{className:"input",required:!0,maxLength:120,placeholder:"Member Server",value:a.operatingSystem.role,onChange:C=>x("operatingSystem",{role:C.target.value})})]}),d.jsxs("label",{children:["Scope",d.jsxs("select",{className:"input",value:a.operatingSystem.scope,onChange:C=>x("operatingSystem",{scope:C.target.value}),children:[d.jsx("option",{value:"computer",children:"Computer"}),d.jsx("option",{value:"user",children:"User"}),d.jsx("option",{value:"mixed",children:"Mixed"})]})]})]}),d.jsxs("label",{className:"policy-profile-product-toggle",children:[d.jsx("input",{type:"checkbox",checked:a.includeProduct,onChange:C=>i(k=>({...k,includeProduct:C.target.checked}))})," Add product context"]}),a.includeProduct&&d.jsxs("fieldset",{children:[d.jsx("legend",{children:"Product context"}),d.jsxs("label",{children:["Product family",d.jsx("input",{className:"input",required:!0,maxLength:160,placeholder:"Microsoft Edge",value:a.product.productFamily,onChange:C=>x("product",{productFamily:C.target.value})})]}),d.jsxs("label",{children:["Version",d.jsx("input",{className:"input",required:!0,maxLength:80,value:a.product.productVersion,onChange:C=>x("product",{productVersion:C.target.value})})]}),d.jsxs("label",{children:["Role",d.jsx("input",{className:"input",required:!0,maxLength:120,placeholder:"Any",value:a.product.role,onChange:C=>x("product",{role:C.target.value})})]}),d.jsxs("label",{children:["Scope",d.jsxs("select",{className:"input",value:a.product.scope,onChange:C=>x("product",{scope:C.target.value}),children:[d.jsx("option",{value:"computer",children:"Computer"}),d.jsx("option",{value:"user",children:"User"}),d.jsx("option",{value:"mixed",children:"Mixed"})]})]})]}),d.jsx("footer",{children:d.jsx("button",{className:"btn primary",type:"submit",disabled:r!==void 0||!y||!w,children:r==="create-profile"?"Saving …":"Create Profile"})})]})]}),d.jsxs("div",{className:"policy-action-stages",children:[d.jsxs("section",{children:[d.jsx("h4",{children:"Reprocessing"}),t.actions.reprocess.length?t.actions.reprocess.slice(0,20).map(C=>d.jsxs("article",{children:[d.jsxs("div",{children:[d.jsx("strong",{children:"GPO source"}),d.jsx("code",{title:C.artifactId,children:G3(C.artifactId)}),d.jsx(nu,{codes:C.reasonCodes})]}),d.jsx("button",{className:"btn compact",type:"button",disabled:r!==void 0||C.status==="blocked",onClick:()=>{g(C.id,()=>Ec.reprocessGpoBackup(e,C.artifactId,C.expectedLatestProcessingRunId),"GPO reprocessing queued.","Starting GPO processing")},children:r===C.id?"Queuing …":C.status==="blocked"?"Blocked":"Reprocess"})]},C.id)):d.jsx("p",{children:"No processed GPO source available."})]}),d.jsxs("section",{children:[d.jsx("h4",{children:"Snapshot aggregation"}),t.actions.aggregate.length?t.actions.aggregate.slice(0,20).map(C=>d.jsxs("article",{children:[d.jsxs("div",{children:[d.jsx("strong",{children:m.get(C.environmentProfileId)?.name??"Environment profile"}),d.jsxs("span",{children:[C.sourceAnalysisRunIds.length," identity run"]}),d.jsx(nu,{codes:C.reasonCodes})]}),d.jsx("button",{className:"btn compact",type:"button",disabled:r!==void 0||["completed","blocked"].includes(C.status),onClick:()=>{g(C.id,()=>Ec.aggregatePolicySnapshot(e,{environmentProfileId:C.environmentProfileId,sourceAnalysisRunIds:C.sourceAnalysisRunIds}),"Snapshot aggregation persisted.","Calculating snapshot")},children:r===C.id?"Running …":ph(C.status)})]},C.id)):d.jsx("p",{children:"Create a profile and process a GPO backup first."})]}),d.jsxs("section",{children:[d.jsx("h4",{children:"Baseline evaluation"}),t.actions.evaluate.length?t.actions.evaluate.slice(0,20).map(C=>d.jsxs("article",{children:[d.jsxs("div",{children:[d.jsx("strong",{children:m.get(C.environmentProfileId)?.name??"Environment profile"}),d.jsxs("span",{children:[C.baselineAnalysisIds.length," baseline analysis source",C.baselineAnalysisIds.length===1?"":"s"]}),d.jsx(nu,{codes:C.reasonCodes})]}),d.jsx("button",{className:"btn compact",type:"button",disabled:r!==void 0||["completed","blocked"].includes(C.status),onClick:()=>{g(C.id,()=>Ec.evaluatePolicy(e,{aggregationRunId:C.aggregationRunId,baselineAnalysisIds:C.baselineAnalysisIds}),"Policy evaluation persisted.","Evaluating baseline")},children:r===C.id?"Running …":ph(C.status)})]},C.id)):d.jsx("p",{children:"No snapshot aggregation available."})]}),d.jsxs("section",{children:[d.jsx("h4",{children:"Finding Factory"}),t.actions.createFindings.length?t.actions.createFindings.slice(0,20).map(C=>d.jsxs("article",{children:[d.jsxs("div",{children:[d.jsxs("strong",{children:[C.eligibleResultCount," eligible result",C.eligibleResultCount===1?"":"s"]}),d.jsx("code",{title:C.evaluationRunId,children:G3(C.evaluationRunId)}),d.jsx(nu,{codes:C.reasonCodes})]}),d.jsx("button",{className:"btn compact",type:"button",disabled:r!==void 0||["completed","blocked"].includes(C.status),onClick:()=>{g(C.id,()=>Ec.createPolicyFindingRun(e,{evaluationRunId:C.evaluationRunId}),"Finding Factory run persisted.","Creating findings")},children:r===C.id?"Running …":ph(C.status)})]},C.id)):d.jsx("p",{children:"No policy evaluation available."})]})]}),d.jsx(xd,{label:l})]})}function Ao({message:e,compact:t=!1}){return d.jsx("div",{className:`panel-loading-state${t?" is-compact":""}`,role:"status","aria-live":"polite","aria-label":e,children:d.jsx("div",{className:"panel-loading-state-content",children:d.jsxs("div",{className:"panel-loading-state-message",children:[d.jsx(b6,{}),d.jsx("span",{children:e})]})})})}const mh=new qi,h_={conflict:"Conflict","unresolved-identity":"Unresolved setting","catalog-gap":"Baseline mapping unavailable","parser-gap":"Unsupported setting format","partial-analysis":"Evaluation incomplete","targeting-unknown":"Targeting not resolved","incomplete-evidence":"Source evidence incomplete",other:"Review required"};function p_(e){return new Intl.DateTimeFormat("en-US",{dateStyle:"short",timeStyle:"medium"}).format(new Date(e))}function m_({item:e}){return d.jsxs("details",{className:`policy-review-item category-${e.category}`,children:[d.jsxs("summary",{children:[d.jsx("strong",{children:h_[e.category]}),d.jsxs("span",{children:[e.observationCount," observation",e.observationCount===1?"":"s"," · ",e.backupCount," GPO source",e.backupCount===1?"":"s"]})]}),d.jsxs("div",{className:"policy-review-detail",children:[d.jsxs("span",{children:["Source: ",e.source]}),e.identityId&&d.jsxs("span",{children:["Technical identity: ",d.jsx("code",{children:e.identityId})]}),d.jsxs("span",{children:["Diagnostic",e.codes.length===1?"":"s",": ",e.codes.map(t=>d.jsx("code",{children:t},t))]})]})]})}function g_({overview:e,counts:t,impact:n}){const a=e.current.reviewItems.slice(0,100),i=e.current.summary,r=new Map(e.profiles.map(l=>[l.id,l])),c=e.summary.identityAnalysisRuns>0||e.summary.aggregationRuns>0||e.summary.evaluationRuns>0||e.summary.findingRuns>0;return d.jsxs("section",{className:"policy-analysis-panel","aria-label":"Policy analysis results",children:[d.jsx("div",{className:"datahub-section-heading",children:d.jsxs("div",{children:[d.jsx("span",{children:"GPO Analysis"}),d.jsx("h3",{children:"Baseline Evaluation"})]})}),d.jsx("p",{className:"policy-analysis-boundary",role:"note",children:"Backup settings are compared with the imported Microsoft Security Baselines. Effective application requires RSoP or GP Results."}),c?d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"policy-analysis-result-groups",children:[d.jsxs("section",{className:"policy-analysis-result-group","aria-labelledby":"gpo-import-summary",children:[d.jsx("h4",{id:"gpo-import-summary",children:"Processing"}),d.jsxs("div",{className:"policy-analysis-summary",children:[d.jsxs("article",{children:[d.jsx("span",{children:"Analysis runs"}),d.jsx("strong",{children:i.identityAnalysisRuns})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Evaluation runs"}),d.jsx("strong",{children:i.evaluationRuns})]}),d.jsxs("article",{children:[d.jsx("span",{children:"GPO backups with failing settings"}),d.jsx("strong",{children:n?.backups??"–"}),d.jsx("small",{children:"Inspect source-linked comparisons with the same-named filter in Work."})]})]})]}),d.jsxs("section",{className:"policy-analysis-result-group","aria-labelledby":"gpo-result-summary",children:[d.jsx("h4",{id:"gpo-result-summary",children:"Policy verdicts"}),d.jsx("p",{className:"policy-analysis-muted",children:"One verdict per technical policy setting."}),d.jsxs("div",{className:"policy-analysis-summary",children:[d.jsxs("article",{"data-result":"fail",children:[d.jsx("span",{children:"Misconfigured"}),d.jsx("strong",{children:t?.Fail??"–"})]}),d.jsxs("article",{"data-result":"pass",children:[d.jsx("span",{children:"Pass"}),d.jsx("strong",{children:t?.Pass??"–"})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Not configured"}),d.jsx("strong",{children:t?.["Not configured"]??"–"})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Review required"}),d.jsx("strong",{children:t?.["Review required"]??"–"})]}),d.jsxs("article",{children:[d.jsx("span",{children:"No baseline rule"}),d.jsx("strong",{children:t?.["No baseline rule"]??"–"}),d.jsx("small",{children:"Configured settings with no applicable Microsoft baseline recommendation. Score-neutral."})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Not comparable"}),d.jsx("strong",{children:t?.["Not comparable"]??"–"}),d.jsx("small",{children:"Group Policy Preferences. No comparable technical policy setting. Score-neutral."})]})]})]}),d.jsxs("section",{className:"policy-analysis-result-group","aria-labelledby":"gpo-diagnostic-summary",children:[d.jsx("h4",{id:"gpo-diagnostic-summary",children:"Diagnostic flags"}),d.jsx("p",{className:"policy-analysis-muted",children:"May overlap with each other and with policy verdicts. Score-neutral."}),d.jsxs("div",{className:"policy-analysis-summary policy-analysis-problems",children:[d.jsxs("article",{children:[d.jsx("span",{children:"Conflicts"}),d.jsx("strong",{children:t?.Conflicts??"–"}),d.jsx("small",{children:"Different customer values for one technical setting."})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Duplicates"}),d.jsx("strong",{children:t?.Duplicates??"–"}),d.jsx("small",{children:"Identical values from multiple GPO sources."})]})]})]}),d.jsxs("section",{className:"policy-analysis-result-group","aria-labelledby":"gpo-gap-summary",children:[d.jsx("h4",{id:"gpo-gap-summary",children:"Analysis gaps"}),d.jsx("p",{className:"policy-analysis-muted",children:"Observation-level diagnostics. No score impact."}),d.jsxs("div",{className:"policy-analysis-summary policy-analysis-problems",children:[d.jsxs("article",{children:[d.jsx("span",{children:"Unresolved identity"}),d.jsx("strong",{children:i.unresolvedIdentities}),d.jsx("small",{children:"Observations that could not be mapped to one technical policy setting. Their settings appear in Work as Not comparable."})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Comparison not supported"}),d.jsx("strong",{children:i.parserGaps}),d.jsx("small",{children:"The retained value cannot yet be compared safely; the setting stays under Review required."})]})]})]})]}),d.jsxs("details",{className:"policy-analysis-technical",children:[d.jsx("summary",{children:"Technical details"}),d.jsxs("div",{className:"policy-analysis-columns",children:[d.jsxs("section",{children:[d.jsxs("div",{className:"policy-analysis-subheading",children:[d.jsx("h4",{children:"Evaluation history"}),d.jsx("span",{children:e.evaluations.length})]}),e.evaluations.length?d.jsx("div",{className:"policy-evaluation-list",children:e.evaluations.map(l=>d.jsxs("article",{children:[d.jsxs("header",{children:[d.jsxs("strong",{children:[r.get(l.environmentProfileId)?.name??"Environment profile"," · ",l.status==="complete"?"complete":l.status]}),d.jsx("span",{children:p_(l.completedAt)})]}),d.jsxs("div",{children:[d.jsxs("span",{children:[l.matchCount," matches"]}),d.jsxs("span",{children:[l.deviationCount," stored mismatches (including missing settings)"]}),d.jsxs("span",{children:[l.notApplicableCount," not applicable"]}),d.jsxs("span",{children:[l.reviewCount," review required"]})]}),d.jsxs("footer",{children:[d.jsxs("strong",{children:[l.findingCount," confirmed finding",l.findingCount===1?"":"s"]}),l.rejectedFindingCount>0&&d.jsxs("span",{children:[l.rejectedFindingCount," factory rejection",l.rejectedFindingCount===1?"":"s"]})]})]},l.evaluationRunId))}):d.jsx("p",{className:"policy-analysis-muted",children:"No baseline evaluation has been persisted yet."})]}),d.jsxs("section",{children:[d.jsxs("div",{className:"policy-analysis-subheading",children:[d.jsx("h4",{children:"Current review queue"}),d.jsx("span",{children:e.current.reviewItems.length})]}),a.length?d.jsx("div",{className:"policy-review-list",children:a.map(l=>d.jsx(m_,{item:l},l.id))}):d.jsx("p",{className:"policy-analysis-muted",children:"No conflicts or unresolved evidence in the persisted runs."}),e.current.reviewItems.length>a.length&&d.jsx("p",{className:"policy-analysis-muted",children:"Showing the first 100 deterministic review hints."})]})]})]})]}):d.jsxs("div",{className:"datahub-empty policy-analysis-empty",children:[d.jsx("h3",{children:"No policy analysis runs yet"}),d.jsx("p",{children:"Imported GPO backups remain processing evidence until snapshot aggregation and baseline evaluation have run."})]})]})}function v_({projectId:e}){const[t,n]=H.useState(),[a,i]=H.useState(),[r,c]=H.useState(),[l,f]=H.useState(),[T,p]=H.useState(!0),m=H.useCallback(async()=>{try{const[g,S,x]=await Promise.all([mh.getPolicyAnalysisOverview(e),dm(C=>mh.queryUnifiedResults(C),{audience:"internal-analysis",projectId:e,sourceKind:["policy-observation"]}),mh.listPolicyEvaluations(e)]);n(g);const y=new Set(g.current.evaluationRunIds),w=zb(S,e6(x.records,new Set(S.map(C=>C.sourceResultId)),y));i(gL(w)),c(vL(w)),f(void 0)}catch(g){i(void 0),c(void 0),f(g instanceof Error?g.message:"Policy analysis could not be loaded.")}finally{p(!1)}},[e]);return H.useEffect(()=>{m();const g=S=>{S instanceof CustomEvent&&S.detail?.projectId&&S.detail.projectId!==e||m()};return globalThis.addEventListener("assessor:gpo-changed",g),globalThis.addEventListener("focus",g),()=>{globalThis.removeEventListener("assessor:gpo-changed",g),globalThis.removeEventListener("focus",g)}},[m,e]),T&&!t?d.jsx("section",{className:"policy-analysis-panel",children:d.jsx(Ao,{message:"Loading policy analysis …",compact:!0})}):l&&!t?d.jsx("section",{className:"policy-analysis-panel",children:d.jsxs("div",{className:"datahub-alert",role:"alert",children:[d.jsx("span",{children:l}),d.jsx("button",{className:"btn",type:"button",onClick:()=>{m()},children:"Reload"})]})}):t?d.jsxs(d.Fragment,{children:[l&&d.jsx("div",{className:"datahub-alert",role:"alert",children:"Analysis could not be refreshed."}),d.jsx(g_,{overview:t,counts:a,impact:r}),d.jsxs("details",{className:"policy-analysis-controls",children:[d.jsx("summary",{children:"Processing controls"}),d.jsx(f_,{projectId:e,overview:t,onChanged:async()=>{await m(),globalThis.dispatchEvent(new CustomEvent("assessor:gpo-changed",{detail:{projectId:e}}))}})]})]}):null}function ym({backendStatus:e,message:t}){const[n,a]=H.useState(!0);if(!n)return null;const i=e==="checking"?"Checking server connection":"Backend is unreachable";return d.jsx(Ua,{title:i,onClose:()=>a(!1),className:"backend-connection-dialog",children:d.jsxs("div",{className:"backend-connection-dialog__content",role:"status","aria-live":"polite",children:[d.jsx("div",{className:"backend-connection-dialog__icon","aria-hidden":"true",children:"!"}),d.jsxs("div",{children:[d.jsx("p",{children:t}),d.jsx("p",{className:"backend-connection-dialog__hint",children:"The connection is checked automatically."})]})]})})}function vn({direction:e="left",className:t=""}){const n=`triangle-icon triangle-icon-${e}${t?` ${t}`:""}`;return d.jsx("svg",{className:n,viewBox:"0 0 12 12","aria-hidden":"true",focusable:"false",children:d.jsx("path",{d:"M9.5 1.5 2.5 6l7 4.5z"})})}const gh=new qi;function x_(e){return e<1024*1024?`${(e/1024).toLocaleString("de-DE",{maximumFractionDigits:1})} KB`:`${(e/1024/1024).toLocaleString("de-DE",{maximumFractionDigits:1})} MB`}function y_(e){const t=new Date(e);return Number.isNaN(t.getTime())?"—":new Intl.DateTimeFormat("en-US",{dateStyle:"short",timeStyle:"medium"}).format(t)}function S_(){const e=H.useRef(null),[t,n]=H.useState([]),[a,i]=H.useState(!1),[r,c]=H.useState(),[l,f]=H.useState(null),[T,p]=H.useState(null),[m,g]=H.useState(null),S=H.useCallback(async()=>{try{n((await gh.listMicrosoftSecurityBaselines()).records)}catch(w){g(w instanceof Error?w.message:"Baseline-Katalog konnte nicht geladen werden.")}},[]);H.useEffect(()=>{S()},[S]);const x=async w=>{i(!0),g(null),p(null);try{const C=Array.from(w);for(const[k,E]of C.entries())c(`Importing baseline ${k+1} of ${C.length}`),await gh.submitMicrosoftSecurityBaseline(E);await S(),p(`${w.length} Baseline-Paket${w.length===1?"":"e"} im Katalog gespeichert.`)}catch(C){g(C instanceof Error?C.message:"Baseline-Upload fehlgeschlagen.")}finally{i(!1),c(void 0)}},y=async()=>{if(l){i(!0),g(null),p(null);try{const w=await gh.deleteMicrosoftSecurityBaseline(l.id);f(null),await S(),p(`${w.record.fileName} was deleted from the baseline catalog.`)}catch(w){g(w instanceof Error?w.message:"Baseline deletion failed.")}finally{i(!1)}}};return d.jsxs(d.Fragment,{children:[d.jsxs("details",{className:"tenant-scan-history baseline-catalog",children:[d.jsxs("summary",{className:"tenant-section-bar",children:[d.jsxs("span",{className:"tenant-history-meta baseline-title",children:[d.jsx("b",{children:t.length.toLocaleString("en-US")}),d.jsx("strong",{children:"Imported Security Baselines"})]}),d.jsxs("span",{className:"tenant-history-meta",children:[d.jsx("button",{className:"btn datahub-maintenance-action baseline-upload-action",type:"button",disabled:a,onClick:w=>{w.preventDefault(),w.stopPropagation(),e.current?.click()},children:a?"Upload in progress …":"Upload Security Baselines (ZIP)"}),d.jsx(vn,{direction:"right"})]})]}),d.jsx("input",{ref:e,className:"hidden-input",type:"file",accept:".zip,application/zip",multiple:!0,onChange:w=>{w.target.files?.length&&x(w.target.files),w.target.value=""}}),T&&d.jsxs("div",{className:"tenant-save-feedback success",role:"status",children:[d.jsx("span",{"aria-hidden":"true",children:"✓"}),d.jsx("strong",{children:T})]}),m&&d.jsx("div",{className:"datahub-alert",role:"alert",children:d.jsx("span",{children:m})}),t.length>0&&d.jsxs("div",{className:"tenant-file-table baseline-table",role:"table","aria-label":"Microsoft security baselines",children:[d.jsxs("div",{className:"tenant-file-row tenant-file-head",role:"row",children:[d.jsx("span",{children:"File"}),d.jsx("span",{children:"Size"}),d.jsx("span",{children:"Imported"}),d.jsx("span",{children:"Status"}),d.jsx("span",{children:"Actions"})]}),t.map(w=>d.jsxs("div",{className:"tenant-file-row",role:"row",children:[d.jsx("span",{"data-label":"File",title:w.fileName,children:w.fileName}),d.jsx("span",{"data-label":"Size",className:"baseline-cell-num",children:x_(w.sizeBytes)}),d.jsx("span",{"data-label":"Imported",className:"baseline-cell-num",children:y_(w.importedAt)}),d.jsx("span",{"data-label":"Status",children:d.jsx("b",{className:"baseline-status","data-status":w.status,title:w.status==="eligible"?"Eligible for automatic package selection":"Excluded until product and version resolve unambiguously",children:w.status==="eligible"?"Eligible":"Metadata required"})}),d.jsx("span",{"data-label":"Actions",children:d.jsx("button",{className:"btn tenant-scan-delete",type:"button",disabled:a,onClick:()=>f(w),children:"Delete"})})]},w.id))]})]}),l&&d.jsx(Ua,{title:"Delete security baseline?",onClose:()=>!a&&f(null),children:d.jsxs("div",{className:"datahub-delete-warning",children:[d.jsx("strong",{children:l.fileName}),d.jsx("p",{children:"Baseline and derived evaluations will be deleted."}),d.jsxs("footer",{children:[d.jsx("button",{className:"btn",type:"button",disabled:a,onClick:()=>f(null),children:"Cancel"}),d.jsx("button",{className:"btn danger",type:"button",disabled:a,onClick:()=>{y()},children:a?"Deleting …":"Delete baseline"})]})]})}),d.jsx(xd,{label:r})]})}function So(e){const t=je(e).toLocaleLowerCase("de-DE");return/critical|kritisch/.test(t)?"critical":/high|hoch/.test(t)?"high":/medium|mittel|warning/.test(t)?"medium":/low|niedrig/.test(t)?"low":/info|informational/.test(t)?"info":"unknown"}function Qc(e){const t=je(e);return/mitre[\s_-]*(?:att&?ck|attack)|(?:att&?ck|attack)[\s_-]*mitre/i.test(t)?"MITRE ATT&CK":/mitre[\s_-]*(?:defen[cs]e|d3fend)|(?:defen[cs]e|d3fend)[\s_-]*mitre/i.test(t)?/d3fend/i.test(t)?"MITRE D3FEND":"MITRE Defense":""}const b_="assessor_custom_mitre_matrix";function w_(e){if(!e||typeof e!="object")throw new Error("Invalid MITRE matrix format: expected a JSON object.");const t=e;if(!Array.isArray(t.tacticOrder)||!t.tacticOrder.length)throw new Error('Invalid MITRE matrix: "tacticOrder" array is missing or empty.');if(!Array.isArray(t.techniques))throw new Error('Invalid MITRE matrix: "techniques" array is missing.');return{version:String(t.version??"Updated"),tacticOrder:t.tacticOrder.map(String),techniques:t.techniques.map(n=>({id:String(n.id),name:String(n.name),tactics:Array.isArray(n.tactics)?n.tactics.map(String):[],platforms:Array.isArray(n.platforms)?n.platforms.map(String):[],parent:n.parent?String(n.parent):null,url:String(n.url??""),sourceCount:Number(n.sourceCount??0)})),entities:Array.isArray(t.entities)?t.entities:[]}}function D6(){try{const e=globalThis.localStorage?.getItem(b_);return e?w_(JSON.parse(e)):null}catch{return null}}const X3=e=>e.trim().toLocaleLowerCase("en-US").replace(/&/g,"and").replace(/[^a-z0-9]+/g," ").trim(),K3=(e,t)=>{const n=e.fields.find(i=>t.test(i.label.trim()))?.value??"",a=Number(n.replace(",",".").match(/-?\d+(?:\.\d+)?/)?.[0]??0);return Number.isFinite(a)?a:0},C_={critical:500,high:400,medium:300,low:200,info:100,unknown:0};function E_(e,t,n="",a){const i=new Map(t.tacticOrder.map(f=>[X3(f),f])),r=new Map(t.techniques.map(f=>[f.id,f])),c=new Map,l=f=>{let T=c.get(f);return T===void 0&&(T=Qc(f),c.set(f,T)),T};return e.map(f=>{const T=f.fields.filter(K=>K.value&&l(K.label)),p=T.filter(K=>l(K.label)==="MITRE ATT&CK"),m=T.filter(K=>l(K.label)!=="MITRE ATT&CK"),g=p.length>0,S=[...new Set(p.flatMap(K=>[...K.value.toUpperCase().matchAll(/\bT\d{4}(?:\.\d{3})?\b/g)].map(I=>I[0])))],x=new Set;for(const K of S)for(const I of r.get(K)?.tactics??[])x.add(I);for(const K of p)for(const I of K.value.split(/[,;|/]+/)){const L=i.get(X3(I.replace(/\bT\d{4}(?:\.\d{3})?\b/gi,"")));L&&x.add(L)}const y=t.tacticOrder.filter(K=>x.has(K)),w=f.fields.find(K=>/^(severity|criticality|priority)$/i.test(K.label.trim()))?.value,C=So(w),k=K3(f,/^weight$/i),E=K3(f,/^score$/i),O=n&&f.fields.find(K=>K.label===n)?.value||f.title,N=[...new Set([...f.fields.filter(K=>/^category$/i.test(K.label.trim())&&K.value).flatMap(K=>K.value.split(/[;|]+/)).map(K=>K.trim()).filter(Boolean),...M1(f,a)])],B=N[0]??"",A=[...new Set(m.flatMap(K=>K.value.split(/[;|]+/)).map(K=>K.trim()).filter(Boolean))],z=[...new Set(f.fields.filter(K=>/^(?:target|ziel|betroffenes objekt|asset|host|hostname|domain|resource|system)$/i.test(K.label.trim())&&K.value).flatMap(K=>K.value.split(/[;|]+/)).map(K=>K.trim()).filter(Boolean))],P=y.length===0?"unmapped":g?"native":"derived";return{id:f.id,record:f,title:O,category:B,categories:N,defenses:A,targets:z,tactics:y,primaryTactic:y[0]??"Unmapped",techniqueIds:S,severity:C,weight:k,score:E,risk:C_[C]+k*10+E/10,mappingOrigin:P}})}const I6=new Set(["reimport-recommended"]),pp=new Set(["incompatible","unknown"]),$3=new Set([...I6,...pp]),kc=e=>e.processedWith.profileId||e.detectedTool.id,Y3=new Set(["generic","tabular","multiple","unknown"]);function k_(e){const t=[...new Set(e.map(T=>t3(kc(T),T.processedWith)))],n=e.reduce((T,p)=>T+(p.reimportReviewTransfer?.unresolved??0),0);if(n>0)return{state:"review",statuses:t,explanation:`${n} client-owned finding ${n===1?"record could":"records could"} not be matched uniquely during reimport. The original data is retained and requires review.`};const a=new Set(e.map(kc).filter(T=>!Y3.has(T)));if(!t.some(T=>$3.has(T))&&e.some(T=>Y3.has(kc(T)))&&a.size!==1)return{state:"review",statuses:t,explanation:"The source recognition and mapping require review. Reimporting the same files with unchanged profiles will not resolve this state."};if(!t.some(T=>$3.has(T)))return{state:"ready",statuses:t,explanation:"The scan uses a current or compatible ASSESSOR processing profile."};const r=t.some(T=>pp.has(T))?pp:I6,c=e.find(T=>r.has(t3(kc(T),T.processedWith)))??e[0],l=c?Db(kc(c)):void 0;if(t.includes("unknown"))return{state:"error",statuses:t,explanation:"The stored ASSESSOR processing profile is unknown and cannot be assessed safely."};if(t.includes("incompatible"))return{state:"error",statuses:t,explanation:`The stored ASSESSOR processing profile is incompatible with the current ASSESSOR profile ${l?.profileVersion??"unknown"}.`};const f=l?.affectedDimensions.includes("environment-context")?" The newer ASSESSOR profile captures additional environment context for the assessment.":"";return{state:"update",statuses:t,explanation:`ASSESSOR profile update: ${c?.processedWith.profileVersion??"unknown"} → ${l?.profileVersion??"unknown"}. Reimporting applies the newer ASSESSOR processing profile; the ${c?.detectedTool.name??"scanner"} report itself has not changed.${f}`}}function mp(e){const t=new Map;for(const r of e){const c=t.get(r.scanRunId)??[];c.push(r),t.set(r.scanRunId,c)}const n=[...t.values()].map(k_),a={ready:0,review:1,update:2,error:3};return{...n.reduce((r,c)=>a[c.state]>a[r.state]?c:r,{state:"ready",statuses:[],explanation:"The scan uses a current or compatible ASSESSOR processing profile."}),statuses:[...new Set(n.flatMap(r=>r.statuses))]}}function A_(e,t,n=[]){if(n.some(c=>c.state==="upload-required"))return{state:"error",label:"A stored GPO source is missing. Upload the unchanged original backup in the affected timeslot."};if(n.some(c=>c.state==="storage-unavailable"))return{state:"error",label:"GPO source storage is unavailable. Check the backend storage connection and permissions."};if(n.some(c=>c.state==="dead-letter"||c.state==="recovery-required"))return{state:"error",label:"GPO processing failed or requires recovery in a client timeslot."};const a=new Set(t),i=e.filter(c=>a.has(c.scanRunId)),r=i.length?[mp(i)]:[];return r.some(c=>c.state==="error")?{state:"error",label:"Processing error requires attention in a client timeslot."}:r.some(c=>c.state==="update")?{state:"update",label:"ASSESSOR processing profile update available in a client timeslot."}:n.some(c=>c.analysisUpdate)?{state:"update",label:"GPO reprocessing required in a client timeslot. Retained analysis uses a previous ASSESSOR analyzer version."}:n.some(c=>c.evaluationUpdates?.length)?{state:"update",label:"GPO re-evaluation required in a client timeslot. Saved results use a previous engine version or baseline analysis."}:r.some(c=>c.state==="review")?{state:"review",label:"A client timeslot requires review or a future reimport."}:n.some(c=>c.state==="queued"||c.state==="running")?{state:"processing",label:"GPO processing in progress."}:r.length||n.length?{state:"ready",label:"Processing ready across all client timeslots."}:{state:"no-data",label:"No processing status available."}}function Hr({label:e,value:t,percentage:n,tone:a,valueSuffix:i="",showPercentage:r=!0,className:c,active:l,onClick:f}){const T=Math.min(100,Math.max(0,Math.round(n))),p=String(T)+" "+String(100-T),m={"--donut-progress-dash":p},g=["donut-metric-card","donut-metric-card--"+a,c].filter(Boolean).join(" "),S=e+": "+t.toLocaleString("en-US")+", "+T+"%",x=d.jsxs(d.Fragment,{children:[d.jsx("h3",{className:"donut-metric-card__title",children:e}),d.jsxs("div",{className:"donut-metric-card__plot",children:[d.jsxs("svg",{viewBox:"0 0 120 120","aria-hidden":"true",children:[d.jsx("circle",{className:"donut-metric-card__track",cx:"60",cy:"60",r:"48",pathLength:"100"}),d.jsx("circle",{className:"donut-metric-card__progress",cx:"60",cy:"60",r:"48",pathLength:"100",strokeDasharray:p,style:m},e+"-"+t+"-"+T)]}),d.jsxs("div",{className:"donut-metric-card__values",children:[d.jsxs("div",{className:`donut-metric-card__primary${T>=100?" is-compact":""}`,children:[d.jsxs("strong",{children:[r?T:t.toLocaleString("en-US"),r?"":i]}),r&&d.jsx("span",{children:"%"})]}),r&&d.jsxs("small",{children:[t.toLocaleString("en-US"),i]})]})]})]});return f?d.jsx("button",{className:g,type:"button","aria-label":S,"aria-pressed":!!l,onClick:f,children:x}):d.jsx("article",{className:g,"aria-label":S,children:x})}function R_(e){const t=new Date(e);return Number.isNaN(t.getTime())?"—":t.toLocaleDateString("de-DE")}function Ac(e,t){return t>0?Math.min(100,Math.max(0,Math.round(e/t*100))):0}function D_({projects:e,projectData:t,projectHistory:n,projectGpoData:a,projectOpenReadiness:i={},selection:r,timeslotMetrics:c,loading:l,comparisonBusy:f,comparisonError:T,onCreate:p,onShow:m,onOpen:g,onSelectProject:S}){const x=c??{all:0,deviation:0,passed:0,notApplicable:0,notRun:0,error:0};return d.jsxs(d.Fragment,{children:[d.jsxs("section",{className:"datahub-rack-module datahub-status-module","aria-label":"Selected client result status","aria-busy":f,children:[d.jsxs("div",{className:"datahub-reference-controls donut-metric-rack",children:[d.jsx(Hr,{className:"datahub-reference-knob",label:"Results All",value:x.all,percentage:x.all>0?100:0,tone:"all"}),d.jsx(Hr,{className:"datahub-reference-knob",label:"Deviation",value:x.deviation,percentage:Ac(x.deviation,x.all),tone:"deviation"}),d.jsx(Hr,{className:"datahub-reference-knob",label:"Passed",value:x.passed,percentage:Ac(x.passed,x.all),tone:"passed"}),d.jsx(Hr,{className:"datahub-reference-knob",label:"Not Applicable",value:x.notApplicable,percentage:Ac(x.notApplicable,x.all),tone:"not-applicable"}),d.jsx(Hr,{className:"datahub-reference-knob",label:"Not Run",value:x.notRun,percentage:Ac(x.notRun,x.all),tone:"not-run"}),d.jsx(Hr,{className:"datahub-reference-knob",label:"Error",value:x.error,percentage:Ac(x.error,x.all),tone:"error"})]}),T&&d.jsx("em",{className:"datahub-comparison-error",role:"alert",children:T})]}),d.jsx("section",{className:"datahub-rack-module datahub-tenants-module","aria-label":"Mandanten",children:l?d.jsx(Ao,{message:"Loading clients …",compact:!0}):d.jsxs("div",{className:"datahub-tenant-card-rack",children:[e.map(y=>{const w=n[y.id],C=ho(t[y.id]??[],w?.assessments,w?.scanRuns,a[y.id]??[]),k=C[0],E=C.find(A=>i[y.id]?.[A.id]?.canOpen),O=C.flatMap(A=>A.scanRunIds),N=A_(t[y.id]??[],O,a[y.id]??[]),B=r?.projectId===y.id;return d.jsxs("article",{className:`donut-metric-card donut-metric-card--all datahub-tenant-card${B?" is-selected":""}`,children:[N.state!=="no-data"&&d.jsx("span",{className:"datahub-tenant-processing-dot","data-status":N.state,role:"img","aria-label":N.label,title:N.label}),d.jsxs("button",{className:"datahub-tenant-select",type:"button","aria-label":`Mandant ${y.name} auswählen`,"aria-pressed":B,onClick:()=>S(y.id),children:[d.jsx("span",{className:"datahub-tenant-name",children:y.name}),d.jsxs("span",{className:"datahub-tenant-summary",children:[d.jsx("strong",{children:C.length.toLocaleString("de-DE")}),d.jsx("small",{children:C.length===1?"Timeslot":"Timeslots"})]}),d.jsx("span",{className:"datahub-tenant-latest",children:k?`Latest ${R_(k.fileDate)}`:"No scan data yet"})]}),(B||N.state==="update"||N.state==="review"||N.state==="error")&&d.jsx("button",{className:"btn datahub-tenant-show","data-status":N.state,type:"button",title:["update","review","error"].includes(N.state)?N.label:"Manage client",onClick:()=>m(y),children:"Manage"}),d.jsx("button",{className:"btn primary datahub-tenant-open",type:"button",disabled:!E,title:E?"Open latest timeslot":"No scan data available",onClick:()=>E&&g(y,E.scanRunIds,E.assessmentIds),children:"Open"})]},y.id)}),d.jsx("button",{className:"donut-metric-card donut-metric-card--all datahub-tenant-card datahub-tenant-add",type:"button",onClick:p,"aria-label":"Mandant anlegen",children:d.jsx("span",{"aria-hidden":"true",children:"+"})})]})})]})}const I_=new Set(["generic","unknown","multiple"]);function N_(e,t){if(!e.length)return{runIds:[],toolIds:[],includesGpo:!1,excludedSourceIds:[]};const n=new Map(t.map(f=>[f.id,f])),a=e.map(f=>{const T=new Set(f.runIds.map(p=>n.get(p)?.tool.id).filter(p=>!!p));return f.hasGpo&&T.add("gpo-backup"),T}),i=[...new Set(a.flatMap(f=>[...f]))],r=e.length===1?new Set(i):new Set(i.filter(f=>!I_.has(f)&&a.every(T=>T.has(f)))),c=[...r].filter(f=>f!=="gpo-backup").sort(),l=new Set(c);return{runIds:e.flatMap(f=>f.runIds.filter(T=>{const p=n.get(T)?.tool.id;return!!(p&&l.has(p))})),toolIds:c,includesGpo:r.has("gpo-backup"),excludedSourceIds:i.filter(f=>!r.has(f)).sort()}}function O_(e,t){const n=new Set(t),a=e.flatMap(r=>r.findingOccurrences).filter(r=>n.has(r.scanRunId)),i=a.map(r=>({occurrence:r,outcome:r.outcome?.normalizedValue??um(r.status.normalizedValue??"unknown")}));return{all:a.length,deviation:i.filter(({occurrence:r,outcome:c})=>wb(!!r.isIoe,c)).length,passed:i.filter(({outcome:r})=>r==="pass").length,notApplicable:i.filter(({outcome:r})=>r==="not_applicable").length,notRun:i.filter(({outcome:r})=>r==="not_run").length,error:i.filter(({occurrence:r,outcome:c})=>c==="execution_error"||r.technicalExecutionState?.normalizedValue==="failed").length}}const M_=new Set(["generic","unknown","multiple"]);function j_(e,t,n){const a=e.some(r=>r.scanRuns.some(c=>c.id===t)),i=e.some(r=>r.findingOccurrences.some(c=>c.scanRunId===t));return!a||!i?"not-viewable":M_.has(n)?"generic":"recognized"}function Rc(e){return e==="recognized"||e==="generic"}const Z3=/^[a-f0-9]{64}$/;function F_(e,t){if(!e.length||e.some(i=>!i||!Z3.test(i)))return"reference-unavailable";if(t.length!==e.length||t.some(i=>!i||!Z3.test(i)))return"mismatch";const n=[...e].sort();return[...t].sort().every((i,r)=>i===n[r])?"match":"mismatch"}async function J3(e,t,n){return Object.fromEntries(await Promise.all(n.map(async a=>{if(!a.assessmentIds.length)return[a.id,{canOpen:!1,hasPolicyResults:!1}];try{const i=await e({audience:"internal-analysis",projectId:t,assessmentIds:a.assessmentIds,sourceKind:["scanner-finding","policy-observation"]}),r=i.facets.find(c=>c.id==="sourceKind")?.values.some(c=>c.value==="policy-observation"&&c.count>0)??!1;return[a.id,{canOpen:i.total>0,hasPolicyResults:r}]}catch{return[a.id,{canOpen:!1,hasPolicyResults:!1}]}})))}const On=new qi,L_=!1;function au(e){return typeof e.attributes.consultant=="string"?e.attributes.consultant:""}function to(e){return new Intl.DateTimeFormat("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"}).format(new Date(e))}function Q3(e){return new Intl.DateTimeFormat("en-US",{dateStyle:"short",timeStyle:"medium"}).format(new Date(e))}function ey(e){return JSON.stringify(e.map(t=>[t.artifactId,t.jobId,t.state,t.updatedAt,t.gpoCount,t.evaluationUpdates?.map(n=>[n.evaluationRunId,n.previousVersion,n.currentVersion])??[]]).sort((t,n)=>String(t[0]).localeCompare(String(n[0]))))}function P_(e,t=[]){const n=new Map(t.map(i=>[i.id,i])),a=new Map;for(const i of e)a.set(i.scanRunId,[...a.get(i.scanRunId)??[],i]);return[...a.entries()].map(([i,r])=>{const c=n.get(i),l=c?.completedAt??c?.startedAt??r[0].lastModifiedAt??r[0].importedAt,f=r.reduce((T,p)=>Date.parse(p.importedAt)>Date.parse(T)?p.importedAt:T,r[0].importedAt);return{id:i,scanRunId:i,scanRunIds:[i],assessmentIds:c?[c.assessmentId]:[],tool:c?.tool??r[0].detectedTool,files:r,gpoBackups:[],sourceCount:1,fileCount:r.length,fileNames:r.map(T=>T.fileName),formats:[...new Set(r.map(T=>T.format))],sizeBytes:r.reduce((T,p)=>T+p.sizeBytes,0),fileDate:l,importedAt:f,possibleDuplicateGroupIds:[]}}).sort((i,r)=>Date.parse(r.fileDate)-Date.parse(i.fileDate))}function __({activeProjectId:e,onProjectSelected:t,onProjectDataChanged:n,onDetailViewChanged:a,backendStatus:i}){const[r,c]=H.useState([]),[l,f]=H.useState({}),[T,p]=H.useState({}),[m,g]=H.useState({}),[S,x]=H.useState(null),[y,w]=H.useState(!1),[C,k]=H.useState(null),[E,O]=H.useState(null),[N,B]=H.useState(null),[A,z]=H.useState(null),[P,K]=H.useState(!0),[I,L]=H.useState(!1),[le,ue]=H.useState(),[X,F]=H.useState(),[re,me]=H.useState(null),[te,Ce]=H.useState(null),[ee,M]=H.useState(()=>D6()),[Y,Z]=H.useState(null),[J,he]=H.useState(null),[ge,de]=H.useState(null),[fe,ye]=H.useState(null),[qe,ae]=H.useState(!1),[Ne,Ve]=H.useState(null),[tt,We]=H.useState([]),[Le,_e]=H.useState([]),[Xe,pt]=H.useState([]),[Pt,Kt]=H.useState(!1),[Dt,dt]=H.useState(""),[jt,Gt]=H.useState({}),[ln,Et]=H.useState({}),[_t,pe]=H.useState("client-information"),He=H.useRef(new Map);H.useEffect(()=>{a?.(S!==null,S?.mode==="edit"?S.name.trim()||S.project?.name:void 0)},[S,a]),H.useEffect(()=>()=>a?.(!1),[a]);const Je=H.useCallback(async()=>{if(i!=="connected"){c([]),f({}),K(!1);return}K(!0),Et({}),me(null);try{He.current.clear();const W=await On.listProjects(),D=await Promise.all(W.map(async j=>{const[_,se,xe]=await Promise.all([On.listProjectImportFiles(j.id),On.listProjectAssessmentHistory(j.id),On.listProjectGpoBackupStatus(j.id)]),Ae=await J3(Fe=>On.queryUnifiedResultFacets(Fe),j.id,ho(_,se.assessments,se.scanRuns,xe.records));return{projectId:j.id,files:_,history:se,gpoRecords:xe.records,openReadiness:Ae}}));c(W),f(Object.fromEntries(D.map(j=>[j.projectId,j.files]))),p(Object.fromEntries(D.map(j=>[j.projectId,j.history]))),g(Object.fromEntries(D.map(j=>[j.projectId,j.gpoRecords]))),Et(Object.fromEntries(D.map(j=>[j.projectId,j.openReadiness])))}catch(W){me(W instanceof Error?W.message:"Projects could not be loaded.")}finally{K(!1)}},[i]);H.useEffect(()=>{Je()},[Je]);const Ye=r.filter(W=>m[W.id]?.some(D=>D.state==="queued"||D.state==="running")).map(W=>W.id).join("\0");H.useEffect(()=>{if(i!=="connected"||!Ye)return;const W=Ye.split("\0");let D=!1,j=!1;const _=globalThis.setInterval(async()=>{if(!j){j=!0;try{const se=(await Promise.all(W.map(async xe=>{const Ae=await On.listProjectGpoBackupStatus(xe);if(ey(Ae.records)===ey(m[xe]??[]))return null;const Fe=T[xe],Oe=await J3(Ue=>On.queryUnifiedResultFacets(Ue),xe,ho(l[xe]??[],Fe?.assessments,Fe?.scanRuns,Ae.records));return{projectId:xe,records:Ae.records,openReadiness:Oe}}))).filter(xe=>xe!==null);!D&&se.length&&(g(xe=>({...xe,...Object.fromEntries(se.map(Ae=>[Ae.projectId,Ae.records]))})),Et(xe=>({...xe,...Object.fromEntries(se.map(Ae=>[Ae.projectId,Ae.openReadiness]))})))}catch{D||me("GPO processing status could not be refreshed.")}finally{j=!1}}},5e3);return()=>{D=!0,globalThis.clearInterval(_)}},[i,Ye,l,m,T]),H.useEffect(()=>{if(!X)return;const W=m[X.projectId]?.find(D=>D.artifactId===X.artifactId&&D.jobId===X.jobId);W&&!["queued","running"].includes(W.state)&&(F(void 0),ue(void 0))},[X,m]),H.useEffect(()=>{const W=()=>{Je()};return globalThis.addEventListener("assessor:datahub-changed",W),globalThis.addEventListener("assessor:gpo-changed",W),()=>{globalThis.removeEventListener("assessor:datahub-changed",W),globalThis.removeEventListener("assessor:gpo-changed",W)}},[Je]);const mt=H.useCallback(W=>{const D=T[W];return ho(l[W]??[],D?.assessments,D?.scanRuns,m[W]??[])},[l,m,T]);H.useEffect(()=>{P||!r.length||de(W=>{if(W){const _=new Set(mt(W.projectId).map(se=>se.id));if(r.some(se=>se.id===W.projectId)&&W.slots.length<=1&&W.slots.every(se=>_.has(se.id)))return W}const D=r.find(_=>_.id===e);if(!D)return null;const j=mt(D.id).find(_=>_.scanRunIds.length);return{projectId:D.id,slots:j?[{id:j.id,runIds:j.scanRunIds,effectiveAt:j.fileDate}]:[]}})},[e,mt,P,r]);const Qe=H.useCallback(async W=>{const D=He.current.get(W);if(D)return D;const j=await On.listProjectAssessments(W),_=await Promise.all(j.map(se=>On.loadAssessmentModel(se.id)));return He.current.set(W,_),_},[]);H.useEffect(()=>{const W=ge?.slots[ge.slots.length-1];if(!W){ye(null),Ve(null),ae(!1);return}let D=!1;return ae(!0),Ve(null),Qe(ge.projectId).then(j=>{D||ye(O_(j,W.runIds))}).catch(j=>{D||(ye(null),Ve(j instanceof Error?j.message:"The selected timeslot status could not be loaded."))}).finally(()=>{D||ae(!1)}),()=>{D=!0}},[Qe,T,ge]);const qt=H.useCallback(W=>{const D=mt(W).find(j=>j.scanRunIds.length);de({projectId:W,slots:D?[{id:D.id,runIds:D.scanRunIds,effectiveAt:D.fileDate}]:[]})},[mt]),ot=H.useMemo(()=>S?.project?mt(S.project.id):[],[S?.project,mt]),Pe=H.useMemo(()=>S?.project?P_(l[S.project.id]??[],T[S.project.id]?.scanRuns):[],[S?.project,l,T]);H.useEffect(()=>{const W=S?.project?.id;if(!W||Pe.length===0){Gt({});return}let D=!1;return Gt(Object.fromEntries(Pe.map(j=>[j.scanRunId,"checking"]))),Qe(W).then(j=>{D||Gt(Object.fromEntries(Pe.map(_=>[_.scanRunId,j_(j,_.scanRunId,_.tool.id)])))}).catch(()=>{D||Gt(Object.fromEntries(Pe.map(j=>[j.scanRunId,"unavailable"])))}),()=>{D=!0}},[Pe,S?.project?.id,Qe]);const Me=H.useMemo(()=>ot.filter(W=>tt.includes(W.id)),[ot,tt]),Ke=H.useMemo(()=>N_(Me.map(W=>({id:W.id,runIds:W.scanRunIds.filter(D=>!Le.includes(D)&&Rc(jt[D])),hasGpo:W.gpoBackups.length>0})),S?.project?T[S.project.id]?.scanRuns??[]:[]),[Le,S?.project,T,jt,Me]),st=()=>{me(null),Ce(null),w(!0),_e([]),pt([]),pe("client-information"),x({mode:"create",name:"",description:"",consultant:""})},Vt=W=>{const D=mt(W.id),j=D[0],_=l[W.id]??[],se=D.filter(xe=>mp(_.filter(Ae=>xe.scanRunIds.includes(Ae.scanRunId))).state!=="ready"||xe.gpoBackups.some(Ae=>Ae.state==="dead-letter"||Ae.state==="recovery-required")).map(xe=>xe.id);me(null),Ce(null),w(!1),We(j?[j.id]:[]),_e([]),pt(se),Kt(!1),z(null),pe("client-information"),x({mode:"edit",project:W,name:W.name,description:W.description??"",consultant:au(W)})},Xt=W=>{Ce(null),x(D=>D&&{...D,...W})},Fn=(W,D)=>{const j=ot.find(_=>_.id===W);We(_=>D?_.includes(W)?_:[..._,W]:_.filter(se=>se!==W)),j&&_e(_=>_.filter(se=>!j.scanRunIds.includes(se))),me(null)},Sa=(W,D,j)=>{_e(_=>j?_.filter(se=>se!==D):_.includes(D)?_:[..._,D]),j&&(We(_=>_.includes(W)?_:[..._,W]),pt(_=>_.includes(W)?_:[..._,W])),me(null)},Zn=()=>{if(!S?.project||!Me.length)return;const W=Me.length===1?Me[0].scanRunIds.filter(D=>!Le.includes(D)&&Rc(jt[D])):Ke.runIds;if(!W.length){if(Me.length===1&&ln[S.project.id]?.[Me[0].id]?.hasPolicyResults){t(S.project,[],Me[0].assessmentIds);return}me("The selected timeslots do not contain a common comparable scanner source.");return}t(S.project,W,[...new Set(Me.flatMap(D=>D.assessmentIds))])},ba=async W=>{if(W.preventDefault(),!S?.project||!Dt)return;const D=`timeslot-${Dt}`;if(ot.some(j=>j.id===D)){me("A timeslot already exists for this date.");return}L(!0),me(null);try{const j=new Date().toISOString(),_=`${Dt}T12:00:00.000Z`,se={id:aC(S.project.id,_),projectId:S.project.id,name:`Timeslot ${to(_)}`,effectiveAt:_,scoringPolicy:T1(),createdAt:j,updatedAt:j};await On.saveAssessment(se),await Je(),We([D]),_e([]),pt([D]),Kt(!1),Ce({tone:"success",message:"Timeslot created and selected."})}catch(j){me(j instanceof Error?j.message:"The timeslot could not be created.")}finally{L(!1)}},Wn=async W=>{if(W.preventDefault(),!(!S?.name.trim()||S.mode==="edit"&&!y)){L(!0),me(null),Ce(null);try{const D=new Date().toISOString(),j=S.project?{...S.project,name:S.name.trim(),description:S.description.trim(),updatedAt:D,attributes:{...S.project.attributes,consultant:S.consultant.trim()}}:{id:hu(S.name,Date.now(),Date.now()),name:S.name.trim(),description:S.description.trim(),createdAt:D,updatedAt:D,attributes:{consultant:S.consultant.trim()}},_=await On.saveProject(j),se=await On.getProject(_.project.id);if(!(se.updatedAt===j.updatedAt&&se.name===j.name&&(se.description??"")===(j.description??"")&&au(se)===au(j)))throw new Error("The database did not confirm the saved state.");await Je(),x({mode:"edit",project:se,name:se.name,description:se.description??"",consultant:au(se)}),w(!1),Ce({tone:"success",message:"Saved to the database."})}catch(D){Ce({tone:"error",message:D instanceof Error?D.message:"Saving to the database failed."})}finally{L(!1)}}},Ln=async()=>{if(C){L(!0),me(null);try{await On.deleteProject(C.id),e===C.id&&t(void 0),S?.project?.id===C.id&&(w(!1),x(null)),k(null),await Je()}catch(W){me(W instanceof Error?W.message:"Project could not be deleted.")}finally{L(!1)}}},Si=async()=>{const W=S?.project?.id;if(!(!W||!E)){L(!0),me(null),Ce(null);try{if(!(await On.deleteScanRun(W,E.scanRunId)).deleted)throw new Error("The scan report was no longer present in the database.");_e(j=>j.filter(_=>_!==E.scanRunId)),O(null),await Je(),e===W&&await n?.(W),globalThis.dispatchEvent(new CustomEvent("assessor:datahub-changed",{detail:{projectId:W}})),Ce({tone:"success",message:"Scan report and its records were deleted from the database."})}catch(D){me(D instanceof Error?D.message:"Scan report could not be deleted.")}finally{L(!1)}}},wa=async(W,D)=>{const j=S?.project?.id;if(j){L(!0),me(null),Ce(null);try{const _=await On.adoptScanRunReplacement(j,W.scanRunId,D.scanRunId);await Je(),e===j&&await n?.(j),globalThis.dispatchEvent(new CustomEvent("assessor:datahub-changed",{detail:{projectId:j}}));const se=_.reimportReviewTransfer,xe=se.unresolved>0?` ${se.transferred} client records were transferred; ${se.unresolved} remain retained on the previous scan and require review.`:` ${se.transferred} client records were transferred safely.`;Ce({tone:"success",message:`${D.tool.name} was adopted as the replacement scan. The previous scan remains auditably retained.${xe}`})}catch(_){me(_ instanceof Error?_.message:"The imported scan could not be adopted as the replacement.")}finally{L(!1)}}},ti=async()=>{const W=S?.project?.id;if(!(!W||!A)){if(!A.assessmentIds.length){z(null),me("This timeslot has no persisted assessment and cannot be deleted safely.");return}L(!0),me(null),Ce(null);try{for(const j of A.assessmentIds)if(!(await On.deleteAssessment(W,j)).deleted)throw new Error("The timeslot was no longer present in the database.");const D=A.id;We(j=>j.filter(_=>_!==D)),_e(j=>j.filter(_=>!A.scanRunIds.includes(_))),pt(j=>j.filter(_=>_!==D)),z(null),await Je(),e===W&&await n?.(W),globalThis.dispatchEvent(new CustomEvent("assessor:datahub-changed",{detail:{projectId:W}})),Ce({tone:"success",message:"Timeslot and its assigned data were deleted from the database."})}catch(D){me(D instanceof Error?D.message:"Timeslot could not be deleted.")}finally{L(!1)}}},Pn=async W=>{const D=S?.project?.id;if(!D||!W.evaluationUpdates?.length)return;L(!0),ue("Re-evaluating GPO baseline comparisons"),me(null),Ce(null);let j;try{for(const _ of W.evaluationUpdates)await On.evaluatePolicy(D,{aggregationRunId:_.aggregationRunId,baselineAnalysisIds:_.baselineAnalysisIds})}catch(_){j=_ instanceof Error?_.message:"GPO re-evaluation failed. Review the processing controls in GPO Analysis. Previous results remain retained."}finally{await Je(),j?me(j):Ce({tone:"success",message:"GPO re-evaluation completed. Previous runs remain retained as history. Reopen the timeslot to load the current results."}),ue(void 0),L(!1)}},Vn=async W=>{const D=S?.project?.id;if(!(!D||!W.analysisUpdate)){L(!0),ue("Reprocessing the stored GPO source"),me(null),Ce(null);try{const j=await On.reprocessGpoBackup(D,W.artifactId,W.analysisUpdate.expectedLatestProcessingRunId);F({projectId:D,artifactId:j.artifactId,jobId:j.jobId}),ue("Processing GPO backup"),await Je(),Ce({tone:"success",message:"GPO reprocessing was queued. Previous runs remain retained as history; re-evaluate once processing completes."})}catch(j){ue(void 0),me(j instanceof Error?j.message:"GPO reprocessing could not be started. Previous results remain retained.")}finally{L(!1)}}},q=async W=>{const D=S?.project?.id;if(D){L(!0),ue("Starting GPO processing"),me(null),Ce(null);try{const j=await On.retryGpoBackup(D,W.artifactId);F({projectId:D,artifactId:j.artifactId,jobId:j.jobId}),ue("Processing GPO backup"),await Je(),Ce({tone:"success",message:"The GPO analysis job was requeued."})}catch(j){ue(void 0),me(j instanceof Error?j.message:"The GPO analysis job could not be restarted.")}finally{L(!1)}}},ne=async()=>{const W=S?.project?.id;if(!(!W||!N)){L(!0),me(null),Ce(null);try{await On.deleteGpoBackup(W,N.artifactId),B(null),await Je(),e===W&&await n?.(W),globalThis.dispatchEvent(new CustomEvent("assessor:datahub-changed",{detail:{projectId:W}})),Ce({tone:"success",message:"GPO backup and its derived records were deleted from the database."})}catch(D){me(D instanceof Error?D.message:"The GPO backup could not be deleted.")}finally{L(!1)}}};if(i!=="connected")return d.jsxs("div",{className:"datahub-page",children:[d.jsx("section",{className:"datahub-hero",children:d.jsx("div",{children:d.jsx("p",{children:"Datahub is the control center for clients, scans, and findings."})})}),d.jsx(ym,{backendStatus:i,message:"Import and project management will be available again once the local API is connected."})]});const V=S?.project,G=Me.length===1?Me[0].scanRunIds.filter(W=>!Le.includes(W)&&Rc(jt[W])):[],Q=!Me.length||(Me.length===1?!ln[S?.project?.id??""]?.[Me[0].id]?.canOpen||!G.length&&!ln[S?.project?.id??""]?.[Me[0].id]?.hasPolicyResults:!Ke.runIds.length),ie=V&&d.jsxs("section",{className:"tenant-timeslots","aria-label":"Timeslots",children:[d.jsxs("div",{className:"tenant-timeslots-header",children:[d.jsx("h2",{className:"tenant-timeslots-heading",children:"Timeslots"}),d.jsxs("button",{className:"btn tenant-timeslot-add",type:"button","aria-label":"Create timeslot",title:"Create Timeslot",onClick:()=>{dt(new Date().toLocaleDateString("sv-SE")),Kt(!0)},children:[d.jsx("span",{"aria-hidden":"true",children:"+"})," Timeslot"]})]}),d.jsx("div",{className:"tenant-timeslot-list",children:P?d.jsx(Ao,{message:"Timeslots are loading …",compact:!0}):ot.length===0?d.jsxs("div",{className:"datahub-empty tenant-files-empty",children:[d.jsx("h3",{children:"No timeslots yet"}),d.jsx("p",{children:"Create the first dated assessment timeslot."})]}):ot.map(W=>{const D=Pe.filter(Be=>W.scanRunIds.includes(Be.scanRunId)),j=new Map(D.map(Be=>[Be.scanRunId,mp(Be.files)])),_=D.filter(Be=>j.get(Be.scanRunId)?.state!=="ready"),se=_.some(Be=>j.get(Be.scanRunId)?.state==="error"),xe=_.some(Be=>j.get(Be.scanRunId)?.state==="review"),Ae=new Map(_.flatMap(Be=>{const ct=D.filter(St=>St.scanRunId!==Be.scanRunId&&St.tool.id===Be.tool.id&&F_(Be.files.map(kn=>kn.sha256),St.files.map(kn=>kn.sha256))==="match"&&Date.parse(St.importedAt)>Date.parse(Be.importedAt)&&j.get(St.scanRunId)?.state==="ready"&&jt[St.scanRunId]==="recognized").sort((St,kn)=>Date.parse(kn.importedAt)-Date.parse(St.importedAt))[0];return ct?[[Be.scanRunId,ct]]:[]})),Fe=D.filter(Be=>Rc(jt[Be.scanRunId])),Oe=tt.includes(W.id),Ue=Oe?Fe.filter(Be=>!Le.includes(Be.scanRunId)).length:0,Ge=Oe&&(Fe.length===0||Ue===Fe.length),kt=Oe&&Fe.length>0&&Ue{const ct=Be.currentTarget.open;pt(St=>ct?St.includes(W.id)?St:[...St,W.id]:St.filter(kn=>kn!==W.id))},children:[d.jsxs("summary",{className:"tenant-section-bar",children:[d.jsxs("span",{className:"tenant-timeslot-title",children:[d.jsx("input",{ref:Be=>{Be&&(Be.indeterminate=kt)},type:"checkbox",checked:Ge,"aria-label":`Select timeslot ${to(W.fileDate)}`,onClick:Be=>Be.stopPropagation(),onChange:Be=>Fn(W.id,Be.target.checked)}),d.jsx("strong",{children:to(W.fileDate)})]}),d.jsxs("span",{className:"tenant-history-meta",children:[d.jsx("b",{children:(D.length+W.gpoBackups.length).toLocaleString("de-DE")}),d.jsx(vn,{direction:"right"})]})]}),D.length===0&&W.gpoBackups.length===0?d.jsxs("div",{className:"datahub-empty tenant-files-empty",children:[d.jsx("h3",{children:"No sources"}),d.jsx("p",{children:"This timeslot does not contain a scan report or GPO backup yet."})]}):d.jsxs("div",{className:"tenant-report-list",role:"table","aria-label":`Assessment sources from ${to(W.fileDate)}`,children:[d.jsxs("div",{className:"tenant-report-row tenant-report-head",role:"row",children:[d.jsx("span",{"aria-hidden":"true"}),d.jsx("span",{children:"Source"}),d.jsx("span",{children:"Imported"}),d.jsx("span",{children:"Status"}),d.jsx("span",{children:"Actions"})]}),D.map(Be=>{const ct=jt[Be.scanRunId]??"checking",St=j.get(Be.scanRunId),kn=Rc(ct),ni=St.state==="update"?"Reimport recommended":St.state==="review"?"Review required":St.state==="error"?"Processing error":ct==="recognized"?"Ready":ct==="generic"?"Generic":ct==="not-viewable"?"Not viewable":ct==="unavailable"?"Unavailable":"Checking",Ca=St.state!=="ready"?St.explanation:ct==="recognized"?"Tool recognized, Work records available, and processing contract ready.":ct==="generic"?"Work records are available, but no specific scanner profile was recognized.":ct==="not-viewable"?"The upload is stored, but it produced no records that Work can display.":ct==="unavailable"?"Display readiness could not be checked.":"Display readiness is being checked.";return d.jsxs("div",{className:"tenant-report-row",role:"row",children:[d.jsx("input",{type:"checkbox",disabled:!kn,checked:kn&&Oe&&!Le.includes(Be.scanRunId),"aria-label":`Select ${Be.tool.name} scan report`,onChange:ss=>Sa(W.id,Be.scanRunId,ss.target.checked)}),d.jsxs("span",{className:"tenant-report-copy",children:[d.jsx("b",{children:Be.tool.name}),d.jsxs("small",{children:[Be.fileCount.toLocaleString("de-DE")," ",Be.fileCount===1?"file":"files"," · ",Be.formats.join(", ")||"—"]})]}),d.jsx("span",{className:"tenant-report-imported",children:Q3(Be.importedAt)}),d.jsx("b",{className:"tenant-report-status","data-status":St.state==="update"?"reimport-recommended":St.state==="review"?"review-required":St.state==="error"?"processing-error":ct,title:Ca,children:ni}),d.jsx("button",{className:"btn tenant-scan-delete",type:"button",title:`Delete ${Be.tool.name} scan report`,"aria-label":`Delete ${Be.tool.name} scan report`,onClick:()=>O(Be),children:"Delete"})]},Be.id)}),W.gpoBackups.map(Be=>d.jsx(T_,{record:Be,projectId:S.project.id,imported:Q3(Be.submittedAt),busy:I,onEvaluate:()=>{Pn(Be)},onReprocess:()=>{Vn(Be)},onRetry:()=>{q(Be)},onDelete:()=>B(Be)},Be.artifactId))]}),_.length>0&&d.jsxs("section",{className:"tenant-processing-alert","data-status":se?"error":xe?"review":"update","aria-label":se?"ASSESSOR processing errors require attention":xe?"ASSESSOR review required":"ASSESSOR processing profile updates available",children:[d.jsxs("header",{children:[d.jsx("strong",{children:se?"ASSESSOR processing issue":xe?"Review required":"New ASSESSOR processing profile available"}),d.jsx("span",{children:se?"At least one stored processing contract cannot be assessed safely. Review the affected scan and reimport its unchanged original file.":xe?"The report needs attention because its scanner profile is generic or client-owned finding data could not be matched uniquely during reimport. Original data remains retained.":"ASSESSOR has updated its internal scanner-processing profile. Reimport the unchanged original scanner file to apply it; the existing scan remains active until replacement succeeds."})]}),_.map(Be=>{const ct=Ae.get(Be.scanRunId);return d.jsxs("div",{className:"tenant-processing-alert-row",children:[d.jsxs("div",{children:[d.jsx("strong",{children:Be.tool.name}),d.jsx("p",{children:ct?"A newer ready scan of the same tool is present. It can be adopted as the replacement without deleting or uploading it again.":j.get(Be.scanRunId).explanation})]}),ct?d.jsxs("button",{className:"btn primary",type:"button",disabled:I,onClick:()=>{wa(Be,ct)},children:["Use imported ",Be.tool.name]}):j.get(Be.scanRunId).state!=="review"&&d.jsx(_3,{targetProjectId:V.id,targetAssessmentId:Be.assessmentIds[0],replacesScanRunId:Be.scanRunId,label:`Reimport ${Be.tool.name}`})]},Be.scanRunId)})]}),d.jsxs("div",{className:"tenant-timeslot-actions",children:[d.jsx("div",{className:"tenant-timeslot-add-heading",children:d.jsx("h4",{children:"Add Entry"})}),d.jsx(_3,{targetProjectId:V.id,targetAssessmentId:W.assessmentIds[0],label:"Import Scan"}),d.jsx(xm,{projectId:V.id,assessmentId:W.assessmentIds[0],label:"Import GPO Folder",archiveLabel:"Import GPO ZIP",showStatus:!1}),d.jsxs("div",{className:"tenant-timeslot-delete-action",children:[d.jsx("span",{children:"Entire timeslot"}),d.jsx("button",{className:"btn danger",type:"button",onClick:()=>z(W),children:"Delete timeslot"})]})]})]},W.id)})})]});return d.jsxs("div",{className:"datahub-page"+(S?" tenant-detail-page":""),children:[S?d.jsxs("div",{className:"tenant-detail-layout",children:[d.jsxs("aside",{className:"tenant-detail-navigation",children:[d.jsxs("section",{className:"tenant-editor-header",children:[d.jsxs("button",{className:"tenant-back",type:"button",title:"Back to client overview","aria-label":"Back to client overview",onClick:()=>{I||(w(!1),_e([]),pe("client-information"),x(null))},children:[d.jsx(vn,{direction:"left"}),d.jsx("span",{children:"Back"})]}),S.project&&d.jsx("button",{className:"btn primary tenant-navigation-open",type:"button",disabled:Q,title:Me.length?Me.length>1?"Open comparable sources from the selected timeslots":"Open selected scan reports":"Select at least one timeslot",onClick:Zn,children:"Open"}),d.jsxs("div",{className:"tenant-identity",children:[d.jsx("h2",{children:S.mode==="create"?"Create Client":S.project?.name}),S.project&&d.jsx("p",{children:to(S.project.createdAt)})]})]}),S.mode==="edit"&&ie]}),d.jsx("main",{className:"tenant-detail-information",children:_t==="client-information"?d.jsxs("section",{className:"tenant-information-sheet","aria-label":"Client information sheet",children:[d.jsxs("header",{className:"tenant-information-header",children:[d.jsx("div",{className:"tenant-information-title",children:d.jsx("strong",{children:"Client Information"})}),d.jsxs("div",{className:"tenant-information-actions",children:[S.project&&m[S.project.id]?.length>0&&!y&&d.jsx("button",{className:"btn tenant-show-gpo",type:"button",onClick:()=>pe("gpo-analysis"),children:"GPO Analysis"}),S.project&&!y&&d.jsx("button",{className:"btn danger tenant-delete-client",type:"button",onClick:()=>k(S.project),children:"Delete client"}),S.mode==="edit"&&!y&&d.jsx("button",{className:"btn primary tenant-edit-client",type:"button",disabled:I,onClick:()=>{Ce(null),w(!0)},children:"Edit"}),(S.mode==="create"||y)&&d.jsx("button",{className:"btn primary tenant-save-client",type:"submit",form:"tenant-editor-form",disabled:I||!S.name.trim(),children:I?"Saving …":"Save"})]})]}),re&&d.jsxs("div",{className:"datahub-alert",role:"alert",children:[d.jsx("span",{children:re}),d.jsx("button",{className:"btn",type:"button",onClick:()=>me(null),children:"Close"})]}),te&&d.jsxs("div",{className:"tenant-save-feedback "+te.tone,role:te.tone==="error"?"alert":"status",children:[d.jsx("span",{"aria-hidden":"true",children:te.tone==="success"?"✓":"!"}),d.jsx("strong",{children:te.message})]}),d.jsxs("form",{id:"tenant-editor-form",className:`tenant-editor-form${y?" is-editing":""}`,onSubmit:Wn,children:[d.jsxs("label",{children:[d.jsxs("span",{className:"tenant-field-label",children:["Name",y&&d.jsx("i",{children:"Required"})]}),y?d.jsx("input",{className:"input",value:S.name,onChange:W=>Xt({name:W.target.value}),required:!0,autoFocus:S.mode==="create"}):d.jsx("span",{className:"tenant-field-value",children:S.name||"—"})]}),d.jsxs("label",{children:[d.jsxs("span",{className:"tenant-field-label",children:["Consultant",y&&d.jsx("i",{children:"optional"})]}),y?d.jsx("input",{className:"input",value:S.consultant,onChange:W=>Xt({consultant:W.target.value}),placeholder:"Responsible person"}):d.jsx("span",{className:"tenant-field-value",children:S.consultant||"—"})]}),d.jsxs("label",{className:"tenant-editor-description",children:[d.jsxs("span",{className:"tenant-field-label",children:["Remarks",y&&d.jsx("i",{children:"optional"})]}),y?d.jsx("textarea",{className:"input",value:S.description,onChange:W=>Xt({description:W.target.value}),rows:10,placeholder:"Notes about the client or project"}):d.jsx("span",{className:"tenant-field-value tenant-field-prose",children:S.description||"—"})]})]})]}):S.project?d.jsxs("section",{className:"tenant-information-sheet tenant-policy-information","aria-label":"GPO policy analysis",children:[d.jsxs("header",{className:"tenant-information-header",children:[d.jsx("div",{className:"tenant-information-title",children:d.jsx("strong",{children:"GPO Analysis"})}),d.jsx("div",{className:"tenant-information-actions",children:d.jsx("button",{className:"btn",type:"button",onClick:()=>pe("client-information"),children:"Client Information"})})]}),d.jsx(v_,{projectId:S.project.id})]}):null})]}):d.jsxs(d.Fragment,{children:[re&&d.jsxs("div",{className:"datahub-alert",role:"alert",children:[d.jsx("span",{children:re}),d.jsx("button",{className:"btn",type:"button",onClick:()=>{Je()},children:"Neu laden"})]}),d.jsx(D_,{projects:r,projectData:l,projectHistory:T,projectGpoData:m,projectOpenReadiness:ln,selection:ge,timeslotMetrics:fe,loading:P,comparisonBusy:qe,comparisonError:Ne,onCreate:st,onShow:Vt,onOpen:(W,D,j)=>t(W,D,j),onSelectProject:qt}),d.jsxs("div",{className:"datahub-reference-row is-mitre-hidden",children:[d.jsx(S_,{}),L_]})]}),E&&d.jsx(Ua,{title:"Delete scan report from the database?",onClose:()=>!I&&O(null),children:d.jsxs("div",{className:"datahub-delete-warning",children:[d.jsx("strong",{children:E.tool.name}),d.jsxs("p",{children:[new Date(E.fileDate).toLocaleString("en-US")," · ",E.fileCount," file",E.fileCount===1?"":"s"]}),d.jsx("p",{children:"The scan report, its findings, evidence, and scan-related mappings will be permanently deleted. Other scan reports for this client remain intact."}),d.jsxs("footer",{children:[d.jsx("button",{className:"btn",type:"button",disabled:I,onClick:()=>O(null),children:"Cancel"}),d.jsx("button",{className:"btn danger",type:"button",disabled:I,onClick:()=>{Si()},children:I?"Deleting …":"Yes, delete scan report"})]})]})}),N&&d.jsx(Ua,{title:"Delete GPO backup from the database?",onClose:()=>!I&&B(null),children:d.jsxs("div",{className:"datahub-delete-warning",children:[d.jsx("strong",{children:"GPO Backup"}),d.jsxs("p",{children:[N.fileName," · ",N.gpoCount," GPO",N.gpoCount===1?"":"s"]}),d.jsx("p",{children:"The GPO backup, its analysis, evaluations, and derived findings will be permanently deleted. The timeslot and all other scan and GPO entries remain intact."}),d.jsxs("footer",{children:[d.jsx("button",{className:"btn",type:"button",disabled:I,onClick:()=>B(null),children:"Cancel"}),d.jsx("button",{className:"btn danger",type:"button",disabled:I,onClick:()=>{ne()},children:I?"Deleting …":"Yes, delete GPO backup"})]})]})}),A&&d.jsx(Ua,{title:"Delete timeslot from the database?",onClose:()=>!I&&z(null),children:d.jsxs("div",{className:"datahub-delete-warning",children:[d.jsx("strong",{children:to(A.fileDate)}),d.jsxs("p",{children:[A.sourceCount," source",A.sourceCount===1?"":"s"," · ",A.fileCount+A.gpoBackups.length," assigned file",A.fileCount+A.gpoBackups.length===1?"":"s"]}),d.jsx("p",{children:"The timeslot, its scan reports, GPO backup data, findings, evidence, and related mappings will be permanently deleted. The client and all other timeslots remain intact."}),d.jsxs("footer",{children:[d.jsx("button",{className:"btn",type:"button",disabled:I,onClick:()=>z(null),children:"Cancel"}),d.jsx("button",{className:"btn danger",type:"button",disabled:I,onClick:()=>{ti()},children:I?"Deleting …":"Yes, delete timeslot"})]})]})}),Pt&&d.jsx(Ua,{title:"Create Timeslot",onClose:()=>!I&&Kt(!1),children:d.jsxs("form",{className:"timeslot-dialog-form",onSubmit:ba,children:[d.jsxs("label",{children:["Date",d.jsx("input",{className:"input",type:"date",value:Dt,required:!0,onChange:W=>dt(W.target.value)})]}),d.jsx("p",{children:"Imports added afterwards are assigned to this dated assessment timeslot."}),d.jsxs("footer",{children:[d.jsx("button",{className:"btn",type:"button",disabled:I,onClick:()=>Kt(!1),children:"Cancel"}),d.jsx("button",{className:"btn primary",type:"submit",disabled:I||!Dt,children:I?"Creating …":"Create"})]})]})}),C&&d.jsx(Ua,{title:"Permanently delete client?",onClose:()=>!I&&k(null),children:d.jsxs("div",{className:"datahub-delete-warning",children:[d.jsx("strong",{children:C.name}),d.jsx("p",{children:"All assessments, scan reports, findings, reviews, and mappings for this client will be permanently deleted from the database. This action cannot be undone."}),d.jsxs("footer",{children:[d.jsx("button",{className:"btn",type:"button",disabled:I,onClick:()=>k(null),children:"Cancel"}),d.jsx("button",{className:"btn danger",type:"button",disabled:I,onClick:()=>{Ln()},children:I?"Deleting …":"Yes, delete permanently"})]})]})}),d.jsx(xd,{label:le})]})}const ty=e=>e===void 0?"—":e.toLocaleString("en-US");function q_({groups:e}){const t=[...new Set(e.flatMap(n=>n.entries.map(a=>a.inventory)))];return d.jsxs("section",{className:"client-os-inventory","aria-label":"Operating systems",children:[d.jsxs("header",{children:[d.jsx("h3",{children:"Operating systems"}),t.length>1&&d.jsx("p",{children:"Source inventories are listed separately; overlapping counts are not added."})]}),d.jsx("div",{className:"client-os-groups",children:e.map(n=>d.jsxs("section",{className:"client-os-group",children:[d.jsxs("h4",{children:[d.jsx("span",{children:n.label}),d.jsx("span",{"aria-label":`${n.label} total`,children:ty(n.total)})]}),n.entries.length?d.jsxs("table",{children:[d.jsx("thead",{children:d.jsxs("tr",{children:[d.jsx("th",{scope:"col",children:"Operating system"}),t.length>1&&d.jsx("th",{className:"client-os-source",scope:"col",children:"Source"}),d.jsx("th",{scope:"col",children:"Devices"})]})}),d.jsx("tbody",{children:n.entries.map(a=>d.jsxs("tr",{children:[d.jsx("td",{children:a.name}),t.length>1&&d.jsx("td",{className:"client-os-source",children:a.inventory==="unquantified"?"Count not reported":`Inventory ${t.indexOf(a.inventory)+1}`}),d.jsx("td",{children:ty(a.count)})]},a.id))})]}):d.jsx("p",{className:"client-os-empty",children:"No classified inventory available"})]},n.label))})]})}function iu(e){const t=e.normalizedValue??e.originalValue;return typeof t=="string"||typeof t=="number"?String(t).trim():""}function B_(e){if(!/^(?:\d+|\d{1,3}(?:,\d{3})+|\d{1,3}(?:[ \u00a0\u202f]\d{3})+)$/.test(e))return;const t=Number(e.replace(/[, \u00a0\u202f]/g,""));return Number.isSafeInteger(t)&&t>=0?t:void 0}function ny(e,t=[]){const n=new Set(t.map(a=>a.toLowerCase()).flatMap(a=>["server","domain controller","member server"].includes(a)?["Servers"]:["client","workstation"].includes(a)?["Clients"]:[]));return n.size>1?"Other / unclassified":n.size===1?[...n][0]:/\bwindows\s+server\b|^windows\s+(?:2003|2008|2012|2016|2019|2022|2025)\b|\bmac\s*os\s*x\s+server\b/i.test(e)?"Servers":/^windows\s+(?:xp|vista|7|8(?:\.1)?|10|11)\b|^(?:macos|mac os x)\b/i.test(e)?"Clients":"Other / unclassified"}function U_(e){const t=new Map;for(const i of e?.observations??[]){if(i.tool.id!=="pingcastle"||i.state!=="observed"||typeof i.attributes.sourceTableIndex!="number"||i.source.rowIndex===void 0)continue;const r=JSON.stringify([i.scanRunId,i.importFileId,i.sectionKey,i.attributes.sourceTableIndex,i.source.rowIndex]),c=t.get(r)??[];c.push(i),t.set(r,c)}const n=new Map([["Servers",[]],["Clients",[]],["Other / unclassified",[]]]),a=new Set;for(const[i,r]of t){const c=[...new Set(r.filter(g=>g.property==="operating_system.name").map(iu).filter(Boolean))];if(!c.length)continue;const l=new Set(r.filter(g=>g.property==="operating_system.count").map(g=>B_(iu(g)))),f=c.length===1&&l.size===1?[...l][0]:void 0,T=r.filter(g=>/^(?:type|role|computer type|os type)$/i.test(g.label.trim())).map(iu),p=r[0],m=JSON.stringify([p.scanRunId,p.importFileId,p.sectionKey,p.attributes.sourceTableIndex]);for(const g of c)a.add(g),n.get(ny(g,T)).push({id:`${i}:${g}`,name:g,count:f,inventory:m})}for(const i of new Set((e?.observations??[]).filter(r=>r.state==="observed"&&r.property==="operating_system.name").map(iu).filter(Boolean)))a.has(i)||n.get(ny(i)).push({id:`name:${i}`,name:i,inventory:"unquantified"});return[...n].map(([i,r])=>{const c=new Map;for(const m of r){const g=JSON.stringify([m.inventory,m.name]);c.set(g,(c.get(g)??0)+1)}const l=r.map(m=>c.get(JSON.stringify([m.inventory,m.name]))>1?{...m,count:void 0}:m),f=[...new Map(l.map(m=>[JSON.stringify([m.inventory,m.name]),m])).values()],T=new Set(f.map(m=>m.inventory)),p=f.length>0&&T.size===1&&f.every(m=>m.count!==void 0)?f.reduce((m,g)=>m+g.count,0):void 0;return{label:i,entries:f.sort((m,g)=>(g.count??-1)-(m.count??-1)||m.name.localeCompare(g.name)),total:p!==void 0&&Number.isSafeInteger(p)?p:void 0}})}const Sm="/assets/assessor-icon-transparent-CwoRGD4B.png";function N6(e){return d.jsx("div",{className:"empty-state empty-state-brand","aria-label":"ASSESSOR – No dataset open",children:d.jsxs("div",{className:"empty-state-content",children:[d.jsxs("div",{className:"empty-brand-mark","aria-hidden":"true",children:[d.jsx("span",{className:"empty-brand-logo",children:d.jsx("img",{src:Sm,alt:""})}),d.jsx("strong",{children:"ASSESSOR"})]}),d.jsx("p",{className:"empty-supported-formats",children:"Open a client in the Datahub and import a scan report there."})]})})}function z_(e,t,n=!1){if(!t)return e;const a=e.map(i=>{const r=new Set(i.records.flatMap(p=>p.importFileId?[p.importFileId]:[])),c=po(i.tool.label),l=t.scans.filter(p=>p.toolId===c&&p.importFileIds.some(m=>r.has(m))),f=Gu(l)[0];if(f)return{...i,score:f.score,weight:f.weight,rating:f};const T=t.policy;return T?{...i,score:Mb(T)?i.score:void 0,weight:T.weights?.[c]??T.defaultWeight}:i});if(n){const i=new Set(e.map(r=>po(r.tool.label)));for(const r of Gu(t.scans).filter(c=>!i.has(c.toolId)))a.push({tool:{id:r.toolId,label:r.scans[0].toolName,sourceValues:[],count:0},records:[],passed:r.scans.reduce((c,l)=>c+l.passed,0),deviations:r.scans.reduce((c,l)=>c+l.deviations,0),assessed:r.scans.reduce((c,l)=>c+l.assessed,0),score:r.score,weight:r.weight,rating:r})}return a}const W_={native:"Native score","inverted-native":"100 − native risk","pass-rate":"100 × passed / assessed",unavailable:"Evidence present, not scoreable"},Dc=e=>e===void 0?"—":e.toLocaleString("en-US",{maximumFractionDigits:2});function V_({sources:e,context:t,onClose:n}){const a=t?.baseline?jb(t.baseline,t.scans):void 0,i=a?.awaitingRevalidation.reduce((r,c)=>r+c.occurrenceIds.length,0)??0;return d.jsx(Ua,{title:"Scoring methodology",onClose:n,children:d.jsxs("div",{className:"security-scoring-methodology",children:[d.jsx("p",{children:"The overall score is a combined assessment index. Each scan uses its validated native score, or the pass rate when the assessed results support that calculation. Native scores and pass rates use different methods; the index is not a percentage of security."}),d.jsx("p",{children:"Each source tool has a fixed weight. Its distinct, latest verified scan scopes contribute equally within that weight. Importing the same verified scan again adds no weight. Critical findings and assessment coverage remain separate."}),d.jsx("p",{children:"Security Domain numbers are pass rates, not components of the overall index. Not relevant results are excluded; unassessed and execution-error results do not become passed checks."}),d.jsxs("table",{children:[d.jsx("caption",{children:"Score contributions · Rule 1.0.0"}),d.jsx("thead",{children:d.jsxs("tr",{children:[d.jsx("th",{children:"Source"}),d.jsx("th",{children:"Contribution"}),d.jsx("th",{children:"Weight"}),d.jsx("th",{children:"Basis"})]})}),d.jsx("tbody",{children:e.map(r=>d.jsxs("tr",{children:[d.jsx("td",{children:r.tool.label}),d.jsx("td",{children:Dc(r.score)}),d.jsx("td",{children:Dc(r.weight??1)}),d.jsx("td",{children:r.rating?r.rating.scans.map(c=>d.jsxs("div",{children:[d.jsx("strong",{children:W_[c.method]}),": ",Dc(c.score),c.nativeValue!==void 0&&d.jsxs(d.Fragment,{children:[" · Native: ",Dc(c.nativeValue)]}),d.jsxs("div",{children:[c.assessed," assessed · ",c.eligible," known eligible · Scan time: ",c.observedAt??"—"]}),c.issues.length>0&&d.jsx("div",{children:c.issues.join(" · ")})]},c.id)):d.jsxs(d.Fragment,{children:[r.passed," / ",r.assessed," passed · Pass rate"]})})]},r.tool.id))})]}),d.jsx("p",{children:"Values are rounded only for display. A missing, invalid or ambiguous native score is disclosed. Historical assessments without an explicit policy use the fixed version 1.0.0 policy."}),t?.historyUnavailable&&d.jsx("p",{children:"Historical evidence could not be fully loaded. No verified progress is available."}),a&&!t?.historyUnavailable&&d.jsxs(d.Fragment,{children:[d.jsx("h3",{children:"Comparable progress"}),d.jsxs("p",{children:[a.comparable," comparable scan scopes · Change: ",a.change===void 0?"—":`${a.change>0?"+":""}${Dc(a.change)} points`,a.scopeChanged?" · Scope or method changed; overall values are not directly comparable.":""]}),d.jsxs("p",{children:[i," previously open findings await revalidation. Historical risks retain their original scan reference and are not reported as resolved because a follow-up scan is missing."]}),a.awaitingRevalidation.filter(r=>r.occurrenceIds.length>0).map((r,c)=>d.jsxs("p",{children:[r.occurrenceIds.length," open findings · Last observed: ",r.observedAt??"—"]},`${r.assessmentId}-${c}`))]})]})})}function O6(){return{scope:"",scenario:"",businessReason:"",alternatives:"",likelihood:"",impact:"",initialRisk:"",residualRisk:"",residualAssessment:"",compensatingControls:"",controlOwner:"",controlEvidence:"",riskOwner:"",riskOwnerRole:"",riskOwnerContact:"",approver:"",approverRole:"",approverContact:"",approvalReference:"",approvedOn:"",validFrom:"",expiresOn:"",reviewOn:"",monitoring:"",reassessmentTriggers:"",exitPlan:"",obligationsReview:"",trackingReference:"",evidenceReferences:""}}const H_=["approvedOn","validFrom","expiresOn","reviewOn"];function G_(e){return/^\d{4}-\d{2}-\d{2}$/.test(e)&&Number.isFinite(Date.parse(e))&&new Date(e).toISOString().slice(0,10)===e}function X_(e,t){const n=[];if(!e||!["draft","accept","revoke"].includes(e.action))return["A valid decision action is required."];if((typeof e.recordedBy!="string"||!e.recordedBy.trim()||e.recordedBy.length>500)&&n.push("Recorded by is required (maximum 500 characters)."),(typeof e.changeReason!="string"||!e.changeReason.trim()||e.changeReason.length>4e3)&&n.push("A change / decision reason is required (maximum 4,000 characters)."),e.action==="revoke")return n;const a=e.details;if(!a||typeof a!="object"||Array.isArray(a))return[...n,"Decision details are required."];for(const i of Object.keys(O6()))typeof a[i]!="string"||a[i].length>12e3?n.push(`${i}: text is required, with at most 12,000 characters.`):e.action==="accept"&&!a[i].trim()&&i!=="evidenceReferences"&&n.push(`${i}: complete this field before recording acceptance.`);if(n.length)return n;for(const i of H_)a[i]&&!G_(a[i])&&n.push(`${i}: enter a valid date.`);for(const i of["initialRisk","residualRisk"])["","Low","Medium","High","Critical"].includes(a[i])||n.push(`${i}: select a risk level.`);return e.action==="accept"&&((a.riskOwner.trim().toLowerCase()===a.approver.trim().toLowerCase()||a.riskOwnerContact.trim().toLowerCase()===a.approverContact.trim().toLowerCase())&&n.push("Risk owner and approving authority must be different people."),a.approvedOn>t&&n.push("Approval cannot be dated in the future."),a.approvedOn>a.validFrom&&n.push("Approval must be on or before the validity start."),(a.expiresOn<=t||a.expiresOn<=a.validFrom)&&n.push("Expiry must be in the future and after the validity start."),(a.reviewOn<=t||a.reviewOna.expiresOn)&&n.push("Review must be in the future, within the validity period."),a.validFromn?"Scheduled":"Accepted":"Not recorded"}function K_(e){return e.fields.find(t=>/^(?:source|quelle):\s*scan$/i.test(t.label.trim()))?.value.trim()||e.sourceSheet?.trim()||"Assessment"}function $_(e,t,n=new Date().toISOString().slice(0,10)){const a=new Map;return e.sheets.forEach(i=>i.analysis.records.forEach(r=>{const c=t[r.id]?.riskAcceptance,l=c?.revisions.at(-1);if(!l)return;const f=r.findingOccurrenceId??l.targetOccurrenceId??r.id;a.has(f)||a.set(f,{id:f,recordId:r.id,occurrenceId:f,title:r.title||"Untitled finding",source:K_(r),state:bm(c,f,n),latest:l,revisions:c.revisions})})),[...a.values()].sort((i,r)=>r.latest.recordedAt.localeCompare(i.latest.recordedAt)||i.title.localeCompare(r.title))}function Ic(e){if(!e)return"—";const t=/^\d{4}-\d{2}-\d{2}$/.test(e)?new Date(`${e}T00:00:00Z`):new Date(e);return Number.isNaN(t.getTime())?e:new Intl.DateTimeFormat("en-GB",{day:"2-digit",month:"short",year:"numeric",timeZone:"UTC"}).format(t)}function ay(e){return e==="Accepted"||e==="Scheduled"?"current":e==="Review due"||e==="Draft"?"attention":e==="Expired"||e==="Review required"?"critical":"neutral"}function Gr({label:e,value:t}){return d.jsxs("div",{children:[d.jsx("dt",{children:e}),d.jsx("dd",{children:t.trim()||"—"})]})}function su({title:e,details:t,fields:n}){return d.jsxs("details",{className:"risk-register-detail-group",children:[d.jsxs("summary",{children:[d.jsx(vn,{direction:"right"}),d.jsx("h3",{children:e})]}),d.jsx("dl",{children:n.map(([a,i])=>d.jsx(Gr,{label:i,value:t[a]},a))})]})}function Y_({dataset:e,reviews:t}){const n=$_(e,t),[a,i]=H.useState(""),r=n.find(l=>l.id===a)??n[0],c=n.filter(l=>["Accepted","Scheduled","Review due","Review required"].includes(l.state)).length;return d.jsxs("section",{className:"client-risk-register","aria-labelledby":"client-risk-register-heading",children:[d.jsxs("header",{children:[d.jsxs("div",{children:[d.jsx("h2",{id:"client-risk-register-heading",children:"Accepted Risks"}),d.jsx("span",{children:"Risk register"})]}),d.jsxs("strong",{children:[n.length.toLocaleString("en-US")," recorded · ",c.toLocaleString("en-US")," current"]})]}),r?d.jsxs("div",{className:"client-risk-register-layout",children:[d.jsx("nav",{className:"client-risk-register-list","aria-label":"Accepted risks",children:n.map(l=>d.jsxs("button",{type:"button",className:`is-${ay(l.state)}`,"aria-pressed":l.id===r.id,onClick:()=>i(l.id),children:[d.jsx("i",{"aria-hidden":"true"}),d.jsxs("span",{children:[d.jsx("strong",{children:l.title}),d.jsx("small",{children:l.source})]}),d.jsx("em",{children:l.state}),d.jsxs("time",{dateTime:l.latest.details.reviewOn||l.latest.recordedAt,children:["Review ",Ic(l.latest.details.reviewOn)]})]},l.id))}),d.jsxs("article",{className:"client-risk-register-detail","aria-live":"polite",children:[d.jsxs("header",{children:[d.jsxs("div",{children:[d.jsx("span",{children:r.source}),d.jsx("h2",{children:r.title})]}),d.jsx("strong",{className:`is-${ay(r.state)}`,children:r.state})]}),d.jsxs("dl",{className:"risk-register-summary",children:[d.jsx(Gr,{label:"Initial risk",value:r.latest.details.initialRisk}),d.jsx(Gr,{label:"Residual risk",value:r.latest.details.residualRisk}),d.jsx(Gr,{label:"Valid from",value:Ic(r.latest.details.validFrom)}),d.jsx(Gr,{label:"Expires",value:Ic(r.latest.details.expiresOn)}),d.jsx(Gr,{label:"Next review",value:Ic(r.latest.details.reviewOn)}),d.jsx(Gr,{label:"Tracking reference",value:r.latest.details.trackingReference})]}),d.jsxs("div",{className:"risk-register-detail-groups",children:[d.jsx(su,{title:"Risk context",details:r.latest.details,fields:[["scope","Scope"],["scenario","Risk scenario"],["businessReason","Business rationale"],["alternatives","Alternatives considered"],["likelihood","Likelihood"],["impact","Business impact"],["residualAssessment","Residual risk assessment"]]}),d.jsx(su,{title:"Controls and monitoring",details:r.latest.details,fields:[["compensatingControls","Compensating controls"],["controlOwner","Control owner"],["controlEvidence","Control evidence"],["monitoring","Monitoring"],["reassessmentTriggers","Reassessment triggers"],["exitPlan","Exit / remediation plan"]]}),d.jsx(su,{title:"Accountability and approval",details:r.latest.details,fields:[["riskOwner","Risk owner"],["riskOwnerRole","Risk owner role / team"],["riskOwnerContact","Risk owner contact"],["approver","Approving authority"],["approverRole","Approver role / authority"],["approverContact","Approver contact"],["approvalReference","Approval evidence"],["approvedOn","Approved on"]]}),d.jsx(su,{title:"Governance and evidence",details:r.latest.details,fields:[["obligationsReview","Policy / regulatory review"],["evidenceReferences","Additional evidence"]]})]}),d.jsxs("details",{className:"risk-register-history",children:[d.jsxs("summary",{children:[d.jsx(vn,{direction:"right"}),d.jsx("h3",{children:"Decision history"}),d.jsxs("span",{children:[r.revisions.length," revisions"]})]}),d.jsx("ol",{children:[...r.revisions].reverse().map(l=>d.jsxs("li",{children:[d.jsxs("span",{children:[d.jsx("strong",{children:l.action==="accept"?"Accepted":l.action==="revoke"?"Revoked":"Draft saved"}),d.jsx("time",{dateTime:l.recordedAt,children:Ic(l.recordedAt)})]}),d.jsx("p",{children:l.changeReason}),d.jsxs("small",{children:["Recorded by ",l.recordedBy," · Revision ",l.revision]})]},l.revision))})]})]},r.id)]}):d.jsx("p",{className:"client-risk-register-empty",children:"No risk acceptance has been recorded for this assessment."})]})}const iy=new qi;function Z_(e){return new Intl.DateTimeFormat("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"}).format(new Date(e))}function J_(e,t){if(!e?.length)return!1;const n=new Set(t);return e.every(a=>n.has(a))}function M6(){const{activeScanRunIds:e,activeAssessmentIds:t,backendStatus:n,openProject:a,targetProjectId:i}=ca(),[r,c]=H.useState([]),[l,f]=H.useState(!1),[T,p]=H.useState(!1),m=H.useRef(""),g=H.useCallback(async()=>{if(!i||n!=="connected"){c([]),p(!1);return}f(!0),p(!1);try{const[y,w]=await Promise.all([iy.listProjectAssessmentHistory(i),iy.listProjectImportFiles(i)]);c(ho(w,y.assessments,y.scanRuns).filter(C=>C.scanRunIds.length>0||C.assessmentIds.some(k=>t?.includes(k))))}catch{c([]),p(!0)}finally{f(!1)}},[t,n,i]);H.useEffect(()=>{g();const y=()=>{g()};return globalThis.addEventListener("assessor:datahub-changed",y),()=>globalThis.removeEventListener("assessor:datahub-changed",y)},[g]);const S=H.useMemo(()=>r.find(y=>J_(e,y.scanRunIds)||!e?.length&&!!t?.length&&t.every(w=>y.assessmentIds.includes(w)))?.id??"",[t,e,r]);H.useEffect(()=>{if(!i||l||r.length===0||S||t?.length)return;const y=r[0],w=`${i}:${y.id}`;m.current!==w&&(m.current=w,a(i,y.scanRunIds,y.assessmentIds))},[t,l,a,S,i,r]);const x=l?"Loading timeslots …":T?"Timeslots unavailable":"No timeslots";return d.jsx("select",{className:"select work-timeslot-select","aria-label":"Timeslot",title:"Timeslot",value:S,disabled:!i||n!=="connected"||l||r.length===0,onChange:y=>{if(!i)return;const w=r.find(C=>C.id===y.target.value);w&&a(i,w.scanRunIds,w.assessmentIds)},children:r.length===0?d.jsx("option",{value:"",children:x}):d.jsxs(d.Fragment,{children:[d.jsx("option",{value:"",disabled:!0,children:"Select timeslot"}),r.map(y=>d.jsxs("option",{value:y.id,children:["Timeslot · ",Z_(y.fileDate)]},y.id))]})})}const j6=new qi;function Q_(e){return{"--share":`${e}%`}}function F6(e){const t=e.split(/\s+·\s+/),n=t.at(-1)??"";return t.length<2||!/^\d{4}-\d{2}-\d{2}(?:T.*)?$/.test(n)||Number.isNaN(Date.parse(n))?e:t.slice(0,-1).join(" · ")}function eq(e){const t=new Map;return e.forEach(n=>{const a=F6(n.label),i=a.toLocaleLowerCase("en-US"),r=t.get(i);r?(r.sourceValues.push(n.value),r.count+=n.count):t.set(i,{id:i,label:a,sourceValues:[n.value],count:n.count})}),[...t.values()]}function wm(e){if(e.state==="explicitly-absent")return e.originalValue===!1?"Not detected":"Not present";const t=e.normalizedValue??e.originalValue;return typeof t=="boolean"?t?"Enabled":"Disabled":t===null||t===""?"No value":String(t)}function tq(e,t){const[n,a]=H.useState(),[i,r]=H.useState(!1);return H.useEffect(()=>{let c=!0;return a(void 0),r(!1),e?(j6.getEnvironmentSnapshot({projectId:e,scanRunIds:t}).then(l=>{c&&a(l)}).catch(()=>{c&&r(!0)}),()=>{c=!1}):()=>{c=!1}},[e,t?.join("|")]),{snapshot:n,failed:i}}function Cm(e,t,n,a){return e?.observations.find(i=>i.property===t||!!(n&&i.label===n))}function nq(e,t){return e?.sections.find(n=>n.sectionKey===t)}const Ro="—";function Em(e){return(e??"").replace(/\s*"\s*data-bs[\s\S]*$/i,"").trim()||Ro}function wn(e,t,n){const a=Cm(e,t,n);return a?Em(wm(a)):Ro}function zr(e,t,n,a){const i=Cm(e,t,n);if(!i)return;const r=i.normalizedValue??i.originalValue,c=typeof r=="number"?r:Number(r);return Number.isFinite(c)?c:void 0}function Kn(e){return e===void 0?Ro:e.toLocaleString("en-US")}function L6(e,t,n){return nq(e,t)?.tables.find(a=>n.test(a.name.trim()))}function no(e,t,n,a){const i=L6(e,t,n),r=i?.headers.findIndex(c=>a.test(c.trim()))??-1;return!i||r<0?Ro:Em(i.rows[0]?.[r]===null||i.rows[0]?.[r]===void 0?"":String(i.rows[0][r]))}function ao(e,t,n){return L6(e,t,n)?.rows.length}function aq(e){return(e?.sections??[]).filter(t=>["license-restricted","access-denied"].includes(t.state)).map(t=>t.label)}function iq(e){return new Set((e?.observations??[]).filter(n=>n.tool.id==="maester"&&n.property==="entra.tenant_id"&&n.state==="observed").map(n=>wm(n).trim()).filter(Boolean)).size||void 0}function sq(e){const t=a=>Zu(e,"sectionUserInformation",a),n=(e?.observations??[]).filter(a=>a.property.startsWith("purple_knight.ad.category_score.")).map(a=>({label:a.label,value:Kn(zr(e,a.property))}));return{operatingSystems:U_(e),directory:[{label:"Domain",value:wn(e,"domain.fqdn","Domain")},{label:"NetBIOS name",value:wn(e,"domain.netbios_name","Netbios Name")},{label:"Forest",value:wn(e,"forest.name")},{label:"Domains",value:Kn(gp(e))},{label:"Domain functional level",value:wn(e,"domain.functional_level","Domain Functional Level")},{label:"Forest functional level",value:wn(e,"forest.functional_level","Forest Functional Level")},{label:"Schema version",value:wn(e,"forest.schema_version","Schema version")},{label:"Domain created",value:wn(e,"domain.created_at","Creation date")},{label:"Entra ID",value:wn(e,"entra.configuration_detected","Entra ID configuration detected")}],inventory:[{label:"User accounts",value:Kn(t(/^nb user accounts$/i))},{label:"Enabled / disabled",value:`${Kn(t(/^nb enabled$/i))} / ${Kn(t(/^nb disabled$/i))}`},{label:"Password never expires",value:Kn(t(/^nb pwd never expire$/i))},{label:"Computer objects",value:Kn(Zu(e,"sectionComputerInformation",/^nb computer accounts$/i))},{label:"Domain controllers",value:wn(e,"domain.controller_count","DC count")},{label:"Admin groups",value:Kn(ao(e,"sectionAdminGroups",/^admin groups list$/i))},{label:"Trusts",value:Kn(ao(e,"sectionTrustsdetails",/^trusts list$/i))},{label:"Assessed host",value:wn(e,"host.name")}],passwordPolicy:[{label:"Policy",value:no(e,"sectionPasswordPolicies",/^password policies list$/i,/^policy name$/i)},{label:"Complexity",value:no(e,"sectionPasswordPolicies",/^password policies list$/i,/^complexity$/i)},{label:"Minimum length",value:no(e,"sectionPasswordPolicies",/^password policies list$/i,/^min password length$/i)},{label:"History",value:no(e,"sectionPasswordPolicies",/^password policies list$/i,/^password history$/i)},{label:"Maximum age",value:no(e,"sectionPasswordPolicies",/^password policies list$/i,/^max password age$/i)},{label:"Lockout threshold",value:no(e,"sectionPasswordPolicies",/^password policies list$/i,/^lockout threshold$/i)}],certificates:[{label:"Certificate templates",value:Kn(ao(e,"sectionPKI",/^certificate templates list$/i))},{label:"Certificates",value:Kn(ao(e,"sectionPKI",/^certificates list$/i))},{label:"DC certificates",value:Kn(ao(e,"sectionPKI",/^dc certificates list$/i))},{label:"PKI delegations",value:Kn(ao(e,"sectionPKI",/^delegations list$/i))}],resilience:[{label:"AD Recycle Bin",value:wn(e,"domain.recycle_bin_enabled","Recycle Bin enabled")},{label:"Last AD backup",value:wn(e,"backup.last_detected_at","Last detected AD backup")},{label:"krbtgt password",value:wn(e,"kerberos.krbtgt.password_last_changed","krbtgt password last changed")},{label:"krbtgt version",value:wn(e,"kerberos.krbtgt.version","krbtgt version")},{label:"Legacy LAPS",value:wn(e,"laps.legacy.installation_date","Legacy LAPS installation date")},{label:"Windows LAPS",value:wn(e,"laps.windows.installation_date","Windows LAPS installation date")},{label:"WEF configurations",value:wn(e,"logging.wef.configuration_count","WEF configuration count")}],toolContext:[{label:"PingCastle engine",value:wn(e,"report.engine_version","PingCastle engine version")},{label:"PingCastle domain risk",value:Kn(zr(e,"risk.domain")??zr(e,"risk.global","Domain Risk Level"))},{label:"Purple Knight posture",value:Kn(zr(e,"purple_knight.ad.security_posture_score"))},{label:"Purple Knight IOEs",value:Kn(zr(e,"purple_knight.ad.ioes_found"))},{label:"Purple Knight evaluated",value:Kn(zr(e,"purple_knight.ad.evaluated"))},...n,{label:"CIS-CAT benchmark",value:wn(e,"benchmark.name")},{label:"CIS-CAT profile",value:wn(e,"benchmark.profile")},{label:"CIS-CAT score",value:Kn(zr(e,"benchmark.score"))},...(e?.observations??[]).filter(a=>a.tool.id==="maester"&&["entra.tenant_id","entra.tenant_name","report.generated_at","report.engine_version","maester.duration","maester.tests.actual_total","maester.runner.host","maester.runner.os","maester.powershell.version"].includes(a.property)).map(a=>({label:a.label.startsWith("Maester")?a.label:`Maester ${a.label}`,value:a.state==="observed"?Em(wm(a)):Ro}))],restricted:aq(e)}}function io({title:e,items:t}){const n=t.length>0&&t.every(c=>c.value===Ro),[a,i]=H.useState(!1),r=H.useId();return d.jsxs("section",{className:"client-env-group",children:[d.jsxs("h3",{className:"client-env-group-title",children:[d.jsx("span",{children:e}),n&&d.jsxs(d.Fragment,{children:[d.jsx("span",{className:"client-env-group-note",children:"not reported by source"}),d.jsx("button",{className:"client-env-group-toggle",type:"button","aria-expanded":a,"aria-controls":r,"aria-label":`${a?"Hide":"Show"} ${e} fields`,title:`${a?"Hide":"Show"} fields`,onClick:()=>i(c=>!c),children:d.jsx(vn,{direction:a?"down":"right"})})]})]}),(!n||a)&&d.jsx("dl",{className:"client-env-facts",id:r,children:t.map(c=>d.jsxs("div",{children:[d.jsx("dt",{children:c.label}),d.jsx("dd",{children:c.value})]},c.label))})]})}const sy=new WeakMap,ry=new WeakMap;function rq(e,t){const n=ry.get(e);if(n&&n.profile===t)return n.state;const a=oq(e,t);return ry.set(e,{profile:t,state:a}),a}function qa(e,t,n){return(n==="deviation"||["not-configured","conflicts","duplicates"].includes(n)||t.presentation.statusFilters.some(i=>i.value===n))&&t.matchesStatus(e,n)}function oq(e,t){return bo(e,/^status$/i)?.trim().toLowerCase()==="review required"?bo(e,/^evaluation readiness$/i)?.trim()?"reevaluation-required":"review-required":qa(e,t,"not-configured")?"not-configured":qa(e,t,"passed")?"passed":qa(e,t,"deviation")?"deviation":qa(e,t,"conflicts")?"conflicts":qa(e,t,"duplicates")?"duplicates":qa(e,t,"not-applicable")||qa(e,t,"not-relevant")?"not-applicable":qa(e,t,"not-run")||qa(e,t,"not-selected")||qa(e,t,"canceled")||qa(e,t,"skipped")||qa(e,t,"manual")?"not-run":qa(e,t,"error")||qa(e,t,"failed-to-run")?"error":"unknown"}function oy(e,t=[]){let n=0,a=0,i=0,r=0,c=0,l=0,f=0,T=0,p=0;e.forEach((g,S)=>{g==="passed"?n+=1:g==="deviation"?a+=1:g==="not-configured"?i+=1:g==="conflicts"?r+=1:g==="duplicates"?c+=1:g==="review-required"?l+=1:g==="reevaluation-required"?f+=1:(g==="unknown"||g==="not-run"||g==="error")&&(T+=1),g!=="not-applicable"&&(p+=1);const x=t[S],y=w=>w!==void 0&&!["","no","none","false","0"].includes(w.trim().toLowerCase());x&&g!=="conflicts"&&y(bo(x,/^conflict$/i))&&(r+=1),x&&g!=="duplicates"&&y(bo(x,/^duplicates$/i))&&(c+=1)});const m=n+a;return{passed:n,deviations:a,notConfigured:i,conflicts:r,duplicates:c,reviewRequired:l,reevaluationRequired:f,missingEvidence:T,assessed:m,eligible:p,unassessed:Math.max(0,p-m),score:m>0?n/m*100:void 0,coverage:p>0?Math.round(m/p*100):void 0}}function cq(e){return Hu(e)}function bo(e,t){return e.fields.find(n=>t.test(n.label.trim()))?.value}function lq(e){let t=sy.get(e);return t===void 0&&(t=bo(e,/^(?:severity|risk|priority)$/i)?.trim().toLocaleLowerCase("en-US")??"unknown",sy.set(e,t)),t}function uq(e){const t=bo(e,/^(?:source|quelle):\s*scan$/i);return t?F6(t):"Assessment"}function or(e,t){const n=e?.observations.find(r=>r.property===t&&r.state==="observed"),a=n?.normalizedValue??n?.originalValue,i=typeof a=="number"?a:Number(a);return Number.isFinite(i)?i:void 0}function Zu(e,t,n){const a=e?.sections.filter(i=>i.sectionKey===t).flatMap(i=>i.tables.flatMap(r=>{const c=r.headers.findIndex(l=>n.test(l.trim()));return c<0?[]:r.rows.flatMap(l=>{const f=Number(l[c]);return Number.isFinite(f)?[f]:[]})}))??[];return a.length?a.reduce((i,r)=>i+r,0):void 0}function gp(e){const t=or(e,"domain.count");return t!==void 0?t:new Set(e?.observations.filter(a=>a.property==="domain.fqdn"&&a.state==="observed").map(a=>String(a.normalizedValue??a.originalValue).trim().toLocaleLowerCase("en-US")).filter(Boolean)).size||void 0}function dq(e){const[t,n]=H.useState({});return H.useEffect(()=>{let a=!0;return n({}),e?(j6.listProjectGpoBackupStatus(e).then(i=>{if(!a)return;const r=i.records.filter(l=>l.processingStatus),c=r.reduce((l,f)=>l+f.gpoCount,0);n(r.length?{gpoCount:c,snapshots:r.length}:{})}).catch(()=>{a&&n({})}),()=>{a=!1}):()=>{a=!1}},[e]),t}function Tq(e){const t=new Set,n=/\{?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}?/gi;return e.forEach(a=>[a.sourceFile,...a.fields.map(i=>i.value)].filter(Boolean).forEach(i=>{String(i).match(n)?.forEach(r=>t.add(r.toLocaleLowerCase("en-US")))})),t.size||void 0}function Zr({name:e}){const t=e==="user"?d.jsxs(d.Fragment,{children:[d.jsx("circle",{cx:"12",cy:"8",r:"4"}),d.jsx("path",{d:"M4 21c0-4 3-7 8-7s8 3 8 7"})]}):e==="computer"?d.jsxs(d.Fragment,{children:[d.jsx("rect",{x:"3",y:"4",width:"18",height:"13"}),d.jsx("path",{d:"M8 21h8M12 17v4"})]}):e==="server"?d.jsxs(d.Fragment,{children:[d.jsx("rect",{x:"4",y:"3",width:"16",height:"7"}),d.jsx("rect",{x:"4",y:"14",width:"16",height:"7"}),d.jsx("path",{d:"M8 6h.01M8 17h.01M12 6h5M12 17h5"})]}):e==="policy"||e==="clipboard"?d.jsxs(d.Fragment,{children:[d.jsx("path",{d:"M7 3h8l4 4v14H7z"}),d.jsx("path",{d:"M15 3v5h5M10 12h6M10 16h6"})]}):e==="cloud"?d.jsx("path",{d:"M6 19h12a4 4 0 0 0 0-8 6 6 0 0 0-11.5-1.5A4.8 4.8 0 0 0 6 19z"}):e==="shield"||e==="scan"?d.jsxs(d.Fragment,{children:[d.jsx("path",{d:"M12 2l8 3v6c0 5-3.4 8.5-8 11-4.6-2.5-8-6-8-11V5z"}),d.jsx("path",{d:"M9 12l2 2 4-5"})]}):e==="lock"?d.jsxs(d.Fragment,{children:[d.jsx("rect",{x:"5",y:"10",width:"14",height:"11"}),d.jsx("path",{d:"M8 10V7a4 4 0 0 1 8 0v3M12 14v3"})]}):e==="code"?d.jsxs(d.Fragment,{children:[d.jsx("rect",{x:"3",y:"4",width:"18",height:"16"}),d.jsx("path",{d:"M9 9l-3 3 3 3M15 9l3 3-3 3M13 8l-2 8"})]}):e==="chart"?d.jsxs(d.Fragment,{children:[d.jsx("path",{d:"M3 20h18M5 17l4-5 3 3 6-9"}),d.jsx("path",{d:"M18 6h3v3"})]}):e==="folder"?d.jsx("path",{d:"M3 6h7l2 2h9v11H3z"}):d.jsxs(d.Fragment,{children:[d.jsx("path",{d:"M4 21V7h6v14M14 21V3h6v18M2 21h20"}),d.jsx("path",{d:"M7 10h.01M7 14h.01M17 7h.01M17 11h.01"})]});return d.jsx("svg",{className:"client-glyph",viewBox:"0 0 24 24","aria-hidden":"true",children:t})}function fq({nodeCount:e}){const t=H.useRef(null),[n,a]=H.useState({width:0,height:0,paths:[]}),i=H.useCallback(()=>{const r=t.current?.parentElement,c=r?.querySelector(".client-overall-ring"),l=[...r?.querySelectorAll(".client-domains .client-domain-score")??[]];if(!r||!c||!l.length){a(g=>g.paths.length?{width:0,height:0,paths:[]}:g);return}const f=r.getBoundingClientRect(),T=c.getBoundingClientRect(),p={x:T.right-f.left,y:T.top+T.height/2-f.top},m=l.map((g,S)=>{const x=g.getBoundingClientRect(),y={x:x.left-f.left,y:x.top+x.height/2-f.top},w=p.y+(S-(l.length-1)/2)*6,C=Math.max(24,(y.x-p.x)*.45);return`M${p.x.toFixed(1)} ${w.toFixed(1)} C${(p.x+C).toFixed(1)} ${w.toFixed(1)}, ${(y.x-C).toFixed(1)} ${y.y.toFixed(1)}, ${y.x.toFixed(1)} ${y.y.toFixed(1)}`});a(g=>g.width===f.width&&g.height===f.height&&g.paths.length===m.length&&g.paths.every((S,x)=>S===m[x])?g:{width:f.width,height:f.height,paths:m})},[]);return H.useLayoutEffect(()=>{i();const r=t.current?.parentElement;window.addEventListener("resize",i);const c=r&&typeof ResizeObserver<"u"?new ResizeObserver(()=>i()):void 0;return r&&c&&(c.observe(r),r.querySelectorAll(".client-domains, .client-overall").forEach(l=>c.observe(l))),()=>{window.removeEventListener("resize",i),c?.disconnect()}},[i,e]),d.jsx("svg",{ref:t,className:"client-posture-connectors",viewBox:`0 0 ${Math.max(1,n.width)} ${Math.max(1,n.height)}`,"aria-hidden":"true",children:n.paths.map((r,c)=>d.jsx("path",{d:r},c))})}function hq({score:e}){const t=e??0,n=e===void 0?"unknown":e<50?"critical":e<75?"medium":"passed";return d.jsxs("div",{className:`client-overall-ring tone-${n}`,role:"img","aria-label":`Overall Score: ${e===void 0?"No data":Math.round(e)}`,children:[d.jsxs("svg",{viewBox:"0 0 120 120","aria-hidden":"true",children:[d.jsx("circle",{className:"client-overall-ring-track",cx:"60",cy:"60",r:"48",pathLength:"100"}),e!==void 0&&d.jsx("circle",{className:"client-overall-ring-value",cx:"60",cy:"60",r:"48",pathLength:"100",strokeDasharray:`${t} ${100-t}`})]}),d.jsxs("span",{children:[d.jsxs("span",{className:"client-overall-ring-number",children:[d.jsx("strong",{children:e===void 0?"—":Math.round(e)}),e!==void 0&&d.jsx("small",{children:"/100"})]}),d.jsx("em",{children:"ASSESSOR"})]})]})}function so({value:e,label:t,glyph:n}){return d.jsxs("article",{className:"client-overview-fact",children:[d.jsx(Zr,{name:n}),d.jsxs("span",{children:[d.jsx("strong",{children:e??"—"}),d.jsx("small",{children:t})]})]})}function pq({domain:e,onClick:t}){const n=e.score===void 0?"unknown":e.score<50?"critical":e.score<75?"medium":"passed",a=e.assessed===0&&e.reviewRecords.length>0,i=[`${e.passed.toLocaleString("en-US")} passed`,e.notConfigured>0?`${e.notConfigured.toLocaleString("en-US")} not configured`:"",e.duplicates>0?`${e.duplicates.toLocaleString("en-US")} duplicates`:"",e.conflicts>0?`${e.conflicts.toLocaleString("en-US")} conflicts`:"",e.reviewRecords.length>0?`${e.reviewRecords.length.toLocaleString("en-US")} require review`:""].filter(Boolean).join(" · "),r=d.jsxs(d.Fragment,{children:[d.jsx("span",{className:`client-domain-score tone-${n}`,title:e.score===void 0?"Not assessed":`Pass rate ${Math.round(e.score)}%`,children:e.score===void 0?d.jsx(Zr,{name:e.glyph}):d.jsx("em",{children:Math.round(e.score)})}),d.jsxs("span",{className:"client-domain-copy",children:[d.jsx("strong",{children:e.label}),d.jsx("small",{children:i})]}),d.jsxs("b",{children:[(a?e.reviewRecords.length:e.deviations).toLocaleString("en-US"),d.jsx("small",{children:a?"Review required":"Deviations"})]})]});return d.jsx("li",{children:t?d.jsx("button",{type:"button",onClick:t,children:r}):d.jsx("div",{children:r})})}function ru(e){return e.filter(Boolean).join(" · ")}function mq({source:e,native:t,onClick:n}){const a=e.tool.label.toLocaleLowerCase("en-US").replace(/[^a-z0-9]+/g,""),i=a.includes("pingcastle")?"pingcastle":a.includes("purple")?"purple":a.includes("maester")?"maester":a.includes("cis")?"cis":a.includes("gpo")?"gpo":"other",r=e.score,c=r===void 0?"unknown":r<50?"critical":r<75?"medium":"passed",l={value:r===void 0?"—":Math.round(r),unit:"/100 ASSESSOR"},f=e.rating?.scans.filter(x=>x.nativeValue!==void 0)??[],T=f.length===1?f[0].nativeValue:void 0,p=e.reevaluationRequired&&!e.assessed?"Re-evaluation required":e.reviewRequired&&!e.assessed?"Review required":e.rating?.methods.length===1?{native:"Native score","inverted-native":"100 − native risk","pass-rate":"Pass rate",unavailable:"Not scoreable"}[e.rating.methods[0]]:e.rating?"Combined scan methods":"Pass rate",m=t.domainCount===void 0?void 0:`${t.domainCount} ${t.domainCount===1?"domain":"domains"}`,g=i==="pingcastle"?{name:"PingCastle",glyph:"scan",...l,meta:ru([T===void 0?void 0:`PingCastle risk ${T}/100`,m])||"Domain assessment"}:i==="purple"?{name:"Purple Knight",glyph:"shield",...l,meta:ru([T===void 0?void 0:`Posture ${T}/100`,`${e.deviations} deviations`])||"Identity indicators"}:i==="maester"?{name:"Maester",glyph:"cloud",...l,meta:`${e.passed.toLocaleString("en-US")} / ${e.assessed.toLocaleString("en-US")} tests passed`}:i==="cis"?{name:"CIS-CAT",glyph:"clipboard",...l,meta:ru([T===void 0?void 0:`Benchmark score ${T}`,`${e.assessed.toLocaleString("en-US")} controls`])}:i==="gpo"?{name:"GPO Analysis",glyph:"domain",...l,meta:ru([e.reevaluationRequired?`${e.reevaluationRequired.toLocaleString("en-US")} saved comparisons`:e.reviewRequired&&!e.assessed?`${e.reviewRequired.toLocaleString("en-US")} comparisons require review`:`${e.deviations.toLocaleString("en-US")} baseline deviations`,`${t.gpoCount??"—"} GPOs`])}:{name:e.tool.label,glyph:"policy",...l,meta:`${e.assessed.toLocaleString("en-US")} controls assessed`},S=d.jsxs(d.Fragment,{children:[d.jsx(Zr,{name:g.glyph}),d.jsx("span",{children:g.name}),d.jsxs("strong",{children:[g.value,d.jsx("small",{children:g.unit})]}),d.jsxs("em",{children:[p," · ",g.meta,e.rating?.issues.length?" · Provisional":""]})]});return n?d.jsx("button",{className:`client-source-${i} tone-${c}`,type:"button",onClick:n,children:S}):d.jsx("article",{className:`client-source-${i} tone-${c}`,children:S})}const ou=[],cy=new WeakMap;function gq(e,t,n,a,i){return H.useMemo(()=>{const r=e&&t?cy.get(e):void 0;if(r&&r.dataset===t&&r.profile===n&&r.reviews===a&&r.sourceFilter===i)return r.value;const c=e?l0(e,t,n,a):[],l=vq(e,n,a,c,i,t?.securityScoring);return e&&t&&cy.set(e,{dataset:t,profile:n,reviews:a,sourceFilter:i,value:l}),l},[n,e,t,a,i])}function vq(e,t,n,a,i,r){{const c=a.find(I=>/^(?:quelle|source):\s*scan$/i.test(I.label.trim())||I.source==="provenance"),l=c&&i?.values?.length?{[c.id]:i}:void 0,f=e?.analysis.records??ou,T=l?f.filter(I=>p1(I,[c],l,n)):f,p=l?g6({facets:a,records:T,filters:{},reviews:n,statusFilter:"all",matchesStatus:(I,L)=>t.matchesStatus(I,L)}):a,m=p.find(I=>I.source==="profile-status"),g=p.find(I=>I.severityScale),S=new Map,x=new Map,y=[];let w=0,C=0;T.forEach(I=>{const L=rq(I,t),le=lq(I);S.set(I,L),x.set(I,le),L==="deviation"&&(le==="critical"||le==="high")&&(y.push(I),le==="critical"?w+=1:C+=1)});const k=fP(T),E=I=>oy(I.map(L=>S.get(L)??"unknown"),I),O=eq(c?.values??[]),N=z_(O.map(I=>{const L=c?T.filter(le=>p1(le,[c],{[c.id]:{values:I.sourceValues}},n)):ou;return{tool:I,records:L,...E(L)}}).filter(I=>I.records.length>0),r,!!(e?.isProjectSheet&&!l)),B=gd.map(I=>{const L=k.get(I.id)??ou,le=E(L);return{id:I.id,label:I.label,glyph:I.glyph,records:L.filter(ue=>S.get(ue)==="deviation"),reviewRecords:L.filter(ue=>["review-required","reevaluation-required"].includes(S.get(ue)??"")),...le}}),A=k.get("unclassified")??ou,z=E(A),P=A.length?{id:"unclassified",label:"Unclassified",glyph:"scan",records:A.filter(I=>S.get(I)==="deviation"),reviewRecords:A.filter(I=>["review-required","reevaluation-required"].includes(S.get(I)??"")),...z}:void 0,K=oy(T.map(I=>S.get(I)??"unknown"),T);return{total:T.length,statusFacet:m,severityFacet:g,sourceFacet:c,tools:O,reports:c?.values.length??0,statusCount:I=>m?.values.find(L=>L.value===I)?.count??0,highSeverity:C,criticalSeverity:w,sourceScores:N,domains:B,unclassifiedDomain:P,totalResult:K,overallScore:cq(N),lowestDomain:B.flatMap(I=>I.score===void 0?[]:[I.score]).sort((I,L)=>I-L)[0],priorityRecords:y.sort((I,L)=>+(x.get(L)==="critical")-+(x.get(I)==="critical")).slice(0,3),severityOf:I=>x.get(I)??"unknown"}}}function xq({onOpenWork:e}){const t=ca(),{dataset:n,activeSheet:a,activeProfile:i,reviews:r,setStatusFilter:c,setFacetFilter:l,setPathFindingIds:f,resetFilters:T,setView:p}=t,m=tq(t.targetProjectId,t.activeScanRunIds),g=dq(t.targetProjectId),S=t.facetFilters["provenance:source-scan"],x=gq(a,n,i,r,S),y=H.useMemo(()=>sq(m.snapshot),[m.snapshot]),[w,C]=H.useState(!1),[k,E]=H.useState(!1),O=H.useMemo(()=>n?.securityScoring?.baseline?jb(n.securityScoring.baseline,n.securityScoring.scans):void 0,[n?.securityScoring]),N=H.useMemo(()=>Tq(x.sourceScores.find(_e=>/gpo/i.test(_e.tool.label))?.records??[]),[x]);if(!n||!a)return t.targetProjectId?d.jsxs("div",{className:"dashboard-page panel-is-loading",children:[d.jsx("h2",{children:"Client Info"}),d.jsx(Ao,{message:t.status})]}):d.jsx(N6,{});const{total:B,statusFacet:A,severityFacet:z,sourceFacet:P,tools:K,reports:I,statusCount:L,sourceScores:le,domains:ue,unclassifiedDomain:X,totalResult:F,overallScore:re,lowestDomain:me,priorityRecords:te,highSeverity:Ce,criticalSeverity:ee,severityOf:M}=x,Y=F.deviations,Z=F.coverage,J=or(m.snapshot,"risk.domain")??or(m.snapshot,"risk.global"),he=Zu(m.snapshot,"sectionUserInformation",/^nb user accounts$/i),ge=Zu(m.snapshot,"sectionComputerInformation",/^nb computer accounts$/i),de=or(m.snapshot,"domain.controller_count"),fe=le.find(_e=>/maester/i.test(_e.tool.label)),ye=iq(m.snapshot)??or(m.snapshot,"entra.configuration_detected")??(fe?.records.length?1:void 0),qe=g.gpoCount??N,ae={pingCastleRisk:J,purpleKnightPosture:or(m.snapshot,"purple_knight.ad.security_posture_score"),purpleKnightIoes:or(m.snapshot,"purple_knight.ad.ioes_found"),benchmarkScore:or(m.snapshot,"benchmark.score"),assessedHost:Cm(m.snapshot,"host.name")?wn(m.snapshot,"host.name"):void 0,domainCount:gp(m.snapshot),gpoCount:qe},Ne=["pingcastle","purpleknight","maester","cis-cat","gpos"],Ve=[...le].sort((_e,Xe)=>{const pt=Pt=>{const Kt=Pt.toLocaleLowerCase("en-US").replace(/[^a-z0-9]+/g,""),Dt=Ne.findIndex(dt=>Kt.includes(dt.replace(/[^a-z0-9]+/g,"")));return Dt<0?Ne.length:Dt};return pt(_e.tool.label)-pt(Xe.tool.label)||_e.tool.label.localeCompare(Xe.tool.label)}),tt=X?.deviations?[...ue,X]:ue,We=_e=>{T(),S&&P&&l(P.id,S),t.setActionOnly(!1),c("deviation"),_e(),p("columns"),e()},Le=S?.values?.length?K.find(_e=>_e.sourceValues.length===S.values.length&&_e.sourceValues.every(Xe=>S.values.includes(Xe)))?.id??"selection":"all";return d.jsxs("div",{className:"dashboard-page client-command-center",children:[d.jsxs("header",{className:"client-overview-header",children:[d.jsxs("div",{className:"client-overview-identity",children:[d.jsx("span",{children:"Client:"}),d.jsx("strong",{children:n.fileName})]}),d.jsxs("div",{className:"client-overview-assessment",children:[d.jsx("span",{children:"Assessment:"}),d.jsx(M6,{})]}),d.jsxs("label",{className:"client-overview-source",children:[d.jsx("span",{children:"Source:"}),d.jsxs("select",{value:Le,onChange:_e=>{const Xe=K.find(Pt=>Pt.id===_e.currentTarget.value);if(!P)return;const pt=p6(n,a);pt&&t.setActiveSheet(pt.id),l(P.id,Xe?{values:Xe.sourceValues}:null)},children:[d.jsx("option",{value:"all",children:"Scan · All"}),Le==="selection"&&d.jsx("option",{value:"selection",children:"Scan · Selection"}),K.map(_e=>d.jsx("option",{value:_e.id,children:_e.label},_e.id))]})]})]}),d.jsxs("section",{className:"client-overview-facts","aria-label":"Environment facts",children:[d.jsx(so,{value:gp(m.snapshot),label:"AD Domains",glyph:"domain"}),d.jsx(so,{value:ye,label:"Entra Tenant",glyph:"cloud"}),d.jsx(so,{value:he,label:"User Accounts",glyph:"user"}),d.jsx(so,{value:ge,label:"Computer Objects",glyph:"computer"}),d.jsx(so,{value:de,label:"Domain Controllers",glyph:"server"}),d.jsx(so,{value:qe,label:"GPOs",glyph:"policy"})]}),d.jsxs("div",{className:"client-overview-main",children:[d.jsxs("section",{className:"client-posture","aria-label":"Security posture",children:[d.jsx(fq,{nodeCount:tt.length}),d.jsxs("section",{className:"client-overall","aria-labelledby":"client-overall-heading",children:[d.jsx("h2",{id:"client-overall-heading",children:"Overall Score"}),d.jsx(hq,{score:re}),d.jsx("strong",{className:`client-overall-status tone-${re===void 0?"unknown":re<50?"critical":re<75?"medium":"passed"}`,children:re===void 0?F.reevaluationRequired?"Re-evaluation required":F.reviewRequired?"Review required":"Not assessed":n.securityScoring?.historyUnavailable?"History unavailable":O?.scopeChanged?"Scope changed":le.some(_e=>_e.rating?.issues.length)?"Provisional":re<50?"Action Required":re<75?"Needs Attention":"Good"}),d.jsxs("button",{className:"client-overall-critical",type:"button",disabled:ee===0||!z,onClick:()=>z&&We(()=>l(z.id,{values:["critical"]})),children:[d.jsx("b",{children:ee.toLocaleString("en-US")}),d.jsx("span",{children:"Critical Findings"})]}),d.jsxs("div",{className:"client-overall-coverage",children:[d.jsxs("span",{children:[d.jsx("strong",{children:"Assessment Coverage"}),d.jsx("b",{children:Z===void 0?"—":`${Z}%`})]}),d.jsx("i",{children:d.jsx("u",{style:Q_(Z??0)})}),d.jsxs("small",{children:[F.assessed.toLocaleString("en-US")," / ",F.eligible.toLocaleString("en-US")," eligible controls assessed"]})]}),d.jsxs("dl",{className:"client-overall-secondary",children:[d.jsxs("div",{children:[d.jsx("dt",{children:"Unassessed"}),d.jsx("dd",{children:F.unassessed.toLocaleString("en-US")})]}),d.jsxs("div",{children:[d.jsx("dt",{children:"Lowest domain pass rate"}),d.jsx("dd",{children:me===void 0?"—":`${Math.round(me)}%`})]})]})]}),d.jsxs("section",{className:"client-domains","aria-labelledby":"client-domains-heading",children:[d.jsxs("header",{children:[d.jsx("h2",{id:"client-domains-heading",children:"Security Domains"}),d.jsxs("span",{children:["Pass rates · ",Y.toLocaleString("en-US")," total deviations"]})]}),d.jsx("ul",{children:tt.map(_e=>d.jsx(pq,{domain:_e,onClick:_e.records.length?()=>We(()=>{l(r6,{values:[_e.id]})}):_e.assessed===0&&_e.reviewRecords.length?()=>We(()=>{c("all"),f(_e.reviewRecords.map(Xe=>Xe.id))}):void 0},_e.id))})]})]}),d.jsxs("aside",{className:"client-priority","aria-labelledby":"client-priority-heading",children:[d.jsxs("section",{className:"client-priority-findings",children:[d.jsxs("header",{children:[d.jsx("h2",{id:"client-priority-heading",children:"Priority Findings"}),d.jsxs("div",{children:[d.jsx("strong",{children:Y.toLocaleString("en-US")}),d.jsx("span",{children:"Deviations"})]}),d.jsxs("div",{className:"tone-critical",children:[d.jsx("strong",{children:ee.toLocaleString("en-US")}),d.jsx("span",{children:"Critical"})]}),d.jsxs("div",{className:"tone-medium",children:[d.jsx("strong",{children:Ce.toLocaleString("en-US")}),d.jsx("span",{children:"High"})]})]}),d.jsx("div",{className:"client-priority-context","aria-label":"Additional result states",children:[["passed","Passed",F.passed],["not-configured","Not configured",F.notConfigured],["duplicates","Duplicates",F.duplicates],["conflicts","Conflicts",F.conflicts]].map(([_e,Xe,pt])=>d.jsxs("button",{type:"button",disabled:pt===0,onClick:()=>We(()=>c(_e)),children:[d.jsx("strong",{children:pt.toLocaleString("en-US")}),d.jsx("span",{children:Xe})]},_e))}),d.jsx("ol",{children:te.length?te.map(_e=>d.jsx("li",{className:`tone-${M(_e)}`,children:d.jsxs("button",{type:"button",onClick:()=>We(()=>{f([_e.id])}),children:[d.jsx("small",{children:M(_e)}),d.jsx("strong",{children:_e.title}),d.jsx("span",{children:uq(_e)})]})},_e.id)):d.jsx("li",{className:"client-priority-empty",children:"No critical or high deviations"})}),d.jsx("button",{className:"btn primary client-overview-action",type:"button",onClick:()=>We(()=>c("deviation")),children:"View findings →"})]}),d.jsxs("section",{className:"client-assessment-gaps",children:[d.jsx("h2",{children:"Assessment Gaps"}),d.jsx("strong",{children:F.unassessed.toLocaleString("en-US")}),d.jsx("span",{children:"Unassessed controls"}),F.reevaluationRequired>0&&d.jsxs("div",{className:"client-gpo-readiness",role:"status",children:[d.jsx("h3",{children:"GPO re-evaluation required"}),d.jsxs("p",{children:[F.reevaluationRequired.toLocaleString("en-US")," saved comparisons await re-evaluation. Open the GPO import in Data Hub and select Re-evaluate to calculate current results."]}),d.jsx("button",{className:"btn",type:"button",onClick:()=>We(()=>c("all")),children:"View saved results"})]}),d.jsxs("dl",{children:[d.jsxs("div",{children:[d.jsxs("dt",{children:[d.jsx(Zr,{name:"clipboard"}),"Manual review"]}),d.jsx("dd",{children:(F.reviewRequired+L("manual")).toLocaleString("en-US")})]}),F.reevaluationRequired>0&&d.jsxs("div",{children:[d.jsxs("dt",{children:[d.jsx(Zr,{name:"clipboard"}),"GPO re-evaluation"]}),d.jsx("dd",{children:F.reevaluationRequired.toLocaleString("en-US")})]}),d.jsxs("div",{children:[d.jsxs("dt",{children:[d.jsx(Zr,{name:"folder"}),"Missing evidence"]}),d.jsx("dd",{children:Math.max(0,F.missingEvidence-L("manual")).toLocaleString("en-US")})]}),O&&d.jsxs("div",{children:[d.jsxs("dt",{children:[d.jsx(Zr,{name:"clipboard"}),"Awaiting revalidation"]}),d.jsx("dd",{children:n.securityScoring?.historyUnavailable?"—":O.awaitingRevalidation.reduce((_e,Xe)=>_e+Xe.occurrenceIds.length,0).toLocaleString("en-US")})]})]}),d.jsx("button",{className:"btn client-overview-action",type:"button",onClick:()=>We(()=>c(L("not-run")?"not-run":"all")),children:"Review gaps →"})]})]})]}),d.jsxs("section",{className:"client-source-overview","aria-labelledby":"client-source-overview-heading",children:[d.jsxs("header",{children:[d.jsx("h2",{id:"client-source-overview-heading",children:"Source Overview"}),d.jsx("button",{className:"btn",type:"button",onClick:()=>C(!0),children:"Scoring methodology ↗"})]}),d.jsx("div",{children:Ve.length?Ve.map(_e=>d.jsx(mq,{source:_e,native:ae,onClick:P&&_e.tool.sourceValues.length?()=>We(()=>{l(P.id,{values:_e.tool.sourceValues}),/gpo/i.test(_e.tool.label)&&c("all")}):void 0},_e.tool.id)):d.jsx("p",{className:"dashboard-empty",children:"No source results available."})})]}),w&&d.jsx(V_,{sources:le,context:n.securityScoring,onClose:()=>C(!1)}),d.jsxs("details",{className:"client-environment-detail","aria-labelledby":"client-environment-detail-heading",children:[d.jsxs("summary",{children:[d.jsx(vn,{direction:"right"}),d.jsx("h2",{id:"client-environment-detail-heading",children:"Environment Detail"}),d.jsxs("span",{className:"client-env-meta",children:[d.jsx("span",{children:m.failed?"Scanner context could not be loaded":m.snapshot?`${m.snapshot.observations.length.toLocaleString("en-US")} observations · ${m.snapshot.sections.length.toLocaleString("en-US")} sections`:"Loading scanner context…"}),y.restricted.length>0&&d.jsxs("span",{children:[y.restricted.length.toLocaleString("en-US")," restricted sections"]})]})]}),y.restricted.length>0&&d.jsxs("button",{className:"btn client-env-restricted-toggle",type:"button","aria-expanded":k,"aria-controls":"client-environment-restricted",onClick:()=>E(_e=>!_e),children:[y.restricted.length.toLocaleString("en-US")," restricted sections",d.jsx(vn,{direction:k?"down":"right"})]}),k&&y.restricted.length>0&&d.jsxs("p",{className:"client-environment-restricted",id:"client-environment-restricted",children:["Restricted by the source tool, not empty: ",y.restricted.join(", ")]}),d.jsxs("div",{className:"client-env-groups",children:[d.jsx(io,{title:"Directory",items:y.directory}),d.jsx(io,{title:"Resilience",items:y.resilience}),d.jsx(io,{title:"Inventory",items:y.inventory}),d.jsx(io,{title:"Password policy",items:y.passwordPolicy}),d.jsx(io,{title:"Certificates & PKI",items:y.certificates}),d.jsx(io,{title:"Source metrics",items:y.toolContext})]}),d.jsx(q_,{groups:y.operatingSystems})]}),d.jsx(Y_,{dataset:n,reviews:r})]})}const yq=new qi,Sq=["import","mapping","canonical","result","governance","core","other"],vh={import:{kicker:"Layer 1",label:"Import & ingestion",description:"Source files, ingestion jobs and immutable import evidence."},mapping:{kicker:"Layer 2",label:"Mapping & normalization",description:"Recognition, mapping and normalization contracts between source and domain data."},canonical:{kicker:"Layer 3",label:"Canonical model",description:"Stable assessments, findings and environment context independent of source tools."},result:{kicker:"Layer 4",label:"Result layer",description:"Read models and result projections used by Work, filters and exports."},governance:{kicker:"Supporting layer",label:"Governance & quality",description:"Reviews, validation, processing compatibility and quality controls."},core:{kicker:"Foundation",label:"Core management",description:"Projects, scan runs and shared lifecycle state."},other:{kicker:"Supporting layer",label:"Other",description:"Additional relational structures outside the primary processing layers."}};function bq(e){return Sq.map(t=>({layer:t,tables:e.filter(n=>n.layer===t)})).filter(t=>t.tables.length>0)}function wq(e){const t=e.filter(n=>n.approximateRowCount!==null);return{tables:e.length,columns:e.reduce((n,a)=>n+a.columns.length,0),relationships:e.reduce((n,a)=>n+a.foreignKeys.length,0),approximateRows:t.reduce((n,a)=>n+(a.approximateRowCount??0),0),countedTables:t.length}}function Cq({table:e,isOpen:t,onToggle:n}){const a=H.useId();return d.jsxs("article",{className:`db-structure-card${t?" is-expanded":""}`,children:[d.jsxs("button",{className:"db-structure-card-header",type:"button",onClick:n,"aria-expanded":t,"aria-controls":a,children:[d.jsxs("span",{className:"db-structure-card-copy",children:[d.jsx("span",{className:"db-structure-table-kind",children:"Table"}),d.jsx("strong",{children:e.name}),d.jsxs("span",{className:"db-structure-card-facts",children:[d.jsxs("span",{children:[e.columns.length.toLocaleString("en-US")," columns"]}),d.jsxs("span",{children:[e.foreignKeys.length.toLocaleString("en-US")," relations"]}),e.approximateRowCount!==null&&d.jsxs("span",{children:["~",e.approximateRowCount.toLocaleString("en-US")," rows"]})]})]}),d.jsx("span",{className:"db-structure-card-toggle","aria-hidden":"true",children:d.jsx(vn,{direction:t?"down":"right"})})]}),t&&d.jsxs("div",{className:"db-structure-card-body",id:a,children:[d.jsxs("section",{className:"db-structure-card-section","aria-label":`Columns in ${e.name}`,children:[d.jsxs("div",{className:"db-structure-detail-heading",children:[d.jsx("h4",{children:"Columns"}),d.jsx("span",{children:e.columns.length.toLocaleString("en-US")})]}),d.jsxs("div",{className:"db-structure-column-head","aria-hidden":"true",children:[d.jsx("span",{children:"Column"}),d.jsx("span",{children:"Type"}),d.jsx("span",{children:"Constraint"})]}),d.jsx("ul",{className:"db-structure-columns",children:e.columns.map(i=>d.jsxs("li",{children:[d.jsx("strong",{children:i.name}),d.jsx("span",{children:i.dataType}),d.jsx("small",{children:i.nullable?"Nullable":"Required"})]},i.name))})]}),d.jsxs("section",{className:"db-structure-card-section db-structure-relations","aria-label":`Relationships from ${e.name}`,children:[d.jsxs("div",{className:"db-structure-detail-heading",children:[d.jsx("h4",{children:"Relationships"}),d.jsx("span",{children:e.foreignKeys.length.toLocaleString("en-US")})]}),e.foreignKeys.length>0?d.jsx("ul",{className:"db-structure-fks",children:e.foreignKeys.map(i=>d.jsxs("li",{children:[d.jsx("strong",{children:i.column}),d.jsx("span",{"aria-hidden":"true",children:"→"}),d.jsxs("span",{children:[i.referencedTable,".",i.referencedColumn]})]},`${i.column}-${i.referencedTable}-${i.referencedColumn}`))}):d.jsx("p",{children:"No outgoing relationships."})]})]})]})}function Eq({backendStatus:e}){const[t,n]=H.useState(null),[a,i]=H.useState(!0),[r,c]=H.useState(null),[l,f]=H.useState({}),T=H.useCallback(async()=>{if(e!=="connected"){n(null),i(!1);return}i(!0),c(null);try{n(await yq.getDatabaseStructure())}catch(x){c(x instanceof Error?x.message:"Database structure could not be loaded.")}finally{i(!1)}},[e]);if(H.useEffect(()=>{T()},[T]),e!=="connected")return d.jsx("div",{className:"datahub-page",children:d.jsx(ym,{backendStatus:e,message:"The database structure will be available again once the local API is connected."})});const p=t?bq(t.tables):[],m=t?wq(t.tables):void 0,g=!!t?.tables.length&&t.tables.every(x=>l[x.name]),S=x=>{t&&f(Object.fromEntries(t.tables.map(y=>[y.name,x])))};return d.jsxs("div",{className:"datahub-page db-structure-page",children:[r&&d.jsxs("div",{className:"datahub-alert",role:"alert",children:[d.jsx("span",{children:r}),d.jsx("button",{className:"btn",type:"button",onClick:()=>{T()},children:"Reload"})]}),a&&!t?d.jsx(Ao,{message:"Loading database structure …"}):t&&d.jsxs(d.Fragment,{children:[d.jsxs("header",{className:"db-structure-intro",children:[d.jsxs("div",{className:"db-structure-intro-copy",children:[d.jsx("span",{className:"db-structure-eyebrow",children:"Database dictionary"}),d.jsx("h2",{children:"Relational schema"}),d.jsx("p",{children:"Explore how imported evidence moves through normalization into canonical and result data. Open any table to inspect its columns, constraints and relationships."})]}),d.jsxs("div",{className:"db-structure-intro-actions",children:[d.jsxs("span",{className:`db-structure-persistence is-${t.persistence}`,children:[d.jsx("i",{"aria-hidden":"true"}),t.persistence==="postgresql"?"PostgreSQL live schema":"Memory mode"]}),d.jsx("button",{className:"btn primary",type:"button",disabled:a,onClick:()=>{T()},children:a?"Loading …":"Refresh schema"})]})]}),m&&d.jsxs("section",{className:"db-structure-summary","aria-label":"Database structure summary",children:[d.jsxs("article",{children:[d.jsx("span",{children:"Tables"}),d.jsx("strong",{children:m.tables.toLocaleString("en-US")}),d.jsxs("small",{children:["Across ",p.length.toLocaleString("en-US")," active layers"]})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Columns"}),d.jsx("strong",{children:m.columns.toLocaleString("en-US")}),d.jsx("small",{children:"Typed schema fields"})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Relationships"}),d.jsx("strong",{children:m.relationships.toLocaleString("en-US")}),d.jsx("small",{children:"Declared foreign keys"})]}),d.jsxs("article",{children:[d.jsx("span",{children:"Approximate rows"}),d.jsx("strong",{children:m.countedTables>0?m.approximateRows.toLocaleString("en-US"):"—"}),d.jsx("small",{children:m.countedTables>0?`Reported by ${m.countedTables.toLocaleString("en-US")} tables`:"No estimates reported"})]})]}),d.jsxs("div",{className:"db-structure-toolbar",children:[d.jsxs("p",{className:"db-structure-meta",children:["Schema snapshot ",d.jsx("time",{dateTime:t.generatedAt,children:new Date(t.generatedAt).toLocaleString("en-US")})]}),t.tables.length>0&&d.jsx("button",{className:"btn",type:"button",onClick:()=>S(!g),children:g?"Collapse all":"Expand all"})]}),t.tables.length===0?d.jsxs("div",{className:"datahub-empty",children:[d.jsx("h3",{children:"No tables found"}),d.jsx("p",{children:"The current persistence mode has no relational schema available to introspect."})]}):d.jsx("div",{className:"db-structure-layers",children:p.map(x=>d.jsxs("section",{className:"db-structure-layer",children:[d.jsxs("header",{className:"db-structure-layer-header",children:[d.jsxs("div",{children:[d.jsx("span",{children:vh[x.layer].kicker}),d.jsx("h3",{children:vh[x.layer].label}),d.jsx("p",{children:vh[x.layer].description})]}),d.jsxs("strong",{children:[x.tables.length.toLocaleString("en-US")," ",x.tables.length===1?"table":"tables"]})]}),d.jsx("div",{className:"db-structure-grid",children:x.tables.map(y=>{const w=y.name,C=l[w]??!1;return d.jsx(Cq,{table:y,isOpen:C,onToggle:()=>f(k=>({...k,[w]:!C}))},w)})})]},x.layer))})]})]})}const kq={sourceKind:"sourceKind",sourceTool:"sourceTool",severity:"severity",outcome:"outcome",technicalExecutionState:"technicalExecutionState",resultType:"resultType",processingStatus:"processingStatus",reviewDisposition:"reviewDisposition",lifecycleState:"lifecycleState",environmentState:"environmentState",environmentProperty:"environmentProperty",environmentSubjectType:"environmentSubjectType",policyClassification:"policyClassification"},ly=new Set(["reviewStatus","effectiveState"]);function uy(e,t){const n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n.size?[...n]:void 0}function dy({facet:e,value:t,label:n,onChange:a}){const i=["all",...e.values.filter(r=>r.count>0).map(r=>r.value)];return t!==void 0&&!i.includes(String(t))&&i.push(String(t)),d.jsxs("section",{className:"results-filter-group",children:[d.jsx("h3",{children:e.label}),d.jsx("div",{className:"results-filter-segmented",role:"group","aria-label":n,children:i.map(r=>{const c=r==="all"?t===void 0:t===(r==="true"),l=r==="all"?void 0:e.values.find(f=>f.value===r)?.count??0;return d.jsxs("button",{type:"button",className:c?"active":"","aria-pressed":c,onClick:()=>a(r==="all"?void 0:r==="true"),children:[r==="all"?"All":r==="true"?"Yes":"No",l!==void 0?` (${l.toLocaleString("en-US")})`:""]},r)})})]})}function Aq({facets:e,selected:t,onChange:n,onReset:a}){const i=e.find(T=>T.id==="deviation"),r=e.find(T=>T.id==="isIoe"),c=e.find(T=>T.id==="category"),l=e.filter(T=>ly.has(T.id)),f=e.filter(T=>T.id!=="isIoe"&&T.id!=="deviation"&&T.id!=="category"&&T.id!=="mappingRuleVersion"&&T.id!=="sourceProfileVersion"&&!ly.has(T.id));return d.jsxs("div",{className:"results-filter-panel",children:[i&&d.jsx(dy,{facet:i,value:t.deviation,label:"Deviation filter",onChange:T=>n({...t,deviation:T})}),r&&d.jsx(dy,{facet:r,value:t.isIoe,label:"IOE filter",onChange:T=>n({...t,isIoe:T})}),f.map(T=>{const p=kq[T.id],m=t[p]??[];return d.jsxs("section",{className:"results-filter-group",children:[d.jsx("h3",{children:T.label}),T.values.length===0?d.jsx("p",{className:"results-filter-empty",children:"No values"}):d.jsx("ul",{className:"results-filter-options",children:T.values.map(g=>{const S=m.includes(g.value),x=uy(m,g.value);return d.jsx("li",{children:d.jsxs("label",{children:[d.jsx("input",{type:"checkbox",checked:S,onChange:()=>n({...t,[p]:x})}),d.jsx("span",{title:g.label,children:g.label}),d.jsx("b",{children:g.count.toLocaleString("en-US")})]})},g.value)})})]},T.id)}),c&&d.jsxs("section",{className:"results-filter-group",children:[d.jsx("h3",{children:c.label}),c.values.length===0?d.jsx("p",{className:"results-filter-empty",children:"No values"}):d.jsx("ul",{className:"results-filter-options",children:c.values.map(T=>{const p=t.categoryValue??[],m=p.includes(T.value);return d.jsx("li",{children:d.jsxs("label",{children:[d.jsx("input",{type:"checkbox",checked:m,onChange:()=>n({...t,categoryValue:uy(p,T.value)})}),d.jsxs("span",{title:T.label,children:[T.namespace?`${T.namespace} · `:"",T.label]}),d.jsx("b",{children:T.count.toLocaleString("en-US")})]})},`${T.namespace??""}:${T.value}`)})})]}),l.map(T=>d.jsxs("section",{className:"results-filter-group results-filter-readonly",children:[d.jsx("h3",{children:T.label}),d.jsx("ul",{className:"results-filter-options",children:T.values.map(p=>d.jsxs("li",{children:[d.jsx("span",{children:p.label}),d.jsx("b",{children:p.count.toLocaleString("en-US")})]},p.value))})]},T.id)),d.jsx("button",{className:"btn results-filter-reset",type:"button",onClick:a,children:"Reset filters"})]})}const Ju={download({fileName:e,text:t,mediaType:n}){const a=document.createElement("a");a.href=URL.createObjectURL(new Blob([t],{type:n})),a.download=e,a.hidden=!0,document.body.appendChild(a),a.click(),URL.revokeObjectURL(a.href),a.remove()}};function yd(e,t,n,a){e.download({fileName:t,text:n,mediaType:a})}const xh=new qi,yh=50,Ty={deviation:!0};function Rq({backendStatus:e,projectId:t,scanRunIds:n,assessmentIds:a}){const[i,r]=H.useState(()=>({...Ty})),[c,l]=H.useState(yh),[f,T]=H.useState(null),[p,m]=H.useState(null),[g,S]=H.useState(!0),[x,y]=H.useState(!1),[w,C]=H.useState(null),[k,E]=H.useState(null),O=S6(n,a),N=H.useCallback(async()=>{if(e!=="connected"||!t||!O){T(null),m(null),S(!1);return}S(!0),C(null);try{const K={...i,projectId:t,scanRunIds:n,assessmentIds:a},[I,L]=await Promise.all([xh.queryUnifiedResultFacets(K),xh.queryUnifiedResults({...K,offset:0,limit:c})]);T(I),m(L)}catch(K){C(K instanceof Error?K.message:"Results could not be loaded.")}finally{S(!1)}},[e,t,n,a,O,i,c]);H.useEffect(()=>{N()},[N]);const B=K=>{E(null),l(yh),r(K)},A=async()=>{if(!(!t||!O)){y(!0),C(null);try{const K={...i,projectId:t,scanRunIds:n,assessmentIds:a},I=await dm(le=>xh.queryUnifiedResults(le),K),L=new Date().toISOString();yd(Ju,ZF(L),YF(K,I,L),"application/x-ndjson;charset=utf-8")}catch(K){C(K instanceof Error?K.message:"Filtered results could not be exported.")}finally{y(!1)}}},P=f?.facets.find(K=>K.id==="processingStatus")?.values.filter(K=>["unknown","incompatible","reimport-recommended"].includes(K.value))??[];return e!=="connected"?d.jsx("div",{className:"datahub-page",children:d.jsx(ym,{backendStatus:e,message:"Results will be available again once the local API is connected."})}):t?O?d.jsxs("div",{className:"datahub-page results-browser-page",children:[w&&d.jsxs("div",{className:"datahub-alert",role:"alert",children:[d.jsx("span",{children:w}),d.jsx("button",{className:"btn",type:"button",onClick:()=>{N()},children:"Reload"})]}),g&&!p?d.jsx(Ao,{message:"Loading results …"}):d.jsxs("div",{className:"results-browser-layout",children:[d.jsx(Aq,{facets:f?.facets??[],selected:i,onChange:B,onReset:()=>B({...Ty})}),d.jsxs("div",{className:"results-browser-table-wrap",children:[P.length>0&&d.jsx("div",{className:"datahub-alert results-processing-alert",role:"status",children:d.jsxs("span",{children:[d.jsx("strong",{children:"Processing readiness:"})," ",P.map(K=>`${vp(K.value)} (${K.count.toLocaleString("en-US")})`).join(" · "),". Comparisons with unknown or incompatible contracts are blocked; reimport the original source with the current profile where recommended."]})}),d.jsxs("div",{className:"page-actions-row",children:[d.jsxs("p",{className:"db-structure-meta",children:[(p?.total??0).toLocaleString("en-US")," hits",p&&p.total>p.items.length?` · ${p.items.length.toLocaleString("en-US")} loaded`:""]}),d.jsxs("div",{className:"page-action-buttons",children:[d.jsx("button",{className:"btn",type:"button",disabled:g,onClick:()=>{N()},children:g?"Loading …":"Refresh"}),d.jsx("button",{className:"btn primary",type:"button",disabled:g||x||!p?.total,onClick:()=>{A()},children:x?"Exporting …":"Export JSONL"})]})]}),p?.items.length?d.jsxs("div",{className:"results-browser-table",role:"table","aria-label":"Results",children:[d.jsxs("div",{className:"results-browser-row results-browser-head",role:"row",children:[d.jsx("span",{children:"Title"}),d.jsx("span",{children:"Severity"}),d.jsx("span",{children:"Outcome"}),d.jsx("span",{children:"Result Type"}),d.jsx("span",{children:"IOE"}),d.jsx("span",{children:"Deviation"}),d.jsx("span",{children:"Tool"}),d.jsx("span",{children:"Processing"}),d.jsx("span",{children:"Review"})]}),p.items.map(K=>d.jsx(Dq,{item:K,expanded:k===K.resultProjectionId,onToggle:()=>E(I=>I===K.resultProjectionId?null:K.resultProjectionId)},K.resultProjectionId))]}):d.jsxs("div",{className:"datahub-empty",children:[d.jsx("h3",{children:"No hits"}),d.jsx("p",{children:"No result matches the current filter combination."})]}),p&&p.total>p.items.length&&d.jsx("button",{className:"btn",type:"button",disabled:g,onClick:()=>l(K=>K+yh),children:"Load more"})]})]})]}):d.jsx("div",{className:"datahub-page",children:d.jsxs("div",{className:"datahub-empty",children:[d.jsx("h3",{children:"No timeslot selected"}),d.jsx("p",{children:"Select a timeslot in Work to browse exactly this assessment state."})]})}):d.jsx("div",{className:"datahub-page",children:d.jsxs("div",{className:"datahub-empty",children:[d.jsx("h3",{children:"No client selected"}),d.jsx("p",{children:"Open a client in the Datahub first to browse its results."})]})})}function Dq({item:e,expanded:t,onToggle:n}){const a=e.sourceKind==="environment-observation",i=e.sourceKind==="policy-observation",r=e.sourceKind==="policy-evaluation"&&!!e.policyBaselineLabel,c=a||i;return d.jsxs("div",{className:`results-browser-row${t?" expanded":""}`,role:"row",children:[d.jsxs("button",{className:"results-browser-row-toggle",type:"button",onClick:n,"aria-expanded":t,children:[d.jsxs("span",{"data-label":"Title",className:"results-browser-title",children:[d.jsx(vn,{direction:t?"down":"right"}),e.title]}),d.jsx("span",{"data-label":"Severity",children:c?"Context":e.severityNormalized}),d.jsx("span",{"data-label":"Outcome",className:c?"":"outcome-mark","data-outcome":c?void 0:e.outcomeNormalized,children:a?e.environmentState:i?e.policyIdentityStatus:e.sourceKind==="policy-evaluation"&&e.policyCustomerState==="missing"&&e.outcomeNormalized==="informational"?"Not configured":e.outcomeNormalized}),d.jsx("span",{"data-label":"Result Type",children:a?"Environment":i?"GPO Observation":e.resultType}),d.jsx("span",{"data-label":"IOE",children:c?"–":e.isIoe?"Yes":"No"}),d.jsx("span",{"data-label":"Deviation",children:c?"–":e.isDeviation?"Yes":"No"}),d.jsx("span",{"data-label":"Tool",children:e.sourceTool??"–"}),d.jsx("span",{"data-label":"Processing",children:vp(e.processingStatus)}),d.jsx("span",{"data-label":"Review",children:a?"–":e.reviewStatus})]}),t&&d.jsxs("div",{className:"results-browser-row-detail",children:[a&&d.jsxs("div",{className:"results-environment-value",children:[d.jsx("strong",{children:e.environmentProperty}),d.jsx("p",{children:Wr(e.environmentNormalizedValue)})]}),i&&d.jsxs("div",{className:"results-environment-value",children:[d.jsx("strong",{children:e.policyIdentityKey}),d.jsx("p",{children:Wr(e.policyValues)})]}),e.description&&d.jsx("p",{children:e.description}),e.recommendation&&d.jsxs("p",{children:[d.jsx("strong",{children:"Recommendation:"})," ",e.recommendation]}),d.jsxs("ul",{children:[d.jsxs("li",{children:["Source: ",e.sourceProfileId??"–","@",e.sourceProfileVersion??"–"]}),d.jsxs("li",{children:["Processing: profile ",e.sourceProfileVersion??"–"," · mapping ",e.mappingRuleVersion??"–"," · normalization ",e.normalizationRuleVersion??"–"," · presentation ",e.presentationVersion??"–"]}),d.jsxs("li",{children:["Compatibility: ",e.processingCompatibilityKey??"unknown"," · ",vp(e.processingStatus)]}),e.policyClassification&&d.jsxs("li",{children:["Result Status: ",jF[e.policyClassification],e.policySourceCount?` · ${e.policySourceCount.toLocaleString("en-US")} sources`:""]}),e.processingStatus==="reimport-recommended"&&d.jsxs("li",{children:["Reprocessing: ",e.reprocessingAvailable?"retained source available":"original source must be uploaded again"]}),a?d.jsxs(d.Fragment,{children:[d.jsxs("li",{children:["Subject class: ",e.environmentSubjectType??"–"]}),d.jsxs("li",{children:["State: ",e.environmentState??"unknown"," · Value type: ",e.environmentValueType??"unknown"]}),d.jsxs("li",{children:["Disclosure: ",e.supplementalDisclosureClass??"–"," · policy ",e.supplementalDisclosurePolicyVersion??"–"]})]}):i?d.jsxs(d.Fragment,{children:[d.jsxs("li",{children:["Scope: ",e.policyScope??"–"," · Delivery: ",e.policyDeliveryMechanism??"–"]}),d.jsxs("li",{children:["Policy state: ",e.policyState??"–"," · Identity: ",e.policyIdentityStatus??"unresolved"]}),d.jsxs("li",{children:["Backup instance: ",e.policyBackupInstanceId??"–"]}),d.jsxs("li",{children:["Diagnostics: ",e.policyDiagnosticCodes?.join(", ")||"none"]}),d.jsxs("li",{children:["Source locator: ",Wr(e.sourceLocator)]})]}):r?d.jsxs(d.Fragment,{children:[d.jsxs("li",{children:["Baseline: ",e.policyBaselineLabel]}),d.jsxs("li",{children:["Scope: ",e.policyScope??"–"," · Delivery: ",e.policyDeliveryMechanism??"–"]}),d.jsxs("li",{children:["Actual: ",Wr(e.policyActualValue)]}),e.policyBaselineVariantAssessment?d.jsxs("li",{children:[fm(e.policyBaselineVariantAssessment),d.jsx("p",{children:"No effective device state or GPO application is established by this backup comparison."}),d.jsx("ul",{children:e.policyBaselineVariantAssessment.variants.map(l=>d.jsxs("li",{children:["Setting reference: ",l.settingId," · Value comparison: ",l.comparator.relation,d.jsxs("p",{children:["Expected: ",Wr(l.comparator.baseline)]}),d.jsxs("p",{children:["Original baseline value: ",Wr(l.baselineValues)]})]},l.settingId))})]}):d.jsxs("li",{children:["Baseline value: ",Wr(e.policyBaselineValue)]}),d.jsxs("li",{children:["Comparison: ",e.policyComparisonRelation??"–"," · Customer state: ",e.policyCustomerState??"–"]}),d.jsxs("li",{children:["Diagnostics: ",e.policyDiagnosticCodes?.join(", ")||"none"]})]}):d.jsxs(d.Fragment,{children:[d.jsxs("li",{children:["Rule ID: ",e.sourceRuleId??"–"]}),d.jsxs("li",{children:["Affected Object: ",e.affectedAsset??"–"]})]}),d.jsxs("li",{children:["Categories: ",e.categories.map(l=>l.categoryLabel).join(", ")||"–"]})]})]})]})}function Wr(e){return e===void 0?"–":typeof e=="string"?e||"–":typeof e=="number"||typeof e=="boolean"?String(e):e===null?"null":JSON.stringify(e)}function vp(e){return e==="current"?"Current":e==="compatible-older"?"Compatible older":e==="reimport-recommended"?"Reimport recommended":e==="incompatible"?"Incompatible":"Unknown"}const fy="__severity_multi__",Iq=["critical","high","medium","low","info"],Nq={critical:"Crit",high:"High",medium:"Med",low:"Low",info:"Inf"};function Oq(e){return Iq.filter(t=>e.includes(t)).map(t=>Nq[t]).join("-")}function hy(e){return e===void 0?void 0:new Date(e).toISOString().slice(0,10)}function Cu(e){const t=e.confidence?` · Mapping confidence: ${e.confidence}`:"";return`${e.label}${t}${e.description?` · ${e.description}`:""}`}function Mq({facet:e,selected:t,onFilter:n}){const[a,i]=H.useState(!1),r=t?.values?.[0]??"",c=a?e.values:e.values.filter(f=>f.value===r),l=()=>{a||vd.flushSync(()=>i(!0))};return d.jsxs("select",{className:`select dynamic-facet-select is-gpo-backup${r?" is-filtered":""}`,"aria-label":e.label,title:Cu(e),value:r,onPointerDown:l,onFocus:l,onKeyDown:l,onBlur:()=>i(!1),onChange:f=>n(e.id,f.target.value?{values:[f.target.value]}:null),children:[d.jsxs("option",{value:"",children:[e.label,": All"]}),c.map(f=>d.jsxs("option",{value:f.value,children:[f.label," · ",f.count," comparisons"]},f.value))]})}function jq(e,t,n,a,i,r){if(e.source==="profile-status"){const m=n!==a;return d.jsxs("select",{className:`select dynamic-facet-select${m?" is-filtered":""}`,value:n,onChange:g=>i(g.target.value),title:Cu(e),"aria-label":e.label,children:[d.jsxs("option",{value:"all",children:[e.label,": All"]}),e.values.map(g=>d.jsxs("option",{value:g.value,children:[g.label," · ",g.count]},g.value))]},e.id)}const c=t[e.id];if(e.derivedKind==="policy-failing-backup")return d.jsx(Mq,{facet:e,selected:c,onFilter:r},e.id);if(e.kind==="category"){const m=!!c?.values?.length,g=c?.values??[],S=!!(e.severityScale&&g.length>1),x=S?fy:g[0]??"",y=/^(?:quelle|source):\s*scan$/i.test(e.label.trim());return d.jsxs("select",{className:`select dynamic-facet-select${y?" is-source-scan":""}${m?" is-filtered":""}`,value:x,onChange:w=>r(e.id,w.target.value?{values:[w.target.value]}:null),title:Cu(e),"aria-label":e.label,children:[S&&d.jsx("option",{value:fy,children:Oq(g)}),d.jsxs("option",{value:"",children:[e.label,": All"]}),e.values.map(w=>d.jsxs("option",{value:w.value,children:[w.label," · ",w.count]},w.value))]},e.id)}const l=!!(c?.minimum||c?.maximum),f=e.kind==="date-range"?"date":"number",T=e.kind==="date-range"?hy(e.minimum):e.minimum,p=e.kind==="date-range"?hy(e.maximum):e.maximum;return d.jsxs("span",{className:`dynamic-range-filter${l?" is-filtered":""}`,title:Cu(e),children:[d.jsx("span",{children:e.label}),d.jsx("input",{className:"input",type:f,value:c?.minimum??"",min:T,max:p,placeholder:"Min","aria-label":`${e.label} Minimum`,onChange:m=>r(e.id,{...c,minimum:m.target.value})}),d.jsx("input",{className:"input",type:f,value:c?.maximum??"",min:T,max:p,placeholder:"Max","aria-label":`${e.label} Maximum`,onChange:m=>r(e.id,{...c,maximum:m.target.value})})]},e.id)}function Fq({facets:e,filters:t,statusFilter:n,defaultStatusFilter:a="all",onStatusFilter:i,onFilter:r}){const c=LP(e),l=f=>jq(f,t,n,a,i,r);return d.jsxs(d.Fragment,{children:[d.jsx("div",{className:"primary-filter-group",role:"group","aria-label":"Primary filters",children:e.slice(0,c).map(l)}),e.slice(c).map(l)]})}const Lq=md(),Pq=[],py={};function km(e,t){if(!e)return Pq;const n={...t,sortColumn:"",sortDirection:"asc"};return Lq(e,y6(n),()=>{const a=l0(e,t.dataset,t.activeProfile,t.reviews),r=m6(e,a,t.facetFilters,t.reviews)==="group-policy"?l0(e,t.dataset,t.activeProfile,t.reviews,"group-policy"):a,c=gm(e,{...n,statusFilter:"all",facetFilters:py});return g6({facets:r,records:c,filters:t.facetFilters??py,reviews:t.reviews,statusFilter:t.statusFilter,matchesStatus:t.activeProfile.matchesStatus})})}function Sd(e,t){return t()}function _q(){const e=ca(),{activeSheetId:t,dataset:n,setActiveSheet:a,status:i}=e,[r,c]=H.useState(!1),l=n?.sheets.find(p=>p.id===t)??n?.sheets[0],f=r?n?.sheets:l?[l]:[],T=()=>{r||vd.flushSync(()=>c(!0))};return d.jsxs("select",{className:"select sheet-select",value:t,disabled:!n?.sheets.length,onPointerDown:T,onFocus:T,onKeyDown:T,onBlur:()=>c(!1),onChange:p=>a(p.target.value),children:[!n?.sheets.length&&d.jsx("option",{value:"",children:i?.includes("Loading")?"Loading saved client …":"No file · 0"}),f?.map(p=>d.jsxs("option",{value:p.id,children:[p.name," · ",p.analysis.records.length.toLocaleString("en-US")]},p.id))]})}function P6(){const e=ca(),{search:t,setSearch:n}=e;return d.jsx("div",{className:"search-text-group",children:d.jsxs("span",{className:"search-input-wrap",children:[d.jsx("input",{className:`input search-input${t?" is-filtered":""}`,value:t,onChange:a=>n(a.target.value.toLocaleLowerCase("en-US")),placeholder:"Search"}),d.jsx("button",{className:"search-clear-btn",type:"button",disabled:!t,onClick:()=>n(""),title:"Clear search","aria-label":"Clear search",children:"×"})]})})}function _6({hiddenFacetLabels:e=[]}){const t=ca(),{activeSheet:n,activeProfile:a,dataset:i,reviews:r,search:c,statusFilter:l,setStatusFilter:f,setActiveSheet:T,facetFilters:p,pathFindingIds:m,setFacetFilter:g,resetFilters:S,actionOnly:x}=t,y=H.useMemo(()=>Sd("filter-counts",()=>km(n,{activeProfile:a,search:c,statusFilter:l,facetFilters:p,dataset:i,actionOnly:x,reviews:r,pathFindingIds:m})),[x,a,n,i,p,m,r,c,l]),w=H.useMemo(()=>y.filter(E=>!e.includes(E.label)),[y,e]),C=a.defaults(n).statusFilter,k=H.useCallback((E,O)=>{if(E===o6&&O?.values?.length&&f("all"),E==="provenance:source-scan"&&O?.values?.length){const N=p6(i,n);N&&T(N.id)}g(E,O)},[n,i,T,g,f]);return H.useEffect(()=>{const E=new Set(y.map(N=>N.id));Object.keys(p).forEach(N=>{E.has(N)||g(N,null)}),y.forEach(N=>{if(N.source==="profile-status")return;const B=p[N.id]?.values;if(!B?.length)return;const A=new Set(N.values.map(P=>P.value)),z=B.filter(P=>A.has(P));z.length!==B.length&&g(N.id,z.length?{values:z}:null)});const O=y.find(N=>N.source==="profile-status");l!=="all"&&O&&!O.values.some(N=>N.value===l)&&f("all")},[y,p,g,f,l]),d.jsxs("div",{className:"search-tools",children:[d.jsx("button",{className:"btn standard-filter-btn",type:"button",disabled:!i||!n?.analysis.records.length,onClick:S,children:"Reset"}),d.jsx(Fq,{facets:w,filters:p,statusFilter:l,defaultStatusFilter:C,onStatusFilter:f,onFilter:k})]})}function bd(e){const{activeSheet:t,activeProfile:n,dataset:a,search:i,sortColumn:r,sortDirection:c,statusFilter:l,facetFilters:f,pathFindingIds:T,actionOnly:p,reviews:m}=ca(),g=e??l;return H.useMemo(()=>gm(t,{activeProfile:n,dataset:a,search:i,sortColumn:r,sortDirection:c,statusFilter:g,facetFilters:f,pathFindingIds:T,actionOnly:p,reviews:m}),[n,t,p,a,g,f,T,m,i,r,c])}function Ot(e,t){if(!t||!t.trim()||!e)return e;const n=t.trim(),a=e.toLocaleLowerCase("en-US"),i=n.toLocaleLowerCase("en-US");if(!a.includes(i))return e;const r=[];let c=0,l=a.indexOf(i,c);for(;l!==-1;){l>c&&r.push(e.slice(c,l));const f=e.slice(l,l+n.length);r.push(d.jsx("mark",{className:"search-highlight",children:f},`${l}-${n}`)),c=l+n.length,l=a.indexOf(i,c)}return ci(m),[]),[c,l]=H.useState(()=>({start:0,end:Math.min(e,Math.ceil((typeof window>"u"?720:window.innerHeight)/t)+n*2)})),f=H.useRef(void 0);H.useEffect(()=>{if(!a)return;const m=()=>{const x=Math.ceil(a.clientHeight/t)+n*2,y=Math.floor(a.scrollTop/t)-n,w=Math.max(0,y),C=Math.min(e,w+x);l(k=>k.start===w&&k.end===C?k:{start:w,end:C})},g=()=>{f.current===void 0&&(f.current=requestAnimationFrame(()=>{f.current=void 0,m()}))};m(),a.addEventListener("scroll",g,{passive:!0});const S=new ResizeObserver(m);return S.observe(a),()=>{a.removeEventListener("scroll",g),S.disconnect(),f.current!==void 0&&cancelAnimationFrame(f.current),f.current=void 0}},[a,e,t,n]);const T=Math.min(c.end,e),p=Math.min(c.start,T);return H.useMemo(()=>({startIndex:p,endIndex:T,paddingTop:p*t,paddingBottom:Math.max(0,e-T)*t,scrollToIndex(m){if(!a)return;const g=m*t;(ga.scrollTop+a.clientHeight)&&a.scrollTo({top:Math.max(0,g-a.clientHeight/2),behavior:"auto"})},containerRef:r}),[p,T,t,e,a,r])}const qq=44;function Bq({sheet:e,records:t,search:n}){const a=xp(t.length,qq,12),i=e.analysis.headers.length+1,r={height:a.paddingTop,padding:0,border:0},c={height:a.paddingBottom,padding:0,border:0};return d.jsx("div",{className:"table-scroll",ref:a.containerRef,children:d.jsxs("table",{children:[d.jsx("thead",{children:d.jsxs("tr",{children:[d.jsx("th",{className:"row-index",children:"#"}),e.analysis.headers.map(l=>d.jsx("th",{children:Ot(l,n)},l))]})}),d.jsxs("tbody",{children:[a.paddingTop>0&&d.jsx("tr",{"aria-hidden":"true",children:d.jsx("td",{colSpan:i,style:r})}),t.slice(a.startIndex,a.endIndex).map(l=>d.jsxs("tr",{children:[d.jsx("td",{className:"row-index",children:l.index+1}),l.fields.map(f=>d.jsx("td",{children:Ot(f.value,n)},`${l.id}-${f.index}`))]},l.id)),a.paddingBottom>0&&d.jsx("tr",{"aria-hidden":"true",children:d.jsx("td",{colSpan:i,style:c})})]})]})})}function Uq(e){const t=e.search(/\{\s*"error"\s*:/i);if(t<0)return;let n=0,a=!1,i=!1;for(let r=t;rt.id===e.toLocaleLowerCase("en-US"))?.presentation.showResultSheetTitles??!1:!1}function q6(e,t){if(!e)return;const n=ei.find(r=>r.id===e.toLocaleLowerCase("en-US"))?.presentation;if(!n?.showResultSheetTitles)return;const a=t.trim(),i=n.resultSheetTitleRules?.find(r=>r.pattern.test(a));return i?a.replace(i.pattern,i.replacement).trim():a}function Vq(e,t){if(!e)return!1;const n=ei.find(i=>i.id===e.toLocaleLowerCase("en-US"))?.presentation.resultSheetHighlightedRowPatterns;if(!n?.length)return!1;const a=t.fields.filter(i=>i.value).map(i=>i.value.trim()).join(" ").trim();return n.some(i=>i.test(a))}function Hq(e,t){if(!e)return t.highlighted?"highlight":void 0;const n=ei.find(i=>i.id===e.toLocaleLowerCase("en-US"))?.presentation,a=t.fields.filter(i=>i.value).map(i=>i.value.trim()).join(" ").trim();if(n?.resultSheetCriterionRowPatterns?.some(i=>i.test(a)))return"criterion";if(t.highlighted&&n?.resultSheetEvaluatedRowTone==="violation")return"violation";if(t.highlighted||n?.resultSheetHighlightedRowPatterns?.some(i=>i.test(a)))return"highlight"}function my(e){return e.trim().replace(/:s*$/,"").toLocaleLowerCase("en-US")}function Gq(e,t,n){const a=ei.find(p=>p.id===e?.toLocaleLowerCase("en-US"))?.presentation.resultSectionListSheetTitles;if(!a?.length)return{tableTitles:new Map,consumedSectionIndexes:new Set};const i=new Map,r=new Map;t.forEach((p,m)=>{if(!a.some(S=>S.test(p.title.trim())))return;let g="";for(const S of p.value.replace(/\r\n?/g,` +`).split(` +`)){const x=/^\s*#{1,6}\s+(.+?)\s*$/.exec(S);if(x){g=my(x[1]);continue}const y=/^\s*[-*+]\s+(.+?)\s*$/.exec(S);if(!y||!g)continue;const w=i.get(g)??[];w.push({title:y[1].trim(),sectionIndex:m}),i.set(g,w),r.set(m,(r.get(m)??0)+1)}});const c=new Map,l=new Map;for(const p of n){const m=my(q6(e,p.name)??""),g=i.get(m)?.shift();g&&(c.set(p.id,g),l.set(g.sectionIndex,(l.get(g.sectionIndex)??0)+1))}const f=new Set;for(const[p,m]of r)m>0&&l.get(p)===m&&f.add(p);const T=new Map;for(const[p,m]of c)f.has(m.sectionIndex)&&T.set(p,m.title);return{tableTitles:T,consumedSectionIndexes:f}}const Xq="Test result";function wd(e,t){const n=oa(e,t),a=ei.find(r=>r.id===n)?.presentation,i=a?.resultMessageHeaders;if(i?.length)for(const r of i){const c=e.fields.find(l=>l.value&&r.test(l.label.trim())&&B6(l,e,a));if(c)return c.value}}function B6(e,t,n){if(!n?.resultMessageHeaders?.some(i=>i.test(e.label.trim())))return!1;const a=n.statusHeaders??[/^(?:status|evaluation|result)$/i];return!a.some(i=>i.test(e.label.trim()))||!/^(?:pass(?:ed)?|fail(?:ed)?|investigate|skipped|not[ -]?run|error|unknown|manual)$/i.test(e.value.trim())?!0:t.fields.some(i=>i.value&&a.some(r=>r.test(i.label.trim()))&&!n.resultMessageHeaders?.some(r=>r.test(i.label.trim())))}function Cd(e,t){const n=oa(e,t),a=ei.find(r=>r.id===n)?.presentation,i=a?.statusHeaders??[/^(?:status|evaluation|result)$/i];for(const r of i){const c=e.fields.find(l=>l.value&&r.test(l.label.trim())&&!B6(l,e,a));if(c){const l=a?.statusDisplayRules?.find(f=>f.patterns.some(T=>T.test(c.value.trim())))?.label;return l?{...c,value:l}:c}}}function U6(e,t){const n=oa(e,t),a=ei.find(i=>i.id===n)?.presentation.resultSectionHeaders;return a?.length?e.fields.filter(i=>i.value&&a.some(r=>r.test(i.label.trim()))):[]}function Am(e,t){const n=oa(e,t),a=wd(e,t),i=n==="maester"&&a?zq(a):void 0;return[...a?[{title:Xq,value:a,...i?{diagnostic:i}:{}}]:[],...U6(e,t).map(r=>({title:r.label,value:r.value}))]}function z6(e,t){if(oa(e,t)!=="group-policy")return[];const n=r=>e.fields.find(c=>c.label.trim().toLowerCase()===r)?.value.trim()??"",a=r=>!["","no","none","false","0"].includes(r.toLowerCase()),i=n("status").toLowerCase();return[...i==="conflicts"||a(n("conflict"))?["Conflict"]:[],...i==="duplicates"||a(n("duplicates"))?["Duplicate"]:[]]}function Ed(e,t){if(oa(e,t)!=="group-policy")return[];const n=x=>e.fields.find(y=>y.label.trim().toLowerCase()===x)?.value.trim()??"",a=n("baseline"),i=/^(?:registry(?:\s+values)?)\s*[·:]\s*(.+)$/i.exec(e.title)?.[1]??"",r=(n("registry path")||i).replace(/\//g,"\\").toLowerCase(),c=n("policy type").toLowerCase(),l=/^(system access|privilege rights|registry values|event audit|kerberos policy|system services|group membership|file security|registry keys)\s*[·:]/i.exec(e.title)?.[1]??"",f=(n("policy section")||l).toLowerCase().replace(/[\s_-]/g,""),T=[],p=/\\(?:policies\\)?microsoft\\office(?:\\|$)/i.test(r),m=/\\(?:policies\\)?microsoft\\edge(?:\\|$)/i.test(r);p?T.push("Office"):m?T.push("Edge"):/\b(?:office|microsoft 365 apps|m365 apps)\b/i.test(a)?T.push("Office"):/\bmicrosoft edge\b/i.test(a)?T.push("Edge"):/\bwindows\b/i.test(a)&&T.push("Windows"),c==="advanced-audit-policy"||c==="security-template"&&f==="eventaudit"||/^system audit subcategory\s*[·:]/i.test(e.title)?T.push("Audit"):/\\(?:windows defender|windows defender security center)(?:\\|$)/i.test(r)?T.push("Defender"):/\\(?:windowsfirewall|firewallpolicy)(?:\\|$)/i.test(r)?T.push("Firewall"):/\\(?:fve|bitlocker)(?:\\|$)/i.test(r)?T.push("BitLocker"):/\\(?:laps|admPwd)(?:\\|$)/i.test(r)?T.push("LAPS"):(c==="security-template"||(!T.length||T[0]==="Windows")&&/\bsecurity baseline\b/i.test(a))&&T.push("Security");const g={systemaccess:"System Access",privilegerights:"Privilege Rights",registryvalues:"Registry Values",kerberospolicy:"Kerberos",systemservices:"System Services",groupmembership:"Restricted Groups",filesecurity:"Filesystem Security",registrykeys:"Registry Permissions"};Object.hasOwn(g,f)&&(T.includes("Security")||T.push("Security"),T.push(g[f]),f==="systemaccess"&&(/\b(?:lockoutbadcount|lockoutduration|resetlockoutcount)\b/i.test(e.title)?T.push("Account Lockout"):/\b(?:minimumpasswordage|maximumpasswordage|minimumpasswordlength|passwordcomplexity|passwordhistorysize|cleartextpassword)\b/i.test(e.title)&&T.push("Password Policy")),f==="privilegerights"&&/\bSe\w*LogonRight\b/i.test(e.title)&&T.push("Logon Rights"));const S=["Office","Edge","Audit","Defender","Firewall","BitLocker","LAPS"].some(x=>T.includes(x));if(!f&&!S&&r){T.push("Registry");const x=r.replace(/^(?:hkey_local_machine|hkey_current_user|hklm|hkcu|machine|user)\\/,"");x.startsWith("software\\")?T.push("Software"):x.startsWith("system\\")&&T.push("System")}return[...new Set(T)]}function Kq(e,t){return Cd(e,t)}function $q({record:e,title:t,bookmarked:n,selected:a,toolId:i,search:r,onOpen:c}){const l=e.fields.find(S=>/^(severity|criticality|priority)$/i.test(S.label)&&S.value),f=So(l?.value),T=Kq(e,i),p=oa(e,i),m=Yu(p,T?.value),g=z6(e,p);return d.jsxs("button",{"aria-current":a?"true":void 0,className:`record-card severity-${f}${n?" is-workspace":""}${a?" active":""}`,type:"button",onClick:c,children:[d.jsxs("span",{className:"record-title",children:[Ot(t,r),n&&d.jsx("span",{className:"action-pill",children:"Workspace"})]}),(T||g.length>0)&&d.jsxs("span",{className:"record-meta-line",children:[T&&d.jsx("span",{className:"record-meta outcome-mark","data-outcome":m,children:Ot(T.value,r)}),g.map(S=>d.jsx("span",{className:"record-diagnostic-badge","data-policy-diagnostic":S.toLowerCase(),children:S},S))]})]})}const Yq=H.memo($q,(e,t)=>e.record===t.record&&e.title===t.title&&e.bookmarked===t.bookmarked&&e.selected===t.selected&&e.toolId===t.toolId&&e.search===t.search);function Qu({filled:e=!1,size:t=16}){return d.jsx("svg",{viewBox:"0 0 24 24",width:t,height:t,"aria-hidden":"true",fill:e?"currentColor":"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinejoin:"round",children:d.jsx("path",{d:"M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"})})}function Zq(e,t){const a=[{label:"Status",pattern:/^(result|status|evaluation)$/i},{label:"Category",pattern:/^category$/i},{label:"Severity",pattern:/^(severity|criticality|priority)$/i},{label:"Weight",pattern:/^weight$/i},{label:"Score",pattern:/^score$/i}].flatMap(({label:T,pattern:p})=>{const m=T==="Status"?Cd(e,t):e.fields.find(S=>S.value?p.test(S.label.trim()):!1);if(!m)return[];const g=/^(Weight|Score)$/.test(T)?`${T}: ${m.value}`:m.value;return[{label:T,value:m.value,text:g,...T==="Severity"?{severity:So(m.value)}:{}}]}),i=M1(e,t).map(T=>({label:"CIS Category",value:T,text:T})),r=Ed(e,t).map(T=>({label:"GPO Category",value:T,text:T})),c=oa(e,t)==="group-policy"?e.fields.filter(T=>T.label.trim().toLowerCase()==="scope"&&T.value.trim()).map(T=>({label:"Scope",value:T.value.trim(),text:`Scope: ${T.value.trim()}`})):[],l=[...a.filter(T=>T.label==="Status"||T.label==="Category"),...i,...r,...c,...a.filter(T=>T.label!=="Status"&&T.label!=="Category")],f=T=>(T.label==="Scope"?T.text:T.value).trim().toLocaleLowerCase("en-US");return l.filter((T,p)=>!l.slice(0,p).some(m=>f(m)===f(T)))}function Jq(e,t){if(!t||e.length<=t)return e;const n=e.filter(c=>c.label==="CIS Category"),i=(n.length?[e.find(c=>c.label==="Status"),e.find(c=>c.label==="Weight"),n.at(-1)]:[e.find(c=>c.label==="Status"),e.find(c=>c.label==="Category"),e.find(c=>c.label==="Severity")]).filter((c,l,f)=>!!c&&f.indexOf(c)===l);for(const c of e){if(i.length>=t-1)break;i.includes(c)||i.push(c)}const r=e.length-i.length;return[...i,{label:"More",value:String(r),text:`+${r}`}]}function Qq({record:e,title:t,bookmarked:n,resultColor:a,toolId:i,search:r,badgeLimit:c,onOpen:l,onBookmark:f,onResults:T}){const p=e.fields.find(C=>/^(severity|criticality|priority)$/i.test(C.label)&&C.value),m=So(p?.value),g=oa(e,i),S=Sd("tile-badges",()=>Zq(e,g)),x=Jq(S,c),y=a?{"--result-color":a}:void 0,w=C=>{C.target!==C.currentTarget||C.key!=="Enter"&&C.key!==" "||(C.preventDefault(),l())};return d.jsxs("article",{className:`data-tile severity-${m}${n?" is-bookmarked":""}`,"data-tool":g,tabIndex:0,role:"button",onClick:l,onKeyDown:w,children:[d.jsx("span",{className:"data-tile-hex","aria-hidden":"true"}),d.jsxs("div",{className:"data-tile-content",children:[d.jsx("h3",{children:Ot(t,r)}),d.jsx("div",{className:"data-tile-badges",children:x.map(C=>C.label==="Status"?d.jsx("span",{className:"outcome-mark","data-badge-role":"status","data-outcome":Yu(g,C.value),children:Ot(C.text,r)},`${C.label}:${C.value}`):d.jsx("span",{className:`reader-severity${C.severity?` severity-${C.severity}`:""}${C.label==="More"?" tile-badge-overflow":""}`,"data-badge-role":C.label==="CIS Category"||C.label==="GPO Category"?"category":C.label.toLocaleLowerCase("en-US"),children:Ot(C.text,r)},`${C.label}:${C.value}`))})]}),d.jsxs("div",{className:"data-tile-actions",children:[d.jsx("button",{className:"reader-bookmark-btn tile-bookmark-btn",type:"button","aria-pressed":n,title:n?"Remove bookmark":"Mark as bookmark",onClick:C=>{C.stopPropagation(),f()},children:d.jsx(Qu,{filled:n})}),T&&d.jsx("button",{className:`tile-results-btn${a?" is-open":""}`,style:y,type:"button",title:"Show results",onClick:C=>{C.stopPropagation(),T()},children:"R"})]})]})}const W6=H.memo(Qq,(e,t)=>e.record===t.record&&e.title===t.title&&e.bookmarked===t.bookmarked&&e.resultColor===t.resultColor&&e.toolId===t.toolId&&e.search===t.search&&e.badgeLimit===t.badgeLimit&&!!e.onResults==!!t.onResults);function V6(e){return e.fields.filter(t=>t.value&&/^(?:result|results|result\s*(?:file|datei)|resultdatei|ergebnis|ergebnisse|ergebnisdatei)$/i.test(je(t.label)))}function ed(e){return V6(e).flatMap(t=>{const n=String(t.value??""),a=[...n.matchAll(/href\s*=\s*['"]([^'"]+)['"]/gi)].map(i=>{try{return decodeURIComponent(i[1])}catch{return i[1]}});return[ga(n),n,...a]}).filter(Boolean)}function Rm(e){const t=je(e);return!t||t.length>120||t.includes("|")?!1:/\.(?:csv|tsv|xlsx?|xlsb|ods|json|html?)\b/i.test(t)?!0:/[\\/]/.test(t)?/^[\w .\-/\\]+$/.test(t):!1}function cu(e){return ga(e).toLocaleLowerCase("de-DE").replace(/^.*[\\/]/,"").replace(/\.(?:csv|tsv|xlsx?|xlsb|ods|json|html?)\b.*$/i,"").replace(/[^a-z0-9]+/g,"")}function gy(e){return ga(e).toLocaleLowerCase("de-DE").split(/[^a-z0-9]+/).filter(t=>t.length>=4&&!["results","result","report","security","assessment"].includes(t))}function eB(e,t,n){const a=[...new Set([e.sourceFile,e.sourceSheet,e.name].filter(Boolean))];let i=0;t.forEach(f=>a.forEach(T=>{const p=cu(f),m=cu(T);!p||!m||(p===m?i=Math.max(i,120):Math.min(p.length,m.length)>=16&&(p.includes(m)||m.includes(p))&&(i=Math.max(i,100)))}));const r=a.map(cu).join(" ");n.some(f=>r.includes(cu(f)))&&(i=Math.max(i,80));const c=new Set(t.flatMap(gy)),l=a.flatMap(gy).filter(f=>c.has(f));return l.length>=3&&(i=Math.max(i,65+Math.min(10,l.length))),i}const tB=/^(?:quelle:\s*datei|source\s*file|source:\s*file)$/i;function nB(e){const t=e.fields.find(n=>tB.test(je(n.label)))?.value;return je(t)||je(e.sourceFile)}function aB(e){const t=[];for(const n of e){if(typeof n!="string")continue;const a=/source-table:(\d+)(?:\s+"([^"]+)")?/gi;let i;for(;i=a.exec(n);)t.push({tableIndex:Number(i[1]),label:je(i[2])})}return t.filter(n=>Number.isInteger(n.tableIndex)&&n.tableIndex>=0)}function vy(e,t){const n=je(e.toolId).toLocaleLowerCase("en-US"),a=je(t).toLocaleLowerCase("en-US");return!!(a&&a!=="generic"&&n&&n!=="generic"&&n!==a)}const xy=new WeakMap;function H6(e,t,n){let a=xy.get(e);a||(a=new Map,xy.set(e,a));const i=a.get(n);if(i)return i;if(!V6(e).length||t.length<2)return a.set(n,[]),[];const r=ed(e),c=t.find(w=>w.id===n)?.toolId,l=oa(e,c),f=aB(r),T=new Map(f.map(w=>[w.tableIndex,w.label]));if(T.size>0){const w=nB(e),C=t.filter(k=>!vy(k,l)&&(!w||k.sourceFile===w)&&k.sourceTableIndex!==void 0&&T.has(k.sourceTableIndex)).map(k=>{const E=T.get(k.sourceTableIndex);return E?{...k,name:E}:k});return a.set(n,C),C}const m=[...[...r,...e.fields.map(w=>ga(w.value))].join(" ").matchAll(/(?:^|[^a-z0-9])((?:SI|ID|IND)[-_ ]?\d{3,})(?=$|[^a-z0-9])/gi)].map(w=>w[1]),g=r.filter(Rm),S=g.length>0?g:m;if(!S.length)return a.set(n,[]),[];const x=t.filter(w=>!vy(w,l)).map(w=>({sheet:w,score:eB(w,S,m)})).filter(w=>!w.sheet.isProjectSheet&&w.sheet.id!==n&&w.score>=65).sort((w,C)=>C.score-w.score),y=x.length?(x[0].score>=100?x.filter(w=>w.score===x[0].score):[x[0]]).map(w=>w.sheet):[];return a.set(n,y),y}const iB="Verwandte Daten";function G6(e){return e.fields.filter(t=>t.label===iB&&t.value).flatMap(t=>t.value.split(",").map(n=>n.trim()).filter(Boolean))}function X6(e,t){const n=G6(e);if(!n.length)return[];const a=new Map(t.map(i=>[i.id,i]));return n.map(i=>a.get(qb(i))).filter(i=>!!i)}const sB=/^(?:result\s*detail|resultdetail|result\s*details|details?|ergebnisdetails?|befund|evidence|nachweis|result|results|ergebnis|ergebnisse)$/i,rB=5*1024*1024,oB=1e4,cB=256;function lB(e){const t=e.trim();if(!t.startsWith("[[")||t.length>rB)return;let n;try{n=JSON.parse(t)}catch{return}if(!Array.isArray(n)||!n.length||n.length>oB)return;const a=n.filter(c=>Array.isArray(c));if(a.length!==n.length||!a[0].length||a[0].length>cB)return;const i=a[0].map(c=>{if(typeof c!="string")return"";const l=c.indexOf(":");return l>0&&l<=120?c.slice(0,l).trim():""});if(i.some(c=>!c)||new Set(i).size!==i.length)return;const r=a.map(c=>i.map((l,f)=>{const T=c[f],p=T==null?"":String(T),m=`${l}:`;return p.startsWith(m)?p.slice(m.length).trimStart():p}));return{headers:i,rows:r}}const yy=new WeakMap;function K6(e){const t=yy.get(e);if(t)return t;const n=[...Jb(e)];for(const a of e.fields){if(!a.value||!sB.test(je(a.label)))continue;const i=VO(a.value);(i.length?i:[lB(a.value)].filter(c=>!!c)).forEach((c,l)=>{const f=[c.headers,...c.rows],T=l===0?a.label:`${a.label} (${l+1})`;n.push(es(T,f,f.map(p=>p.join(" ")).join(` +`),e.id,{sourceFile:e.sourceFile,sourceSheet:T}))})}return yy.set(e,n),n}function $6(e,t,n,a){return[...H6(e,t,n),...X6(e,t),...wd(e,a)?[]:K6(e)]}const lu=[{title:"Scope and business decision",fields:[{key:"scope",label:"Affected assets, systems and exclusions",help:"Define exactly where this exception applies. This record is linked to the current finding occurrence."},{key:"scenario",label:"Risk scenario",help:"Threat, weakness, possible event and business consequence."},{key:"businessReason",label:"Reason for accepting the risk"},{key:"alternatives",label:"Alternatives considered",help:"Document mitigation, avoidance and transfer options, their costs and why they were not chosen."},{key:"trackingReference",label:"Risk register / ticket reference",kind:"short"},{key:"obligationsReview",label:"Policy, contractual and regulatory review",help:"Record applicable obligations, consulted specialists and restrictions. Acceptance does not waive mandatory requirements."}]},{title:"Risk assessment and controls",fields:[{key:"likelihood",label:"Likelihood and supporting assumptions"},{key:"impact",label:"Business impact",help:"Consider confidentiality, integrity, availability, financial and operational impact."},{key:"initialRisk",label:"Initial risk level",kind:"risk"},{key:"residualRisk",label:"Residual risk level",kind:"risk"},{key:"residualAssessment",label:"Residual risk assessment",help:"Explain the remaining exposure and why it is within the approving authority’s tolerance."},{key:"compensatingControls",label:"Compensating controls",help:"If none, state this explicitly and explain why."},{key:"controlOwner",label:"Control owner",kind:"short"},{key:"controlEvidence",label:"Control effectiveness and verification evidence"}]},{title:"Responsibility and documented approval",fields:[{key:"riskOwner",label:"Risk owner",kind:"short"},{key:"riskOwnerRole",label:"Risk owner role / team",kind:"short"},{key:"riskOwnerContact",label:"Risk owner contact",kind:"short"},{key:"approver",label:"Independent approving authority",kind:"short"},{key:"approverRole",label:"Approver role and decision authority",kind:"short"},{key:"approverContact",label:"Approver contact",kind:"short"},{key:"approvalReference",label:"Approval evidence reference",help:"Reference an explicit, signed or otherwise attributable approval covering this scope and validity period."},{key:"approvedOn",label:"External approval date",kind:"date"}]},{title:"Validity, monitoring and exit",fields:[{key:"validFrom",label:"Valid from",kind:"date"},{key:"expiresOn",label:"Expires on",kind:"date"},{key:"reviewOn",label:"Next review",kind:"date"},{key:"monitoring",label:"Monitoring plan and review owner",help:"Specify what is monitored, by whom, how often and when to escalate."},{key:"reassessmentTriggers",label:"Early reassessment / revocation triggers",help:"For example: incidents, changed exposure, failed controls or changed business requirements."},{key:"exitPlan",label:"Exit / remediation plan and milestones"},{key:"evidenceReferences",label:"Additional evidence references (optional)",help:"Use reference IDs or locations. This form does not upload or verify evidence files."}]}],uB={draft:"Save draft",accept:"Record acceptance",revoke:"Revoke acceptance"};function dB({title:e,occurrenceId:t,value:n,onSave:a,onClose:i}){const r=n?.revisions.at(-1),[c,l]=H.useState(()=>({...O6(),...r?.details})),[f,T]=H.useState(""),[p,m]=H.useState(""),[g,S]=H.useState(!1),[x,y]=H.useState(!1),[w,C]=H.useState([]),[k,E]=H.useState(""),[O,N]=H.useState(),B=H.useRef(null),A=H.useRef(null),z=H.useRef(!1);H.useEffect(()=>{(w.length||k)&&A.current?.focus()},[w,k]);const P=H.useRef(()=>{});P.current=()=>{!x&&(!z.current||window.confirm("Discard unsaved risk acceptance entries?"))&&i()},H.useEffect(()=>{const ue=document.activeElement,X=B.current?.closest('[role="dialog"]'),F=()=>[...X?.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), summary, [tabindex="0"]')??[]];B.current?.querySelector("input, textarea")?.focus();const re=me=>{if(me.key==="Escape"&&(me.preventDefault(),P.current()),me.key!=="Tab")return;const te=F();me.shiftKey&&document.activeElement===te[0]?(me.preventDefault(),te.at(-1)?.focus()):!me.shiftKey&&document.activeElement===te.at(-1)&&(me.preventDefault(),te[0]?.focus())};return document.addEventListener("keydown",re),()=>{document.removeEventListener("keydown",re),ue?.focus()}},[]);const K=(ue,X)=>{z.current=!0,E(""),S(!1),l(F=>({...F,[ue]:X}))},I=ue=>{if(!a||x)return;const X={action:ue,details:c,recordedBy:f,changeReason:p},F=X_(X,new Date().toISOString().slice(0,10));ue==="accept"&&!g&&F.push("Confirm that the external approval covers the documented risk and scope."),C(F),!F.length&&(E(""),N(X))},L=async()=>{if(!(!a||x||!O)){y(!0),E("");try{await a(O),z.current=!1,E(O.action==="draft"?"Draft saved successfully.":O.action==="revoke"?"Revocation saved successfully.":"Acceptance saved successfully."),m(""),S(!1)}catch(ue){C([ue instanceof Error?ue.message:"Could not save. Your entries are still available."])}finally{y(!1),N(void 0)}}},le=O?lu.map(ue=>({...ue,fields:ue.fields.filter(X=>O.details[X.key].trim())})).filter(ue=>ue.fields.length):[];return d.jsx(Ua,{title:O?"Review entry":"Accepted Risk",className:O?"risk-acceptance-review-dialog":"risk-acceptance-dialog",onClose:()=>O?N(void 0):P.current(),dismissible:!x,children:O?d.jsxs("section",{className:"risk-acceptance-review","aria-label":"Accepted Risk entry review",children:[d.jsxs("div",{className:"risk-acceptance-review-intro",children:[d.jsx("strong",{children:uB[O.action]}),d.jsx("p",{children:"Review your information before it is saved."})]}),d.jsxs("dl",{className:"risk-acceptance-review-meta",children:[d.jsxs("div",{children:[d.jsx("dt",{children:"Finding"}),d.jsx("dd",{children:e})]}),d.jsxs("div",{children:[d.jsx("dt",{children:"Recorded by"}),d.jsx("dd",{children:O.recordedBy})]}),d.jsxs("div",{children:[d.jsx("dt",{children:"Change / decision reason"}),d.jsx("dd",{children:O.changeReason})]})]}),le.map(ue=>d.jsxs("section",{className:"risk-acceptance-review-group",children:[d.jsx("h3",{children:ue.title}),d.jsx("dl",{children:ue.fields.map(X=>d.jsxs("div",{children:[d.jsx("dt",{children:X.label}),d.jsx("dd",{children:O.details[X.key]})]},X.key))})]},ue.title)),O.action==="accept"&&d.jsx("p",{className:"risk-acceptance-review-confirmation",children:"External approval coverage was confirmed for this risk, scope, residual exposure and validity period."}),d.jsxs("div",{className:"risk-acceptance-review-actions",children:[d.jsx("button",{className:"btn primary",type:"button",disabled:x,onClick:()=>{L()},children:"OK"}),d.jsx("button",{className:"btn",type:"button",disabled:x,onClick:()=>N(void 0),children:"Change"})]})]}):d.jsxs("form",{ref:B,className:"risk-acceptance-form",onSubmit:ue=>{ue.preventDefault(),I("draft")},children:[d.jsx("p",{className:"risk-acceptance-context",children:e}),d.jsxs("p",{children:["Decision state: ",d.jsx("strong",{children:bm(n,t)}),". Technical findings remain unchanged."]}),d.jsx("p",{className:"risk-acceptance-note",children:"Record an external approval here. Names and references are documented, not authenticated signatures. Complete all fields except optional evidence before recording acceptance."}),r?.action==="accept"&&d.jsx("p",{children:"A new draft replaces the active decision state until acceptance is recorded again. Earlier approvals remain in the history."}),!a&&d.jsx("p",{role:"status",children:"Open a saved finding with a connected backend to save this record."}),(w.length>0||k)&&d.jsxs("div",{ref:A,tabIndex:-1,children:[w.length>0&&d.jsxs("div",{role:"alert",children:[d.jsx("strong",{children:"Review the following entries:"}),d.jsx("ul",{children:w.map((ue,X)=>d.jsx("li",{children:ue.replace(/^(\w+):/,(F,re)=>`${lu.flatMap(me=>me.fields).find(me=>me.key===re)?.label??re}:`)},X))})]}),k&&d.jsx("p",{role:"status",children:k})]}),d.jsxs("fieldset",{disabled:x,className:"risk-acceptance-fields",children:[lu.map(ue=>d.jsxs("section",{children:[d.jsx("h3",{children:ue.title}),d.jsx("div",{className:"risk-acceptance-grid",children:ue.fields.map(X=>d.jsxs("label",{children:[d.jsx("span",{children:X.label}),X.kind==="risk"?d.jsxs("select",{value:c[X.key],onChange:F=>K(X.key,F.target.value),children:[d.jsx("option",{value:"",children:"Select level"}),["Low","Medium","High","Critical"].map(F=>d.jsx("option",{children:F},F))]}):X.kind?d.jsx("input",{type:X.kind==="date"?"date":"text",maxLength:12e3,value:c[X.key],onChange:F=>K(X.key,F.target.value)}):d.jsx("textarea",{maxLength:12e3,rows:3,value:c[X.key],onChange:F=>K(X.key,F.target.value)}),X.help&&d.jsx("small",{children:X.help})]},X.key))})]},ue.title)),d.jsxs("section",{children:[d.jsx("h3",{children:"Record this revision"}),d.jsxs("div",{className:"risk-acceptance-grid",children:[d.jsxs("label",{children:[d.jsx("span",{children:"Recorded by"}),d.jsx("input",{maxLength:500,value:f,onChange:ue=>{z.current=!0,T(ue.target.value)}})]}),d.jsxs("label",{children:[d.jsx("span",{children:"Change / decision reason"}),d.jsx("textarea",{maxLength:4e3,value:p,onChange:ue=>{z.current=!0,m(ue.target.value)}})]})]})]}),d.jsxs("label",{className:"risk-acceptance-confirm",children:[d.jsx("input",{type:"checkbox",checked:g,onChange:ue=>S(ue.target.checked)}),d.jsx("span",{children:"I have verified that the referenced approval explicitly covers this risk, scope, residual exposure and validity period."})]})]}),d.jsxs("div",{className:"risk-acceptance-actions",children:[d.jsx("button",{className:"btn",type:"submit",disabled:x||!a,children:"Save draft"}),d.jsx("button",{className:"btn",type:"button",disabled:x||!a,onClick:()=>I("accept"),children:"Record acceptance"}),n?.revisions.some(ue=>ue.action==="accept")&&d.jsx("button",{className:"btn",type:"button",disabled:x||!a||r?.action==="revoke",onClick:()=>I("revoke"),children:"Revoke acceptance"}),d.jsx("button",{className:"btn",type:"button",disabled:x,onClick:()=>P.current(),children:"Close"})]}),n?.revisions.length?d.jsxs("section",{className:"risk-acceptance-history",children:[d.jsx("h3",{children:"Decision history"}),[...n.revisions].reverse().map(ue=>d.jsxs("details",{children:[d.jsxs("summary",{children:["Revision ",ue.revision," · ",ue.action," · ",ue.recordedAt]}),d.jsxs("p",{children:["Recorded by: ",ue.recordedBy]}),d.jsx("p",{children:ue.changeReason}),d.jsx("dl",{children:lu.flatMap(X=>X.fields).map(X=>d.jsxs("div",{children:[d.jsx("dt",{children:X.label}),d.jsx("dd",{children:ue.details[X.key]||"—"})]},X.key))})]},ue.revision))]}):null]})})}const TB=/^(?:(?:source|registry|file|folder|directory|binary)\s+)?path$/i,Sy=/^(?:–|—|-|not configured|not available|none)$/i;function yp(e=""){return TB.test(e.trim())}function e1(e){const t=e.trim();return!t||/[\r\n]/.test(t)||/^\w+:\/\//.test(t)?!1:/^(?:[a-z]:[\\/]|\\\\|\/(?!\/)|\.{1,2}[\\/]|%[\w()]+%[\\/]|(?:HKEY_[A-Z_]+|HKLM|HKCU|HKCR|HKU|HKCC|SOFTWARE|SYSTEM)[\\/])/i.test(t)||/^[^\s<>:\\/]+[\\/][^<>\r\n]+\.[a-z0-9]{1,12}(?:#.*)?$/i.test(t)}function ia({value:e,search:t="",label:n=""}){const a=r=>d.jsx("code",{className:"technical-path",children:Ot(r,t)});if(yp(n)&&e.trim()&&!Sy.test(e.trim()))return a(e);const i=/^(registry(?:\s+values)?\s*\u00b7\s*)(.+)$/i.exec(e.trim());return i&&(e1(i[2])||/^(?:MACHINE|USER)[\\/]/i.test(i[2]))?d.jsxs(d.Fragment,{children:[Ot(i[1],t),a(i[2])]}):d.jsx(d.Fragment,{children:e.split(/(\r?\n)/).map((r,c)=>{const l=/^((?:(?:(?:source|registry|file|folder|directory|binary)\s+)?path|key|computer policy|user policy):\s*)(.+)$/i.exec(r);return l&&!Sy.test(l[2].trim())&&(yp(l[1].split(":")[0])||e1(l[2]))?d.jsxs(H.Fragment,{children:[Ot(l[1],t),a(l[2])]},c):d.jsx(H.Fragment,{children:e1(r)?a(r):Ot(r,t)},c)})})}function fB({sources:e,search:t}){const n=Xb(e),a=n.filter(r=>r.identified).length,i=n.length-a;return d.jsxs("section",{className:"policy-source-evidence","aria-label":"GPO source contributions",children:[d.jsxs("h4",{children:[a," GPO backup ",a===1?"source":"sources",i>0?` · ${i} unassigned`:""]}),d.jsx("p",{className:"policy-source-notice",children:"Original instructions by GPO. This list is not an execution order between GPOs and does not establish the effective endpoint value."}),d.jsx("div",{className:"policy-source-groups",children:n.map(r=>{const c=r.observations.length===1?r.observations[0].baselineRelation:void 0;return d.jsxs("article",{className:`policy-source-group${c?` is-${c}`:""}`,"data-source-label":r.label,"data-source-relation":c??"unassessed",children:[d.jsxs("header",{className:"policy-source-group__header",children:[d.jsx("h5",{children:Ot(r.label,t)}),c==="review"&&d.jsx("span",{className:"policy-source-group__badge is-review",children:"Review required"})]}),r.backupLabel&&d.jsx("p",{className:"policy-source-group__backup",children:d.jsx("strong",{children:Ot(r.backupLabel,t)})}),r.observations.map((l,f)=>d.jsxs("div",{className:"policy-source-observation",children:[d.jsx("p",{className:"policy-source-reference",children:d.jsx(ia,{value:l.sourceReference,search:t})}),l.sequence!==void 0&&d.jsxs("p",{className:"policy-source-sequence",children:["Source sequence: ",l.sequence]}),l.values.map((T,p)=>d.jsx("p",{className:"policy-guidance-text policy-source-value",children:Kb(T,l.deviationFields?.[p],l.deviationItems?.[p]).map((m,g)=>{const S=m.emphasized?d.jsx("strong",{className:"policy-value-emphasis",children:d.jsx(ia,{value:m.text,search:t})}):d.jsx(ia,{value:m.text,search:t});return d.jsxs(H.Fragment,{children:[g>0&&` +`,m.deviating?d.jsx("span",{className:"policy-source-deviation-value",children:S}):S]},g)})},p)),ftd(n[i]?.getBoundingClientRect().width||Dm))}function mB(e,t){const n=Array.from(e.rows).map(i=>i.cells[t]).filter(i=>!!i);let a=Dm;for(const i of n){const r=i.style.whiteSpace,c=i.style.width;i.style.whiteSpace="nowrap",i.style.width="auto",a=Math.max(a,i.scrollWidth+2),i.style.whiteSpace=r,i.style.width=c}return td(a)}function Y6({headers:e,children:t,enabled:n=!1,className:a="rich-text-table"}){const i=e.length,r=H.useRef(null),c=H.useRef(null),[l,f]=H.useState([]),T=n&&l.length===i?l:[],p=T.length?{tableLayout:"fixed",width:`${T.reduce((w,C)=>w+C,0)}px`}:void 0,m=w=>C=>{if(!n||!r.current)return;const k=Sh(r.current,i);c.current={pointerId:C.pointerId,columnIndex:w,startX:C.clientX,startWidths:k},f(k),C.currentTarget.setPointerCapture?.(C.pointerId),C.preventDefault(),C.stopPropagation()},g=w=>{const C=c.current;if(!C||C.pointerId!==w.pointerId)return;const k=[...C.startWidths];k[C.columnIndex]=td(C.startWidths[C.columnIndex]+w.clientX-C.startX),f(k)},S=w=>{c.current?.pointerId===w.pointerId&&(c.current=null,w.currentTarget.hasPointerCapture?.(w.pointerId)&&w.currentTarget.releasePointerCapture?.(w.pointerId))},x=w=>{const C=r.current;if(!n||!C)return;const k=Sh(C,i);k[w]=mB(C,w),f(k)},y=(w,C)=>{const k=r.current;if(!n||!k)return;const E=T.length?[...T]:Sh(k,i);E[w]=td(E[w]+C),f(E)};return d.jsxs("table",{ref:r,className:`${a}${n?" is-column-resizable":""}${T.length?" has-custom-column-widths":""}`,style:p,children:[n&&d.jsx("caption",{className:"result-column-instructions",children:"Column widths can be changed by dragging a header separator or fitted by double-clicking it."}),T.length>0&&d.jsx("colgroup",{children:T.map((w,C)=>d.jsx("col",{style:pB(w)},C))}),d.jsx("thead",{children:d.jsx("tr",{children:e.map((w,C)=>d.jsxs("th",{children:[w,n&&C{k.preventDefault(),k.stopPropagation(),x(C)},onKeyDown:k=>{k.key==="Enter"&&(k.preventDefault(),x(C)),k.key==="ArrowLeft"&&(k.preventDefault(),y(C,-16)),k.key==="ArrowRight"&&(k.preventDefault(),y(C,16))}})]},C))})}),d.jsx("tbody",{children:t})]})}const gB=/<\/?(?:p|br|b|strong|i|em|u|ul|ol|li|a)\b/i,vB=/<\/?(?:p|br|b|strong|i|em|u|ul|ol|li|a)\b/i,xB=new Set(["script","style","iframe","object","embed","svg","math"]);function yB(e){const t=document.createElement("textarea");return t.innerHTML=e,t.value}function Z6(e){if(!e)return;const t=e.trim();return/^(?:https?:|mailto:)/i.test(t)?t:void 0}const SB=/https?:\/\/[^\s<>"']+/g,bB=/[.,;:!?)\]}]+$/,uu=/(Show\s+Assessment\s+Evidence|Show\s+Rule\s+Result\s+XML|(?:--?\s*)?\bMore\b)/gi;function bh(e,t,n){if(!e||!/https?:\/\//i.test(e))return d.jsx(ia,{value:e,search:n});const a=[];let i=0;for(const r of e.matchAll(SB)){const c=r[0],l=c.replace(bB,""),f=r.index??0;f>i&&a.push(Ot(e.slice(i,f),n)),a.push(d.jsx("a",{href:l,target:"_blank",rel:"noopener noreferrer",children:Ot(l,n)},`${t}-url-${f}`)),l.lengthr&&i.push(bh(e.slice(r,T),`${t}-p-${T}`,n)),/rule\s*result\s*xml/i.test(f)){const m=g=>{g.preventDefault();const S=document.querySelector(".finding-optional-detail");S&&(S.setAttribute("open","true"),S.scrollIntoView({behavior:"smooth",block:"nearest"}))};i.push(d.jsx("button",{type:"button",className:"inline-results-link",onClick:m,title:"Show Rule Result XML",children:Ot(l,n)},`${t}-trig-${T}`))}else a?i.push(d.jsx("button",{type:"button",className:"inline-results-link",onClick:a,title:"Show in Results popup",children:Ot(l,n)},`${t}-trig-${T}`)):i.push(d.jsx("span",{className:"inline-results-link-disabled",children:Ot(l,n)},`${t}-trig-${T}`));r=T+l.length}return rJ6(f,`${t}-${T}`,n||c==="a",a,i));switch(c){case"p":return d.jsx("p",{children:l},t);case"br":return d.jsx("br",{},t);case"b":case"strong":return d.jsx("strong",{children:l},t);case"i":case"em":return d.jsx("em",{children:l},t);case"u":return d.jsx("u",{children:l},t);case"ul":return d.jsx("ul",{children:l},t);case"ol":return d.jsx("ol",{children:l},t);case"li":return d.jsx("li",{children:l},t);case"a":{const f=Z6(r.getAttribute("href")),T=r.textContent?.trim()??"";return!f&&/^(Show\s+Assessment\s+Evidence|Show\s+Rule\s+Result\s+XML|(?:--?\s*)?More)$/i.test(T)?d.jsx(H.Fragment,{children:mo(T,t,a,i)},t):f?d.jsx("a",{href:f,target:"_blank",rel:"noopener noreferrer",children:l},t):d.jsx(H.Fragment,{children:mo(r.textContent??"",t,a,i)},t)}default:return d.jsx(H.Fragment,{children:l},t)}}function Yi(e,t,n,a){return e.map((i,r)=>{const c=`${t}-${r}`;switch(i.kind){case"strong":return d.jsx("strong",{children:Yi(i.children,c,n,a)},c);case"emphasis":return d.jsx("em",{children:Yi(i.children,c,n,a)},c);case"code":return e1(i.text)?d.jsx(ia,{value:i.text,search:n},c):d.jsx("code",{children:Ot(i.text,n)},c);case"link":{const l=Z6(i.href),f=i.children.map(p=>p.kind==="text"?p.text:"").join("");if(!l&&/^(Show\s+Assessment\s+Evidence|Show\s+Rule\s+Result\s+XML|(?:--?\s*)?More)$/i.test(f.trim()))return d.jsx(H.Fragment,{children:mo(f,c,n,a)},c);const T=i.children.map((p,m)=>p.kind==="text"?d.jsx(H.Fragment,{children:mo(p.text,`${c}-${m}`,n,a)},`${c}-${m}`):Yi([p],`${c}-${m}`,n,a));return l?d.jsx("a",{href:l,target:"_blank",rel:"noopener noreferrer",children:T},c):d.jsx(H.Fragment,{children:T},c)}default:return d.jsx(H.Fragment,{children:mo(i.text,c,n,a)},c)}})}function wB(e,t,n,a,i=!1){switch(e.kind){case"heading":{const r=e.level<=2?"h5":"h6";return d.jsx(r,{children:Yi(e.content,t,n,a)},t)}case"list":return e.ordered?d.jsx("ol",{children:e.items.map((r,c)=>d.jsx("li",{children:Yi(r,`${t}-${c}`,n,a)},`${t}-${c}`))},t):d.jsx("ul",{children:e.items.map((r,c)=>d.jsx("li",{children:Yi(r,`${t}-${c}`,n,a)},`${t}-${c}`))},t);case"table":return d.jsx("div",{className:"rich-text-table-wrap",children:d.jsx(Y6,{enabled:i,headers:e.table.headers.map((r,c)=>Yi(Os(r),`${t}-h-${c}`,n,a)),children:e.table.rows.map((r,c)=>d.jsx("tr",{children:r.map((l,f)=>d.jsx("td",{children:Yi(Os(l),`${t}-${c}-${f}`,n,a)},f))},c))})},t);case"code":return d.jsx("pre",{className:"rich-text-code",children:Ot(e.text,n)},t);default:return d.jsx("p",{children:Yi(e.content,t,n,a)},t)}}function Eu({value:e,search:t,onResults:n,resizableTables:a=!1,label:i}){if(yp(i)||e1(e))return d.jsx("p",{children:d.jsx(ia,{value:e,search:t,label:i})});let r=e;vB.test(r)&&(r=yB(r));const c=r.trim().replace(/^```\w*\n?/,"").replace(/\n?```$/,"").trim();if(/^<\??(?:xml|xccdf|rule-result|evidence)\b/i.test(c)||/))/i.test(c)&&!/<(?:p|br|div|table|ul|ol|li)\b/i.test(c))return d.jsx("pre",{className:"rich-text-code",children:Ot(c,t)});if(gB.test(r)){const f=new DOMParser().parseFromString(r,"text/html");return d.jsx("div",{className:"rich-text-value",children:Array.from(f.body.childNodes).map((T,p)=>J6(T,String(p),!1,t,n))})}return UO(r)?d.jsx("div",{className:"rich-text-value",children:sm(r).map((f,T)=>wB(f,String(T),t,n,a))}):d.jsx("p",{children:mo(r,"plain",t,n)})}const CB={Office:"Microsoft Office",Edge:"Microsoft Edge",Windows:"Windows",Audit:"advanced audit policy",Defender:"Microsoft Defender",Firewall:"Windows Firewall",BitLocker:"BitLocker",LAPS:"Windows LAPS",Security:"security policy"},Jr={adpasswordencryptionenabled:"Windows LAPS ADPasswordEncryptionEnabled","system audit subcategory · 0cce9212-69ae-11d9-bed3-505054503030":"Audit System Integrity","system audit subcategory · 0cce9216-69ae-11d9-bed3-505054503030":"Audit Logoff"},Q6=["AllowLocalPolicyMerge","AllowLocalIPsecPolicyMerge","EnableFirewall","DefaultInboundAction","DefaultOutboundAction","DisableInboundNotifications","DisableStealthMode","DisableUnicastResponsesToMulticastBroadcast","EnableLogDroppedPackets","EnableLogSuccessConnections","LogFilePath","LogMaxFileSize"],EB=[{segment:"domainprofile",label:"Domain profile"},{segment:"privateprofile",label:"Private profile"},{segment:"publicprofile",label:"Public profile"}],kB=["Windows 10 Version 1607 and Windows Server 2016 Security Baseline","Windows 10 Version 1809 and Windows Server 2019 Security Baseline","Windows 10 Version 20H2 and Windows Server Version 20H2 Security Baseline","Windows Server 2022 Security Baseline","Windows Server 2025 Security Baseline"],AB=["Baseline setting is not configured","Matches baseline","Differs from baseline"];function ku(e,t){const n=e.fields.filter(a=>a.label.trim().toLowerCase()===t);return n.length===1?n[0].value.trim():""}function RB(e,t){const n=ku(e,"remediation");if(n.length>512)return;const a=/^(Computer|User) policy: (system audit subcategory · [a-f0-9-]+)\s+(Expected|Must include):\s*(Failure|Success): (true|false)\s+(Failure|Success): (true|false)$/i.exec(n);if(!a||a[4].toLowerCase()===a[6].toLowerCase())return;const i=a[2].toLowerCase();if(!Object.hasOwn(Jr,i)||t&&t!==a[1].toLowerCase())return;const r=e.title.trim().toLowerCase();if(r!==i&&r!==Jr[i].toLowerCase())return;const c=Object.keys(Jr).find(p=>p===i),l=(a[4].toLowerCase()==="failure"?a[5]:a[7]).toLowerCase()==="true",f=(a[4].toLowerCase()==="success"?a[5]:a[7]).toLowerCase()==="true",T=a[3].toLowerCase()==="must include"?"Must include":"Expected";return`${Jr[i]} (${c}). ${T}: Failure: ${l?"true":"false"}; Success: ${f?"true":"false"}.`}function DB(e){const t=["computer","user"].find(r=>r===ku(e,"scope").toLowerCase())??"",n=kB.find(r=>r.toLowerCase()===ku(e,"baseline").toLowerCase()),a=AB.find(r=>r.toLowerCase()===ku(e,"comparison").toLowerCase()),i=RB(e,t);return[t&&`Scope: ${t}.`,n&&`Baseline: ${n}.`,i&&`Remediation target: ${i}`,a&&`Comparison scenario: ${a}. This describes backup configuration, not verified effective application.`].filter(Boolean).join(" ")}function IB(e,t){const n=e.title.trim().toLowerCase(),a=Ed(e,t),i=e.fields.find(l=>l.label.trim().toLowerCase()==="registry path")?.value.toLowerCase().replace(/\//g,"\\")??"",r=a.includes("Firewall")?Q6.find(l=>l.toLowerCase()===n):void 0;if(r){const l=EB.filter(T=>i.split("\\").includes(T.segment)),f=l.length===1?` (${l[0].label})`:"";return`Windows Firewall ${r}${f}`}if(Object.hasOwn(Jr,n))return Jr[n];const c=a.map(l=>CB[l]).filter(Boolean);return c.filter(l=>!c.some(f=>f!==l&&f.includes(l))).join(" / ")||"Microsoft Group Policy"}function NB(e){const t=e.title.trim().toLowerCase(),n=Object.hasOwn(Jr,t)||Ed(e,"group-policy").includes("Firewall")&&Q6.some(a=>a.toLowerCase()===t);return{subject:IB(e,"group-policy"),context:DB(e),exact:n}}const OB={registry:"https://learn.microsoft.com/en-us/azure/governance/policy/samples/guest-configuration-baseline-windows",privileges:"https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/security-policy-settings/user-rights-assignment",passwords:"https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-gpsb/0b40db09-d95d-40a6-8467-32aedec8140c",asr:"https://learn.microsoft.com/en-us/defender-endpoint/attack-surface-reduction-rules-overview",maester:"https://maester.dev/docs/tests/maester/",pingcastle:"https://www.pingcastle.com/PingCastleFiles/ad_hc_rules_list.html"},MB=["SOFTWARE\\Policies\\Microsoft\\Windows Defender\\PUAProtection","Software\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableIOAVProtection","Software\\Policies\\Microsoft\\Windows Defender\\DisableAntiSpyware","Software\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableRealtimeMonitoring","SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Scan\\DisableEmailScanning","Software\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableScriptScanning","SOFTWARE\\Policies\\Microsoft\\InputPersonalization\\AllowInputPersonalization","SYSTEM\\CurrentControlSet\\Services\\LanmanWorkstation\\DependOnService","SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\WDigest\\UseLogonCredential","System\\CurrentControlSet\\Services\\Tcpip6\\Parameters\\DisableIPSourceRouting","System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\DisableIPSourceRouting","System\\CurrentControlSet\\Services\\Netbt\\Parameters\\NoNameReleaseOnDemand","SYSTEM\\CurrentControlSet\\Control\\Session Manager\\SafeDllSearchMode","SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Security\\WarningLevel","SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\EnableICMPRedirect","SOFTWARE\\Policies\\Microsoft\\Windows\\LanmanWorkstation\\AllowInsecureGuestAuth","SOFTWARE\\Policies\\Microsoft\\Windows\\WcmSvc\\GroupPolicy\\fMinimizeConnections","SOFTWARE\\Policies\\Microsoft\\Windows\\Network Connections\\NC_AllowNetBridge_NLA","SOFTWARE\\Policies\\Microsoft\\Windows\\Network Connections\\NC_ShowSharedAccessUI","SOFTWARE\\Policies\\Microsoft\\Windows\\System\\EnableCdp","SOFTWARE\\Policies\\Microsoft\\Windows\\System\\EnumerateLocalUsers","SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\Audit\\ProcessCreationIncludeCmdLine_Enabled","SOFTWARE\\Policies\\Microsoft\\Windows\\Device Metadata\\PreventDeviceMetadataFromNetwork","SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Windows Defender Exploit Guard\\Network Protection\\EnableNetworkProtection","Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\NoConnectedUser","SYSTEM\\CurrentControlSet\\Services\\Netlogon\\Parameters\\SignSecureChannel","SYSTEM\\CurrentControlSet\\Services\\Netlogon\\Parameters\\DisablePasswordChange","System\\CurrentControlSet\\Services\\Netlogon\\Parameters\\MaximumPasswordAge","SYSTEM\\CurrentControlSet\\Services\\Netlogon\\Parameters\\RequireStrongKey","SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\CachedLogonsCount","SYSTEM\\CurrentControlSet\\Services\\LanManServer\\Parameters\\EnableForcedLogoff","System\\CurrentControlSet\\Services\\LanManServer\\Parameters\\SMBServerNameHardeningLevel","SYSTEM\\CurrentControlSet\\Services\\LanmanServer\\Parameters\\SMB1","SYSTEM\\CurrentControlSet\\Control\\Lsa\\RestrictAnonymousSAM","SYSTEM\\CurrentControlSet\\Control\\Lsa\\RestrictAnonymous","SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\Kerberos\\Parameters\\SupportedEncryptionTypes","SYSTEM\\CurrentControlSet\\Control\\Lsa\\NoLMHash","SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\EnableInstallerDetection","SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\EnableSecureUIAPaths","SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\EnableLUA","SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\PromptOnSecureDesktop","SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\EnableVirtualization","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\DomainProfile\\Logging\\LogFilePath","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\DomainProfile\\Logging\\LogFileSize","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\DomainProfile\\DefaultOutboundAction","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\DomainProfile\\AllowLocalIPsecPolicyMerge","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\DomainProfile\\AllowLocalPolicyMerge","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\DomainProfile\\DisableNotifications","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\PublicProfile\\Logging\\LogFilePath","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\PublicProfile\\Logging\\LogFileSize","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\PublicProfile\\DefaultOutboundAction","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\PublicProfile\\AllowLocalIPsecPolicyMerge","SOFTWARE\\Policies\\Microsoft\\WindowsFirewall\\PublicProfile\\AllowLocalPolicyMerge","SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services\\fPromptForPassword","SOFTWARE\\Policies\\Microsoft\\Windows\\EventLog\\Application\\Retention","SOFTWARE\\Policies\\Microsoft\\Windows\\EventLog\\Application\\MaxSize","SOFTWARE\\Policies\\Microsoft\\MicrosoftAccount\\DisableUserAuth","SOFTWARE\\Policies\\Microsoft\\Windows Defender\\SpyNet\\LocalSettingOverrideSpynetReporting","SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services\\fEncryptRPCTraffic","SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services\\UserAuthentication","SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Scan\\DisableRemovableDriveScanning","SOFTWARE\\Policies\\Microsoft\\Windows\\EventLog\\Security\\Retention","SOFTWARE\\Policies\\Microsoft\\Windows\\EventLog\\Security\\MaxSize","SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent\\DisableWindowsConsumerFeatures","SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\PreXPSP2ShellProtocolBehavior","SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableBehaviorMonitoring","SOFTWARE\\Policies\\Microsoft\\Windows\\PowerShell\\ScriptBlockLogging\\EnableScriptBlockLogging"],jB=["SeTrustedCredManAccessPrivilege","SeNetworkLogonRight","SeTcbPrivilege","SeMachineAccountPrivilege","SeIncreaseQuotaPrivilege","SeInteractiveLogonRight","SeRemoteInteractiveLogonRight","SeBackupPrivilege","SeChangeNotifyPrivilege","SeSystemtimePrivilege","SeTimeZonePrivilege","SeCreatePagefilePrivilege","SeCreateTokenPrivilege","SeCreateGlobalPrivilege","SeCreatePermanentPrivilege","SeCreateSymbolicLinkPrivilege","SeDebugPrivilege","SeDenyNetworkLogonRight","SeDenyBatchLogonRight","SeDenyServiceLogonRight","SeDenyInteractiveLogonRight","SeDenyRemoteInteractiveLogonRight","SeEnableDelegationPrivilege","SeRemoteShutdownPrivilege","SeAuditPrivilege","SeImpersonatePrivilege","SeIncreaseWorkingSetPrivilege","SeIncreaseBasePriorityPrivilege","SeLoadDriverPrivilege","SeLockMemoryPrivilege","SeBatchLogonRight","SeServiceLogonRight","SeSecurityPrivilege","SeRelabelPrivilege","SeSystemEnvironmentPrivilege","SeDelegateSessionUserImpersonatePrivilege","SeManageVolumePrivilege","SeProfileSingleProcessPrivilege","SeSystemProfilePrivilege","SeUndockPrivilege","SeAssignPrimaryTokenPrivilege","SeRestorePrivilege","SeShutdownPrivilege","SeSyncAgentPrivilege","SeTakeOwnershipPrivilege"],FB=["MT.1001","MT.1002","MT.1003","MT.1004","MT.1005","MT.1006","MT.1007","MT.1008","MT.1009","MT.1010","MT.1011","MT.1012","MT.1013","MT.1014","MT.1015","MT.1016","MT.1017","MT.1018","MT.1019","MT.1020","MT.1022","MT.1023","MT.1025","MT.1026","MT.1027","MT.1028","MT.1029","MT.1030","MT.1031","MT.1033","MT.1034","MT.1035","MT.1036","MT.1037","MT.1038","MT.1041","MT.1042","MT.1043","MT.1044","MT.1045","MT.1047","MT.1048","MT.1049","MT.1050","MT.1051","MT.1052","MT.1054","MT.1055","MT.1056","MT.1057","MT.1058","MT.1059","MT.1061","MT.1062","MT.1063","MT.1064","MT.1065","MT.1066","MT.1067","MT.1068","MT.1069","MT.1070","MT.1071","MT.1072","MT.1073","MT.1074","MT.1075","MT.1076","MT.1077","MT.1078","MT.1079","MT.1080","MT.1081","MT.1083","MT.1084","MT.1085","MT.1086","MT.1087","MT.1088","MT.1089","MT.1090","MT.1091","MT.1092","MT.1093","MT.1094","MT.1095","MT.1096","MT.1097","MT.1098","MT.1099","MT.1100","MT.1101","MT.1102","MT.1103","MT.1105","MT.1106","MT.1107","MT.1108","MT.1109","MT.1110","MT.1111","MT.1112","MT.1113","MT.1114","MT.1115","MT.1116","MT.1117","MT.1118","MT.1119","MT.1120","MT.1121","MT.1122","MT.1123","MT.1147","MT.1148","MT.1149","MT.1150","MT.1151","MT.1152","MT.1153","MT.1154","MT.1155","MT.1156","MT.1157","MT.1158","MT.1159","MT.1160","MT.1161","MT.1162","MT.1163","MT.1164","MT.1165","MT.1166","MT.1167","MT.1168","MT.1169","MT.1170","MT.1171","MT.1172","MT.1173","MT.1174","MT.1175","MT.1176","MT.1177","MT.1178","MT.1179","MT.1180","MT.1182","MT.1183","MT.1184","MT.1185","MT.1186","MT.1187","MT.1188","MT.1189","MT.1190","MT.1191","MT.1192","MT.1193","MT.1194","MT.1195"],LB=["A-AdminSDHolder","A-AnonymousAuthorizedGPO","A-CertTempAgent","A-CertTempAnyPurpose","A-DsHeuristicsAllowAnonNSPI","A-DsHeuristicsAnonymous","A-Guest","A-HardenedPaths","A-Krbtgt","A-LDAPSigningDisabled","A-LimitBlankPasswordUse","A-MD2RootCert","A-MD4RootCert","A-MD5IntermediateCert","A-MinPwdLen","A-NoServicePolicy","A-PwdGPO","A-SHA0IntermediateCert","A-SHA1IntermediateCert","A-SMB2SignatureNotRequired","A-WSUS-SslProtocol","P-ControlPathIndirectEveryone","P-ControlPathIndirectMany","P-DNSDelegation","P-DelegationEveryone","P-DelegationKeyAdmin","P-DelegationLoginScript","P-ExchangePrivEsc","P-RODCAdminRevealed","P-RODCNeverReveal","P-RODCRevealOnDemand","P-RODCSYSVOLWrite","S-C-Inactive","S-C-PrimaryGroup","S-DC-NotUpdated","S-DC-SubnetMissing","S-DefenderASR","S-FirewallScript","S-FolderOptions","S-OS-2003","S-OS-2008","S-OS-2012","S-OS-NT","S-TerminalServicesGPO","S-Vuln-MS17_010","S-WSUS-HTTP","S-WSUS-UserProxy","T-FileDeployedOutOfDomain","T-Inactive","T-ScriptOutOfDomain","T-TGTDelegation"],PB=["56a863a9-875e-4185-98a7-b882c64b5ce5","9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2","e6db77e5-3df2-4cf1-b95a-636979351e5b","7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c","d4f940ab-401b-4efc-aadc-ad5f3c50688a","be9ba2d9-53ea-4cdc-84e5-9b1eeee46550","01443614-cd74-433a-b99e-2ecdc07bfc25","5beb7efe-fd9a-4556-801d-275e5ffc04cc","d3e037e1-3eb8-44c8-a917-57927947596d","3b576869-a4ec-4529-8536-b80a7769e899","75668c1f-73b5-4cf0-bb93-3ecf5cb7cc84","26190899-1602-49e8-8b27-eb1d0a1ce869","d1e49aac-8f56-4280-b9ba-993a6d77406c","33ddedf1-c6e0-47cb-833e-de6133960387","b2b3f03d-6a65-4f7b-a9c7-1c7ef74a9ba4","c0033c00-d16d-4114-a5a0-dc9b3a7d2ceb","a8f5898e-1dc8-49a9-9878-85004b8a61e6","92e97fa1-2edf-4476-bdd6-9dd0b4dddc7b","c1db55ab-c21a-4637-bb3f-a12568109d35"],pi={sources:OB,registryTargets:MB,privilegeIds:jB,maesterIds:FB,pingcastleIds:LB,asrIds:PB},wh={"group-policy":"Microsoft Group Policy","cis-cat":"CIS-CAT / CIS Benchmarks",maester:"Maester",pingcastle:"PingCastle","purple-knight":"Semperis Purple Knight",generic:"Security assessment"},by={MinimumPasswordAge:"Password policy: minimum age",MaximumPasswordAge:"Password policy: maximum age",MinimumPasswordLength:"Password policy: minimum length",PasswordComplexity:"Password complexity requirements",PasswordHistorySize:"Password reuse / history",ClearTextPassword:"Reversible password encryption",RequireLogonToChangePassword:"Legacy password-change logon requirement",LockoutBadCount:"Account lockout threshold",LockoutDuration:"Account lockout duration",ResetLockoutCount:"Account lockout counter reset"},_B=[[/\bAdminSDHolder\b/i,"Active Directory AdminSDHolder ACL inheritance"],[/\bDCSync\b|\bDC Sync\b/i,"Active Directory replication permissions / DCSync"],[/\bDCShadow\b/i,"Active Directory DCShadow rogue replication"],[/\bSIDHistory\b/i,"Active Directory SIDHistory permissions"],[/\bresource.based constrained delegation\b|\bRBCD\b/i,"Kerberos resource-based constrained delegation"],[/\bunconstrained delegation\b/i,"Kerberos unconstrained delegation"],[/\bconstrained delegation\b/i,"Kerberos constrained delegation"],[/\bkrbtgt\b/i,"Kerberos krbtgt account protection"],[/\bSMB\s*signing\b/i,"SMB signing requirements"],[/\bSMBv?1\b/i,"SMB version 1 removal"],[/\bLDAP\s*signing\b/i,"LDAP signing requirements"],[/\bchannel binding\b/i,"LDAP channel binding"],[/\bNTLM\b/i,"NTLM authentication restrictions"],[/\bWDigest\b/i,"WDigest credential caching"],[/\bLAPS\b/i,"Windows LAPS password management"],[/\bBitLocker\b/i,"BitLocker encryption"],[/\bCredential Guard\b/i,"Windows Defender Credential Guard"],[/\bTLS\b/i,"TLS protocol and cipher configuration"],[/\bcertificate templates?\b/i,"Active Directory Certificate Services template security"],[/\bConditional Access\b/i,"Microsoft Entra Conditional Access"],[/\bMFA\b|\bmultifactor authentication\b/i,"Multifactor authentication"],[/\blegacy authentication\b/i,"Legacy authentication blocking"],[/\bbreak.glass\b|\bemergency access\b/i,"Emergency access account protection"],[/\bPIM\b|\bPrivileged Identity Management\b/i,"Entra Privileged Identity Management"],[/\bIntune\b/i,"Microsoft Intune device configuration"],[/\bExchange Online\b/i,"Exchange Online security"],[/\bDefender\b/i,"Microsoft Defender protection"],[/\bAppLocker\b/i,"AppLocker application control"],[/\bPowerShell\b/i,"PowerShell security logging"],[/\baudit\b/i,"Windows audit policy"],[/\bpassword\b/i,"Password policy"],[/\bfirewall\b/i,"Firewall security policy"],[/\bOpenSSH\b|\bsshd\b/i,"OpenSSH server hardening"],[/\bsudo\b/i,"Linux sudo privilege configuration"],[/\bauditd\b/i,"Linux auditd configuration"],[/\bSELinux\b/i,"SELinux mandatory access control"],[/\bAppArmor\b/i,"AppArmor mandatory access control"]];function ji(e,t){const n=e.fields.filter(a=>t.includes(a.label.trim().toLowerCase()));return n.length===1&&n[0].value.length<=16e3?n[0].value.trim():""}const Ra=e=>e.trim().toLowerCase(),wy=e=>Ra(e).replace(/\//g,"\\").replace(/^(?:hkey_local_machine|hkey_current_user|hklm|hkcu|machine|user)\\/,"");function qB(e){const t=e.title.length<=1e3?e.title.trim():"",a=ji(e,["value name"])||hm(ji(e,["configured value"]))||t.split("·").pop()?.trim()||"",i=ji(e,["registry path"]),r=pi.registryTargets.find(g=>wy(g)===wy(`${i}\\${a}`));if(r)return{text:`Setting: ${r.split("\\").pop()}. Public registry target: ${r}. Identity reference: ${pi.sources.registry}. This reference identifies the setting; its Azure benchmark is not the selected SCT baseline.`,scalar:!0};const c=/^(system access|privilege rights)\s*[·:]\s*([a-z]+)$/i.exec(t),l=Ra(ji(e,["policy section"])).replace(/[\s_-]/g,""),f=c?.[2]??t,T=pi.privilegeIds.find(g=>Ra(g)===Ra(f));if(T&&(c?.[1].toLowerCase()==="privilege rights"||l==="privilegerights"))return{text:`Setting: ${T}. Policy section: Privilege Rights (User Rights Assignment). Configuration: Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights Assignment. Reference: ${pi.sources.privileges}.`,scalar:!1};const p=Object.keys(by).find(g=>Ra(g)===Ra(f));if(p&&(c?.[1].toLowerCase()==="system access"||l==="systemaccess")){const g=/lockout/i.test(p)?pi.sources.registry:pi.sources.passwords;return{text:`Setting: ${p}. Subject: ${by[p]}. Policy section: System Access. Configuration: Computer Configuration > Windows Settings > Security Settings > Account Policies. Reference: ${g}.`,scalar:!0}}const m=pi.asrIds.find(g=>Ra(g)===Ra(a));if(m&&/\\windows defender(?:\\|$)/i.test(i)&&/\\asr\\rules$/i.test(i))return{text:`Setting: Microsoft Defender Attack Surface Reduction rule ${m}. Reference: ${pi.sources.asr}. Explain the exact rule name and the Disabled, Block, Audit and Warn modes.`,scalar:!0}}function BB(e){const t=ji(e,["baseline value"]);if(!t||t.length>160)return"";let n=t;try{n=JSON.parse(t)}catch{}if(typeof n=="object"&&n&&!Array.isArray(n)){const a=n;Object.keys(a).every(i=>["kind","value"].includes(i))&&["number","integer","uint32","boolean"].includes(String(a.kind))&&(n=a.value)}return typeof n=="boolean"?`Selected benchmark target: ${n}.`:typeof n=="number"&&Number.isInteger(n)&&n>=0&&n<=65535?`Selected benchmark target: ${n}. Verify this target against the selected baseline version; do not assume it applies to every device.`:""}function UB(e,t){const n=t==="maester"?pi.maesterIds:t==="pingcastle"?pi.pingcastleIds:[],a=ji(e,["rule id","rule-id","test id","test-id","id"]),i=n.find(c=>Ra(c)===Ra(a)||Ra(c)===Ra(e.title)),r=i?[i]:n.filter(c=>new RegExp(`^${c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?:\\s*[-:·]|\\.[0-9]+(?:[: .]|$))`,"i").test(e.title));if(r.length===1)return`Public rule ID: ${r[0]}. Rule catalog: ${t==="maester"?pi.sources.maester:pi.sources.pingcastle}. Retrieve this exact rule, its rationale and remediation; do not substitute another rule.`}function zB(e,t){const n=oa(e,t)??"generic",a=Object.hasOwn(wh,n)?wh[n]:wh.generic,i=qB(e),r=UB(e,n),c=n==="group-policy"?NB(e):void 0,l=[e.title,ji(e,["description"]),ji(e,["rationale"])].join(` +`).slice(0,2e4),f=_B.filter(([y])=>y.test(l)).map(([,y])=>y).slice(0,4),T=["Fail","Failed","Pass","Passed","Not configured","Conflicts","Duplicates"].find(y=>Ra(y)===Ra(ji(e,["status"]))),p=ji(e,["baseline","benchmark","benchmark title","benchmark name"]),m=["Windows Server 2016","Windows Server 2019","Windows Server 2022","Windows Server 2025","Windows 10","Windows 11","Microsoft 365","Microsoft Edge","Office 2016","Ubuntu","Debian","Red Hat Enterprise Linux"].filter(y=>new RegExp(`\\b${y}\\b`,"i").test(p)),g=i||c?.exact?"setting":r?"rule":"topic",S=["computer","user"].find(y=>y===Ra(ji(e,["scope"]))),x=[`Explain this security check from ${a}.`,i?.text,r,m.length&&`Benchmark product family (not proof of device applicability): ${m.join(", ")}.`,i?.scalar&&BB(e),f.length&&`Public technical topics: ${f.join("; ")}.`,T&&`Comparison scenario: ${T}.`,!i&&c&&`Subject: ${c.subject}.`,c?.context,S&&`Scope: ${S}.`,g==="topic"?"The exact public rule is not resolved; discuss only the named topics and do not invent a rule ID or benchmark value.":"","Answer in German. Focus on this exact setting or rule, not a general product overview. Explain its purpose, security impact, required versus optional configuration, precise remediation steps and how to verify the change. Cite the original vendor or benchmark publisher with direct links. Separate recommendation, default and effective configuration. Do not assume a server role, operating system version or scope that is not supplied. No customer configuration or identities are supplied."].filter(Boolean).join(" ");return{query:x,url:`https://www.google.com/search?udm=50&q=${encodeURIComponent(x)}`,specificity:g}}const WB=["Open","In Review","Clarification Needed","Actionable","Blocked","Done","Not Relevant"],VB=["High","Medium","Low"],En=e=>e.trim().toLocaleLowerCase("en-US").replace(/[\s_-]+/g," "),Ch=e=>e.trim().replace(/\s+/g," ").toLocaleLowerCase("en-US"),Cy=e=>{const t=En(e);return/^(?:short\s*name|si version|target|runtime|points scale|rule id|policy type|policy section|description source)$/.test(t)||/^(?:quelle|source):? /.test(t)||/^anssi \d+$/.test(t)},Ey=e=>/^(?:name|title|finding|indicator|results?|status|evaluation|category|severity|criticality|priority|weight|score)$/.test(En(e)),Eh=e=>/^(?:details?|result detail|resultdetail)$/.test(En(e)),HB=e=>En(e)==="verwandte daten";function GB(e,t){if(t!=="purple-knight")return{fields:[],sourceIndexes:[]};const n=e.fields.find(c=>En(c.label)==="framework"&&c.value);if(!n||n.value.length>64*1024)return{fields:[],sourceIndexes:[]};let a;try{a=JSON.parse(n.value)}catch{return{fields:[],sourceIndexes:[]}}if(!Array.isArray(a)||a.length>32)return{fields:[],sourceIndexes:[]};const i=[],r=Math.max(-1,...e.fields.map(c=>c.index))+1;return a.forEach(c=>{if(!c||typeof c!="object"||Array.isArray(c))return;const l=c;if(typeof l.Name!="string"||!Array.isArray(l.Tags))return;const f=l.Name;l.Tags.slice(0,32).forEach(T=>{if(typeof T!="string"||!T.trim())return;const p=i.filter(m=>En(m.label).startsWith(En(f))).length+1;i.push({index:r+i.length,label:`${f}_${p}`,value:T.trim()})})}),i.length?{fields:i,sourceIndexes:[n.index]}:{fields:[],sourceIndexes:[]}}const XB="cis cat details",KB="rule result xml",$B=/^##\s+Rule Result XML\s*$/im;function YB(e,t,n=new Set){const a=new Set(n);if(t!=="cis-cat")return{optionalFields:[],hiddenFieldIndexes:a};const i=e.fields.find(m=>En(m.label)===KB&&m.value),r=e.fields.find(m=>En(m.label)===XB&&m.value);r&&a.add(r.index);const c=m=>m.replace(/^```\w*\n?/,"").replace(/\n?```$/,"").trim();if(i)return a.add(i.index),n.has(i.index)?{optionalFields:[],hiddenFieldIndexes:a}:{optionalFields:[{...i,value:c(i.value)}],hiddenFieldIndexes:a};if(!r)return{optionalFields:[],hiddenFieldIndexes:a};const l=$B.exec(r.value);if(!l?.length||l.index===void 0)return{optionalFields:[],hiddenFieldIndexes:a};const f=r.value.slice(l.index+l[0].length).trimStart(),T=f.search(/^##\s+/m),p=c((T>=0?f.slice(0,T):f).trim());return{optionalFields:p?[{...r,label:"Rule Result XML",value:p}]:[],hiddenFieldIndexes:a}}const ZB=/\s*>?\s*References(?![a-z])\s*/;function JB(e){return e.flatMap(t=>{const n=ZB.exec(t.value);if(!n?.index)return[t];const a=t.value.slice(0,n.index).replace(/[\s>]+$/,""),i=t.value.slice(n.index+n[0].length).trim();return!a||!i?[t]:[{...t,value:a},{...t,label:"References",value:i}]})}function QB(e,t,n=!1,a){const i=M1(e,a),r=GB(e,a),c=new Set(U6(e,a).map(P=>P.index)),{optionalFields:l,hiddenFieldIndexes:f}=YB(e,a,c);r.sourceIndexes.forEach(P=>f.add(P)),a==="pingcastle"&&e.fields.filter(P=>HB(P.label)).forEach(P=>f.add(P.index)),n&&e.fields.filter(P=>Eh(P.label)).forEach(P=>f.add(P.index)),a==="purple-knight"&&(r.fields.length||e.fields.some(P=>Eh(P.label)))&&e.fields.filter(P=>/^(?:grade|exposure type)$/.test(En(P.label))).forEach(P=>f.add(P.index));const T=Cd(e,a),p=a==="group-policy"&&n&&Jb(e).length>0,m=a==="group-policy"&&!!e.policySourceEvidence?.length;m&&e.fields.filter(P=>["Sources","Configured Value"].includes(P.label)).forEach(P=>f.add(P.index)),p&&e.fields.filter(P=>[pd,h1,"Sources","Configured Value"].includes(P.label)).forEach(P=>f.add(P.index));const g=a==="group-policy"&&(!p||m)?e.fields.filter(P=>{const K=En(P.label);return P.value&&(!m&&K==="configured value"||K==="baseline value")}):[],S=a==="group-policy"?e.fields.find(P=>En(P.label)==="evaluation readiness"&&P.value):void 0;S&&f.add(S.index),g.forEach(P=>f.add(P.index));const x=e.fields.filter(P=>{if(!P.value)return!1;const K=En(P.label);return/^(?:category|severity|weight|score|category score|domain risk level)$/.test(K)||/^points?$/.test(K)&&vi(P.value)!==null}),y=[...e.fields,...r.fields].filter(P=>Qc(P.label)&&P.value),w=P=>{const K=En(P);return K==="conflict"||K==="duplicates"?-1:K==="result message"?0:/^number of results?$/.test(K)?1:K==="description"?2:a==="pingcastle"&&K==="technical explanation"?3:a==="pingcastle"&&K==="advised solution"?4:a==="pingcastle"&&K==="documentation"?5:/^remediation(?: guidance| recommendation)?$/.test(K)?3:/^(source|quelle)(?:\s*:\s*.*)?$/.test(K)?4:10},C=new Set,k=e.fields.filter(P=>{if(f.has(P.index)||!P.value||P.value===t||x.some(I=>I.index===P.index)||Qc(P.label)||Cy(P.label)||Ey(P.label)||n&&Eh(P.label))return!1;const K=Ch(P.value);return C.has(K)?!1:(C.add(K),!0)}).sort((P,K)=>w(P.label)-w(K.label)||P.index-K.index),E=JB(k).slice(0,12),O=new Set([...f,...E.map(P=>P.index),...x.map(P=>P.index),...y.map(P=>P.index),...T?[T.index]:[]]),N=new Set([t,...E.map(P=>P.value)].map(Ch)),B=[...e.fields,...r.fields.filter(P=>!Qc(P.label))].filter(P=>!P.value||O.has(P.index)?!1:Cy(P.label)?!0:Ey(P.label)?!1:!N.has(Ch(P.value))),A=E.findIndex(P=>En(P.label)==="check title"),z=A>=0?E.splice(A,1)[0]:void 0;return{statusField:T,badges:x,derivedCategories:i,mitre:y,summary:E,checkTitle:z,optionalFields:l,remainingFields:B,policyComparisonFields:g,policyReadiness:S}}function eU(e,t,n){if(n!=="group-policy")return[];const i=(T=>e.fields.find(p=>En(p.label)===T)?.value.trim()??"")("policy type")==="group-policy-preference",c=(t.split(/\s*\u00b7\s*/).at(-1)?.trim()??t.trim()).split(/[\\/]/).map(T=>T.trim()).filter(Boolean),l=[],f=T=>{const p=T?.trim();p&&!l.some(m=>m.toLocaleLowerCase("en-US")===p.toLocaleLowerCase("en-US"))&&l.push(p)};for(const T of e.fields)if(/^(?:configured value|baseline value)$/.test(En(T.label))){if(i)try{const p=JSON.parse(T.value),m=g=>{if(Array.isArray(g))return g.forEach(m);if(!g||typeof g!="object")return;const S=g;S.kind==="registry-preference"&&typeof S.key=="string"&&f(S.key.split(/[\\/]/).at(-1)),Object.values(S).forEach(m)};m(p)}catch{}f(hm(T.value))}return!l.length&&i&&c.length>1&&f(c.at(-2)),(i||!l.length)&&f(c.at(-1)),l}function tU({record:e,title:t,review:n,previousPolicyReviews:a,linkedSheets:i,resultReferences:r,search:c,position:l,recordCount:f,toolId:T,onPrevious:p,onNext:m,onReview:g,onRiskAcceptance:S,onResults:x,resultsOpen:y,resultColor:w}){const C=y&&w?{"--result-color":w}:void 0,[k,E]=H.useState(""),[O,N]=H.useState(""),B=k===e.id,A={...hr(),...n},z=e.fields.find(de=>/^(severity|criticality|priority)$/i.test(de.label)&&de.value),P=So(z?.value),K=i.length>0,I=oa(e,T),L=zB(e,I),{statusField:le,badges:ue,derivedCategories:X,mitre:F,summary:re,checkTitle:me,optionalFields:te,remainingFields:Ce,policyComparisonFields:ee,policyReadiness:M}=QB(e,t,K,I),Y=le?.value?Yu(I,le.value):"unknown",Z=ee.map(de=>hm(de.value)).find(Boolean),J=eU(e,t,I),he=[...new Set(r.filter(Rm))],ge=de=>fe=>g({[de]:fe.target.value});return d.jsxs("article",{className:"finding-reader",children:[d.jsxs("nav",{className:"reader-nav","aria-label":"Record navigation",children:[d.jsxs("div",{children:[d.jsx("button",{type:"button",onClick:p,disabled:l<=0,"aria-label":"Previous record",children:d.jsx(vn,{direction:"left"})}),d.jsx("button",{type:"button",onClick:m,disabled:l>=f-1,"aria-label":"Next record",children:d.jsx(vn,{direction:"right"})})]}),d.jsxs("span",{title:e.sourceFile??e.sourceSheet,children:["Inbox  /  Record  /  ",s6(e.sourceFile)||e.sourceSheet||"Finding"]})]}),d.jsxs("div",{className:"reader-heading",children:[d.jsx("span",{className:`reader-title-hex severity-${P}`,"aria-hidden":"true"}),d.jsxs("div",{children:[d.jsx("h2",{children:d.jsx(ia,{value:t,search:c})}),d.jsxs("div",{className:"finding-badges",children:[le?.value&&d.jsx("span",{className:"outcome-mark","data-outcome":Yu(I,le.value),children:Ot(le.value,c)}),X.map(de=>d.jsx("span",{className:"status-badge","data-derived-category":"cis",children:Ot(de,c)},de)),ue.map(de=>{const fe=de.label.toLowerCase()==="severity",ye=/^(?:category score|domain risk level)$/i.test(de.label.trim())?" / 100":"",qe=fe?"severity-badge severity-"+So(de.value):"status-badge",ae=fe?de.value:de.label+": "+de.value+ye;return d.jsx("span",{className:qe,children:Ot(ae,c)},de.label)}),Ed(e,I).map(de=>d.jsx("span",{className:"status-badge","data-derived-category":"gpo",children:Ot(de,c)},de)),z6(e,I).map(de=>d.jsx("span",{className:"status-badge policy-diagnostic-badge","data-policy-diagnostic":de.toLowerCase(),children:de},`policy-diagnostic-${de}`)),I==="group-policy"&&e.fields.filter(de=>En(de.label)==="scope"&&de.value.trim()).slice(0,1).map(de=>d.jsxs("span",{className:"status-badge","data-policy-scope":!0,children:["Scope: ",Ot(de.value,c)]},"policy-scope"))]}),F.length>0&&d.jsx("div",{className:"mitre-line",children:F.map(de=>d.jsxs("span",{className:"mitre-badge",children:[Qc(de.label),": ",Ot(de.value,c)]},de.label))})]}),d.jsxs("button",{className:"btn accepted-risk-trigger",type:"button","aria-haspopup":"dialog",onClick:()=>N(e.id),children:["Accepted Risk",A.riskAcceptance&&d.jsx("small",{children:bm(A.riskAcceptance,e.findingOccurrenceId)})]}),d.jsxs("div",{className:"reader-heading-actions",children:[J.length>0&&d.jsxs("div",{className:"policy-search-key",children:[d.jsxs("span",{children:["Policy Analyzer search ",J.length===1?"key":"terms"]}),d.jsx("div",{children:J.map(de=>d.jsx("code",{children:Ot(de,c)},de))})]}),L&&d.jsx("a",{className:"btn",href:L.url,target:"_blank",rel:"noopener noreferrer",referrerPolicy:"no-referrer","data-search-specificity":L.specificity,title:`${L.specificity==="topic"?"Topic search — ":""}${L.query}`,children:"AI search"}),d.jsx("span",{className:"bookmark-label",children:"Bookmark"}),d.jsx("button",{className:"bookmark-btn",type:"button","aria-pressed":A.include,onClick:()=>g({include:!A.include}),children:d.jsx(Qu,{filled:A.include})}),d.jsx("button",{className:`btn results-detail-btn results-btn${y?" is-open":""}`,style:C,type:"button",disabled:!x,onClick:x,children:"Results"})]})]}),O===e.id&&d.jsx(dB,{title:t,occurrenceId:e.findingOccurrenceId,value:A.riskAcceptance,onSave:S,onClose:()=>N("")},e.id),d.jsxs("section",{className:"dashboard-grid",children:[d.jsxs("label",{children:["Status",d.jsx("select",{value:A.status,onChange:ge("status"),children:WB.map(de=>d.jsx("option",{children:de},de))})]}),d.jsxs("label",{children:["Priority",d.jsx("select",{value:A.priority,onChange:ge("priority"),children:VB.map(de=>d.jsx("option",{children:de},de))})]}),d.jsxs("label",{children:["Owner / Team",d.jsx("input",{value:A.owner,onChange:ge("owner")})]}),d.jsxs("label",{children:["Due Date",d.jsx("input",{type:"date",value:A.due,onChange:ge("due")})]})]}),d.jsxs("section",{className:"reader-summary",children:[!!a?.length&&d.jsxs("details",{className:"policy-previous-reviews",children:[d.jsxs("summary",{children:["Previous baseline-specific reviews (",a.length,")"]}),d.jsx("p",{children:"These earlier notes remain attached to their original comparisons. Different decisions and risk acceptances are not automatically applied to this combined setting."}),a.map(de=>d.jsxs("section",{children:[d.jsx("h4",{children:de.baseline}),d.jsx("dl",{children:Object.entries(de.review).filter(([fe,ye])=>ye!==void 0&&JSON.stringify(ye)!==JSON.stringify(hr()[fe])).map(([fe,ye])=>d.jsxs(H.Fragment,{children:[d.jsx("dt",{children:fe.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^./,qe=>qe.toUpperCase())}),d.jsx("dd",{children:typeof ye=="object"?JSON.stringify(ye,null,2):String(ye)})]},fe))})]},de.id))]}),d.jsx("h3",{children:d.jsx(ia,{value:Z||me?.value||(I==="group-policy"?t:"Finding"),search:c})}),M&&d.jsxs("div",{className:"policy-evaluation-warning",role:"status",children:[d.jsx("h4",{children:"Historical comparison"}),d.jsx("p",{children:M.value})]}),I==="group-policy"&&!!e.policySourceEvidence?.length&&d.jsx(fB,{sources:e.policySourceEvidence,search:c}),ee.length>0&&d.jsx("div",{className:"policy-value-comparison","data-outcome":M?"historical":Y,children:ee.map(de=>{const fe=En(de.label)==="baseline value";return d.jsxs("section",{className:"policy-value-block","data-value":fe?"expected":"configured",children:[d.jsx("h4",{children:M?fe?"Saved baseline value":"Saved customer value":fe?"Expected baseline value":"Configured customer value"}),d.jsx("p",{className:"policy-guidance-text",children:cp(de.value).map((ye,qe)=>d.jsxs(H.Fragment,{children:[qe>0&&` +`,ye.emphasized?d.jsx("strong",{className:"policy-value-emphasis",children:d.jsx(ia,{value:ye.text,search:c})}):d.jsx(ia,{value:ye.text,search:c})]},qe))})]},`${de.index}-${de.label}`)})}),re.map(de=>d.jsxs("div",{className:/^remediation(?: guidance| recommendation)?$/.test(En(de.label))?"reader-remediation":void 0,children:[d.jsx("h4",{children:Ot(de.label,c)}),I==="group-policy"&&/^(?:description|remediation|sources)$/.test(En(de.label))?d.jsx("p",{className:"policy-guidance-text",children:d.jsx(ia,{value:de.value,search:c,label:de.label})}):d.jsx(Eu,{value:de.value,search:c,label:de.label,onResults:x})]},`${de.index}-${de.label}`)),te.map(de=>d.jsxs("details",{className:"finding-optional-detail",children:[d.jsxs("summary",{children:[d.jsx(vn,{direction:"right"}),Ot(de.label,c)]}),d.jsx(Eu,{value:de.value,search:c,label:de.label,onResults:x})]},`${de.index}-${de.label}`))]}),d.jsxs("section",{className:"review-grid",children:[[["prerequisites","Prerequisites"],["access","Required Access / Roles"],["nextStep","Next Step"],["evidence","Evidence / Acceptance Criteria"],["comment","Comment"]].map(([de,fe])=>d.jsxs("label",{children:[fe,d.jsx("textarea",{value:String(A[de]),onChange:ge(de)})]},de)),d.jsxs("fieldset",{className:"review-markers",children:[d.jsx("legend",{children:"Markers"}),[["markerQuestion","Question Needed"],["markerBlocked","Permission Blocked"],["markerQuickwin","Quick Win"],["markerExternal","External Team"],["markerNotRelevant","Not Relevant"]].map(([de,fe])=>d.jsxs("label",{children:[d.jsx("input",{type:"checkbox",checked:!!A[de],onChange:ye=>g({[de]:ye.target.checked})})," ",fe]},de))]})]}),r.length>0&&!i.length&&d.jsxs("details",{className:"all-fields linked-results-inline",open:B,onToggle:de=>E(de.currentTarget.open?e.id:""),children:[d.jsxs("summary",{children:[d.jsx(vn,{direction:"right"}),"Results (reference found)"]}),B&&d.jsxs("div",{className:"linked-results-empty",children:[d.jsx("strong",{children:"No matching result file found automatically."}),he.length>0&&d.jsxs(d.Fragment,{children:[d.jsx("br",{}),"Reference: ",he.join(", ")]}),d.jsx("br",{}),"The referenced file must be loaded in the same project."]})]}),Ce.length>0&&d.jsxs("details",{className:"all-fields",children:[d.jsxs("summary",{children:[d.jsx(vn,{direction:"right"}),"Additional Information"]}),d.jsx("table",{children:d.jsx("tbody",{children:Ce.map(de=>d.jsxs("tr",{children:[d.jsx("th",{children:Ot(de.label,c)}),d.jsx("td",{children:d.jsx(Eu,{value:de.value,search:c,label:de.label,onResults:x})})]},`${de.index}-${de.label}`))})})]})]})}function Qr(e,t){if(!t)return e;const n=e.toLocaleLowerCase("en-US"),a=[];let i=0,r=n.indexOf(t.toLocaleLowerCase("en-US"),i);for(;r>=0;)r>i&&a.push(e.slice(i,r)),a.push(d.jsx("mark",{children:e.slice(r,r+t.length)},`${r}-${i}`)),i=r+t.length,r=n.indexOf(t.toLocaleLowerCase("en-US"),i);return id.jsx(ia,{value:n.sourcePath,search:t,label:"Source path"},`${n.recordId}-${a}`))})}function iU({comparison:e,search:t}){return d.jsxs("details",{className:"variant-comparison__technical",children:[d.jsx("summary",{children:"Technical source details"}),d.jsx("div",{className:"variant-comparison__technical-list",children:e.variants.flatMap(n=>n.sources.map((a,i)=>d.jsxs("section",{children:[d.jsxs("h5",{children:[a.label," · ",n.label]}),d.jsxs("dl",{children:[d.jsxs("div",{children:[d.jsx("dt",{children:"Source path"}),d.jsx("dd",{children:d.jsx(ia,{value:a.sourcePath,search:t,label:"Source path"})})]}),d.jsxs("div",{children:[d.jsx("dt",{children:"Backup ID"}),d.jsx("dd",{children:Qr(a.backupId,t)})]}),d.jsxs("div",{children:[d.jsx("dt",{children:"Record ID"}),d.jsx("dd",{children:Qr(a.recordId,t)})]})]})]},`${n.label}-${a.recordId}-${i}`)))})]})}function sU({comparison:e,search:t}){const n=e.sourceCount===1?"GPO source defines":"GPO sources define",a=e.mode==="duplicate";return d.jsxs("section",{className:`variant-comparison${a?" is-duplicate":""}`,"aria-label":a?"Duplicate setting evidence":"Conflicting setting comparison",children:[d.jsxs("header",{className:"variant-comparison__header",children:[d.jsx("p",{className:"variant-comparison__eyebrow",children:a?"Duplicate setting":"Conflicting setting"}),d.jsx("h3",{children:Qr(e.title,t)}),d.jsx("p",{className:"variant-comparison__scope",children:e.scope?`${e.scope[0].toUpperCase()}${e.scope.slice(1)} scope`:"Policy scope"})]}),d.jsxs("div",{className:`variant-comparison__notice${a?" is-duplicate":""}`,children:[d.jsx("strong",{children:a?"Duplicate detected":"Conflict detected"}),d.jsx("p",{children:a?`${e.sourceCount} ${n} this setting with an identical value and type.`:`${e.sourceCount} ${n} this setting with ${e.variants.length} different values or types.`}),d.jsx("p",{children:a?"This may be intentional. A duplicate alone is not a baseline deviation.":"ASSESSOR shows the conflicting evidence but does not determine which value ultimately applies."})]}),d.jsxs("section",{className:"variant-comparison__setting",children:[d.jsx("h4",{children:"Setting details"}),d.jsxs("dl",{children:[e.registryPath&&d.jsxs("div",{children:[d.jsx("dt",{children:"Registry path"}),d.jsx("dd",{children:d.jsx(ia,{value:e.registryPath,search:t,label:"Registry path"})})]}),e.valueName&&d.jsxs("div",{children:[d.jsx("dt",{children:"Value name"}),d.jsx("dd",{children:Qr(e.valueName,t)})]}),e.scope&&d.jsxs("div",{children:[d.jsx("dt",{children:"Scope"}),d.jsx("dd",{children:Qr(e.scope,t)})]})]})]}),d.jsxs("section",{className:"variant-comparison__variants",children:[d.jsx("h4",{children:a?"Observed value":"Observed variants"}),d.jsx("p",{children:a?"The following value and type were found in every listed source.":"The following values or types were found for the affected setting."}),d.jsx("div",{className:"variant-comparison__table-wrap",children:d.jsxs("table",{className:"variant-comparison__table",children:[d.jsx("thead",{children:d.jsxs("tr",{children:[!a&&d.jsx("th",{children:"Variant"}),d.jsx("th",{children:"Value"}),d.jsx("th",{children:"Type"}),d.jsx("th",{children:"Evidence"})]})}),d.jsx("tbody",{children:e.variants.map(i=>d.jsxs("tr",{children:[!a&&d.jsx("th",{scope:"row",children:i.label}),d.jsx("td",{className:"variant-comparison__value",children:d.jsx(nU,{value:i.value,search:t})}),d.jsx("td",{children:Qr(i.typeLabel,t)}),d.jsxs("td",{children:[d.jsxs("span",{children:[i.sources.length," ",i.sources.length===1?"source":"sources"]}),d.jsx(aU,{sources:i.sources,search:t})]})]},i.label))})]})})]}),d.jsx(iU,{comparison:e,search:t})]})}function rU({error:e,search:t}){const n=[{label:"Error code",value:e.code},{label:"HTTP status",value:e.httpStatus},{label:"Request",value:[e.method,e.endpoint].filter(Boolean).join(" ")||void 0},{label:"Source",value:e.source},{label:"Timestamp",value:e.timestamp},{label:"Request ID",value:e.requestId},{label:"Client request ID",value:e.clientRequestId}].filter(a=>!!a.value);return d.jsxs("div",{className:"maester-error",children:[d.jsx("p",{className:"maester-error__summary",children:kh(e.message,t)}),n.length>0&&d.jsx("dl",{className:"maester-error__facts",children:n.map(a=>d.jsxs("div",{children:[d.jsx("dt",{children:a.label}),d.jsx("dd",{children:kh(a.value,t)})]},a.label))}),d.jsxs("details",{className:"maester-error__raw",children:[d.jsx("summary",{children:"Technical details"}),d.jsx("pre",{children:kh(e.raw,t)})]})]})}function kh(e,t){if(!t)return e;const n=e.toLocaleLowerCase("en-US"),a=[];let i=0,r=n.indexOf(t,i);for(;r>=0;)r>i&&a.push(e.slice(i,r)),a.push(d.jsx("mark",{children:e.slice(r,r+t.length)},`${r}-${i}`)),i=r+t.length,r=n.indexOf(t,i);return im.resultVariantComparison)?.resultVariantComparison;return d.jsxs("div",{className:"linked-results",children:[n&&!p&&d.jsx("h3",{className:"linked-results-heading",children:n}),a.map(m=>d.jsxs("section",{className:"result-block",children:[d.jsx("h4",{className:"result-block__title",children:m.title}),m.diagnostic?d.jsx(rU,{error:m.diagnostic,search:t}):d.jsx(Eu,{value:m.value,search:t,resizableTables:T})]},m.title)),p&&d.jsx(sU,{comparison:p,search:t}),e.map((m,g)=>{if(p&&(m.resultVariantComparison||m.name==="Source references"))return null;const S=i?r?.(m)??m.name:void 0,x=g>0&&r?r(e[g-1]):void 0,y=c?.(m),w=m.analysis.headers.filter(C=>m.analysis.records.some(k=>k.fields.find(E=>E.label===C)?.value));return d.jsxs("section",{className:"result-block",children:[S&&S!==x&&d.jsx("h4",{className:"result-block__title",children:S}),y&&d.jsx("h5",{className:"result-block__subtitle",children:y}),m.resultPreamble&&d.jsx("p",{className:"result-block__preamble",children:d.jsx(ia,{value:m.resultPreamble,search:t})}),d.jsx("div",{className:"rich-text-table-wrap",children:d.jsx(Y6,{enabled:T,headers:w,className:`rich-text-table${m.resultEmphasisColumns?" result-evidence-table":""}`,children:m.analysis.records.map(C=>{const k=f?.(C);return d.jsx("tr",{className:k?`rich-text-table-row--${k}`:C.highlighted||l?.(C)?"rich-text-table-row--highlight":void 0,children:w.map(E=>{const O=C.fields.find(N=>N.label===E)?.value??"";return d.jsx("td",{className:m.resultEmphasisColumns?.includes(E)?"result-evidence-difference":void 0,children:d.jsx(ia,{value:O,search:t,label:E})},`${C.id}-${E}`)})},C.id)})})})]},m.id)})]})}const e7="result-dock-slot",cU=46,lU=80,m1=34,uU=12;function dU(e,t){const n=Math.max(0,e-1);return Math.min(n*m1,Math.max(0,t))}function TU(e,t,n,a=0){return{left:Math.max(0,e-t-lU),top:Math.min(a+cU,n)}}function fU(e){return e.map(t=>t.detached||t.minimized?t:{...t,minimized:!0})}function Au(e,t){return e.find(a=>a.recordId===t)?e.map(a=>a.recordId===t?a.minimized?{...a,minimized:!1,detached:!1}:a:a.detached||a.minimized?a:{...a,minimized:!0}):e}function hU(e,t){return e.map(n=>n.recordId===t?{...n,minimized:!0,detached:!1}:n)}function pU(e,t){const n=e.find(a=>a.recordId===t);return n?n.minimized?Au(e,t):hU(e,t):e}function mU(e,t){return e.map(n=>n.recordId===t&&!n.minimized&&!n.detached?{...n,detached:!0}:n)}const Nc=440,ky=220,Ay=" – ",Ah=14,Ry=28,du=8,gU=124,vU=["n","s","e","w","ne","nw","se","sw"];function xU(e){const t=e.indexOf(Ay);return t<0?{badge:e.trim(),name:""}:{badge:e.slice(0,t).trim(),name:e.slice(t+Ay.length).trim()}}function Dy(e){return e.match(/\(([^)]+)\)/)?.[1]??e.replace(/^results?\s*/i,"").trim()}function t7(){return d.jsxs("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinejoin:"round",children:[d.jsx("rect",{x:"3.5",y:"3.5",width:"7.5",height:"7.5",rx:"1"}),d.jsx("rect",{x:"13",y:"3.5",width:"7.5",height:"7.5",rx:"1"}),d.jsx("rect",{x:"3.5",y:"13",width:"7.5",height:"7.5",rx:"1"}),d.jsx("rect",{x:"13",y:"13",width:"7.5",height:"7.5",rx:"1"})]})}function n7({id:e,title:t,sheets:n,toolId:a,sections:i=[],color:r,zIndex:c,offset:l,search:f,onActivate:T,onClose:p,onOpenRecord:m,actionLabel:g="To Report",actionTitle:S="Jump to this finding’s record",minimized:x=!1,dimmed:y=!1,onToggleMinimize:w,detached:C=!1,onDetach:k,clusterIndex:E,isClusterBottom:O=!1,clusterCount:N=0,clusterPosition:B,clusterWidth:A,isClusterTop:z=!1,onMoveCluster:P,onResizeClusterWidth:K,bookmarked:I=!1,onToggleBookmark:L,allClusterBookmarked:le=!1,onBookmarkCluster:ue,onCloseCluster:X,onDockCluster:F}){const re=xU(t),me=Wq(a),te=Gq(a,i,n),Ce=i.filter((Pe,Me)=>!te.consumedSectionIndexes.has(Me)),ee=H.useRef(null),M=H.useRef(null),Y=H.useRef(null),Z=H.useRef(!1),[J,he]=H.useState(null),[ge,de]=H.useState(!1),fe=!x&&C,ye=(Pe,Me)=>({left:Math.max(0,(window.innerWidth-Pe)/2+l),top:Math.max(0,(window.innerHeight-Me)/2+l)}),[qe,ae]=H.useState(()=>B?{left:B.left+Ah,top:B.top}:ye(Math.min(1040,window.innerWidth*.78),Math.min(680,window.innerHeight*.76))),Ne=H.useRef(!1),Ve=(Pe,Me)=>{const Ke=ee.current,st=Ke?.offsetWidth??Math.min(1040,window.innerWidth*.78),Vt=Ke?.offsetHeight??Math.min(680,window.innerHeight*.76);return{left:Math.max(0,Math.min(Pe,window.innerWidth-st)),top:Math.max(132,Math.min(Me,window.innerHeight-Vt))}};H.useEffect(()=>{const Pe=ee.current;if(!Pe)return;const Me=new ResizeObserver(()=>ae(st=>{if(!Ne.current){Ne.current=!0;const{left:Vt,top:Xt}=ye(Pe.offsetWidth,Pe.offsetHeight);return Ve(Vt,Xt)}return Ve(st.left,st.top)}));Me.observe(Pe);const Ke=()=>ae(st=>Ve(st.left,st.top));return window.addEventListener("resize",Ke),()=>{Me.disconnect(),window.removeEventListener("resize",Ke)}},[]),H.useEffect(()=>{x&&de(!1)},[x]);const tt=Pe=>{if(Pe.target.closest("button:not(.results-cluster-handle)"))return;if(ge){T();return}const Me=ee.current?.getBoundingClientRect();Me&&(M.current={pointerId:Pe.pointerId,lastX:Pe.clientX,lastY:Pe.clientY,startLeft:x&&B?B.left:Me.left,startTop:x&&B?B.top:Me.top,detachedDuringDrag:x||fe},Pe.currentTarget.setPointerCapture(Pe.pointerId),T(),Pe.preventDefault())},We=Pe=>{const Me=M.current;if(!Me||Me.pointerId!==Pe.pointerId)return;const Ke=Pe.clientX-Me.lastX,st=Pe.clientY-Me.lastY;Me.lastX=Pe.clientX,Me.lastY=Pe.clientY,x&&B&&P?P(Ke,st):Me.detachedDuringDrag?ae(Vt=>Ve(Vt.left+Ke,Vt.top+st)):(Me.detachedDuringDrag=!0,k?.(),ae(Ve(Me.startLeft+Ke,Me.startTop+st)))},Le=Pe=>{M.current?.pointerId===Pe.pointerId&&(M.current=null,Pe.currentTarget.hasPointerCapture(Pe.pointerId)&&Pe.currentTarget.releasePointerCapture(Pe.pointerId))},_e=Pe=>{if(!Pe.target.closest("button")){if(Z.current){Z.current=!1;return}if(x){w?.();return}de(Me=>!Me),T()}},Xe=Pe=>{!ge||Pe.target.closest("button")||(Z.current=!0,de(!1),T())},pt=Pe=>Me=>{const Ke=ee.current?.getBoundingClientRect();Ke&&(Y.current={pointerId:Me.pointerId,dir:Pe,startX:Me.clientX,startY:Me.clientY,startLeft:Ke.left,startTop:Ke.top,startWidth:Ke.width,startHeight:Ke.height},ae({left:Ke.left,top:Ke.top}),he({width:Ke.width,height:Ke.height}),fe||k?.(),Me.currentTarget.setPointerCapture(Me.pointerId),T(),Me.preventDefault())},Pt=Pe=>Me=>{if(!B||!K)return;const Ke=A??Math.min(760,Math.max(440,window.innerWidth*.76));Y.current={pointerId:Me.pointerId,dir:Pe,startX:Me.clientX,startY:Me.clientY,startLeft:B.left,startTop:B.top,startWidth:Ke,startHeight:m1},Me.currentTarget.setPointerCapture(Me.pointerId),T(),Me.preventDefault()},Kt=Pe=>{const Me=Y.current;if(!Me||Me.pointerId!==Pe.pointerId)return;const Ke=Pe.clientX-Me.startX,st=Pe.clientY-Me.startY;let{startLeft:Vt,startTop:Xt,startWidth:Fn,startHeight:Sa}=Me;if(x&&K&&(Me.dir==="e"||Me.dir==="w")){if(Me.dir==="e"){const Zn=Math.max(Nc,Math.min(Me.startWidth+Ke,window.innerWidth-Me.startLeft-10));K(Zn)}else{const Zn=Me.startWidth-Nc,ba=Math.max(-Me.startLeft,Math.min(Ke,Zn)),Wn=Me.startWidth-ba;K(Wn,ba)}return}Me.dir.includes("e")&&(Fn=Math.max(Nc,Math.min(Me.startWidth+Ke,window.innerWidth-Me.startLeft))),Me.dir.includes("s")&&(Sa=Math.max(ky,Math.min(Me.startHeight+st,window.innerHeight-Me.startTop))),Me.dir.includes("w")&&(Fn=Math.max(Nc,Math.min(Me.startWidth-Ke,Me.startLeft+Me.startWidth)),Vt=Me.startLeft+Me.startWidth-Fn),Me.dir.includes("n")&&(Sa=Math.max(ky,Math.min(Me.startHeight-st,Me.startTop+Me.startHeight)),Xt=Me.startTop+Me.startHeight-Sa),ae({left:Vt,top:Xt}),he({width:Fn,height:Sa})},Dt=Pe=>{Y.current?.pointerId===Pe.pointerId&&(Y.current=null,Pe.currentTarget.hasPointerCapture(Pe.pointerId)&&Pe.currentTarget.releasePointerCapture(Pe.pointerId))},dt=!ge&&!fe&&B!==void 0&&E!==void 0,jt=!x&&!dt,Gt=A??Math.min(760,Math.max(440,window.innerWidth*.76)),ln=J?J.width:void 0,Et=J?J.height:void 0,_t=document.querySelector(".topbar")?.getBoundingClientRect().bottom??gU,pe=Math.max(0,_t+du),He=Math.max(0,window.innerWidth-du*2),Je=Math.max(0,window.innerHeight-pe-du),rt=ge?du:dt?x?B.left:B.left+Ah:qe.left,Ye=ge?pe:dt?B.top+E*m1:qe.top,mt=Math.max(0,window.innerWidth-rt-Ry),Qe=Math.max(0,window.innerHeight-Ye-Ry),qt=dt&&!x?dU(N,Math.max(0,window.innerHeight-Ye-uU)):0,ot={left:rt,top:Ye,...ge?{width:He,height:Je}:{},...dt?{width:ln&&!x?ln:x?Gt:Math.max(400,Gt-Ah)}:{},...ln&&!x&&!ge?{width:ln}:{},...Et&&!x&&!ge?{height:Et}:{},minWidth:Math.min(Nc,mt),...qt>0?{minHeight:qt}:{},maxWidth:ge?He:mt,maxHeight:ge?Je:Math.max(Qe,qt),zIndex:x?c+(E??0):c+300,"--result-color":r};return d.jsxs("section",{ref:ee,className:`results-window${x?" is-minimized":""}${ge?" is-maximized":""}${O?" is-cluster-bottom":""}${y?" is-dimmed":""}`,style:ot,role:"dialog","aria-modal":"false","aria-label":t,onPointerDown:T,children:[z&&d.jsxs("div",{className:"results-cluster-bar",onPointerDown:tt,onPointerMove:We,onPointerUp:Le,onPointerCancel:Le,children:[d.jsx("button",{className:"results-cluster-slot",type:"button",onClick:F,disabled:!F,title:"Results in die Filterzeile einklappen","aria-label":"Results in die Filterzeile einklappen","aria-expanded":"true",children:d.jsx(t7,{})}),d.jsx("span",{className:"results-cluster-total","aria-label":`${N} Results im Verbund`,children:N}),d.jsxs("span",{className:"results-cluster-bar-actions",children:[ue&&d.jsx("button",{className:`results-cluster-bookmark${le?" is-bookmarked":""}`,type:"button",title:le?"Alle minimierten Bookmarks entfernen":"Alle minimierten Results im Cluster bookmarken","aria-label":le?"Alle minimierten Bookmarks entfernen":"Alle minimierten Results im Cluster bookmarken",onClick:ue,children:d.jsx(Qu,{filled:le,size:14})}),X&&d.jsx("button",{className:"results-cluster-close",type:"button",onClick:X,title:"Alle Results schliessen","aria-label":"Alle Results schliessen",children:d.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",children:d.jsx("path",{d:"M6 6l12 12M18 6 6 18"})})})]})]}),d.jsxs("header",{className:"results-window-head",onClick:Xe,onDoubleClick:_e,onPointerDown:tt,onPointerMove:We,onPointerUp:Le,onPointerCancel:Le,children:[d.jsxs("h2",{id:`${e}-title`,title:re.name,children:[d.jsxs("span",{className:"results-window-result-summary","aria-label":"Results "+Dy(re.badge),children:[w?d.jsx("button",{className:"results-window-toggle",type:"button",onClick:w,title:x?"Result wiederherstellen":"Result minimieren","aria-label":x?"Result wiederherstellen":"Result minimieren","aria-expanded":!x,children:d.jsx(vn,{direction:x?"right":"down"})}):d.jsx("span",{className:"results-window-toggle-icon","aria-hidden":"true",children:d.jsx(vn,{direction:x?"right":"down"})}),d.jsx("span",{children:Dy(re.badge)})]}),d.jsx("span",{className:"results-window-name",children:re.name})]}),d.jsxs("div",{className:"results-window-actions",children:[L&&d.jsx("button",{className:`results-window-bookmark${I?" is-bookmarked":""}`,type:"button",onClick:L,title:I?"Bookmark entfernen":"Datensatz bookmarken","aria-label":I?"Bookmark entfernen":"Datensatz bookmarken",children:d.jsx(Qu,{filled:I,size:14})}),m&&d.jsx("button",{className:"btn results-window-action",type:"button",onClick:m,title:S,children:g}),p&&d.jsx("button",{className:"results-window-close",type:"button",onClick:p,title:"Close","aria-label":"Close results window",children:d.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",children:d.jsx("path",{d:"M6 6l12 12M18 6 6 18"})})})]})]}),d.jsx("div",{className:"results-window-body",children:d.jsx(oU,{sheets:n,search:f,heading:re.name,sections:Ce,showSheetTitles:me,sheetTitle:Pe=>q6(a,Pe.name),sheetSubtitle:Pe=>te.tableTitles.get(Pe.id),rowHighlighted:Pe=>Vq(a,Pe),rowTone:Pe=>Hq(a,Pe),resizableTables:jt})}),x&&K?d.jsxs(d.Fragment,{children:[d.jsx("span",{className:"results-window-resize results-window-resize-w",onPointerDown:Pt("w"),onPointerMove:Kt,onPointerUp:Dt,onPointerCancel:Dt}),d.jsx("span",{className:"results-window-resize results-window-resize-e",onPointerDown:Pt("e"),onPointerMove:Kt,onPointerUp:Dt,onPointerCancel:Dt})]}):!x&&!ge?vU.map(Pe=>d.jsx("span",{className:`results-window-resize results-window-resize-${Pe}`,onPointerDown:pt(Pe),onPointerMove:Kt,onPointerUp:Dt,onPointerCancel:Dt},Pe)):null]})}const yU=H.memo(function({records:t,raw:n,filtered:a,search:i}){const r=H.useMemo(()=>a?t.map(c=>[`# Record ${c.index+1}`,...c.fields.filter(l=>l.value).map(l=>`${l.label}: ${l.value}`)].join(` +`)).join(` + +`):n,[a,n,t]);return d.jsx("div",{className:"viewer-scroll",children:d.jsx("pre",{className:"raw-view",children:Ot(r,i)})})}),SU=78,Iy=358,bU=223,Bc=12,Ny=20,wU=bU+Bc,Rh=["#7c3aed","#059669","#dc2626","#2563eb","#ea580c","#0d9488","#be185d","#16a34a","#d946ef","#b45309","#4f46e5","#ca8a04","#0369a1","#9333ea","#65a30d","#475569"];function CU(){const e=ca(),{dataset:t,activeSheet:n,view:a,setView:i,search:r,titleColumn:c,selectedRecordId:l,setSelectedRecord:f,reviews:T,updateReview:p}=e,[m,g]=H.useState([]),[S,x]=H.useState(null),[y,w]=H.useState(760),[C,k]=H.useState(!1),[E,O]=H.useState(null),[N,B]=H.useState(()=>({width:window.innerWidth,height:window.innerHeight})),A=H.useRef(null),[z,P]=H.useState(0),K=H.useRef(2100),I=bd(),L=H.useMemo(()=>m.filter(pe=>pe.minimized&&!pe.detached),[m]),le=H.useMemo(()=>m.filter(pe=>!pe.detached),[m]),ue=Math.min(y,Math.max(0,N.width-12)),X=Math.max(m1,L.length*m1),F=Math.max(0,N.width-ue),re=Math.max(0,N.height-X-12),me=H.useMemo(()=>TU(N.width,ue,re,z),[ue,re,N.width,z]),te=me.top,Ce=S??me,ee={left:Math.max(0,Math.min(Ce.left,F)),top:Math.max(te,Math.min(Ce.top,re))},M=H.useMemo(()=>new Map(m.map(pe=>[pe.recordId,pe.color])),[m]),Y=H.useRef(null),[Z,J]=H.useState(1);H.useLayoutEffect(()=>{const pe=Y.current;if(!pe||a!=="columns")return;const He=()=>{const rt=pe.clientWidth-Ny*2;pe.clientWidth>0&&J(Math.max(1,Math.floor((rt+Bc)/(Iy+Bc))))};He();const Je=new ResizeObserver(He);return Je.observe(pe),()=>Je.disconnect()},[a,n,t]);const he=Math.ceil(I.length/Z),ge=xp(he,wU,2),de=H.useCallback(pe=>{if(Y.current=pe,ge.containerRef(pe),pe&&pe.clientWidth>0){const He=pe.clientWidth-Ny*2;J(Math.max(1,Math.floor((He+Bc)/(Iy+Bc))))}},[ge.containerRef]),fe=xp(I.length,SU,8);if(H.useEffect(()=>{if(a!=="records")return;const pe=I.findIndex(He=>He.id===l);pe>=0&&fe.scrollToIndex(pe)},[a,l]),H.useEffect(()=>{const pe=()=>B({width:window.innerWidth,height:window.innerHeight});return window.addEventListener("resize",pe),()=>window.removeEventListener("resize",pe)},[]),H.useLayoutEffect(()=>{const pe=A.current;if(!pe)return;const He=()=>P(pe.getBoundingClientRect().top);He();const Je=new ResizeObserver(He);return Je.observe(pe.parentElement??pe),window.addEventListener("resize",He),()=>{Je.disconnect(),window.removeEventListener("resize",He)}},[n,t,a]),H.useEffect(()=>{a==="records"&&x(null)},[a]),H.useEffect(()=>{a==="records"&&g(pe=>Au(pe,l))},[a,l]),H.useEffect(()=>O(document.getElementById(e7)),[]),H.useEffect(()=>{le.length||k(!1)},[le.length]),!t||!n)return d.jsx(N6,{});const ye=pe=>c&&pe.fields.find(He=>He.label===c)?.value||pe.title,qe=I.find(pe=>pe.id===l)??I[0],ae=n.toolId??t.profileId,Ne=pe=>$6(pe,t.sheets,n.id,ae),Ve=pe=>wd(pe,n.toolId??t.profileId),tt=pe=>Am(pe,n.toolId??t.profileId),We=pe=>Sd("result-links",()=>Ne(pe).length>0||tt(pe).length>0),Le=pe=>g(He=>He.map(Je=>Je.recordId===pe?{...Je,zIndex:++K.current}:Je)),_e=pe=>{const He=Ne(pe),Je=tt(pe),rt=oa(pe,ae);if(!He.length&&!Je.length)return;k(!1);const Ye=He.reduce((mt,Qe)=>mt+Qe.analysis.records.length,0);g(mt=>{if(mt.some(ot=>ot.recordId===pe.id))return mt.filter(ot=>ot.recordId!==pe.id);const Qe=new Set(mt.map(ot=>ot.color)),qt=Rh.find(ot=>!Qe.has(ot))??Rh[mt.length%Rh.length];return[...fU(mt),{recordId:pe.id,toolId:rt,title:He.length?`Results (${Ye.toLocaleString("en-US")}) – ${ye(pe)}`:`Result – ${ye(pe)}`,sheets:He,sections:Je,color:qt,zIndex:++K.current,minimized:!1,detached:!1}]})},Xe=pe=>M.get(pe),pt=pe=>{m.some(He=>He.recordId===pe&&!He.minimized)&&x(me),g(He=>pU(He,pe))},Pt=pe=>{const He=!!T[pe]?.include;p(pe,{include:!He})},Kt=()=>{const pe=L.length>0&&L.every(He=>!!T[He.recordId]?.include);L.forEach(He=>{p(He.recordId,{include:!pe})})},Dt=pe=>{f(pe),g(He=>Au(He,pe)),i("records")},dt={gridTemplateColumns:`repeat(${Z}, var(--tile-content-width))`},jt={gridColumn:"1 / -1",height:ge.paddingTop},Gt={gridColumn:"1 / -1",height:ge.paddingBottom},ln={height:fe.paddingTop},Et={height:fe.paddingBottom},_t=pe=>({"--result-color":pe});return d.jsxs(d.Fragment,{children:[d.jsx("span",{ref:A,className:"results-parking-anchor","aria-hidden":"true"}),I.length?a==="columns"?d.jsx("div",{className:"viewer-scroll tile-view-scroll",ref:de,children:d.jsxs("div",{className:"tile-grid",style:dt,children:[ge.paddingTop>0&&d.jsx("div",{"aria-hidden":"true",style:jt}),I.slice(ge.startIndex*Z,ge.endIndex*Z).map(pe=>d.jsx(W6,{record:pe,title:ye(pe),bookmarked:!!T[pe.id]?.include,resultColor:Xe(pe.id),toolId:n?.toolId??t?.profileId,search:r,onOpen:()=>{f(pe.id),i("records")},onBookmark:()=>p(pe.id,{include:!T[pe.id]?.include}),onResults:We(pe)?()=>_e(pe):void 0},pe.id)),ge.paddingBottom>0&&d.jsx("div",{"aria-hidden":"true",style:Gt})]})}):a==="records"&&qe?d.jsxs("div",{className:"records-layout",children:[d.jsxs("div",{className:"record-list",ref:fe.containerRef,children:[fe.paddingTop>0&&d.jsx("div",{"aria-hidden":"true",style:ln}),I.slice(fe.startIndex,fe.endIndex).map(pe=>d.jsx(Yq,{record:pe,title:ye(pe),bookmarked:!!T[pe.id]?.include,selected:pe.id===qe.id,toolId:n?.toolId??t?.profileId,search:r,onOpen:()=>f(pe.id)},pe.id)),fe.paddingBottom>0&&d.jsx("div",{"aria-hidden":"true",style:Et})]}),d.jsx(tU,{record:qe,title:ye(qe),review:T[qe.id],previousPolicyReviews:i6(qe,T),linkedSheets:Ne(qe),resultReferences:[...ed(qe),...G6(qe)].filter(pe=>pe.trim()!==(Ve(qe)??"").trim()),search:r,position:I.indexOf(qe),recordCount:I.length,toolId:n?.toolId??t?.profileId,onPrevious:()=>f(I[Math.max(0,I.indexOf(qe)-1)].id),onNext:()=>f(I[Math.min(I.length-1,I.indexOf(qe)+1)].id),onReview:pe=>p(qe.id,pe),onRiskAcceptance:qe.findingOccurrenceId&&e.backendStatus==="connected"?pe=>e.recordRiskAcceptance(qe.id,pe):void 0,onResults:We(qe)?()=>_e(qe):void 0,resultsOpen:!!Xe(qe.id),resultColor:Xe(qe.id)})]}):a==="table"?d.jsx(Bq,{sheet:n,records:I,search:r}):d.jsx(yU,{records:I,raw:n.raw||t.rawText,filtered:!!(r||e.actionOnly||e.statusFilter!=="all"||Object.keys(e.facetFilters).length),search:r}):d.jsxs("div",{className:"work-filter-empty",role:"status",children:[d.jsx("h3",{children:"No results match the current filters"}),d.jsxs("p",{children:["The selected sheet contains ",n.analysis.records.length.toLocaleString("en-US")," saved results. GPO comparisons awaiting review or re-evaluation are available under Result Status: All."]}),d.jsx("button",{className:"btn",type:"button",onClick:()=>{const pe=e.facetFilters["provenance:source-scan"];e.resetFilters(),e.setStatusFilter("all"),e.setActionOnly(!1),e.setSearch(""),e.setPathFindingIds([]),pe&&e.setFacetFilter("provenance:source-scan",pe)},children:"Show all results for this source"})]}),C&&E&&vd.createPortal(d.jsxs("div",{className:"result-dock",children:[d.jsx("button",{className:"result-dock-toggle",type:"button",onClick:()=>k(!1),title:"Results wieder aufklappen","aria-label":"Results wieder aufklappen","aria-expanded":"false",children:d.jsx(t7,{})}),d.jsx("span",{className:"result-dock-count",children:le.length}),d.jsx("span",{className:"result-dock-marks",children:le.map(pe=>d.jsx("button",{className:"result-dock-mark",type:"button",style:_t(pe.color),title:pe.title,"aria-label":pe.title,onClick:()=>{k(!1),g(He=>Au(He,pe.recordId))},children:d.jsx(vn,{direction:"right"})},pe.recordId))})]}),E),m.map((pe,He)=>{if(C&&!pe.detached)return null;const Je=pe.minimized?L.findIndex(Qe=>Qe.recordId===pe.recordId):-1,rt=pe.minimized?Je:0,Ye=pe.minimized&&Je===0,mt=pe.minimized&&Je===L.length-1;return d.jsx(n7,{id:`results-${pe.recordId}`,title:pe.title,sheets:pe.sheets,toolId:pe.toolId,sections:pe.sections,color:pe.color,zIndex:pe.zIndex,offset:He*24,search:r,onActivate:()=>Le(pe.recordId),onClose:()=>g(Qe=>Qe.filter(qt=>qt.recordId!==pe.recordId)),onOpenRecord:()=>Dt(pe.recordId),actionLabel:"To Report",actionTitle:"Jump to this finding's record in the Report",minimized:pe.minimized,onToggleMinimize:()=>pt(pe.recordId),detached:pe.detached,onDetach:()=>g(Qe=>mU(Qe,pe.recordId)),clusterIndex:rt>=0?rt:void 0,isClusterBottom:mt,clusterCount:le.length,clusterPosition:ee,clusterWidth:ue,isClusterTop:Ye,onMoveCluster:(Qe,qt)=>x(ot=>{const Pe=ot??me;return{left:Math.max(0,Math.min(Pe.left+Qe,F)),top:Math.max(te,Math.min(Pe.top+qt,re))}}),onResizeClusterWidth:(Qe,qt)=>{w(Qe),qt&&x(ot=>{const Pe=ot??me;return{...Pe,left:Math.max(0,Pe.left+qt)}})},bookmarked:!!T[pe.recordId]?.include,onToggleBookmark:()=>Pt(pe.recordId),allClusterBookmarked:L.length>0&&L.every(Qe=>!!T[Qe.recordId]?.include),onBookmarkCluster:Kt,onCloseCluster:()=>g(Qe=>Qe.filter(qt=>qt.detached)),onDockCluster:()=>k(!0)},pe.recordId)})]})}const nd=7,Sp="ASSESSOR.view-bookmarks.v1",Dh=5e3;function EU(e){return[...new Set(e.nodeIds.filter(t=>t.startsWith("finding:")).map(t=>t.slice(8)).filter(Boolean))]}function kU(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,{...n.values?{values:[...n.values]}:{},...n.minimum!==void 0?{minimum:n.minimum}:{},...n.maximum!==void 0?{maximum:n.maximum}:{}}]))}function AU(e){return{activeSheetId:e.activeSheetId,view:e.view,search:e.search,sortColumn:e.sortColumn,sortDirection:e.sortDirection,titleColumn:e.titleColumn,statusFilter:e.statusFilter,facetFilters:kU(e.facetFilters),pathFindingIds:[...e.pathFindingIds],actionOnly:e.actionOnly,selectedRecordId:e.selectedRecordId}}function RU(e){return e==="records"||e==="columns"||e==="table"||e==="raw"}function DU(e){if(!e||typeof e!="object"||Array.isArray(e))return;const t={};for(const[n,a]of Object.entries(e)){if(!a||typeof a!="object"||Array.isArray(a))return;const i=a;if(i.values!==void 0&&(!Array.isArray(i.values)||!i.values.every(r=>typeof r=="string"))||i.minimum!==void 0&&typeof i.minimum!="string"||i.maximum!==void 0&&typeof i.maximum!="string")return;t[n]={...i.values?{values:[...i.values]}:{},...i.minimum!==void 0?{minimum:i.minimum}:{},...i.maximum!==void 0?{maximum:i.maximum}:{}}}return t}function IU(e){if(!e||typeof e!="object"||Array.isArray(e))return;const t=e,n=t.view,a=DU(n?.facetFilters),i=n?.pathFindingIds===void 0?[]:Array.isArray(n.pathFindingIds)&&n.pathFindingIds.every(l=>typeof l=="string")?[...new Set(n.pathFindingIds.filter(Boolean))].slice(0,Dh):void 0;if(typeof t.id!="string"||typeof t.projectId!="string"||typeof t.name!="string"||!t.name.trim()||typeof t.createdAt!="string"||!n||typeof n.activeSheetId!="string"||!RU(n.view)||typeof n.search!="string"||typeof n.sortColumn!="string"||n.sortDirection!=="asc"&&n.sortDirection!=="desc"||typeof n.titleColumn!="string"||typeof n.statusFilter!="string"||a===void 0||i===void 0||typeof n.actionOnly!="boolean"||typeof n.selectedRecordId!="string")return;const r=t.kind===void 0?void 0:t.kind;if(r!==void 0&&r!=="path")return;let c;if(r==="path"){const l=t.path;if(!l||!Array.isArray(l.activeNodeIds)||!Array.isArray(l.nodeIds)||!l.activeNodeIds.every(p=>typeof p=="string")||!l.nodeIds.every(p=>typeof p=="string"))return;const f=[...new Set(l.activeNodeIds.filter(Boolean))].slice(0,Dh),T=[...new Set(l.nodeIds.filter(Boolean))].slice(0,Dh);if(!f.length||f.some(p=>!T.includes(p)))return;c={activeNodeIds:f,nodeIds:T}}return{id:t.id,projectId:t.projectId,name:t.name.trim().slice(0,32),createdAt:t.createdAt,view:{...n,facetFilters:a,pathFindingIds:i},...r==="path"&&c?{kind:r,path:c}:{}}}function a7(e){if(!e)return[];try{const t=JSON.parse(e);return Array.isArray(t)?t.map(IU).filter(n=>!!n):[]}catch{return[]}}function NU(e,t){return a7(e.get(Sp)).filter(n=>n.projectId===t).slice(0,nd)}function OU(e,t,n){const a=a7(e.get(Sp)).filter(r=>r.projectId!==t),i=n.filter(r=>r.projectId===t).slice(0,nd);e.set(Sp,JSON.stringify([...a,...i]))}const Oy=new bb;function MU(){return globalThis.crypto?.randomUUID?.()??`view-${Date.now().toString(36)}`}function i7({mode:e="view",path:t,onApplyPathSnapshot:n}={}){const a=ca(),[i,r]=H.useState([]),[c,l]=H.useState(!1),[f,T]=H.useState(""),p=a.workScopeId;H.useEffect(()=>{r(p?NU(Oy,p):[]),l(!1),T("")},[p]);const m=f.trim(),g=H.useMemo(()=>i.some(E=>E.name.toLocaleLowerCase("de-DE")===m.toLocaleLowerCase("de-DE")),[i,m]),S=i.length>=nd,x=e!=="path"||!!t?.activeNodeIds.length,y=!!(m&&!g&&!S&&p&&x),w=E=>{r(E),OU(Oy,p,E)},C=E=>{if(E.preventDefault(),!y)return;const O={id:MU(),projectId:p,name:m.slice(0,32),createdAt:new Date().toISOString(),view:AU(a),...e==="path"&&t?{kind:"path",path:{activeNodeIds:[...t.activeNodeIds],nodeIds:[...t.nodeIds]}}:{}};w([...i,O]),T(""),l(!1)},k=E=>{w(i.filter(O=>O.id!==E))};return d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"view-bookmark-bar",role:"group","aria-label":"View bookmarks",children:[d.jsx("button",{className:"btn primary view-bookmark-create",type:"button",disabled:!a.dataset||!p||S||!x,title:S?`Maximum of ${nd} snapshots reached`:e==="path"&&!x?"Select at least one graph point":e==="path"?"Save active graph points and their direct neighbours":"Bookmark current view",onClick:()=>l(!0),children:e==="path"?"Path Snapshot":"Snapshot"}),d.jsx("div",{className:"view-bookmark-list",children:i.map(E=>d.jsxs("span",{className:`view-bookmark-item${E.kind==="path"?" is-path":""}`,children:[d.jsx("button",{className:"btn view-bookmark-entry",type:"button",title:`Open ${E.kind==="path"?"path snapshot":"view bookmark"}: ${E.name}`,onClick:()=>{a.applyViewBookmark(E.view),E.kind==="path"&&n?.(E)},children:E.name}),d.jsx("button",{className:"view-bookmark-remove",type:"button","aria-label":`Delete ${E.kind==="path"?"path snapshot":"view bookmark"}: ${E.name}`,title:`Delete ${E.name}`,onClick:()=>k(E.id),children:"x"})]},E.id))})]}),c&&d.jsx("div",{className:"view-bookmark-dialog-backdrop",role:"presentation",onMouseDown:()=>l(!1),children:d.jsxs("form",{className:"popover view-bookmark-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"view-bookmark-dialog-title",onSubmit:C,onMouseDown:E=>E.stopPropagation(),children:[d.jsx("strong",{id:"view-bookmark-dialog-title",children:e==="path"?"Name path snapshot":"Name view bookmark"}),d.jsx("label",{htmlFor:"view-bookmark-name",children:e==="path"?"Path snapshot name":"Bookmark name"}),d.jsx("input",{id:"view-bookmark-name",className:"input",autoFocus:!0,maxLength:32,value:f,onChange:E=>T(E.target.value)}),g&&d.jsx("small",{role:"alert",children:"This name is already in use."}),d.jsxs("footer",{children:[d.jsx("button",{className:"btn",type:"button",onClick:()=>l(!1),children:"Cancel"}),d.jsx("button",{className:"btn primary",type:"submit",disabled:!y,children:"Save"})]})]})})]})}const jU="18.1",FU=["Reconnaissance","Resource Development","Initial Access","Execution","Persistence","Privilege Escalation","Defense Evasion","Credential Access","Discovery","Lateral Movement","Collection","Command and Control","Exfiltration","Impact"],LU=JSON.parse('[{"id":"T1001","name":"Data Obfuscation","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1001","sourceCount":13},{"id":"T1001.001","name":"Data Obfuscation: Junk Data","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1001","url":"https://attack.mitre.org/techniques/T1001/001","sourceCount":17},{"id":"T1001.002","name":"Data Obfuscation: Steganography","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1001","url":"https://attack.mitre.org/techniques/T1001/002","sourceCount":13},{"id":"T1001.003","name":"Data Obfuscation: Protocol or Service Impersonation","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1001","url":"https://attack.mitre.org/techniques/T1001/003","sourceCount":22},{"id":"T1003","name":"OS Credential Dumping","tactics":["Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1003","sourceCount":20},{"id":"T1003.001","name":"OS Credential Dumping: LSASS Memory","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1003","url":"https://attack.mitre.org/techniques/T1003/001","sourceCount":75},{"id":"T1003.002","name":"OS Credential Dumping: Security Account Manager","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1003","url":"https://attack.mitre.org/techniques/T1003/002","sourceCount":33},{"id":"T1003.003","name":"OS Credential Dumping: NTDS","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1003","url":"https://attack.mitre.org/techniques/T1003/003","sourceCount":24},{"id":"T1003.004","name":"OS Credential Dumping: LSA Secrets","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1003","url":"https://attack.mitre.org/techniques/T1003/004","sourceCount":19},{"id":"T1003.005","name":"OS Credential Dumping: Cached Domain Credentials","tactics":["Credential Access"],"platforms":["Linux","Windows"],"parent":"T1003","url":"https://attack.mitre.org/techniques/T1003/005","sourceCount":8},{"id":"T1003.006","name":"OS Credential Dumping: DCSync","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1003","url":"https://attack.mitre.org/techniques/T1003/006","sourceCount":8},{"id":"T1003.007","name":"OS Credential Dumping: Proc Filesystem","tactics":["Credential Access"],"platforms":["Linux"],"parent":"T1003","url":"https://attack.mitre.org/techniques/T1003/007","sourceCount":3},{"id":"T1003.008","name":"OS Credential Dumping: /etc/passwd and /etc/shadow","tactics":["Credential Access"],"platforms":["Linux"],"parent":"T1003","url":"https://attack.mitre.org/techniques/T1003/008","sourceCount":2},{"id":"T1005","name":"Data from Local System","tactics":["Collection"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1005","sourceCount":218},{"id":"T1006","name":"Direct Volume Access","tactics":["Defense Evasion"],"platforms":["Network Devices","Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1006","sourceCount":4},{"id":"T1007","name":"System Service Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1007","sourceCount":67},{"id":"T1008","name":"Fallback Channels","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1008","sourceCount":53},{"id":"T1010","name":"Application Window Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1010","sourceCount":35},{"id":"T1011","name":"Exfiltration Over Other Network Medium","tactics":["Exfiltration"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1011","sourceCount":0},{"id":"T1011.001","name":"Exfiltration Over Other Network Medium: Exfiltration Over Bluetooth","tactics":["Exfiltration"],"platforms":["Linux","Windows","macOS"],"parent":"T1011","url":"https://attack.mitre.org/techniques/T1011/001","sourceCount":1},{"id":"T1012","name":"Query Registry","tactics":["Discovery"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1012","sourceCount":118},{"id":"T1014","name":"Rootkit","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1014","sourceCount":32},{"id":"T1016","name":"System Network Configuration Discovery","tactics":["Discovery"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1016","sourceCount":277},{"id":"T1016.001","name":"System Network Configuration Discovery: Internet Connection Discovery","tactics":["Discovery"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1016","url":"https://attack.mitre.org/techniques/T1016/001","sourceCount":26},{"id":"T1016.002","name":"System Network Configuration Discovery: Wi-Fi Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1016","url":"https://attack.mitre.org/techniques/T1016/002","sourceCount":7},{"id":"T1018","name":"Remote System Discovery","tactics":["Discovery"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1018","sourceCount":99},{"id":"T1020","name":"Automated Exfiltration","tactics":["Exfiltration"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1020","sourceCount":29},{"id":"T1020.001","name":"Automated Exfiltration: Traffic Duplication","tactics":["Exfiltration"],"platforms":["IaaS","Network Devices"],"parent":"T1020","url":"https://attack.mitre.org/techniques/T1020/001","sourceCount":0},{"id":"T1021","name":"Remote Services","tactics":["Lateral Movement"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1021","sourceCount":7},{"id":"T1021.001","name":"Remote Services: Remote Desktop Protocol","tactics":["Lateral Movement"],"platforms":["Windows"],"parent":"T1021","url":"https://attack.mitre.org/techniques/T1021/001","sourceCount":59},{"id":"T1021.002","name":"Remote Services: SMB/Windows Admin Shares","tactics":["Lateral Movement"],"platforms":["Windows"],"parent":"T1021","url":"https://attack.mitre.org/techniques/T1021/002","sourceCount":64},{"id":"T1021.003","name":"Remote Services: Distributed Component Object Model","tactics":["Lateral Movement"],"platforms":["Windows"],"parent":"T1021","url":"https://attack.mitre.org/techniques/T1021/003","sourceCount":3},{"id":"T1021.004","name":"Remote Services: SSH","tactics":["Lateral Movement"],"platforms":["ESXi","Linux","macOS"],"parent":"T1021","url":"https://attack.mitre.org/techniques/T1021/004","sourceCount":26},{"id":"T1021.005","name":"Remote Services: VNC","tactics":["Lateral Movement"],"platforms":["Linux","Windows","macOS"],"parent":"T1021","url":"https://attack.mitre.org/techniques/T1021/005","sourceCount":11},{"id":"T1021.006","name":"Remote Services: Windows Remote Management","tactics":["Lateral Movement"],"platforms":["Windows"],"parent":"T1021","url":"https://attack.mitre.org/techniques/T1021/006","sourceCount":10},{"id":"T1021.007","name":"Remote Services: Cloud Services","tactics":["Lateral Movement"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1021","url":"https://attack.mitre.org/techniques/T1021/007","sourceCount":4},{"id":"T1021.008","name":"Remote Services: Direct Cloud VM Connections","tactics":["Lateral Movement"],"platforms":["IaaS"],"parent":"T1021","url":"https://attack.mitre.org/techniques/T1021/008","sourceCount":0},{"id":"T1025","name":"Data from Removable Media","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1025","sourceCount":24},{"id":"T1027","name":"Obfuscated Files or Information","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1027","sourceCount":152},{"id":"T1027.001","name":"Obfuscated Files or Information: Binary Padding","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/001","sourceCount":28},{"id":"T1027.002","name":"Obfuscated Files or Information: Software Packing","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/002","sourceCount":102},{"id":"T1027.003","name":"Obfuscated Files or Information: Steganography","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/003","sourceCount":29},{"id":"T1027.004","name":"Obfuscated Files or Information: Compile After Delivery","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/004","sourceCount":10},{"id":"T1027.005","name":"Obfuscated Files or Information: Indicator Removal from Tools","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/005","sourceCount":18},{"id":"T1027.006","name":"Obfuscated Files or Information: HTML Smuggling","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/006","sourceCount":3},{"id":"T1027.007","name":"Obfuscated Files or Information: Dynamic API Resolution","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/007","sourceCount":15},{"id":"T1027.008","name":"Obfuscated Files or Information: Stripped Payloads","tactics":["Defense Evasion"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/008","sourceCount":2},{"id":"T1027.009","name":"Obfuscated Files or Information: Embedded Payloads","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/009","sourceCount":23},{"id":"T1027.010","name":"Obfuscated Files or Information: Command Obfuscation","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/010","sourceCount":65},{"id":"T1027.011","name":"Obfuscated Files or Information: Fileless Storage","tactics":["Defense Evasion"],"platforms":["Linux","Windows"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/011","sourceCount":31},{"id":"T1027.012","name":"Obfuscated Files or Information: LNK Icon Smuggling","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/012","sourceCount":4},{"id":"T1027.013","name":"Obfuscated Files or Information: Encrypted/Encoded File","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/013","sourceCount":221},{"id":"T1027.014","name":"Obfuscated Files or Information: Polymorphic Code","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/014","sourceCount":1},{"id":"T1027.015","name":"Obfuscated Files or Information: Compression","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/015","sourceCount":31},{"id":"T1027.016","name":"Obfuscated Files or Information: Junk Code Insertion","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/016","sourceCount":19},{"id":"T1027.017","name":"Obfuscated Files or Information: SVG Smuggling","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1027","url":"https://attack.mitre.org/techniques/T1027/017","sourceCount":0},{"id":"T1029","name":"Scheduled Transfer","tactics":["Exfiltration"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1029","sourceCount":18},{"id":"T1030","name":"Data Transfer Size Limits","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1030","sourceCount":21},{"id":"T1033","name":"System Owner/User Discovery","tactics":["Discovery"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1033","sourceCount":231},{"id":"T1036","name":"Masquerading","tactics":["Defense Evasion"],"platforms":["Containers","ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1036","sourceCount":58},{"id":"T1036.001","name":"Masquerading: Invalid Code Signature","tactics":["Defense Evasion"],"platforms":["Windows","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/001","sourceCount":9},{"id":"T1036.002","name":"Masquerading: Right-to-Left Override","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/002","sourceCount":5},{"id":"T1036.003","name":"Masquerading: Rename Legitimate Utilities","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/003","sourceCount":10},{"id":"T1036.004","name":"Masquerading: Masquerade Task or Service","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/004","sourceCount":90},{"id":"T1036.005","name":"Masquerading: Match Legitimate Resource Name or Location","tactics":["Defense Evasion"],"platforms":["Containers","ESXi","Linux","Windows","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/005","sourceCount":202},{"id":"T1036.006","name":"Masquerading: Space after Filename","tactics":["Defense Evasion"],"platforms":["Linux","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/006","sourceCount":2},{"id":"T1036.007","name":"Masquerading: Double File Extension","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/007","sourceCount":5},{"id":"T1036.008","name":"Masquerading: Masquerade File Type","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/008","sourceCount":16},{"id":"T1036.009","name":"Masquerading: Break Process Trees","tactics":["Defense Evasion"],"platforms":["Linux","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/009","sourceCount":1},{"id":"T1036.010","name":"Masquerading: Masquerade Account Name","tactics":["Defense Evasion"],"platforms":["Containers","IaaS","Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/010","sourceCount":7},{"id":"T1036.011","name":"Masquerading: Overwrite Process Arguments","tactics":["Defense Evasion"],"platforms":["Linux"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/011","sourceCount":1},{"id":"T1036.012","name":"Masquerading: Browser Fingerprint","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1036","url":"https://attack.mitre.org/techniques/T1036/012","sourceCount":1},{"id":"T1037","name":"Boot or Logon Initialization Scripts","tactics":["Persistence","Privilege Escalation"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1037","sourceCount":7},{"id":"T1037.001","name":"Boot or Logon Initialization Scripts: Logon Script (Windows)","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1037","url":"https://attack.mitre.org/techniques/T1037/001","sourceCount":6},{"id":"T1037.002","name":"Boot or Logon Initialization Scripts: Login Hook","tactics":["Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1037","url":"https://attack.mitre.org/techniques/T1037/002","sourceCount":0},{"id":"T1037.003","name":"Boot or Logon Initialization Scripts: Network Logon Script","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1037","url":"https://attack.mitre.org/techniques/T1037/003","sourceCount":0},{"id":"T1037.004","name":"Boot or Logon Initialization Scripts: RC Scripts","tactics":["Persistence","Privilege Escalation"],"platforms":["ESXi","Linux","Network Devices","macOS"],"parent":"T1037","url":"https://attack.mitre.org/techniques/T1037/004","sourceCount":7},{"id":"T1037.005","name":"Boot or Logon Initialization Scripts: Startup Items","tactics":["Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1037","url":"https://attack.mitre.org/techniques/T1037/005","sourceCount":1},{"id":"T1039","name":"Data from Network Shared Drive","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1039","sourceCount":13},{"id":"T1040","name":"Network Sniffing","tactics":["Credential Access","Discovery"],"platforms":["IaaS","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1040","sourceCount":27},{"id":"T1041","name":"Exfiltration Over C2 Channel","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1041","sourceCount":191},{"id":"T1046","name":"Network Service Discovery","tactics":["Discovery"],"platforms":["Containers","IaaS","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1046","sourceCount":71},{"id":"T1047","name":"Windows Management Instrumentation","tactics":["Execution"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1047","sourceCount":138},{"id":"T1048","name":"Exfiltration Over Alternative Protocol","tactics":["Exfiltration"],"platforms":["ESXi","IaaS","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1048","sourceCount":9},{"id":"T1048.001","name":"Exfiltration Over Alternative Protocol: Exfiltration Over Symmetric Encrypted Non-C2 Protocol","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1048","url":"https://attack.mitre.org/techniques/T1048/001","sourceCount":0},{"id":"T1048.002","name":"Exfiltration Over Alternative Protocol: Exfiltration Over Asymmetric Encrypted Non-C2 Protocol","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1048","url":"https://attack.mitre.org/techniques/T1048/002","sourceCount":6},{"id":"T1048.003","name":"Exfiltration Over Alternative Protocol: Exfiltration Over Unencrypted Non-C2 Protocol","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1048","url":"https://attack.mitre.org/techniques/T1048/003","sourceCount":34},{"id":"T1049","name":"System Network Connections Discovery","tactics":["Discovery"],"platforms":["ESXi","IaaS","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1049","sourceCount":95},{"id":"T1052","name":"Exfiltration Over Physical Medium","tactics":["Exfiltration"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1052","sourceCount":0},{"id":"T1052.001","name":"Exfiltration Over Physical Medium: Exfiltration over USB","tactics":["Exfiltration"],"platforms":["Linux","Windows","macOS"],"parent":"T1052","url":"https://attack.mitre.org/techniques/T1052/001","sourceCount":7},{"id":"T1053","name":"Scheduled Task/Job","tactics":["Execution","Persistence","Privilege Escalation"],"platforms":["Containers","ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1053","sourceCount":1},{"id":"T1053.002","name":"Scheduled Task/Job: At","tactics":["Execution","Persistence","Privilege Escalation"],"platforms":["Linux","Windows","macOS"],"parent":"T1053","url":"https://attack.mitre.org/techniques/T1053/002","sourceCount":6},{"id":"T1053.003","name":"Scheduled Task/Job: Cron","tactics":["Execution","Persistence","Privilege Escalation"],"platforms":["ESXi","Linux","macOS"],"parent":"T1053","url":"https://attack.mitre.org/techniques/T1053/003","sourceCount":16},{"id":"T1053.005","name":"Scheduled Task/Job: Scheduled Task","tactics":["Execution","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1053","url":"https://attack.mitre.org/techniques/T1053/005","sourceCount":184},{"id":"T1053.006","name":"Scheduled Task/Job: Systemd Timers","tactics":["Execution","Persistence","Privilege Escalation"],"platforms":["Linux"],"parent":"T1053","url":"https://attack.mitre.org/techniques/T1053/006","sourceCount":0},{"id":"T1053.007","name":"Scheduled Task/Job: Container Orchestration Job","tactics":["Execution","Persistence","Privilege Escalation"],"platforms":["Containers"],"parent":"T1053","url":"https://attack.mitre.org/techniques/T1053/007","sourceCount":0},{"id":"T1055","name":"Process Injection","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1055","sourceCount":82},{"id":"T1055.001","name":"Process Injection: Dynamic-link Library Injection","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/001","sourceCount":66},{"id":"T1055.002","name":"Process Injection: Portable Executable Injection","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/002","sourceCount":13},{"id":"T1055.003","name":"Process Injection: Thread Execution Hijacking","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/003","sourceCount":4},{"id":"T1055.004","name":"Process Injection: Asynchronous Procedure Call","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/004","sourceCount":12},{"id":"T1055.005","name":"Process Injection: Thread Local Storage","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/005","sourceCount":2},{"id":"T1055.008","name":"Process Injection: Ptrace System Calls","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Linux"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/008","sourceCount":1},{"id":"T1055.009","name":"Process Injection: Proc Memory","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Linux"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/009","sourceCount":1},{"id":"T1055.011","name":"Process Injection: Extra Window Memory Injection","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/011","sourceCount":2},{"id":"T1055.012","name":"Process Injection: Process Hollowing","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/012","sourceCount":39},{"id":"T1055.013","name":"Process Injection: Process Doppelgänging","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/013","sourceCount":3},{"id":"T1055.014","name":"Process Injection: VDSO Hijacking","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Linux"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/014","sourceCount":0},{"id":"T1055.015","name":"Process Injection: ListPlanting","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1055","url":"https://attack.mitre.org/techniques/T1055/015","sourceCount":1},{"id":"T1056","name":"Input Capture","tactics":["Collection","Credential Access"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1056","sourceCount":12},{"id":"T1056.001","name":"Input Capture: Keylogging","tactics":["Collection","Credential Access"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1056","url":"https://attack.mitre.org/techniques/T1056/001","sourceCount":152},{"id":"T1056.002","name":"Input Capture: GUI Input Capture","tactics":["Collection","Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1056","url":"https://attack.mitre.org/techniques/T1056/002","sourceCount":13},{"id":"T1056.003","name":"Input Capture: Web Portal Capture","tactics":["Collection","Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1056","url":"https://attack.mitre.org/techniques/T1056/003","sourceCount":5},{"id":"T1056.004","name":"Input Capture: Credential API Hooking","tactics":["Collection","Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1056","url":"https://attack.mitre.org/techniques/T1056/004","sourceCount":12},{"id":"T1057","name":"Process Discovery","tactics":["Discovery"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1057","sourceCount":304},{"id":"T1059","name":"Command and Scripting Interpreter","tactics":["Execution"],"platforms":["ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1059","sourceCount":43},{"id":"T1059.001","name":"Command and Scripting Interpreter: PowerShell","tactics":["Execution"],"platforms":["Windows"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/001","sourceCount":223},{"id":"T1059.002","name":"Command and Scripting Interpreter: AppleScript","tactics":["Execution"],"platforms":["macOS"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/002","sourceCount":5},{"id":"T1059.003","name":"Command and Scripting Interpreter: Windows Command Shell","tactics":["Execution"],"platforms":["Windows"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/003","sourceCount":372},{"id":"T1059.004","name":"Command and Scripting Interpreter: Unix Shell","tactics":["Execution"],"platforms":["ESXi","Linux","Network Devices","macOS"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/004","sourceCount":60},{"id":"T1059.005","name":"Command and Scripting Interpreter: Visual Basic","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/005","sourceCount":127},{"id":"T1059.006","name":"Command and Scripting Interpreter: Python","tactics":["Execution"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/006","sourceCount":55},{"id":"T1059.007","name":"Command and Scripting Interpreter: JavaScript","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/007","sourceCount":62},{"id":"T1059.008","name":"Command and Scripting Interpreter: Network Device CLI","tactics":["Execution"],"platforms":["Network Devices"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/008","sourceCount":2},{"id":"T1059.009","name":"Command and Scripting Interpreter: Cloud API","tactics":["Execution"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/009","sourceCount":4},{"id":"T1059.010","name":"Command and Scripting Interpreter: AutoHotKey & AutoIT","tactics":["Execution"],"platforms":["Windows"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/010","sourceCount":6},{"id":"T1059.011","name":"Command and Scripting Interpreter: Lua","tactics":["Execution"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/011","sourceCount":5},{"id":"T1059.012","name":"Command and Scripting Interpreter: Hypervisor CLI","tactics":["Execution"],"platforms":["ESXi"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/012","sourceCount":4},{"id":"T1059.013","name":"Command and Scripting Interpreter: Container CLI/API","tactics":["Execution"],"platforms":["Containers"],"parent":"T1059","url":"https://attack.mitre.org/techniques/T1059/013","sourceCount":1},{"id":"T1068","name":"Exploitation for Privilege Escalation","tactics":["Privilege Escalation"],"platforms":["Containers","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1068","sourceCount":43},{"id":"T1069","name":"Permission Groups Discovery","tactics":["Discovery"],"platforms":["Containers","IaaS","Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1069","sourceCount":13},{"id":"T1069.001","name":"Permission Groups Discovery: Local Groups","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1069","url":"https://attack.mitre.org/techniques/T1069/001","sourceCount":31},{"id":"T1069.002","name":"Permission Groups Discovery: Domain Groups","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1069","url":"https://attack.mitre.org/techniques/T1069/002","sourceCount":36},{"id":"T1069.003","name":"Permission Groups Discovery: Cloud Groups","tactics":["Discovery"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1069","url":"https://attack.mitre.org/techniques/T1069/003","sourceCount":4},{"id":"T1070","name":"Indicator Removal","tactics":["Defense Evasion"],"platforms":["Containers","ESXi","Linux","Network Devices","Office Suite","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1070","sourceCount":31},{"id":"T1070.001","name":"Indicator Removal: Clear Windows Event Logs","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/001","sourceCount":40},{"id":"T1070.002","name":"Indicator Removal: Clear Linux or Mac System Logs","tactics":["Defense Evasion"],"platforms":["Linux","macOS"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/002","sourceCount":8},{"id":"T1070.003","name":"Indicator Removal: Clear Command History","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/003","sourceCount":11},{"id":"T1070.004","name":"Indicator Removal: File Deletion","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/004","sourceCount":296},{"id":"T1070.005","name":"Indicator Removal: Network Share Connection Removal","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/005","sourceCount":5},{"id":"T1070.006","name":"Indicator Removal: Timestomp","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/006","sourceCount":56},{"id":"T1070.007","name":"Indicator Removal: Clear Network Connection History and Configurations","tactics":["Defense Evasion"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/007","sourceCount":4},{"id":"T1070.008","name":"Indicator Removal: Clear Mailbox Data","tactics":["Defense Evasion"],"platforms":["Linux","Office Suite","Windows","macOS"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/008","sourceCount":5},{"id":"T1070.009","name":"Indicator Removal: Clear Persistence","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/009","sourceCount":15},{"id":"T1070.010","name":"Indicator Removal: Relocate Malware","tactics":["Defense Evasion"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1070","url":"https://attack.mitre.org/techniques/T1070/010","sourceCount":0},{"id":"T1071","name":"Application Layer Protocol","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1071","sourceCount":16},{"id":"T1071.001","name":"Application Layer Protocol: Web Protocols","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1071","url":"https://attack.mitre.org/techniques/T1071/001","sourceCount":406},{"id":"T1071.002","name":"Application Layer Protocol: File Transfer Protocols","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1071","url":"https://attack.mitre.org/techniques/T1071/002","sourceCount":25},{"id":"T1071.003","name":"Application Layer Protocol: Mail Protocols","tactics":["Command and Control"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1071","url":"https://attack.mitre.org/techniques/T1071/003","sourceCount":26},{"id":"T1071.004","name":"Application Layer Protocol: DNS","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1071","url":"https://attack.mitre.org/techniques/T1071/004","sourceCount":53},{"id":"T1071.005","name":"Application Layer Protocol: Publish/Subscribe Protocols","tactics":["Command and Control"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1071","url":"https://attack.mitre.org/techniques/T1071/005","sourceCount":1},{"id":"T1072","name":"Software Deployment Tools","tactics":["Execution","Lateral Movement"],"platforms":["Linux","Network Devices","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1072","sourceCount":8},{"id":"T1074","name":"Data Staged","tactics":["Collection"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1074","sourceCount":8},{"id":"T1074.001","name":"Data Staged: Local Data Staging","tactics":["Collection"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1074","url":"https://attack.mitre.org/techniques/T1074/001","sourceCount":126},{"id":"T1074.002","name":"Data Staged: Remote Data Staging","tactics":["Collection"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":"T1074","url":"https://attack.mitre.org/techniques/T1074/002","sourceCount":13},{"id":"T1078","name":"Valid Accounts","tactics":["Defense Evasion","Initial Access","Persistence","Privilege Escalation"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1078","sourceCount":60},{"id":"T1078.001","name":"Valid Accounts: Default Accounts","tactics":["Defense Evasion","Initial Access","Persistence","Privilege Escalation"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":"T1078","url":"https://attack.mitre.org/techniques/T1078/001","sourceCount":7},{"id":"T1078.002","name":"Valid Accounts: Domain Accounts","tactics":["Defense Evasion","Initial Access","Persistence","Privilege Escalation"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1078","url":"https://attack.mitre.org/techniques/T1078/002","sourceCount":32},{"id":"T1078.003","name":"Valid Accounts: Local Accounts","tactics":["Defense Evasion","Initial Access","Persistence","Privilege Escalation"],"platforms":["Containers","ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1078","url":"https://attack.mitre.org/techniques/T1078/003","sourceCount":20},{"id":"T1078.004","name":"Valid Accounts: Cloud Accounts","tactics":["Defense Evasion","Initial Access","Persistence","Privilege Escalation"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1078","url":"https://attack.mitre.org/techniques/T1078/004","sourceCount":14},{"id":"T1080","name":"Taint Shared Content","tactics":["Lateral Movement"],"platforms":["Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1080","sourceCount":12},{"id":"T1082","name":"System Information Discovery","tactics":["Discovery"],"platforms":["ESXi","IaaS","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1082","sourceCount":403},{"id":"T1083","name":"File and Directory Discovery","tactics":["Discovery"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1083","sourceCount":355},{"id":"T1087","name":"Account Discovery","tactics":["Discovery"],"platforms":["ESXi","IaaS","Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1087","sourceCount":9},{"id":"T1087.001","name":"Account Discovery: Local Account","tactics":["Discovery"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1087","url":"https://attack.mitre.org/techniques/T1087/001","sourceCount":63},{"id":"T1087.002","name":"Account Discovery: Domain Account","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1087","url":"https://attack.mitre.org/techniques/T1087/002","sourceCount":56},{"id":"T1087.003","name":"Account Discovery: Email Account","tactics":["Discovery"],"platforms":["Office Suite","Windows"],"parent":"T1087","url":"https://attack.mitre.org/techniques/T1087/003","sourceCount":14},{"id":"T1087.004","name":"Account Discovery: Cloud Account","tactics":["Discovery"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1087","url":"https://attack.mitre.org/techniques/T1087/004","sourceCount":6},{"id":"T1090","name":"Proxy","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1090","sourceCount":72},{"id":"T1090.001","name":"Proxy: Internal Proxy","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1090","url":"https://attack.mitre.org/techniques/T1090/001","sourceCount":32},{"id":"T1090.002","name":"Proxy: External Proxy","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1090","url":"https://attack.mitre.org/techniques/T1090/002","sourceCount":22},{"id":"T1090.003","name":"Proxy: Multi-hop Proxy","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1090","url":"https://attack.mitre.org/techniques/T1090/003","sourceCount":38},{"id":"T1090.004","name":"Proxy: Domain Fronting","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1090","url":"https://attack.mitre.org/techniques/T1090/004","sourceCount":5},{"id":"T1091","name":"Replication Through Removable Media","tactics":["Initial Access","Lateral Movement"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1091","sourceCount":28},{"id":"T1092","name":"Communication Through Removable Media","tactics":["Command and Control"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1092","sourceCount":3},{"id":"T1095","name":"Non-Application Layer Protocol","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1095","sourceCount":106},{"id":"T1098","name":"Account Manipulation","tactics":["Persistence","Privilege Escalation"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1098","sourceCount":6},{"id":"T1098.001","name":"Account Manipulation: Additional Cloud Credentials","tactics":["Persistence","Privilege Escalation"],"platforms":["IaaS","Identity Provider","SaaS"],"parent":"T1098","url":"https://attack.mitre.org/techniques/T1098/001","sourceCount":4},{"id":"T1098.002","name":"Account Manipulation: Additional Email Delegate Permissions","tactics":["Persistence","Privilege Escalation"],"platforms":["Office Suite","Windows"],"parent":"T1098","url":"https://attack.mitre.org/techniques/T1098/002","sourceCount":5},{"id":"T1098.003","name":"Account Manipulation: Additional Cloud Roles","tactics":["Persistence","Privilege Escalation"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1098","url":"https://attack.mitre.org/techniques/T1098/003","sourceCount":5},{"id":"T1098.004","name":"Account Manipulation: SSH Authorized Keys","tactics":["Persistence","Privilege Escalation"],"platforms":["ESXi","IaaS","Linux","Network Devices","macOS"],"parent":"T1098","url":"https://attack.mitre.org/techniques/T1098/004","sourceCount":6},{"id":"T1098.005","name":"Account Manipulation: Device Registration","tactics":["Persistence","Privilege Escalation"],"platforms":["Identity Provider","Windows"],"parent":"T1098","url":"https://attack.mitre.org/techniques/T1098/005","sourceCount":4},{"id":"T1098.006","name":"Account Manipulation: Additional Container Cluster Roles","tactics":["Persistence","Privilege Escalation"],"platforms":["Containers"],"parent":"T1098","url":"https://attack.mitre.org/techniques/T1098/006","sourceCount":0},{"id":"T1098.007","name":"Account Manipulation: Additional Local or Domain Groups","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux","Windows","macOS"],"parent":"T1098","url":"https://attack.mitre.org/techniques/T1098/007","sourceCount":11},{"id":"T1102","name":"Web Service","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1102","sourceCount":45},{"id":"T1102.001","name":"Web Service: Dead Drop Resolver","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1102","url":"https://attack.mitre.org/techniques/T1102/001","sourceCount":23},{"id":"T1102.002","name":"Web Service: Bidirectional Communication","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1102","url":"https://attack.mitre.org/techniques/T1102/002","sourceCount":54},{"id":"T1102.003","name":"Web Service: One-Way Communication","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1102","url":"https://attack.mitre.org/techniques/T1102/003","sourceCount":9},{"id":"T1104","name":"Multi-Stage Channels","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1104","sourceCount":15},{"id":"T1105","name":"Ingress Tool Transfer","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1105","sourceCount":498},{"id":"T1106","name":"Native API","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1106","sourceCount":211},{"id":"T1110","name":"Brute Force","tactics":["Credential Access"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1110","sourceCount":23},{"id":"T1110.001","name":"Brute Force: Password Guessing","tactics":["Credential Access"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":"T1110","url":"https://attack.mitre.org/techniques/T1110/001","sourceCount":11},{"id":"T1110.002","name":"Brute Force: Password Cracking","tactics":["Credential Access"],"platforms":["Identity Provider","Linux","Network Devices","Office Suite","Windows","macOS"],"parent":"T1110","url":"https://attack.mitre.org/techniques/T1110/002","sourceCount":6},{"id":"T1110.003","name":"Brute Force: Password Spraying","tactics":["Credential Access"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":"T1110","url":"https://attack.mitre.org/techniques/T1110/003","sourceCount":17},{"id":"T1110.004","name":"Brute Force: Credential Stuffing","tactics":["Credential Access"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":"T1110","url":"https://attack.mitre.org/techniques/T1110/004","sourceCount":2},{"id":"T1111","name":"Multi-Factor Authentication Interception","tactics":["Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1111","sourceCount":8},{"id":"T1112","name":"Modify Registry","tactics":["Defense Evasion","Persistence"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1112","sourceCount":170},{"id":"T1113","name":"Screen Capture","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1113","sourceCount":166},{"id":"T1114","name":"Email Collection","tactics":["Collection"],"platforms":["Linux","Office Suite","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1114","sourceCount":6},{"id":"T1114.001","name":"Email Collection: Local Email Collection","tactics":["Collection"],"platforms":["Windows"],"parent":"T1114","url":"https://attack.mitre.org/techniques/T1114/001","sourceCount":18},{"id":"T1114.002","name":"Email Collection: Remote Email Collection","tactics":["Collection"],"platforms":["Office Suite","Windows"],"parent":"T1114","url":"https://attack.mitre.org/techniques/T1114/002","sourceCount":18},{"id":"T1114.003","name":"Email Collection: Email Forwarding Rule","tactics":["Collection"],"platforms":["Linux","Office Suite","Windows","macOS"],"parent":"T1114","url":"https://attack.mitre.org/techniques/T1114/003","sourceCount":5},{"id":"T1115","name":"Clipboard Data","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1115","sourceCount":45},{"id":"T1119","name":"Automated Collection","tactics":["Collection"],"platforms":["IaaS","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1119","sourceCount":69},{"id":"T1120","name":"Peripheral Device Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1120","sourceCount":57},{"id":"T1123","name":"Audio Capture","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1123","sourceCount":31},{"id":"T1124","name":"System Time Discovery","tactics":["Discovery"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1124","sourceCount":93},{"id":"T1125","name":"Video Capture","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1125","sourceCount":34},{"id":"T1127","name":"Trusted Developer Utilities Proxy Execution","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1127","sourceCount":0},{"id":"T1127.001","name":"Trusted Developer Utilities Proxy Execution: MSBuild","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1127","url":"https://attack.mitre.org/techniques/T1127/001","sourceCount":3},{"id":"T1127.002","name":"Trusted Developer Utilities Proxy Execution: ClickOnce","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1127","url":"https://attack.mitre.org/techniques/T1127/002","sourceCount":0},{"id":"T1127.003","name":"Trusted Developer Utilities Proxy Execution: JamPlus","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1127","url":"https://attack.mitre.org/techniques/T1127/003","sourceCount":0},{"id":"T1129","name":"Shared Modules","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1129","sourceCount":22},{"id":"T1132","name":"Data Encoding","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1132","sourceCount":6},{"id":"T1132.001","name":"Data Encoding: Standard Encoding","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1132","url":"https://attack.mitre.org/techniques/T1132/001","sourceCount":120},{"id":"T1132.002","name":"Data Encoding: Non-Standard Encoding","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1132","url":"https://attack.mitre.org/techniques/T1132/002","sourceCount":16},{"id":"T1133","name":"External Remote Services","tactics":["Initial Access","Persistence"],"platforms":["Containers","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1133","sourceCount":40},{"id":"T1134","name":"Access Token Manipulation","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1134","sourceCount":23},{"id":"T1134.001","name":"Access Token Manipulation: Token Impersonation/Theft","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1134","url":"https://attack.mitre.org/techniques/T1134/001","sourceCount":18},{"id":"T1134.002","name":"Access Token Manipulation: Create Process with Token","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1134","url":"https://attack.mitre.org/techniques/T1134/002","sourceCount":13},{"id":"T1134.003","name":"Access Token Manipulation: Make and Impersonate Token","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1134","url":"https://attack.mitre.org/techniques/T1134/003","sourceCount":5},{"id":"T1134.004","name":"Access Token Manipulation: Parent PID Spoofing","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1134","url":"https://attack.mitre.org/techniques/T1134/004","sourceCount":4},{"id":"T1134.005","name":"Access Token Manipulation: SID-History Injection","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1134","url":"https://attack.mitre.org/techniques/T1134/005","sourceCount":2},{"id":"T1135","name":"Network Share Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1135","sourceCount":77},{"id":"T1136","name":"Create Account","tactics":["Persistence"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1136","sourceCount":5},{"id":"T1136.001","name":"Create Account: Local Account","tactics":["Persistence"],"platforms":["Containers","ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1136","url":"https://attack.mitre.org/techniques/T1136/001","sourceCount":29},{"id":"T1136.002","name":"Create Account: Domain Account","tactics":["Persistence"],"platforms":["Linux","Windows","macOS"],"parent":"T1136","url":"https://attack.mitre.org/techniques/T1136/002","sourceCount":11},{"id":"T1136.003","name":"Create Account: Cloud Account","tactics":["Persistence"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1136","url":"https://attack.mitre.org/techniques/T1136/003","sourceCount":3},{"id":"T1137","name":"Office Application Startup","tactics":["Persistence"],"platforms":["Office Suite","Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1137","sourceCount":2},{"id":"T1137.001","name":"Office Application Startup: Office Template Macros","tactics":["Persistence"],"platforms":["Office Suite","Windows"],"parent":"T1137","url":"https://attack.mitre.org/techniques/T1137/001","sourceCount":3},{"id":"T1137.002","name":"Office Application Startup: Office Test","tactics":["Persistence"],"platforms":["Office Suite","Windows"],"parent":"T1137","url":"https://attack.mitre.org/techniques/T1137/002","sourceCount":1},{"id":"T1137.003","name":"Office Application Startup: Outlook Forms","tactics":["Persistence"],"platforms":["Office Suite","Windows"],"parent":"T1137","url":"https://attack.mitre.org/techniques/T1137/003","sourceCount":1},{"id":"T1137.004","name":"Office Application Startup: Outlook Home Page","tactics":["Persistence"],"platforms":["Office Suite","Windows"],"parent":"T1137","url":"https://attack.mitre.org/techniques/T1137/004","sourceCount":2},{"id":"T1137.005","name":"Office Application Startup: Outlook Rules","tactics":["Persistence"],"platforms":["Office Suite","Windows"],"parent":"T1137","url":"https://attack.mitre.org/techniques/T1137/005","sourceCount":1},{"id":"T1137.006","name":"Office Application Startup: Add-ins","tactics":["Persistence"],"platforms":["Office Suite","Windows"],"parent":"T1137","url":"https://attack.mitre.org/techniques/T1137/006","sourceCount":4},{"id":"T1140","name":"Deobfuscate/Decode Files or Information","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1140","sourceCount":325},{"id":"T1176","name":"Software Extensions","tactics":["Persistence"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1176","sourceCount":0},{"id":"T1176.001","name":"Software Extensions: Browser Extensions","tactics":["Persistence"],"platforms":["Linux","Windows","macOS"],"parent":"T1176","url":"https://attack.mitre.org/techniques/T1176/001","sourceCount":7},{"id":"T1176.002","name":"Software Extensions: IDE Extensions","tactics":["Persistence"],"platforms":["Linux","Windows","macOS"],"parent":"T1176","url":"https://attack.mitre.org/techniques/T1176/002","sourceCount":1},{"id":"T1185","name":"Browser Session Hijacking","tactics":["Collection"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1185","sourceCount":14},{"id":"T1187","name":"Forced Authentication","tactics":["Credential Access"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1187","sourceCount":3},{"id":"T1189","name":"Drive-by Compromise","tactics":["Initial Access"],"platforms":["Identity Provider","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1189","sourceCount":44},{"id":"T1190","name":"Exploit Public-Facing Application","tactics":["Initial Access"],"platforms":["Containers","ESXi","IaaS","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1190","sourceCount":69},{"id":"T1195","name":"Supply Chain Compromise","tactics":["Initial Access"],"platforms":["Linux","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1195","sourceCount":5},{"id":"T1195.001","name":"Supply Chain Compromise: Compromise Software Dependencies and Development Tools","tactics":["Initial Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1195","url":"https://attack.mitre.org/techniques/T1195/001","sourceCount":2},{"id":"T1195.002","name":"Supply Chain Compromise: Compromise Software Supply Chain","tactics":["Initial Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1195","url":"https://attack.mitre.org/techniques/T1195/002","sourceCount":14},{"id":"T1195.003","name":"Supply Chain Compromise: Compromise Hardware Supply Chain","tactics":["Initial Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1195","url":"https://attack.mitre.org/techniques/T1195/003","sourceCount":0},{"id":"T1197","name":"BITS Jobs","tactics":["Defense Evasion","Persistence"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1197","sourceCount":13},{"id":"T1199","name":"Trusted Relationship","tactics":["Initial Access"],"platforms":["IaaS","Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1199","sourceCount":12},{"id":"T1200","name":"Hardware Additions","tactics":["Initial Access"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1200","sourceCount":1},{"id":"T1201","name":"Password Policy Discovery","tactics":["Discovery"],"platforms":["IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1201","sourceCount":8},{"id":"T1202","name":"Indirect Command Execution","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1202","sourceCount":4},{"id":"T1203","name":"Exploitation for Client Execution","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1203","sourceCount":60},{"id":"T1204","name":"User Execution","tactics":["Execution"],"platforms":["Containers","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1204","sourceCount":5},{"id":"T1204.001","name":"User Execution: Malicious Link","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":"T1204","url":"https://attack.mitre.org/techniques/T1204/001","sourceCount":83},{"id":"T1204.002","name":"User Execution: Malicious File","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":"T1204","url":"https://attack.mitre.org/techniques/T1204/002","sourceCount":185},{"id":"T1204.003","name":"User Execution: Malicious Image","tactics":["Execution"],"platforms":["Containers","IaaS"],"parent":"T1204","url":"https://attack.mitre.org/techniques/T1204/003","sourceCount":1},{"id":"T1204.004","name":"User Execution: Malicious Copy and Paste","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":"T1204","url":"https://attack.mitre.org/techniques/T1204/004","sourceCount":2},{"id":"T1204.005","name":"User Execution: Malicious Library","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":"T1204","url":"https://attack.mitre.org/techniques/T1204/005","sourceCount":1},{"id":"T1205","name":"Traffic Signaling","tactics":["Command and Control","Defense Evasion","Persistence"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1205","sourceCount":21},{"id":"T1205.001","name":"Traffic Signaling: Port Knocking","tactics":["Command and Control","Defense Evasion","Persistence"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1205","url":"https://attack.mitre.org/techniques/T1205/001","sourceCount":6},{"id":"T1205.002","name":"Traffic Signaling: Socket Filters","tactics":["Command and Control","Defense Evasion","Persistence"],"platforms":["Linux","Windows","macOS"],"parent":"T1205","url":"https://attack.mitre.org/techniques/T1205/002","sourceCount":4},{"id":"T1207","name":"Rogue Domain Controller","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1207","sourceCount":1},{"id":"T1210","name":"Exploitation of Remote Services","tactics":["Lateral Movement"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1210","sourceCount":24},{"id":"T1211","name":"Exploitation for Defense Evasion","tactics":["Defense Evasion"],"platforms":["IaaS","Linux","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1211","sourceCount":2},{"id":"T1212","name":"Exploitation for Credential Access","tactics":["Credential Access"],"platforms":["Identity Provider","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1212","sourceCount":2},{"id":"T1213","name":"Data from Information Repositories","tactics":["Collection"],"platforms":["IaaS","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1213","sourceCount":4},{"id":"T1213.001","name":"Data from Information Repositories: Confluence","tactics":["Collection"],"platforms":["SaaS"],"parent":"T1213","url":"https://attack.mitre.org/techniques/T1213/001","sourceCount":1},{"id":"T1213.002","name":"Data from Information Repositories: Sharepoint","tactics":["Collection"],"platforms":["Office Suite","Windows"],"parent":"T1213","url":"https://attack.mitre.org/techniques/T1213/002","sourceCount":8},{"id":"T1213.003","name":"Data from Information Repositories: Code Repositories","tactics":["Collection"],"platforms":["SaaS"],"parent":"T1213","url":"https://attack.mitre.org/techniques/T1213/003","sourceCount":4},{"id":"T1213.004","name":"Data from Information Repositories: Customer Relationship Management Software","tactics":["Collection"],"platforms":["SaaS"],"parent":"T1213","url":"https://attack.mitre.org/techniques/T1213/004","sourceCount":1},{"id":"T1213.005","name":"Data from Information Repositories: Messaging Applications","tactics":["Collection"],"platforms":["Office Suite","SaaS"],"parent":"T1213","url":"https://attack.mitre.org/techniques/T1213/005","sourceCount":3},{"id":"T1213.006","name":"Data from Information Repositories: Databases","tactics":["Collection"],"platforms":["IaaS","Linux","SaaS","Windows","macOS"],"parent":"T1213","url":"https://attack.mitre.org/techniques/T1213/006","sourceCount":8},{"id":"T1216","name":"System Script Proxy Execution","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1216","sourceCount":0},{"id":"T1216.001","name":"System Script Proxy Execution: PubPrn","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1216","url":"https://attack.mitre.org/techniques/T1216/001","sourceCount":1},{"id":"T1216.002","name":"System Script Proxy Execution: SyncAppvPublishingServer","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1216","url":"https://attack.mitre.org/techniques/T1216/002","sourceCount":0},{"id":"T1217","name":"Browser Information Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1217","sourceCount":26},{"id":"T1218","name":"System Binary Proxy Execution","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1218","sourceCount":2},{"id":"T1218.001","name":"System Binary Proxy Execution: Compiled HTML File","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/001","sourceCount":6},{"id":"T1218.002","name":"System Binary Proxy Execution: Control Panel","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/002","sourceCount":2},{"id":"T1218.003","name":"System Binary Proxy Execution: CMSTP","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/003","sourceCount":4},{"id":"T1218.004","name":"System Binary Proxy Execution: InstallUtil","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/004","sourceCount":6},{"id":"T1218.005","name":"System Binary Proxy Execution: Mshta","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/005","sourceCount":30},{"id":"T1218.007","name":"System Binary Proxy Execution: Msiexec","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/007","sourceCount":29},{"id":"T1218.008","name":"System Binary Proxy Execution: Odbcconf","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/008","sourceCount":3},{"id":"T1218.009","name":"System Binary Proxy Execution: Regsvcs/Regasm","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/009","sourceCount":1},{"id":"T1218.010","name":"System Binary Proxy Execution: Regsvr32","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/010","sourceCount":36},{"id":"T1218.011","name":"System Binary Proxy Execution: Rundll32","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/011","sourceCount":103},{"id":"T1218.012","name":"System Binary Proxy Execution: Verclsid","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/012","sourceCount":1},{"id":"T1218.013","name":"System Binary Proxy Execution: Mavinject","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/013","sourceCount":1},{"id":"T1218.014","name":"System Binary Proxy Execution: MMC","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/014","sourceCount":2},{"id":"T1218.015","name":"System Binary Proxy Execution: Electron Applications","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1218","url":"https://attack.mitre.org/techniques/T1218/015","sourceCount":2},{"id":"T1219","name":"Remote Access Tools","tactics":["Command and Control"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1219","sourceCount":21},{"id":"T1219.001","name":"Remote Access Tools: IDE Tunneling","tactics":["Command and Control"],"platforms":["Linux","Windows","macOS"],"parent":"T1219","url":"https://attack.mitre.org/techniques/T1219/001","sourceCount":1},{"id":"T1219.002","name":"Remote Access Tools: Remote Desktop Software","tactics":["Command and Control"],"platforms":["Linux","Windows","macOS"],"parent":"T1219","url":"https://attack.mitre.org/techniques/T1219/002","sourceCount":12},{"id":"T1219.003","name":"Remote Access Tools: Remote Access Hardware","tactics":["Command and Control"],"platforms":["Linux","Windows","macOS"],"parent":"T1219","url":"https://attack.mitre.org/techniques/T1219/003","sourceCount":0},{"id":"T1220","name":"XSL Script Processing","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1220","sourceCount":4},{"id":"T1221","name":"Template Injection","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1221","sourceCount":11},{"id":"T1222","name":"File and Directory Permissions Modification","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1222","sourceCount":1},{"id":"T1222.001","name":"File and Directory Permissions Modification: Windows File and Directory Permissions Modification","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1222","url":"https://attack.mitre.org/techniques/T1222/001","sourceCount":11},{"id":"T1222.002","name":"File and Directory Permissions Modification: Linux and Mac File and Directory Permissions Modification","tactics":["Defense Evasion"],"platforms":["Linux","macOS"],"parent":"T1222","url":"https://attack.mitre.org/techniques/T1222/002","sourceCount":14},{"id":"T1480","name":"Execution Guardrails","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1480","sourceCount":37},{"id":"T1480.001","name":"Execution Guardrails: Environmental Keying","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1480","url":"https://attack.mitre.org/techniques/T1480/001","sourceCount":10},{"id":"T1480.002","name":"Execution Guardrails: Mutual Exclusion","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1480","url":"https://attack.mitre.org/techniques/T1480/002","sourceCount":16},{"id":"T1482","name":"Domain Trust Discovery","tactics":["Discovery"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1482","sourceCount":31},{"id":"T1484","name":"Domain or Tenant Policy Modification","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Identity Provider","Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1484","sourceCount":0},{"id":"T1484.001","name":"Domain or Tenant Policy Modification: Group Policy Modification","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1484","url":"https://attack.mitre.org/techniques/T1484/001","sourceCount":14},{"id":"T1484.002","name":"Domain or Tenant Policy Modification: Trust Modification","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Identity Provider","Windows"],"parent":"T1484","url":"https://attack.mitre.org/techniques/T1484/002","sourceCount":4},{"id":"T1485","name":"Data Destruction","tactics":["Impact"],"platforms":["Containers","ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1485","sourceCount":30},{"id":"T1485.001","name":"Data Destruction: Lifecycle-Triggered Deletion","tactics":["Impact"],"platforms":["IaaS"],"parent":"T1485","url":"https://attack.mitre.org/techniques/T1485/001","sourceCount":0},{"id":"T1486","name":"Data Encrypted for Impact","tactics":["Impact"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1486","sourceCount":82},{"id":"T1489","name":"Service Stop","tactics":["Impact"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1489","sourceCount":50},{"id":"T1490","name":"Inhibit System Recovery","tactics":["Impact"],"platforms":["Containers","ESXi","IaaS","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1490","sourceCount":54},{"id":"T1491","name":"Defacement","tactics":["Impact"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1491","sourceCount":0},{"id":"T1491.001","name":"Defacement: Internal Defacement","tactics":["Impact"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1491","url":"https://attack.mitre.org/techniques/T1491/001","sourceCount":12},{"id":"T1491.002","name":"Defacement: External Defacement","tactics":["Impact"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":"T1491","url":"https://attack.mitre.org/techniques/T1491/002","sourceCount":2},{"id":"T1495","name":"Firmware Corruption","tactics":["Impact"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1495","sourceCount":2},{"id":"T1496","name":"Resource Hijacking","tactics":["Impact"],"platforms":["Containers","IaaS","Linux","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1496","sourceCount":0},{"id":"T1496.001","name":"Resource Hijacking: Compute Hijacking","tactics":["Impact"],"platforms":["Containers","IaaS","Linux","Windows","macOS"],"parent":"T1496","url":"https://attack.mitre.org/techniques/T1496/001","sourceCount":14},{"id":"T1496.002","name":"Resource Hijacking: Bandwidth Hijacking","tactics":["Impact"],"platforms":["Containers","IaaS","Linux","Windows","macOS"],"parent":"T1496","url":"https://attack.mitre.org/techniques/T1496/002","sourceCount":0},{"id":"T1496.003","name":"Resource Hijacking: SMS Pumping","tactics":["Impact"],"platforms":["SaaS"],"parent":"T1496","url":"https://attack.mitre.org/techniques/T1496/003","sourceCount":0},{"id":"T1496.004","name":"Resource Hijacking: Cloud Service Hijacking","tactics":["Impact"],"platforms":["SaaS"],"parent":"T1496","url":"https://attack.mitre.org/techniques/T1496/004","sourceCount":0},{"id":"T1497","name":"Virtualization/Sandbox Evasion","tactics":["Defense Evasion","Discovery"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1497","sourceCount":26},{"id":"T1497.001","name":"Virtualization/Sandbox Evasion: System Checks","tactics":["Defense Evasion","Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1497","url":"https://attack.mitre.org/techniques/T1497/001","sourceCount":66},{"id":"T1497.002","name":"Virtualization/Sandbox Evasion: User Activity Based Checks","tactics":["Defense Evasion","Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1497","url":"https://attack.mitre.org/techniques/T1497/002","sourceCount":5},{"id":"T1497.003","name":"Virtualization/Sandbox Evasion: Time Based Checks","tactics":["Defense Evasion","Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1497","url":"https://attack.mitre.org/techniques/T1497/003","sourceCount":46},{"id":"T1498","name":"Network Denial of Service","tactics":["Impact"],"platforms":["Containers","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1498","sourceCount":3},{"id":"T1498.001","name":"Network Denial of Service: Direct Network Flood","tactics":["Impact"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":"T1498","url":"https://attack.mitre.org/techniques/T1498/001","sourceCount":0},{"id":"T1498.002","name":"Network Denial of Service: Reflection Amplification","tactics":["Impact"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":"T1498","url":"https://attack.mitre.org/techniques/T1498/002","sourceCount":0},{"id":"T1499","name":"Endpoint Denial of Service","tactics":["Impact"],"platforms":["Containers","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1499","sourceCount":3},{"id":"T1499.001","name":"Endpoint Denial of Service: OS Exhaustion Flood","tactics":["Impact"],"platforms":["Linux","Windows","macOS"],"parent":"T1499","url":"https://attack.mitre.org/techniques/T1499/001","sourceCount":0},{"id":"T1499.002","name":"Endpoint Denial of Service: Service Exhaustion Flood","tactics":["Impact"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":"T1499","url":"https://attack.mitre.org/techniques/T1499/002","sourceCount":0},{"id":"T1499.003","name":"Endpoint Denial of Service: Application Exhaustion Flood","tactics":["Impact"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":"T1499","url":"https://attack.mitre.org/techniques/T1499/003","sourceCount":0},{"id":"T1499.004","name":"Endpoint Denial of Service: Application or System Exploitation","tactics":["Impact"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":"T1499","url":"https://attack.mitre.org/techniques/T1499/004","sourceCount":1},{"id":"T1505","name":"Server Software Component","tactics":["Persistence"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1505","sourceCount":0},{"id":"T1505.001","name":"Server Software Component: SQL Stored Procedures","tactics":["Persistence"],"platforms":["Linux","Windows"],"parent":"T1505","url":"https://attack.mitre.org/techniques/T1505/001","sourceCount":2},{"id":"T1505.002","name":"Server Software Component: Transport Agent","tactics":["Persistence"],"platforms":["Linux","Windows"],"parent":"T1505","url":"https://attack.mitre.org/techniques/T1505/002","sourceCount":1},{"id":"T1505.003","name":"Server Software Component: Web Shell","tactics":["Persistence"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1505","url":"https://attack.mitre.org/techniques/T1505/003","sourceCount":62},{"id":"T1505.004","name":"Server Software Component: IIS Components","tactics":["Persistence"],"platforms":["Windows"],"parent":"T1505","url":"https://attack.mitre.org/techniques/T1505/004","sourceCount":5},{"id":"T1505.005","name":"Server Software Component: Terminal Services DLL","tactics":["Persistence"],"platforms":["Windows"],"parent":"T1505","url":"https://attack.mitre.org/techniques/T1505/005","sourceCount":0},{"id":"T1505.006","name":"Server Software Component: vSphere Installation Bundles","tactics":["Persistence"],"platforms":["ESXi"],"parent":"T1505","url":"https://attack.mitre.org/techniques/T1505/006","sourceCount":2},{"id":"T1518","name":"Software Discovery","tactics":["Discovery"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1518","sourceCount":50},{"id":"T1518.001","name":"Software Discovery: Security Software Discovery","tactics":["Discovery"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":"T1518","url":"https://attack.mitre.org/techniques/T1518/001","sourceCount":135},{"id":"T1518.002","name":"Software Discovery: Backup Software Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1518","url":"https://attack.mitre.org/techniques/T1518/002","sourceCount":1},{"id":"T1525","name":"Implant Internal Image","tactics":["Persistence"],"platforms":["Containers","IaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1525","sourceCount":0},{"id":"T1526","name":"Cloud Service Discovery","tactics":["Discovery"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1526","sourceCount":4},{"id":"T1528","name":"Steal Application Access Token","tactics":["Credential Access"],"platforms":["Containers","IaaS","Identity Provider","Office Suite","SaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1528","sourceCount":5},{"id":"T1529","name":"System Shutdown/Reboot","tactics":["Impact"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1529","sourceCount":27},{"id":"T1530","name":"Data from Cloud Storage","tactics":["Collection"],"platforms":["IaaS","Office Suite","SaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1530","sourceCount":9},{"id":"T1531","name":"Account Access Removal","tactics":["Impact"],"platforms":["ESXi","IaaS","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1531","sourceCount":6},{"id":"T1534","name":"Internal Spearphishing","tactics":["Lateral Movement"],"platforms":["Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1534","sourceCount":5},{"id":"T1535","name":"Unused/Unsupported Cloud Regions","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1535","sourceCount":0},{"id":"T1537","name":"Transfer Data to Cloud Account","tactics":["Exfiltration"],"platforms":["IaaS","Office Suite","SaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1537","sourceCount":3},{"id":"T1538","name":"Cloud Service Dashboard","tactics":["Discovery"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1538","sourceCount":1},{"id":"T1539","name":"Steal Web Session Cookie","tactics":["Credential Access"],"platforms":["Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1539","sourceCount":25},{"id":"T1542","name":"Pre-OS Boot","tactics":["Defense Evasion","Persistence"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1542","sourceCount":0},{"id":"T1542.001","name":"Pre-OS Boot: System Firmware","tactics":["Defense Evasion","Persistence"],"platforms":["Network Devices","Windows"],"parent":"T1542","url":"https://attack.mitre.org/techniques/T1542/001","sourceCount":3},{"id":"T1542.002","name":"Pre-OS Boot: Component Firmware","tactics":["Defense Evasion","Persistence"],"platforms":["Linux","Windows","macOS"],"parent":"T1542","url":"https://attack.mitre.org/techniques/T1542/002","sourceCount":2},{"id":"T1542.003","name":"Pre-OS Boot: Bootkit","tactics":["Defense Evasion","Persistence"],"platforms":["Linux","Windows"],"parent":"T1542","url":"https://attack.mitre.org/techniques/T1542/003","sourceCount":9},{"id":"T1542.004","name":"Pre-OS Boot: ROMMONkit","tactics":["Defense Evasion","Persistence"],"platforms":["Network Devices"],"parent":"T1542","url":"https://attack.mitre.org/techniques/T1542/004","sourceCount":0},{"id":"T1542.005","name":"Pre-OS Boot: TFTP Boot","tactics":["Defense Evasion","Persistence"],"platforms":["Network Devices"],"parent":"T1542","url":"https://attack.mitre.org/techniques/T1542/005","sourceCount":0},{"id":"T1543","name":"Create or Modify System Process","tactics":["Persistence","Privilege Escalation"],"platforms":["Containers","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1543","sourceCount":6},{"id":"T1543.001","name":"Create or Modify System Process: Launch Agent","tactics":["Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1543","url":"https://attack.mitre.org/techniques/T1543/001","sourceCount":21},{"id":"T1543.002","name":"Create or Modify System Process: Systemd Service","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux"],"parent":"T1543","url":"https://attack.mitre.org/techniques/T1543/002","sourceCount":12},{"id":"T1543.003","name":"Create or Modify System Process: Windows Service","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1543","url":"https://attack.mitre.org/techniques/T1543/003","sourceCount":138},{"id":"T1543.004","name":"Create or Modify System Process: Launch Daemon","tactics":["Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1543","url":"https://attack.mitre.org/techniques/T1543/004","sourceCount":11},{"id":"T1543.005","name":"Create or Modify System Process: Container Service","tactics":["Persistence","Privilege Escalation"],"platforms":["Containers"],"parent":"T1543","url":"https://attack.mitre.org/techniques/T1543/005","sourceCount":0},{"id":"T1546","name":"Event Triggered Execution","tactics":["Persistence","Privilege Escalation"],"platforms":["IaaS","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1546","sourceCount":4},{"id":"T1546.001","name":"Event Triggered Execution: Change Default File Association","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/001","sourceCount":2},{"id":"T1546.002","name":"Event Triggered Execution: Screensaver","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/002","sourceCount":1},{"id":"T1546.003","name":"Event Triggered Execution: Windows Management Instrumentation Event Subscription","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/003","sourceCount":25},{"id":"T1546.004","name":"Event Triggered Execution: Unix Shell Configuration Modification","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux","macOS"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/004","sourceCount":6},{"id":"T1546.005","name":"Event Triggered Execution: Trap","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux","macOS"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/005","sourceCount":0},{"id":"T1546.006","name":"Event Triggered Execution: LC_LOAD_DYLIB Addition","tactics":["Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/006","sourceCount":0},{"id":"T1546.007","name":"Event Triggered Execution: Netsh Helper DLL","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/007","sourceCount":1},{"id":"T1546.008","name":"Event Triggered Execution: Accessibility Features","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/008","sourceCount":7},{"id":"T1546.009","name":"Event Triggered Execution: AppCert DLLs","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/009","sourceCount":1},{"id":"T1546.010","name":"Event Triggered Execution: AppInit DLLs","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/010","sourceCount":4},{"id":"T1546.011","name":"Event Triggered Execution: Application Shimming","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/011","sourceCount":4},{"id":"T1546.012","name":"Event Triggered Execution: Image File Execution Options Injection","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/012","sourceCount":3},{"id":"T1546.013","name":"Event Triggered Execution: PowerShell Profile","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/013","sourceCount":1},{"id":"T1546.014","name":"Event Triggered Execution: Emond","tactics":["Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/014","sourceCount":0},{"id":"T1546.015","name":"Event Triggered Execution: Component Object Model Hijacking","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/015","sourceCount":12},{"id":"T1546.016","name":"Event Triggered Execution: Installer Packages","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux","Windows","macOS"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/016","sourceCount":2},{"id":"T1546.017","name":"Event Triggered Execution: Udev Rules","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/017","sourceCount":1},{"id":"T1546.018","name":"Event Triggered Execution: Python Startup Hooks","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux","Windows","macOS"],"parent":"T1546","url":"https://attack.mitre.org/techniques/T1546/018","sourceCount":0},{"id":"T1547","name":"Boot or Logon Autostart Execution","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1547","sourceCount":6},{"id":"T1547.001","name":"Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/001","sourceCount":252},{"id":"T1547.002","name":"Boot or Logon Autostart Execution: Authentication Package","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/002","sourceCount":1},{"id":"T1547.003","name":"Boot or Logon Autostart Execution: Time Providers","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/003","sourceCount":0},{"id":"T1547.004","name":"Boot or Logon Autostart Execution: Winlogon Helper DLL","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/004","sourceCount":13},{"id":"T1547.005","name":"Boot or Logon Autostart Execution: Security Support Provider","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/005","sourceCount":3},{"id":"T1547.006","name":"Boot or Logon Autostart Execution: Kernel Modules and Extensions","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux","macOS"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/006","sourceCount":4},{"id":"T1547.007","name":"Boot or Logon Autostart Execution: Re-opened Applications","tactics":["Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/007","sourceCount":0},{"id":"T1547.008","name":"Boot or Logon Autostart Execution: LSASS Driver","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/008","sourceCount":2},{"id":"T1547.009","name":"Boot or Logon Autostart Execution: Shortcut Modification","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/009","sourceCount":29},{"id":"T1547.010","name":"Boot or Logon Autostart Execution: Port Monitors","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/010","sourceCount":0},{"id":"T1547.012","name":"Boot or Logon Autostart Execution: Print Processors","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/012","sourceCount":3},{"id":"T1547.013","name":"Boot or Logon Autostart Execution: XDG Autostart Entries","tactics":["Persistence","Privilege Escalation"],"platforms":["Linux"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/013","sourceCount":7},{"id":"T1547.014","name":"Boot or Logon Autostart Execution: Active Setup","tactics":["Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/014","sourceCount":1},{"id":"T1547.015","name":"Boot or Logon Autostart Execution: Login Items","tactics":["Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1547","url":"https://attack.mitre.org/techniques/T1547/015","sourceCount":3},{"id":"T1548","name":"Abuse Elevation Control Mechanism","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["IaaS","Identity Provider","Linux","Office Suite","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1548","sourceCount":2},{"id":"T1548.001","name":"Abuse Elevation Control Mechanism: Setuid and Setgid","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Linux","macOS"],"parent":"T1548","url":"https://attack.mitre.org/techniques/T1548/001","sourceCount":2},{"id":"T1548.002","name":"Abuse Elevation Control Mechanism: Bypass User Account Control","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Windows"],"parent":"T1548","url":"https://attack.mitre.org/techniques/T1548/002","sourceCount":61},{"id":"T1548.003","name":"Abuse Elevation Control Mechanism: Sudo and Sudo Caching","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["Linux","macOS"],"parent":"T1548","url":"https://attack.mitre.org/techniques/T1548/003","sourceCount":3},{"id":"T1548.004","name":"Abuse Elevation Control Mechanism: Elevated Execution with Prompt","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["macOS"],"parent":"T1548","url":"https://attack.mitre.org/techniques/T1548/004","sourceCount":1},{"id":"T1548.005","name":"Abuse Elevation Control Mechanism: Temporary Elevated Cloud Access","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["IaaS","Identity Provider","Office Suite"],"parent":"T1548","url":"https://attack.mitre.org/techniques/T1548/005","sourceCount":0},{"id":"T1548.006","name":"Abuse Elevation Control Mechanism: TCC Manipulation","tactics":["Defense Evasion","Privilege Escalation"],"platforms":["macOS"],"parent":"T1548","url":"https://attack.mitre.org/techniques/T1548/006","sourceCount":1},{"id":"T1550","name":"Use Alternate Authentication Material","tactics":["Defense Evasion","Lateral Movement"],"platforms":["Containers","IaaS","Identity Provider","Linux","Office Suite","SaaS","Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1550","sourceCount":2},{"id":"T1550.001","name":"Use Alternate Authentication Material: Application Access Token","tactics":["Defense Evasion","Lateral Movement"],"platforms":["Containers","IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1550","url":"https://attack.mitre.org/techniques/T1550/001","sourceCount":5},{"id":"T1550.002","name":"Use Alternate Authentication Material: Pass the Hash","tactics":["Defense Evasion","Lateral Movement"],"platforms":["Windows"],"parent":"T1550","url":"https://attack.mitre.org/techniques/T1550/002","sourceCount":20},{"id":"T1550.003","name":"Use Alternate Authentication Material: Pass the Ticket","tactics":["Defense Evasion","Lateral Movement"],"platforms":["Windows"],"parent":"T1550","url":"https://attack.mitre.org/techniques/T1550/003","sourceCount":6},{"id":"T1550.004","name":"Use Alternate Authentication Material: Web Session Cookie","tactics":["Defense Evasion","Lateral Movement"],"platforms":["IaaS","Office Suite","SaaS"],"parent":"T1550","url":"https://attack.mitre.org/techniques/T1550/004","sourceCount":2},{"id":"T1552","name":"Unsecured Credentials","tactics":["Credential Access"],"platforms":["Containers","IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1552","sourceCount":6},{"id":"T1552.001","name":"Unsecured Credentials: Credentials In Files","tactics":["Credential Access"],"platforms":["Containers","IaaS","Linux","Windows","macOS"],"parent":"T1552","url":"https://attack.mitre.org/techniques/T1552/001","sourceCount":34},{"id":"T1552.002","name":"Unsecured Credentials: Credentials in Registry","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1552","url":"https://attack.mitre.org/techniques/T1552/002","sourceCount":9},{"id":"T1552.003","name":"Unsecured Credentials: Shell History","tactics":["Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1552","url":"https://attack.mitre.org/techniques/T1552/003","sourceCount":1},{"id":"T1552.004","name":"Unsecured Credentials: Private Keys","tactics":["Credential Access"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1552","url":"https://attack.mitre.org/techniques/T1552/004","sourceCount":18},{"id":"T1552.005","name":"Unsecured Credentials: Cloud Instance Metadata API","tactics":["Credential Access"],"platforms":["IaaS"],"parent":"T1552","url":"https://attack.mitre.org/techniques/T1552/005","sourceCount":3},{"id":"T1552.006","name":"Unsecured Credentials: Group Policy Preferences","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1552","url":"https://attack.mitre.org/techniques/T1552/006","sourceCount":4},{"id":"T1552.007","name":"Unsecured Credentials: Container API","tactics":["Credential Access"],"platforms":["Containers"],"parent":"T1552","url":"https://attack.mitre.org/techniques/T1552/007","sourceCount":1},{"id":"T1552.008","name":"Unsecured Credentials: Chat Messages","tactics":["Credential Access"],"platforms":["Office Suite","SaaS"],"parent":"T1552","url":"https://attack.mitre.org/techniques/T1552/008","sourceCount":1},{"id":"T1553","name":"Subvert Trust Controls","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1553","sourceCount":1},{"id":"T1553.001","name":"Subvert Trust Controls: Gatekeeper Bypass","tactics":["Defense Evasion"],"platforms":["macOS"],"parent":"T1553","url":"https://attack.mitre.org/techniques/T1553/001","sourceCount":6},{"id":"T1553.002","name":"Subvert Trust Controls: Code Signing","tactics":["Defense Evasion"],"platforms":["Windows","macOS"],"parent":"T1553","url":"https://attack.mitre.org/techniques/T1553/002","sourceCount":85},{"id":"T1553.003","name":"Subvert Trust Controls: SIP and Trust Provider Hijacking","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1553","url":"https://attack.mitre.org/techniques/T1553/003","sourceCount":0},{"id":"T1553.004","name":"Subvert Trust Controls: Install Root Certificate","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1553","url":"https://attack.mitre.org/techniques/T1553/004","sourceCount":4},{"id":"T1553.005","name":"Subvert Trust Controls: Mark-of-the-Web Bypass","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1553","url":"https://attack.mitre.org/techniques/T1553/005","sourceCount":5},{"id":"T1553.006","name":"Subvert Trust Controls: Code Signing Policy Modification","tactics":["Defense Evasion"],"platforms":["Windows","macOS"],"parent":"T1553","url":"https://attack.mitre.org/techniques/T1553/006","sourceCount":5},{"id":"T1554","name":"Compromise Host Software Binary","tactics":["Persistence"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1554","sourceCount":21},{"id":"T1555","name":"Credentials from Password Stores","tactics":["Credential Access"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1555","sourceCount":37},{"id":"T1555.001","name":"Credentials from Password Stores: Keychain","tactics":["Credential Access"],"platforms":["macOS"],"parent":"T1555","url":"https://attack.mitre.org/techniques/T1555/001","sourceCount":11},{"id":"T1555.002","name":"Credentials from Password Stores: Securityd Memory","tactics":["Credential Access"],"platforms":["Linux","macOS"],"parent":"T1555","url":"https://attack.mitre.org/techniques/T1555/002","sourceCount":1},{"id":"T1555.003","name":"Credentials from Password Stores: Credentials from Web Browsers","tactics":["Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1555","url":"https://attack.mitre.org/techniques/T1555/003","sourceCount":87},{"id":"T1555.004","name":"Credentials from Password Stores: Windows Credential Manager","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1555","url":"https://attack.mitre.org/techniques/T1555/004","sourceCount":14},{"id":"T1555.005","name":"Credentials from Password Stores: Password Managers","tactics":["Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1555","url":"https://attack.mitre.org/techniques/T1555/005","sourceCount":12},{"id":"T1555.006","name":"Credentials from Password Stores: Cloud Secrets Management Stores","tactics":["Credential Access"],"platforms":["IaaS"],"parent":"T1555","url":"https://attack.mitre.org/techniques/T1555/006","sourceCount":3},{"id":"T1556","name":"Modify Authentication Process","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["IaaS","Identity Provider","Linux","Network Devices","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1556","sourceCount":5},{"id":"T1556.001","name":"Modify Authentication Process: Domain Controller Authentication","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["Windows"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/001","sourceCount":2},{"id":"T1556.002","name":"Modify Authentication Process: Password Filter DLL","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["Windows"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/002","sourceCount":3},{"id":"T1556.003","name":"Modify Authentication Process: Pluggable Authentication Modules","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["Linux","macOS"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/003","sourceCount":2},{"id":"T1556.004","name":"Modify Authentication Process: Network Device Authentication","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["Network Devices"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/004","sourceCount":2},{"id":"T1556.005","name":"Modify Authentication Process: Reversible Encryption","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["Windows"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/005","sourceCount":0},{"id":"T1556.006","name":"Modify Authentication Process: Multi-Factor Authentication","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["IaaS","Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/006","sourceCount":3},{"id":"T1556.007","name":"Modify Authentication Process: Hybrid Identity","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS","Windows"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/007","sourceCount":2},{"id":"T1556.008","name":"Modify Authentication Process: Network Provider DLL","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["Windows"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/008","sourceCount":0},{"id":"T1556.009","name":"Modify Authentication Process: Conditional Access Policies","tactics":["Credential Access","Defense Evasion","Persistence"],"platforms":["IaaS","Identity Provider"],"parent":"T1556","url":"https://attack.mitre.org/techniques/T1556/009","sourceCount":2},{"id":"T1557","name":"Adversary-in-the-Middle","tactics":["Collection","Credential Access"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1557","sourceCount":7},{"id":"T1557.001","name":"Adversary-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay","tactics":["Collection","Credential Access"],"platforms":["Windows"],"parent":"T1557","url":"https://attack.mitre.org/techniques/T1557/001","sourceCount":7},{"id":"T1557.002","name":"Adversary-in-the-Middle: ARP Cache Poisoning","tactics":["Collection","Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1557","url":"https://attack.mitre.org/techniques/T1557/002","sourceCount":2},{"id":"T1557.003","name":"Adversary-in-the-Middle: DHCP Spoofing","tactics":["Collection","Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1557","url":"https://attack.mitre.org/techniques/T1557/003","sourceCount":0},{"id":"T1557.004","name":"Adversary-in-the-Middle: Evil Twin","tactics":["Collection","Credential Access"],"platforms":["Network Devices"],"parent":"T1557","url":"https://attack.mitre.org/techniques/T1557/004","sourceCount":1},{"id":"T1558","name":"Steal or Forge Kerberos Tickets","tactics":["Credential Access"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1558","sourceCount":1},{"id":"T1558.001","name":"Steal or Forge Kerberos Tickets: Golden Ticket","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1558","url":"https://attack.mitre.org/techniques/T1558/001","sourceCount":5},{"id":"T1558.002","name":"Steal or Forge Kerberos Tickets: Silver Ticket","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1558","url":"https://attack.mitre.org/techniques/T1558/002","sourceCount":4},{"id":"T1558.003","name":"Steal or Forge Kerberos Tickets: Kerberoasting","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1558","url":"https://attack.mitre.org/techniques/T1558/003","sourceCount":12},{"id":"T1558.004","name":"Steal or Forge Kerberos Tickets: AS-REP Roasting","tactics":["Credential Access"],"platforms":["Windows"],"parent":"T1558","url":"https://attack.mitre.org/techniques/T1558/004","sourceCount":1},{"id":"T1558.005","name":"Steal or Forge Kerberos Tickets: Ccache Files","tactics":["Credential Access"],"platforms":["Linux","macOS"],"parent":"T1558","url":"https://attack.mitre.org/techniques/T1558/005","sourceCount":1},{"id":"T1559","name":"Inter-Process Communication","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1559","sourceCount":16},{"id":"T1559.001","name":"Inter-Process Communication: Component Object Model","tactics":["Execution"],"platforms":["Windows"],"parent":"T1559","url":"https://attack.mitre.org/techniques/T1559/001","sourceCount":20},{"id":"T1559.002","name":"Inter-Process Communication: Dynamic Data Exchange","tactics":["Execution"],"platforms":["Windows"],"parent":"T1559","url":"https://attack.mitre.org/techniques/T1559/002","sourceCount":20},{"id":"T1559.003","name":"Inter-Process Communication: XPC Services","tactics":["Execution"],"platforms":["macOS"],"parent":"T1559","url":"https://attack.mitre.org/techniques/T1559/003","sourceCount":0},{"id":"T1560","name":"Archive Collected Data","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1560","sourceCount":54},{"id":"T1560.001","name":"Archive Collected Data: Archive via Utility","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":"T1560","url":"https://attack.mitre.org/techniques/T1560/001","sourceCount":78},{"id":"T1560.002","name":"Archive Collected Data: Archive via Library","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":"T1560","url":"https://attack.mitre.org/techniques/T1560/002","sourceCount":15},{"id":"T1560.003","name":"Archive Collected Data: Archive via Custom Method","tactics":["Collection"],"platforms":["Linux","Windows","macOS"],"parent":"T1560","url":"https://attack.mitre.org/techniques/T1560/003","sourceCount":39},{"id":"T1561","name":"Disk Wipe","tactics":["Impact"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1561","sourceCount":0},{"id":"T1561.001","name":"Disk Wipe: Disk Content Wipe","tactics":["Impact"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1561","url":"https://attack.mitre.org/techniques/T1561/001","sourceCount":16},{"id":"T1561.002","name":"Disk Wipe: Disk Structure Wipe","tactics":["Impact"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":"T1561","url":"https://attack.mitre.org/techniques/T1561/002","sourceCount":17},{"id":"T1562","name":"Impair Defenses","tactics":["Defense Evasion"],"platforms":["Containers","ESXi","IaaS","Identity Provider","Linux","Network Devices","Office Suite","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1562","sourceCount":5},{"id":"T1562.001","name":"Impair Defenses: Disable or Modify Tools","tactics":["Defense Evasion"],"platforms":["Containers","IaaS","Linux","Network Devices","Windows","macOS"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/001","sourceCount":110},{"id":"T1562.002","name":"Impair Defenses: Disable Windows Event Logging","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/002","sourceCount":6},{"id":"T1562.003","name":"Impair Defenses: Impair Command History Logging","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/003","sourceCount":10},{"id":"T1562.004","name":"Impair Defenses: Disable or Modify System Firewall","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/004","sourceCount":45},{"id":"T1562.006","name":"Impair Defenses: Indicator Blocking","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/006","sourceCount":10},{"id":"T1562.007","name":"Impair Defenses: Disable or Modify Cloud Firewall","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/007","sourceCount":1},{"id":"T1562.008","name":"Impair Defenses: Disable or Modify Cloud Logs","tactics":["Defense Evasion"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/008","sourceCount":2},{"id":"T1562.009","name":"Impair Defenses: Safe Mode Boot","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/009","sourceCount":7},{"id":"T1562.010","name":"Impair Defenses: Downgrade Attack","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/010","sourceCount":3},{"id":"T1562.011","name":"Impair Defenses: Spoof Security Alerting","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/011","sourceCount":0},{"id":"T1562.012","name":"Impair Defenses: Disable or Modify Linux Audit System","tactics":["Defense Evasion"],"platforms":["Linux"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/012","sourceCount":1},{"id":"T1562.013","name":"Impair Defenses: Disable or Modify Network Device Firewall","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":"T1562","url":"https://attack.mitre.org/techniques/T1562/013","sourceCount":2},{"id":"T1563","name":"Remote Service Session Hijacking","tactics":["Lateral Movement"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1563","sourceCount":0},{"id":"T1563.001","name":"Remote Service Session Hijacking: SSH Hijacking","tactics":["Lateral Movement"],"platforms":["Linux","macOS"],"parent":"T1563","url":"https://attack.mitre.org/techniques/T1563/001","sourceCount":1},{"id":"T1563.002","name":"Remote Service Session Hijacking: RDP Hijacking","tactics":["Lateral Movement"],"platforms":["Windows"],"parent":"T1563","url":"https://attack.mitre.org/techniques/T1563/002","sourceCount":2},{"id":"T1564","name":"Hide Artifacts","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Office Suite","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1564","sourceCount":5},{"id":"T1564.001","name":"Hide Artifacts: Hidden Files and Directories","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/001","sourceCount":58},{"id":"T1564.002","name":"Hide Artifacts: Hidden Users","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/002","sourceCount":3},{"id":"T1564.003","name":"Hide Artifacts: Hidden Window","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/003","sourceCount":54},{"id":"T1564.004","name":"Hide Artifacts: NTFS File Attributes","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/004","sourceCount":16},{"id":"T1564.005","name":"Hide Artifacts: Hidden File System","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/005","sourceCount":6},{"id":"T1564.006","name":"Hide Artifacts: Run Virtual Instance","tactics":["Defense Evasion"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/006","sourceCount":3},{"id":"T1564.007","name":"Hide Artifacts: VBA Stomping","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/007","sourceCount":0},{"id":"T1564.008","name":"Hide Artifacts: Email Hiding Rules","tactics":["Defense Evasion"],"platforms":["Linux","Office Suite","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/008","sourceCount":2},{"id":"T1564.009","name":"Hide Artifacts: Resource Forking","tactics":["Defense Evasion"],"platforms":["macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/009","sourceCount":2},{"id":"T1564.010","name":"Hide Artifacts: Process Argument Spoofing","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/010","sourceCount":2},{"id":"T1564.011","name":"Hide Artifacts: Ignore Process Interrupts","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/011","sourceCount":6},{"id":"T1564.012","name":"Hide Artifacts: File/Path Exclusions","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/012","sourceCount":1},{"id":"T1564.013","name":"Hide Artifacts: Bind Mounts","tactics":["Defense Evasion"],"platforms":["Linux"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/013","sourceCount":1},{"id":"T1564.014","name":"Hide Artifacts: Extended Attributes","tactics":["Defense Evasion"],"platforms":["Linux","macOS"],"parent":"T1564","url":"https://attack.mitre.org/techniques/T1564/014","sourceCount":0},{"id":"T1565","name":"Data Manipulation","tactics":["Impact"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1565","sourceCount":1},{"id":"T1565.001","name":"Data Manipulation: Stored Data Manipulation","tactics":["Impact"],"platforms":["Linux","Windows","macOS"],"parent":"T1565","url":"https://attack.mitre.org/techniques/T1565/001","sourceCount":3},{"id":"T1565.002","name":"Data Manipulation: Transmitted Data Manipulation","tactics":["Impact"],"platforms":["Linux","Windows","macOS"],"parent":"T1565","url":"https://attack.mitre.org/techniques/T1565/002","sourceCount":4},{"id":"T1565.003","name":"Data Manipulation: Runtime Data Manipulation","tactics":["Impact"],"platforms":["Linux","Windows","macOS"],"parent":"T1565","url":"https://attack.mitre.org/techniques/T1565/003","sourceCount":1},{"id":"T1566","name":"Phishing","tactics":["Initial Access"],"platforms":["Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1566","sourceCount":9},{"id":"T1566.001","name":"Phishing: Spearphishing Attachment","tactics":["Initial Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1566","url":"https://attack.mitre.org/techniques/T1566/001","sourceCount":141},{"id":"T1566.002","name":"Phishing: Spearphishing Link","tactics":["Initial Access"],"platforms":["Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":"T1566","url":"https://attack.mitre.org/techniques/T1566/002","sourceCount":80},{"id":"T1566.003","name":"Phishing: Spearphishing via Service","tactics":["Initial Access"],"platforms":["Linux","Windows","macOS"],"parent":"T1566","url":"https://attack.mitre.org/techniques/T1566/003","sourceCount":16},{"id":"T1566.004","name":"Phishing: Spearphishing Voice","tactics":["Initial Access"],"platforms":["Identity Provider","Linux","Windows","macOS"],"parent":"T1566","url":"https://attack.mitre.org/techniques/T1566/004","sourceCount":2},{"id":"T1567","name":"Exfiltration Over Web Service","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1567","sourceCount":14},{"id":"T1567.001","name":"Exfiltration Over Web Service: Exfiltration to Code Repository","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1567","url":"https://attack.mitre.org/techniques/T1567/001","sourceCount":1},{"id":"T1567.002","name":"Exfiltration Over Web Service: Exfiltration to Cloud Storage","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1567","url":"https://attack.mitre.org/techniques/T1567/002","sourceCount":42},{"id":"T1567.003","name":"Exfiltration Over Web Service: Exfiltration to Text Storage Sites","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1567","url":"https://attack.mitre.org/techniques/T1567/003","sourceCount":0},{"id":"T1567.004","name":"Exfiltration Over Web Service: Exfiltration Over Webhook","tactics":["Exfiltration"],"platforms":["ESXi","Linux","Office Suite","SaaS","Windows","macOS"],"parent":"T1567","url":"https://attack.mitre.org/techniques/T1567/004","sourceCount":0},{"id":"T1568","name":"Dynamic Resolution","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1568","sourceCount":20},{"id":"T1568.001","name":"Dynamic Resolution: Fast Flux DNS","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1568","url":"https://attack.mitre.org/techniques/T1568/001","sourceCount":6},{"id":"T1568.002","name":"Dynamic Resolution: Domain Generation Algorithms","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1568","url":"https://attack.mitre.org/techniques/T1568/002","sourceCount":22},{"id":"T1568.003","name":"Dynamic Resolution: DNS Calculation","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":"T1568","url":"https://attack.mitre.org/techniques/T1568/003","sourceCount":1},{"id":"T1569","name":"System Services","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1569","sourceCount":0},{"id":"T1569.001","name":"System Services: Launchctl","tactics":["Execution"],"platforms":["macOS"],"parent":"T1569","url":"https://attack.mitre.org/techniques/T1569/001","sourceCount":6},{"id":"T1569.002","name":"System Services: Service Execution","tactics":["Execution"],"platforms":["Windows"],"parent":"T1569","url":"https://attack.mitre.org/techniques/T1569/002","sourceCount":71},{"id":"T1569.003","name":"System Services: Systemctl","tactics":["Execution"],"platforms":["Linux"],"parent":"T1569","url":"https://attack.mitre.org/techniques/T1569/003","sourceCount":1},{"id":"T1570","name":"Lateral Tool Transfer","tactics":["Lateral Movement"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1570","sourceCount":52},{"id":"T1571","name":"Non-Standard Port","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1571","sourceCount":60},{"id":"T1572","name":"Protocol Tunneling","tactics":["Command and Control"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1572","sourceCount":38},{"id":"T1573","name":"Encrypted Channel","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1573","sourceCount":17},{"id":"T1573.001","name":"Encrypted Channel: Symmetric Cryptography","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1573","url":"https://attack.mitre.org/techniques/T1573/001","sourceCount":177},{"id":"T1573.002","name":"Encrypted Channel: Asymmetric Cryptography","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":"T1573","url":"https://attack.mitre.org/techniques/T1573/002","sourceCount":89},{"id":"T1574","name":"Hijack Execution Flow","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1574","sourceCount":10},{"id":"T1574.001","name":"Hijack Execution Flow: DLL","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/001","sourceCount":103},{"id":"T1574.004","name":"Hijack Execution Flow: Dylib Hijacking","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["macOS"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/004","sourceCount":1},{"id":"T1574.005","name":"Hijack Execution Flow: Executable Installer File Permissions Weakness","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/005","sourceCount":1},{"id":"T1574.006","name":"Hijack Execution Flow: Dynamic Linker Hijacking","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Linux","macOS"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/006","sourceCount":9},{"id":"T1574.007","name":"Hijack Execution Flow: Path Interception by PATH Environment Variable","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Linux","Windows","macOS"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/007","sourceCount":3},{"id":"T1574.008","name":"Hijack Execution Flow: Path Interception by Search Order Hijacking","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/008","sourceCount":2},{"id":"T1574.009","name":"Hijack Execution Flow: Path Interception by Unquoted Path","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/009","sourceCount":2},{"id":"T1574.010","name":"Hijack Execution Flow: Services File Permissions Weakness","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/010","sourceCount":1},{"id":"T1574.011","name":"Hijack Execution Flow: Services Registry Permissions Weakness","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/011","sourceCount":1},{"id":"T1574.012","name":"Hijack Execution Flow: COR_PROFILER","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/012","sourceCount":2},{"id":"T1574.013","name":"Hijack Execution Flow: KernelCallbackTable","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/013","sourceCount":2},{"id":"T1574.014","name":"Hijack Execution Flow: AppDomainManager","tactics":["Defense Evasion","Persistence","Privilege Escalation"],"platforms":["Windows"],"parent":"T1574","url":"https://attack.mitre.org/techniques/T1574/014","sourceCount":1},{"id":"T1578","name":"Modify Cloud Compute Infrastructure","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1578","sourceCount":0},{"id":"T1578.001","name":"Modify Cloud Compute Infrastructure: Create Snapshot","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":"T1578","url":"https://attack.mitre.org/techniques/T1578/001","sourceCount":1},{"id":"T1578.002","name":"Modify Cloud Compute Infrastructure: Create Cloud Instance","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":"T1578","url":"https://attack.mitre.org/techniques/T1578/002","sourceCount":3},{"id":"T1578.003","name":"Modify Cloud Compute Infrastructure: Delete Cloud Instance","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":"T1578","url":"https://attack.mitre.org/techniques/T1578/003","sourceCount":2},{"id":"T1578.004","name":"Modify Cloud Compute Infrastructure: Revert Cloud Instance","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":"T1578","url":"https://attack.mitre.org/techniques/T1578/004","sourceCount":0},{"id":"T1578.005","name":"Modify Cloud Compute Infrastructure: Modify Cloud Compute Configurations","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":"T1578","url":"https://attack.mitre.org/techniques/T1578/005","sourceCount":0},{"id":"T1580","name":"Cloud Infrastructure Discovery","tactics":["Discovery"],"platforms":["IaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1580","sourceCount":3},{"id":"T1583","name":"Acquire Infrastructure","tactics":["Resource Development"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1583","sourceCount":8},{"id":"T1583.001","name":"Acquire Infrastructure: Domains","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1583","url":"https://attack.mitre.org/techniques/T1583/001","sourceCount":58},{"id":"T1583.002","name":"Acquire Infrastructure: DNS Server","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1583","url":"https://attack.mitre.org/techniques/T1583/002","sourceCount":3},{"id":"T1583.003","name":"Acquire Infrastructure: Virtual Private Server","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1583","url":"https://attack.mitre.org/techniques/T1583/003","sourceCount":20},{"id":"T1583.004","name":"Acquire Infrastructure: Server","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1583","url":"https://attack.mitre.org/techniques/T1583/004","sourceCount":10},{"id":"T1583.005","name":"Acquire Infrastructure: Botnet","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1583","url":"https://attack.mitre.org/techniques/T1583/005","sourceCount":3},{"id":"T1583.006","name":"Acquire Infrastructure: Web Services","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1583","url":"https://attack.mitre.org/techniques/T1583/006","sourceCount":27},{"id":"T1583.007","name":"Acquire Infrastructure: Serverless","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1583","url":"https://attack.mitre.org/techniques/T1583/007","sourceCount":1},{"id":"T1583.008","name":"Acquire Infrastructure: Malvertising","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1583","url":"https://attack.mitre.org/techniques/T1583/008","sourceCount":2},{"id":"T1584","name":"Compromise Infrastructure","tactics":["Resource Development"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1584","sourceCount":2},{"id":"T1584.001","name":"Compromise Infrastructure: Domains","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1584","url":"https://attack.mitre.org/techniques/T1584/001","sourceCount":11},{"id":"T1584.002","name":"Compromise Infrastructure: DNS Server","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1584","url":"https://attack.mitre.org/techniques/T1584/002","sourceCount":2},{"id":"T1584.003","name":"Compromise Infrastructure: Virtual Private Server","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1584","url":"https://attack.mitre.org/techniques/T1584/003","sourceCount":3},{"id":"T1584.004","name":"Compromise Infrastructure: Server","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1584","url":"https://attack.mitre.org/techniques/T1584/004","sourceCount":15},{"id":"T1584.005","name":"Compromise Infrastructure: Botnet","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1584","url":"https://attack.mitre.org/techniques/T1584/005","sourceCount":5},{"id":"T1584.006","name":"Compromise Infrastructure: Web Services","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1584","url":"https://attack.mitre.org/techniques/T1584/006","sourceCount":6},{"id":"T1584.007","name":"Compromise Infrastructure: Serverless","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1584","url":"https://attack.mitre.org/techniques/T1584/007","sourceCount":0},{"id":"T1584.008","name":"Compromise Infrastructure: Network Devices","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1584","url":"https://attack.mitre.org/techniques/T1584/008","sourceCount":9},{"id":"T1585","name":"Establish Accounts","tactics":["Resource Development"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1585","sourceCount":6},{"id":"T1585.001","name":"Establish Accounts: Social Media Accounts","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1585","url":"https://attack.mitre.org/techniques/T1585/001","sourceCount":19},{"id":"T1585.002","name":"Establish Accounts: Email Accounts","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1585","url":"https://attack.mitre.org/techniques/T1585/002","sourceCount":25},{"id":"T1585.003","name":"Establish Accounts: Cloud Accounts","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1585","url":"https://attack.mitre.org/techniques/T1585/003","sourceCount":2},{"id":"T1586","name":"Compromise Accounts","tactics":["Resource Development"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1586","sourceCount":0},{"id":"T1586.001","name":"Compromise Accounts: Social Media Accounts","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1586","url":"https://attack.mitre.org/techniques/T1586/001","sourceCount":2},{"id":"T1586.002","name":"Compromise Accounts: Email Accounts","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1586","url":"https://attack.mitre.org/techniques/T1586/002","sourceCount":13},{"id":"T1586.003","name":"Compromise Accounts: Cloud Accounts","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1586","url":"https://attack.mitre.org/techniques/T1586/003","sourceCount":2},{"id":"T1587","name":"Develop Capabilities","tactics":["Resource Development"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1587","sourceCount":3},{"id":"T1587.001","name":"Develop Capabilities: Malware","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1587","url":"https://attack.mitre.org/techniques/T1587/001","sourceCount":36},{"id":"T1587.002","name":"Develop Capabilities: Code Signing Certificates","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1587","url":"https://attack.mitre.org/techniques/T1587/002","sourceCount":4},{"id":"T1587.003","name":"Develop Capabilities: Digital Certificates","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1587","url":"https://attack.mitre.org/techniques/T1587/003","sourceCount":7},{"id":"T1587.004","name":"Develop Capabilities: Exploits","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1587","url":"https://attack.mitre.org/techniques/T1587/004","sourceCount":3},{"id":"T1588","name":"Obtain Capabilities","tactics":["Resource Development"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1588","sourceCount":0},{"id":"T1588.001","name":"Obtain Capabilities: Malware","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1588","url":"https://attack.mitre.org/techniques/T1588/001","sourceCount":20},{"id":"T1588.002","name":"Obtain Capabilities: Tool","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1588","url":"https://attack.mitre.org/techniques/T1588/002","sourceCount":103},{"id":"T1588.003","name":"Obtain Capabilities: Code Signing Certificates","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1588","url":"https://attack.mitre.org/techniques/T1588/003","sourceCount":11},{"id":"T1588.004","name":"Obtain Capabilities: Digital Certificates","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1588","url":"https://attack.mitre.org/techniques/T1588/004","sourceCount":10},{"id":"T1588.005","name":"Obtain Capabilities: Exploits","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1588","url":"https://attack.mitre.org/techniques/T1588/005","sourceCount":2},{"id":"T1588.006","name":"Obtain Capabilities: Vulnerabilities","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1588","url":"https://attack.mitre.org/techniques/T1588/006","sourceCount":4},{"id":"T1588.007","name":"Obtain Capabilities: Artificial Intelligence","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1588","url":"https://attack.mitre.org/techniques/T1588/007","sourceCount":1},{"id":"T1589","name":"Gather Victim Identity Information","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1589","sourceCount":11},{"id":"T1589.001","name":"Gather Victim Identity Information: Credentials","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1589","url":"https://attack.mitre.org/techniques/T1589/001","sourceCount":7},{"id":"T1589.002","name":"Gather Victim Identity Information: Email Addresses","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1589","url":"https://attack.mitre.org/techniques/T1589/002","sourceCount":17},{"id":"T1589.003","name":"Gather Victim Identity Information: Employee Names","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1589","url":"https://attack.mitre.org/techniques/T1589/003","sourceCount":3},{"id":"T1590","name":"Gather Victim Network Information","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1590","sourceCount":3},{"id":"T1590.001","name":"Gather Victim Network Information: Domain Properties","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1590","url":"https://attack.mitre.org/techniques/T1590/001","sourceCount":2},{"id":"T1590.002","name":"Gather Victim Network Information: DNS","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1590","url":"https://attack.mitre.org/techniques/T1590/002","sourceCount":0},{"id":"T1590.003","name":"Gather Victim Network Information: Network Trust Dependencies","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1590","url":"https://attack.mitre.org/techniques/T1590/003","sourceCount":0},{"id":"T1590.004","name":"Gather Victim Network Information: Network Topology","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1590","url":"https://attack.mitre.org/techniques/T1590/004","sourceCount":3},{"id":"T1590.005","name":"Gather Victim Network Information: IP Addresses","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1590","url":"https://attack.mitre.org/techniques/T1590/005","sourceCount":3},{"id":"T1590.006","name":"Gather Victim Network Information: Network Security Appliances","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1590","url":"https://attack.mitre.org/techniques/T1590/006","sourceCount":1},{"id":"T1591","name":"Gather Victim Org Information","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1591","sourceCount":7},{"id":"T1591.001","name":"Gather Victim Org Information: Determine Physical Locations","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1591","url":"https://attack.mitre.org/techniques/T1591/001","sourceCount":1},{"id":"T1591.002","name":"Gather Victim Org Information: Business Relationships","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1591","url":"https://attack.mitre.org/techniques/T1591/002","sourceCount":3},{"id":"T1591.003","name":"Gather Victim Org Information: Identify Business Tempo","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1591","url":"https://attack.mitre.org/techniques/T1591/003","sourceCount":0},{"id":"T1591.004","name":"Gather Victim Org Information: Identify Roles","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1591","url":"https://attack.mitre.org/techniques/T1591/004","sourceCount":5},{"id":"T1592","name":"Gather Victim Host Information","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1592","sourceCount":1},{"id":"T1592.001","name":"Gather Victim Host Information: Hardware","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1592","url":"https://attack.mitre.org/techniques/T1592/001","sourceCount":0},{"id":"T1592.002","name":"Gather Victim Host Information: Software","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1592","url":"https://attack.mitre.org/techniques/T1592/002","sourceCount":3},{"id":"T1592.003","name":"Gather Victim Host Information: Firmware","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1592","url":"https://attack.mitre.org/techniques/T1592/003","sourceCount":0},{"id":"T1592.004","name":"Gather Victim Host Information: Client Configurations","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1592","url":"https://attack.mitre.org/techniques/T1592/004","sourceCount":1},{"id":"T1593","name":"Search Open Websites/Domains","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1593","sourceCount":6},{"id":"T1593.001","name":"Search Open Websites/Domains: Social Media","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1593","url":"https://attack.mitre.org/techniques/T1593/001","sourceCount":4},{"id":"T1593.002","name":"Search Open Websites/Domains: Search Engines","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1593","url":"https://attack.mitre.org/techniques/T1593/002","sourceCount":2},{"id":"T1593.003","name":"Search Open Websites/Domains: Code Repositories","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1593","url":"https://attack.mitre.org/techniques/T1593/003","sourceCount":3},{"id":"T1594","name":"Search Victim-Owned Websites","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1594","sourceCount":9},{"id":"T1595","name":"Active Scanning","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1595","sourceCount":1},{"id":"T1595.001","name":"Active Scanning: Scanning IP Blocks","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1595","url":"https://attack.mitre.org/techniques/T1595/001","sourceCount":2},{"id":"T1595.002","name":"Active Scanning: Vulnerability Scanning","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1595","url":"https://attack.mitre.org/techniques/T1595/002","sourceCount":15},{"id":"T1595.003","name":"Active Scanning: Wordlist Scanning","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1595","url":"https://attack.mitre.org/techniques/T1595/003","sourceCount":2},{"id":"T1596","name":"Search Open Technical Databases","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1596","sourceCount":2},{"id":"T1596.001","name":"Search Open Technical Databases: DNS/Passive DNS","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1596","url":"https://attack.mitre.org/techniques/T1596/001","sourceCount":0},{"id":"T1596.002","name":"Search Open Technical Databases: WHOIS","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1596","url":"https://attack.mitre.org/techniques/T1596/002","sourceCount":0},{"id":"T1596.003","name":"Search Open Technical Databases: Digital Certificates","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1596","url":"https://attack.mitre.org/techniques/T1596/003","sourceCount":0},{"id":"T1596.004","name":"Search Open Technical Databases: CDNs","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1596","url":"https://attack.mitre.org/techniques/T1596/004","sourceCount":0},{"id":"T1596.005","name":"Search Open Technical Databases: Scan Databases","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1596","url":"https://attack.mitre.org/techniques/T1596/005","sourceCount":3},{"id":"T1597","name":"Search Closed Sources","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1597","sourceCount":1},{"id":"T1597.001","name":"Search Closed Sources: Threat Intel Vendors","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1597","url":"https://attack.mitre.org/techniques/T1597/001","sourceCount":0},{"id":"T1597.002","name":"Search Closed Sources: Purchase Technical Data","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1597","url":"https://attack.mitre.org/techniques/T1597/002","sourceCount":1},{"id":"T1598","name":"Phishing for Information","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1598","sourceCount":5},{"id":"T1598.001","name":"Phishing for Information: Spearphishing Service","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1598","url":"https://attack.mitre.org/techniques/T1598/001","sourceCount":1},{"id":"T1598.002","name":"Phishing for Information: Spearphishing Attachment","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1598","url":"https://attack.mitre.org/techniques/T1598/002","sourceCount":4},{"id":"T1598.003","name":"Phishing for Information: Spearphishing Link","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1598","url":"https://attack.mitre.org/techniques/T1598/003","sourceCount":17},{"id":"T1598.004","name":"Phishing for Information: Spearphishing Voice","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":"T1598","url":"https://attack.mitre.org/techniques/T1598/004","sourceCount":4},{"id":"T1599","name":"Network Boundary Bridging","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":null,"url":"https://attack.mitre.org/techniques/T1599","sourceCount":2},{"id":"T1599.001","name":"Network Boundary Bridging: Network Address Translation Traversal","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":"T1599","url":"https://attack.mitre.org/techniques/T1599/001","sourceCount":0},{"id":"T1600","name":"Weaken Encryption","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":null,"url":"https://attack.mitre.org/techniques/T1600","sourceCount":0},{"id":"T1600.001","name":"Weaken Encryption: Reduce Key Space","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":"T1600","url":"https://attack.mitre.org/techniques/T1600/001","sourceCount":0},{"id":"T1600.002","name":"Weaken Encryption: Disable Crypto Hardware","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":"T1600","url":"https://attack.mitre.org/techniques/T1600/002","sourceCount":0},{"id":"T1601","name":"Modify System Image","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":null,"url":"https://attack.mitre.org/techniques/T1601","sourceCount":0},{"id":"T1601.001","name":"Modify System Image: Patch System Image","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":"T1601","url":"https://attack.mitre.org/techniques/T1601/001","sourceCount":1},{"id":"T1601.002","name":"Modify System Image: Downgrade System Image","tactics":["Defense Evasion"],"platforms":["Network Devices"],"parent":"T1601","url":"https://attack.mitre.org/techniques/T1601/002","sourceCount":0},{"id":"T1602","name":"Data from Configuration Repository","tactics":["Collection"],"platforms":["Network Devices"],"parent":null,"url":"https://attack.mitre.org/techniques/T1602","sourceCount":0},{"id":"T1602.001","name":"Data from Configuration Repository: SNMP (MIB Dump)","tactics":["Collection"],"platforms":["Network Devices"],"parent":"T1602","url":"https://attack.mitre.org/techniques/T1602/001","sourceCount":0},{"id":"T1602.002","name":"Data from Configuration Repository: Network Device Configuration Dump","tactics":["Collection"],"platforms":["Network Devices"],"parent":"T1602","url":"https://attack.mitre.org/techniques/T1602/002","sourceCount":1},{"id":"T1606","name":"Forge Web Credentials","tactics":["Credential Access"],"platforms":["IaaS","Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1606","sourceCount":0},{"id":"T1606.001","name":"Forge Web Credentials: Web Cookies","tactics":["Credential Access"],"platforms":["IaaS","Linux","SaaS","Windows","macOS"],"parent":"T1606","url":"https://attack.mitre.org/techniques/T1606/001","sourceCount":1},{"id":"T1606.002","name":"Forge Web Credentials: SAML Tokens","tactics":["Credential Access"],"platforms":["IaaS","Identity Provider","Office Suite","SaaS","Windows"],"parent":"T1606","url":"https://attack.mitre.org/techniques/T1606/002","sourceCount":2},{"id":"T1608","name":"Stage Capabilities","tactics":["Resource Development"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1608","sourceCount":1},{"id":"T1608.001","name":"Stage Capabilities: Upload Malware","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1608","url":"https://attack.mitre.org/techniques/T1608/001","sourceCount":33},{"id":"T1608.002","name":"Stage Capabilities: Upload Tool","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1608","url":"https://attack.mitre.org/techniques/T1608/002","sourceCount":4},{"id":"T1608.003","name":"Stage Capabilities: Install Digital Certificate","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1608","url":"https://attack.mitre.org/techniques/T1608/003","sourceCount":1},{"id":"T1608.004","name":"Stage Capabilities: Drive-by Target","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1608","url":"https://attack.mitre.org/techniques/T1608/004","sourceCount":9},{"id":"T1608.005","name":"Stage Capabilities: Link Target","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1608","url":"https://attack.mitre.org/techniques/T1608/005","sourceCount":4},{"id":"T1608.006","name":"Stage Capabilities: SEO Poisoning","tactics":["Resource Development"],"platforms":["PRE"],"parent":"T1608","url":"https://attack.mitre.org/techniques/T1608/006","sourceCount":1},{"id":"T1609","name":"Container Administration Command","tactics":["Execution"],"platforms":["Containers"],"parent":null,"url":"https://attack.mitre.org/techniques/T1609","sourceCount":5},{"id":"T1610","name":"Deploy Container","tactics":["Defense Evasion","Execution"],"platforms":["Containers"],"parent":null,"url":"https://attack.mitre.org/techniques/T1610","sourceCount":4},{"id":"T1611","name":"Escape to Host","tactics":["Privilege Escalation"],"platforms":["Containers","ESXi","Linux","Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1611","sourceCount":5},{"id":"T1612","name":"Build Image on Host","tactics":["Defense Evasion"],"platforms":["Containers"],"parent":null,"url":"https://attack.mitre.org/techniques/T1612","sourceCount":0},{"id":"T1613","name":"Container and Resource Discovery","tactics":["Discovery"],"platforms":["Containers"],"parent":null,"url":"https://attack.mitre.org/techniques/T1613","sourceCount":3},{"id":"T1614","name":"System Location Discovery","tactics":["Discovery"],"platforms":["IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1614","sourceCount":20},{"id":"T1614.001","name":"System Location Discovery: System Language Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":"T1614","url":"https://attack.mitre.org/techniques/T1614/001","sourceCount":36},{"id":"T1615","name":"Group Policy Discovery","tactics":["Discovery"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1615","sourceCount":7},{"id":"T1619","name":"Cloud Storage Object Discovery","tactics":["Discovery"],"platforms":["IaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1619","sourceCount":2},{"id":"T1620","name":"Reflective Code Loading","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1620","sourceCount":28},{"id":"T1621","name":"Multi-Factor Authentication Request Generation","tactics":["Credential Access"],"platforms":["IaaS","Identity Provider","Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1621","sourceCount":4},{"id":"T1622","name":"Debugger Evasion","tactics":["Defense Evasion","Discovery"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1622","sourceCount":23},{"id":"T1647","name":"Plist File Modification","tactics":["Defense Evasion"],"platforms":["macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1647","sourceCount":2},{"id":"T1648","name":"Serverless Execution","tactics":["Execution"],"platforms":["IaaS","Office Suite","SaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1648","sourceCount":1},{"id":"T1649","name":"Steal or Forge Authentication Certificates","tactics":["Credential Access"],"platforms":["Identity Provider","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1649","sourceCount":3},{"id":"T1650","name":"Acquire Access","tactics":["Resource Development"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1650","sourceCount":1},{"id":"T1651","name":"Cloud Administration Command","tactics":["Execution"],"platforms":["IaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1651","sourceCount":3},{"id":"T1652","name":"Device Driver Discovery","tactics":["Discovery"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1652","sourceCount":4},{"id":"T1653","name":"Power Settings","tactics":["Persistence"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1653","sourceCount":3},{"id":"T1654","name":"Log Enumeration","tactics":["Discovery"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1654","sourceCount":10},{"id":"T1656","name":"Impersonation","tactics":["Defense Evasion"],"platforms":["Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1656","sourceCount":12},{"id":"T1657","name":"Financial Theft","tactics":["Impact"],"platforms":["Linux","Office Suite","SaaS","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1657","sourceCount":20},{"id":"T1659","name":"Content Injection","tactics":["Command and Control","Initial Access"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1659","sourceCount":2},{"id":"T1665","name":"Hide Infrastructure","tactics":["Command and Control"],"platforms":["ESXi","Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1665","sourceCount":7},{"id":"T1666","name":"Modify Cloud Resource Hierarchy","tactics":["Defense Evasion"],"platforms":["IaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1666","sourceCount":0},{"id":"T1667","name":"Email Bombing","tactics":["Impact"],"platforms":["Linux","Office Suite","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1667","sourceCount":1},{"id":"T1668","name":"Exclusive Control","tactics":["Persistence"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1668","sourceCount":0},{"id":"T1669","name":"Wi-Fi Networks","tactics":["Initial Access"],"platforms":["Linux","Network Devices","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1669","sourceCount":2},{"id":"T1671","name":"Cloud Application Integration","tactics":["Persistence"],"platforms":["Office Suite","SaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1671","sourceCount":1},{"id":"T1672","name":"Email Spoofing","tactics":["Defense Evasion"],"platforms":["Linux","Office Suite","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1672","sourceCount":0},{"id":"T1673","name":"Virtual Machine Discovery","tactics":["Discovery"],"platforms":["ESXi","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1673","sourceCount":4},{"id":"T1674","name":"Input Injection","tactics":["Execution"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1674","sourceCount":1},{"id":"T1675","name":"ESXi Administration Command","tactics":["Execution"],"platforms":["ESXi"],"parent":null,"url":"https://attack.mitre.org/techniques/T1675","sourceCount":2},{"id":"T1677","name":"Poisoned Pipeline Execution","tactics":["Execution"],"platforms":["SaaS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1677","sourceCount":0},{"id":"T1678","name":"Delay Execution","tactics":["Defense Evasion"],"platforms":["Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1678","sourceCount":4},{"id":"T1679","name":"Selective Exclusion","tactics":["Defense Evasion"],"platforms":["Windows"],"parent":null,"url":"https://attack.mitre.org/techniques/T1679","sourceCount":3},{"id":"T1680","name":"Local Storage Discovery","tactics":["Discovery"],"platforms":["ESXi","IaaS","Linux","Windows","macOS"],"parent":null,"url":"https://attack.mitre.org/techniques/T1680","sourceCount":99},{"id":"T1681","name":"Search Threat Vendor Data","tactics":["Reconnaissance"],"platforms":["PRE"],"parent":null,"url":"https://attack.mitre.org/techniques/T1681","sourceCount":2}]'),PU=JSON.parse('[{"id":"C0028","name":"2015 Ukraine Electric Power Attack","type":"campaign","techniques":["T1018","T1040","T1055","T1056.001","T1059.005","T1070.004","T1071.001","T1078","T1105","T1112","T1133","T1136.002","T1204.002","T1218.011","T1562.001","T1566.001","T1570"]},{"id":"C0025","name":"2016 Ukraine Electric Power Attack","type":"campaign","techniques":["T1003.001","T1018","T1021.002","T1027","T1027.002","T1036.005","T1036.008","T1036.010","T1047","T1059.001","T1059.003","T1059.005","T1098","T1110","T1136","T1136.002","T1505.001","T1543.003","T1554","T1562.002","T1570"]},{"id":"C0034","name":"2022 Ukraine Electric Power Attack","type":"campaign","techniques":["T1036.004","T1053.005","T1059.001","T1095","T1484.001","T1485","T1505.003","T1543.002","T1570","T1572"]},{"id":"C0057","name":"3CX Supply Chain Attack","type":"campaign","techniques":["T1027","T1027.009","T1027.013","T1055","T1055.002","T1071.001","T1078","T1102.001","T1189","T1195.002","T1203","T1217","T1218.007","T1218.015","T1543.004","T1546.016","T1553.002","T1559","T1573.001","T1574.001","T1620","T1678"]},{"id":"C0051","name":"APT28 Nearest Neighbor Campaign","type":"campaign","techniques":["T1003.002","T1003.003","T1006","T1016.002","T1021.001","T1021.002","T1059.001","T1059.003","T1074.001","T1090.001","T1110.003","T1140","T1560.001","T1561.001","T1562.004","T1567","T1584","T1669"]},{"id":"C0040","name":"APT41 DUST","type":"campaign","techniques":["T1027.013","T1036.004","T1070.004","T1071.001","T1074.001","T1102","T1105","T1119","T1213.006","T1505.003","T1543.003","T1553.002","T1560.001","T1567.002","T1569.002","T1573.002","T1574.001","T1583.007","T1586.003","T1588.003","T1593.002","T1594","T1596.005"]},{"id":"C0046","name":"ArcaneDoor","type":"campaign","techniques":["T1014","T1020","T1036","T1037","T1040","T1041","T1055","T1059","T1070.004","T1071.001","T1082","T1102.003","T1119","T1133","T1140","T1190","T1556","T1557","T1562.001","T1562.003","T1583.003","T1583.006","T1587.001","T1587.003","T1653"]},{"id":"C0010","name":"C0010","type":"campaign","techniques":["T1105","T1189","T1583.001","T1584.001","T1587.001","T1588.002","T1608.001","T1608.002","T1608.004"]},{"id":"C0011","name":"C0011","type":"campaign","techniques":["T1059.005","T1204.001","T1204.002","T1566.001","T1566.002","T1583.001","T1587.003","T1608.001"]},{"id":"C0015","name":"C0015","type":"campaign","techniques":["T1005","T1016","T1018","T1021.001","T1027","T1030","T1036","T1039","T1047","T1055.001","T1057","T1059.003","T1059.005","T1059.007","T1069.001","T1069.002","T1074.001","T1083","T1105","T1124","T1135","T1204.002","T1218.005","T1218.010","T1218.011","T1219.002","T1482","T1486","T1553.002","T1566.001","T1567.002","T1570","T1588.001","T1588.002"]},{"id":"C0017","name":"C0017","type":"campaign","techniques":["T1001.003","T1003.002","T1005","T1016","T1027","T1027.002","T1033","T1036.004","T1036.005","T1041","T1048.003","T1053.005","T1059.003","T1059.007","T1071.001","T1074.001","T1090","T1102","T1102.001","T1105","T1134","T1140","T1190","T1505.003","T1560.003","T1567","T1574","T1588.002","T1680"]},{"id":"C0018","name":"C0018","type":"campaign","techniques":["T1016","T1021.001","T1027.010","T1033","T1036","T1036.005","T1046","T1047","T1059.001","T1071.001","T1072","T1105","T1190","T1218.011","T1219.002","T1486","T1570","T1571","T1588.002"]},{"id":"C0021","name":"C0021","type":"campaign","techniques":["T1027.009","T1027.010","T1059.001","T1071.001","T1095","T1105","T1140","T1204.001","T1218.011","T1566.002","T1573.002","T1583.001","T1584.001","T1588.002","T1608.001"]},{"id":"C0026","name":"C0026","type":"campaign","techniques":["T1005","T1030","T1105","T1560.001","T1568","T1583.001"]},{"id":"C0027","name":"C0027","type":"campaign","techniques":["T1003.006","T1021.007","T1046","T1047","T1069.003","T1078.004","T1087.003","T1087.004","T1090","T1098.001","T1098.003","T1098.005","T1102","T1105","T1133","T1190","T1213.002","T1219.002","T1530","T1566.004","T1572","T1578.002","T1588.002","T1589.001","T1598.001","T1598.004","T1621","T1656"]},{"id":"C0032","name":"C0032","type":"campaign","techniques":["T1003.001","T1021.001","T1021.004","T1036.005","T1053.005","T1059.001","T1070.004","T1070.006","T1074.001","T1078","T1133","T1505.003","T1546.012","T1571","T1572","T1583.003","T1588.002"]},{"id":"C0004","name":"CostaRicto","type":"campaign","techniques":["T1005","T1046","T1053.005","T1090.003","T1105","T1133","T1572","T1583.001","T1587.001","T1588.002"]},{"id":"C0029","name":"Cutting Edge","type":"campaign","techniques":["T1003.001","T1003.003","T1005","T1021.001","T1021.002","T1021.004","T1027.013","T1055","T1056.001","T1056.003","T1059","T1059.006","T1070","T1070.004","T1070.006","T1071.004","T1078.002","T1082","T1095","T1105","T1190","T1205","T1505.003","T1554","T1560.001","T1562.001","T1572","T1584.008","T1588.002","T1594","T1595.002"]},{"id":"C0053","name":"FLORAHOX Activity","type":"campaign","techniques":["T1059","T1059.004","T1090.003","T1190","T1583.003","T1584.008"]},{"id":"C0001","name":"Frankenstein","type":"campaign","techniques":["T1005","T1016","T1020","T1027.010","T1033","T1036.004","T1041","T1047","T1053.005","T1057","T1059.001","T1059.003","T1059.005","T1071.001","T1082","T1105","T1119","T1127.001","T1140","T1203","T1204.002","T1221","T1497.001","T1518.001","T1566.001","T1573.001","T1588.002"]},{"id":"C0041","name":"FrostyGoop Incident","type":"campaign","techniques":["T1003.002","T1071","T1190","T1505.003","T1562.010"]},{"id":"C0007","name":"FunnyDream","type":"campaign","techniques":["T1016","T1018","T1047","T1049","T1057","T1059.003","T1059.005","T1082","T1105","T1560.001","T1583.001","T1585.002","T1588.001","T1588.002"]},{"id":"C0038","name":"HomeLand Justice","type":"campaign","techniques":["T1003.001","T1021.001","T1021.002","T1036.005","T1041","T1046","T1047","T1059.001","T1059.003","T1078","T1078.001","T1087.003","T1098.002","T1105","T1114.002","T1134.001","T1190","T1486","T1505.003","T1561.002","T1562.001","T1562.002","T1570","T1588.002","T1588.003"]},{"id":"C0043","name":"Indian Critical Infrastructure Intrusions","type":"campaign","techniques":["T1071.001","T1568","T1571","T1573.002","T1583.001","T1584","T1588.004","T1599"]},{"id":"C0050","name":"J-magic Campaign","type":"campaign","techniques":["T1036.005","T1583.003","T1587.003","T1588.001"]},{"id":"C0044","name":"Juicy Mix","type":"campaign","techniques":["T1053.005","T1059.001","T1059.005","T1071.001","T1074.001","T1082","T1132.001","T1140","T1217","T1518","T1555.003","T1555.004","T1584.004","T1587.001"]},{"id":"C0035","name":"KV Botnet Activity","type":"campaign","techniques":["T1016","T1036","T1036.004","T1055.009","T1057","T1059.004","T1070.004","T1082","T1083","T1095","T1105","T1222.002","T1518.001","T1546","T1562.001","T1564.013","T1571","T1573","T1583.003","T1584.008"]},{"id":"C0049","name":"Leviathan Australian Intrusions","type":"campaign","techniques":["T1018","T1021.002","T1021.004","T1041","T1056","T1068","T1074.001","T1078","T1078.002","T1078.003","T1082","T1111","T1135","T1190","T1212","T1213.006","T1482","T1505.003","T1528","T1552","T1552.001","T1558.003","T1562.004","T1588.006","T1594","T1615"]},{"id":"C0002","name":"Night Dragon","type":"campaign","techniques":["T1003.002","T1005","T1008","T1027.002","T1027.013","T1033","T1059.003","T1071.001","T1074.002","T1078","T1078.002","T1083","T1105","T1110.002","T1112","T1114.001","T1133","T1190","T1204.001","T1219","T1550.002","T1562.001","T1566.002","T1568","T1583.004","T1584.004","T1588.001","T1588.002","T1608.001"]},{"id":"C0012","name":"Operation CuckooBees","type":"campaign","techniques":["T1003.002","T1005","T1007","T1016","T1018","T1027.010","T1027.011","T1033","T1036.005","T1049","T1053.005","T1057","T1059.003","T1059.005","T1069.001","T1071.001","T1078.002","T1082","T1083","T1087.001","T1087.002","T1120","T1124","T1133","T1135","T1190","T1201","T1505.003","T1543.003","T1547.006","T1560.001","T1574.001","T1588.002"]},{"id":"C0022","name":"Operation Dream Job","type":"campaign","techniques":["T1005","T1027.002","T1027.013","T1036.008","T1041","T1047","T1053.005","T1059.001","T1059.003","T1059.005","T1070.004","T1071.001","T1083","T1087.002","T1105","T1106","T1110","T1204.001","T1204.002","T1218.010","T1218.011","T1220","T1221","T1497.001","T1497.003","T1505.004","T1534","T1547.001","T1553.002","T1560.001","T1566.001","T1566.002","T1566.003","T1567.002","T1573.001","T1583.001","T1583.004","T1583.006","T1584.001","T1584.004","T1585.001","T1585.002","T1587.001","T1587.002","T1588.002","T1588.003","T1589","T1591","T1591.004","T1593.001","T1608.001","T1608.002","T1614.001","T1622","T1656"]},{"id":"C0016","name":"Operation Dust Storm","type":"campaign","techniques":["T1027.002","T1027.013","T1036","T1059.005","T1059.007","T1140","T1189","T1203","T1204.001","T1204.002","T1218.005","T1518","T1566.001","T1566.002","T1568","T1583.001","T1585.002"]},{"id":"C0023","name":"Operation Ghost","type":"campaign","techniques":["T1001.002","T1027.003","T1078.002","T1102.002","T1546.003","T1583.001","T1585.001","T1587.001"]},{"id":"C0006","name":"Operation Honeybee","type":"campaign","techniques":["T1005","T1027.013","T1036","T1036.005","T1041","T1057","T1059.003","T1059.005","T1070.004","T1071.002","T1074.001","T1082","T1083","T1105","T1106","T1112","T1140","T1204.002","T1543.003","T1548.002","T1553.002","T1560.001","T1569.002","T1574.011","T1583.001","T1583.004","T1585.002","T1588.004"]},{"id":"C0048","name":"Operation MidnightEclipse","type":"campaign","techniques":["T1003.003","T1005","T1021.002","T1021.006","T1053.003","T1059.004","T1071.001","T1074.001","T1078","T1078.002","T1090","T1105","T1190","T1559","T1584.003","T1584.006","T1588.002"]},{"id":"C0013","name":"Operation Sharpshooter","type":"campaign","techniques":["T1036.005","T1055","T1059.005","T1090","T1105","T1106","T1204.002","T1547.001","T1559.002","T1583.006","T1584.004","T1587.001","T1608.001"]},{"id":"C0005","name":"Operation Spalax","type":"campaign","techniques":["T1027.002","T1027.003","T1027.013","T1059","T1102","T1140","T1204.001","T1204.002","T1218.011","T1497","T1566.001","T1566.002","T1568","T1583.001","T1588.001","T1588.002","T1608.001"]},{"id":"C0014","name":"Operation Wocao","type":"campaign","techniques":["T1001","T1003.001","T1003.006","T1005","T1007","T1012","T1016","T1016.001","T1018","T1021.002","T1027.005","T1027.010","T1033","T1036.005","T1041","T1046","T1047","T1049","T1053.005","T1055","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1059.006","T1069.001","T1070.001","T1070.004","T1071.001","T1074.001","T1078","T1078.002","T1078.003","T1082","T1083","T1087.002","T1090","T1090.001","T1090.003","T1095","T1105","T1106","T1111","T1112","T1115","T1119","T1120","T1124","T1133","T1135","T1190","T1505.003","T1518","T1518.001","T1552.004","T1555.005","T1558.003","T1560.001","T1562.004","T1569.002","T1570","T1571","T1573.002","T1583.004","T1585.002","T1587.001","T1588.002","T1589","T1680"]},{"id":"C0042","name":"Outer Space","type":"campaign","techniques":["T1027.013","T1059.005","T1071.001","T1105","T1217","T1584.004","T1585.003","T1587.001"]},{"id":"C0036","name":"Pikabot Distribution February 2024","type":"campaign","techniques":["T1059.001","T1059.007","T1566.002","T1574"]},{"id":"C0055","name":"Quad7 Activity","type":"campaign","techniques":["T1027.011","T1059.004","T1071.001","T1071.002","T1090.002","T1090.003","T1105","T1110.003","T1190","T1562.001","T1571","T1584.005","T1584.008","T1589.002","T1665"]},{"id":"C0047","name":"RedDelta Modified PlugX Infection Chain Operations","type":"campaign","techniques":["T1027.013","T1036.004","T1059.001","T1071.001","T1082","T1090","T1095","T1203","T1204.001","T1204.002","T1218.007","T1218.014","T1480","T1547.001","T1553.002","T1564.001","T1566.001","T1566.002","T1574.001","T1583.001","T1588.004","T1608.001"]},{"id":"C0056","name":"RedPenguin","type":"campaign","techniques":["T1014","T1016","T1027.013","T1036.005","T1040","T1041","T1055","T1057","T1059.004","T1059.008","T1070.004","T1070.007","T1078","T1090","T1090.003","T1095","T1104","T1105","T1140","T1203","T1205","T1554","T1562.003","T1571","T1573.001","T1587.001"]},{"id":"C0052","name":"SPACEHOP Activity","type":"campaign","techniques":["T1090.003","T1190","T1583.003","T1588.002"]},{"id":"C0059","name":"Salesforce Data Exfiltration","type":"campaign","techniques":["T1020","T1036","T1059.006","T1078.002","T1083","T1090","T1090.003","T1213.004","T1567","T1585","T1585.002","T1586.002","T1587.001","T1588.002","T1598.004","T1608.005","T1656","T1671"]},{"id":"C0045","name":"ShadowRay","type":"campaign","techniques":["T1003.008","T1016","T1027.013","T1059.006","T1068","T1105","T1190","T1496.001","T1546.004","T1588.002"]},{"id":"C0058","name":"SharePoint ToolShell Exploitation","type":"campaign","techniques":["T1003.001","T1005","T1027.002","T1027.010","T1033","T1041","T1047","T1053.005","T1059.001","T1059.003","T1071.001","T1074.001","T1082","T1083","T1090","T1105","T1112","T1119","T1140","T1190","T1484.001","T1486","T1505.003","T1505.004","T1552.001","T1562.001","T1569.002","T1570","T1572","T1583.001","T1585.002","T1588.002","T1595.002","T1620","T1657"]},{"id":"C0024","name":"SolarWinds Compromise","type":"campaign","techniques":["T1003.006","T1005","T1016.001","T1018","T1021.001","T1021.002","T1021.006","T1036.004","T1036.005","T1047","T1048.002","T1053.005","T1057","T1059.001","T1059.003","T1059.005","T1069","T1069.002","T1070","T1070.004","T1070.006","T1070.008","T1071.001","T1074.002","T1078","T1078.002","T1078.003","T1078.004","T1083","T1087","T1087.002","T1090.001","T1098.001","T1098.002","T1098.003","T1098.005","T1105","T1114.002","T1133","T1140","T1190","T1195.002","T1199","T1213","T1213.003","T1218.011","T1482","T1484.002","T1539","T1546.003","T1550","T1550.001","T1550.004","T1552.004","T1553.002","T1555","T1555.003","T1558.003","T1560.001","T1562.001","T1562.002","T1562.004","T1568","T1583.001","T1584.001","T1587.001","T1589.001","T1606.001","T1606.002","T1665","T1680"]},{"id":"C0030","name":"Triton Safety Instrumented System Attack","type":"campaign","techniques":["T1003.001","T1027.005","T1036.005","T1053.005","T1056.003","T1059.001","T1573","T1587.001","T1588.002","T1595"]},{"id":"C0039","name":"Versa Director Zero Day Exploitation","type":"campaign","techniques":["T1056","T1071.001","T1095","T1190","T1505.003","T1573.002","T1584.008","T1587.001"]},{"id":"C0037","name":"Water Curupira Pikabot Distribution","type":"campaign","techniques":["T1059.003","T1059.007","T1105","T1140","T1204","T1204.001","T1204.002","T1218.011","T1566.001","T1589.002"]},{"id":"G0099","name":"APT-C-36","type":"group","techniques":["T1027","T1036.004","T1053.005","T1059.005","T1105","T1204.002","T1566.001","T1571","T1588.002"]},{"id":"G0006","name":"APT1","type":"group","techniques":["T1003.001","T1005","T1007","T1016","T1021.001","T1036.005","T1049","T1057","T1059.003","T1087.001","T1114.001","T1114.002","T1119","T1135","T1550.002","T1560.001","T1566.001","T1566.002","T1583.001","T1584.001","T1585.002","T1588.001","T1588.002"]},{"id":"G0005","name":"APT12","type":"group","techniques":["T1102.002","T1203","T1204.002","T1566.001","T1568.003"]},{"id":"G0025","name":"APT17","type":"group","techniques":["T1583.006","T1585"]},{"id":"G0026","name":"APT18","type":"group","techniques":["T1027.013","T1053.002","T1059.003","T1070.004","T1071.001","T1071.004","T1078","T1082","T1083","T1105","T1133","T1547.001"]},{"id":"G0073","name":"APT19","type":"group","techniques":["T1016","T1027.010","T1027.013","T1033","T1059","T1059.001","T1071.001","T1082","T1112","T1132.001","T1140","T1189","T1204.002","T1218.010","T1218.011","T1543.003","T1547.001","T1564.003","T1566.001","T1574.001","T1588.002"]},{"id":"G0007","name":"APT28","type":"group","techniques":["T1001.001","T1003","T1003.001","T1003.003","T1005","T1014","T1021.002","T1025","T1027.013","T1030","T1036","T1036.005","T1037.001","T1039","T1040","T1048.002","T1056.001","T1057","T1059.001","T1059.003","T1068","T1070.001","T1070.004","T1070.006","T1071.001","T1071.003","T1074.001","T1074.002","T1078","T1078.004","T1083","T1090.002","T1090.003","T1091","T1092","T1098.002","T1102.002","T1105","T1110","T1110.001","T1110.003","T1113","T1114.002","T1119","T1120","T1133","T1134.001","T1137.002","T1140","T1189","T1190","T1199","T1203","T1204.001","T1204.002","T1210","T1211","T1213","T1213.002","T1218.011","T1221","T1498","T1505.003","T1528","T1542.003","T1546.015","T1547.001","T1550.001","T1550.002","T1557.004","T1559.002","T1560","T1560.001","T1564.001","T1564.003","T1566.001","T1567","T1573.001","T1583.001","T1583.003","T1583.006","T1584.008","T1586.002","T1588.002","T1589.001","T1591","T1595.002","T1596","T1598","T1598.003","T1669"]},{"id":"G0016","name":"APT29","type":"group","techniques":["T1003.002","T1003.004","T1005","T1016.001","T1021.007","T1027.001","T1027.002","T1027.006","T1036.005","T1037","T1037.004","T1047","T1053.005","T1059.001","T1059.006","T1059.009","T1068","T1070.004","T1070.006","T1078","T1078.003","T1078.004","T1087.004","T1090.002","T1090.003","T1090.004","T1098.002","T1098.005","T1105","T1110.001","T1110.003","T1114.002","T1133","T1136.003","T1190","T1199","T1203","T1204.001","T1204.002","T1218.005","T1505.003","T1528","T1546.003","T1546.008","T1547.001","T1548.002","T1550.003","T1553.005","T1556.007","T1562.008","T1566.001","T1566.002","T1566.003","T1568","T1573","T1583.006","T1586.002","T1586.003","T1587.001","T1587.003","T1588.002","T1595.002","T1621","T1649","T1651","T1665"]},{"id":"G0022","name":"APT3","type":"group","techniques":["T1003.001","T1005","T1016","T1018","T1021.001","T1021.002","T1027","T1027.002","T1027.005","T1033","T1036.010","T1041","T1049","T1053.005","T1056.001","T1057","T1059.001","T1059.003","T1069","T1070.004","T1074.001","T1078.002","T1082","T1083","T1087.001","T1090.002","T1095","T1098.007","T1104","T1105","T1110.002","T1136.001","T1203","T1204.001","T1218.011","T1543.003","T1546.008","T1547.001","T1552.001","T1555.003","T1560.001","T1564.003","T1566.002","T1574.001"]},{"id":"G0013","name":"APT30","type":"group","techniques":["T1204.002","T1566.001"]},{"id":"G0050","name":"APT32","type":"group","techniques":["T1003","T1003.001","T1012","T1016","T1018","T1021.002","T1027.010","T1027.011","T1027.013","T1027.016","T1033","T1036","T1036.003","T1036.004","T1036.005","T1041","T1046","T1047","T1048.003","T1049","T1053.005","T1055","T1056.001","T1059","T1059.001","T1059.003","T1059.005","T1059.007","T1068","T1070.001","T1070.004","T1070.006","T1071.001","T1071.003","T1072","T1078.003","T1082","T1083","T1087.001","T1102","T1105","T1112","T1135","T1137","T1189","T1203","T1204.001","T1204.002","T1216.001","T1218.005","T1218.010","T1218.011","T1222.002","T1505.003","T1543.003","T1547.001","T1550.002","T1550.003","T1552.002","T1560","T1564.001","T1564.003","T1564.004","T1566.001","T1566.002","T1569.002","T1570","T1571","T1574.001","T1583.001","T1583.006","T1585.001","T1588.002","T1589","T1589.002","T1598.003","T1608.001","T1608.004"]},{"id":"G0064","name":"APT33","type":"group","techniques":["T1003.001","T1003.004","T1003.005","T1027.013","T1040","T1048.003","T1053.005","T1059.001","T1059.005","T1068","T1071.001","T1078","T1078.004","T1105","T1110.003","T1132.001","T1203","T1204.001","T1204.002","T1546.003","T1547.001","T1552.001","T1552.006","T1555","T1555.003","T1560.001","T1566.001","T1566.002","T1571","T1573.001","T1588.002"]},{"id":"G0067","name":"APT37","type":"group","techniques":["T1005","T1027","T1027.003","T1033","T1036.001","T1053.005","T1055","T1057","T1059","T1059.003","T1059.005","T1059.006","T1071.001","T1082","T1102.002","T1105","T1106","T1120","T1123","T1189","T1203","T1204.002","T1529","T1547.001","T1548.002","T1555.003","T1559.002","T1561.002","T1566.001"]},{"id":"G0082","name":"APT38","type":"group","techniques":["T1005","T1027.002","T1033","T1036.003","T1036.006","T1049","T1053.003","T1053.005","T1055","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1070.001","T1070.004","T1070.006","T1071.001","T1082","T1083","T1105","T1106","T1110","T1112","T1115","T1135","T1140","T1189","T1204.001","T1204.002","T1217","T1218.001","T1218.005","T1218.007","T1218.011","T1480.002","T1485","T1486","T1505.003","T1518.001","T1529","T1543.003","T1548.002","T1553.005","T1561.002","T1562.001","T1562.003","T1562.004","T1562.013","T1565.001","T1565.002","T1565.003","T1566.001","T1569.002","T1583.001","T1588.002"]},{"id":"G0087","name":"APT39","type":"group","techniques":["T1003","T1003.001","T1005","T1012","T1018","T1021.001","T1021.002","T1021.004","T1027.002","T1027.013","T1033","T1036.005","T1041","T1046","T1053.005","T1056","T1056.001","T1059","T1059.001","T1059.005","T1059.006","T1059.010","T1070.004","T1071.001","T1071.004","T1074.001","T1078","T1083","T1090.001","T1090.002","T1102.002","T1105","T1110","T1113","T1115","T1135","T1136.001","T1140","T1190","T1197","T1204.001","T1204.002","T1505.003","T1546.010","T1547.001","T1547.009","T1553.006","T1555","T1560.001","T1566.001","T1566.002","T1569.002","T1588.002"]},{"id":"G0096","name":"APT41","type":"group","techniques":["T1003.001","T1003.002","T1003.003","T1005","T1008","T1012","T1014","T1016","T1018","T1021.001","T1021.002","T1027","T1027.002","T1030","T1033","T1036.004","T1036.005","T1037","T1046","T1047","T1049","T1053.005","T1055","T1056.001","T1059.001","T1059.003","T1059.004","T1069","T1070.001","T1070.003","T1070.004","T1071.001","T1071.002","T1071.004","T1078","T1082","T1083","T1087.001","T1087.002","T1090","T1098.007","T1102.001","T1104","T1105","T1110","T1112","T1133","T1135","T1136.001","T1190","T1195.002","T1197","T1203","T1213.003","T1218.001","T1218.011","T1480.001","T1484.001","T1486","T1496.001","T1542.003","T1543.003","T1546.008","T1547.001","T1550.002","T1553.002","T1555","T1555.003","T1560.001","T1562.006","T1566.001","T1568.002","T1569.002","T1570","T1574.001","T1574.006","T1588.002","T1595.002","T1595.003","T1596.005","T1599","T1656"]},{"id":"G1044","name":"APT42","type":"group","techniques":["T1016","T1036.005","T1047","T1053.005","T1056","T1056.001","T1059.001","T1059.005","T1070","T1070.008","T1071.001","T1082","T1087.001","T1102","T1111","T1112","T1113","T1132.001","T1518.001","T1530","T1539","T1547","T1555.003","T1566.002","T1573.002","T1583.001","T1583.003","T1585.002","T1588.002","T1608.001","T1656"]},{"id":"G1023","name":"APT5","type":"group","techniques":["T1003.001","T1003.002","T1021.001","T1021.004","T1036.005","T1049","T1053.003","T1055","T1056.001","T1057","T1059.001","T1059.003","T1070","T1070.003","T1070.004","T1070.006","T1074.001","T1078.002","T1078.004","T1083","T1098.007","T1136.001","T1190","T1505.003","T1554","T1560.001","T1562.006","T1583.005","T1654"]},{"id":"G1030","name":"Agrius","type":"group","techniques":["T1003.001","T1003.002","T1005","T1018","T1021.001","T1036","T1041","T1046","T1059.003","T1074.001","T1078.002","T1110","T1110.003","T1119","T1140","T1190","T1505.003","T1543.003","T1560.001","T1562.001","T1570","T1583"]},{"id":"G0130","name":"Ajax Security Team","type":"group","techniques":["T1056.001","T1105","T1204.002","T1555.003","T1566.001","T1566.003"]},{"id":"G1024","name":"Akira","type":"group","techniques":["T1018","T1021.001","T1027.001","T1036.005","T1059.001","T1078","T1133","T1213.002","T1219","T1482","T1486","T1531","T1558","T1560.001","T1562.001","T1567.002","T1657"]},{"id":"G0138","name":"Andariel","type":"group","techniques":["T1005","T1027.003","T1049","T1057","T1105","T1189","T1203","T1204.002","T1566.001","T1588.001","T1590.005","T1592.002"]},{"id":"G1007","name":"Aoqin Dragon","type":"group","techniques":["T1027.002","T1036","T1083","T1091","T1203","T1204.002","T1570","T1587.001","T1588.002"]},{"id":"G1049","name":"AppleJeus","type":"group","techniques":["T1566","T1657"]},{"id":"G0143","name":"Aquatic Panda","type":"group","techniques":["T1003.001","T1005","T1007","T1021","T1021.001","T1021.002","T1021.004","T1027.010","T1033","T1036.004","T1036.005","T1047","T1059.001","T1059.003","T1059.004","T1070.001","T1070.003","T1070.004","T1078.002","T1082","T1087","T1105","T1112","T1218.011","T1518.001","T1543.003","T1550.002","T1560.001","T1562.001","T1574.001","T1574.006","T1588.001","T1588.002","T1595.002","T1654"]},{"id":"G0001","name":"Axiom","type":"group","techniques":["T1001.002","T1003","T1005","T1021.001","T1078","T1189","T1190","T1203","T1546.008","T1553","T1560","T1563.002","T1566","T1583.002","T1583.003","T1584.005"]},{"id":"G1002","name":"BITTER","type":"group","techniques":["T1027.013","T1036.004","T1053.005","T1068","T1071.001","T1095","T1105","T1203","T1204.002","T1559.002","T1566.001","T1568","T1573","T1583.001","T1588.002","T1608.001"]},{"id":"G0060","name":"BRONZE BUTLER","type":"group","techniques":["T1003.001","T1005","T1007","T1018","T1027.001","T1027.003","T1036","T1036.002","T1036.005","T1039","T1053.002","T1053.005","T1059.001","T1059.003","T1059.005","T1059.006","T1070.004","T1071.001","T1080","T1083","T1087.002","T1102.001","T1105","T1113","T1124","T1132.001","T1140","T1189","T1203","T1204.002","T1518","T1547.001","T1548.002","T1550.003","T1560.001","T1562.001","T1566.001","T1573.001","T1574.001","T1588.002"]},{"id":"G0135","name":"BackdoorDiplomacy","type":"group","techniques":["T1027","T1036.004","T1036.005","T1046","T1049","T1055.001","T1074.001","T1095","T1105","T1120","T1190","T1505.003","T1574.001","T1588.001","T1588.002"]},{"id":"G1043","name":"BlackByte","type":"group","techniques":["T1003","T1012","T1016","T1018","T1021.001","T1021.002","T1036.008","T1041","T1046","T1047","T1053.005","T1055","T1055.012","T1059.001","T1059.003","T1068","T1070.004","T1071.001","T1078","T1078.002","T1082","T1087.002","T1105","T1112","T1134.003","T1135","T1136.002","T1140","T1190","T1219","T1480","T1482","T1486","T1490","T1491.001","T1505.003","T1518.001","T1543.003","T1547.001","T1560","T1562","T1562.001","T1562.004","T1567","T1569.002","T1570","T1583.003","T1608.001","T1614.001"]},{"id":"G0098","name":"BlackTech","type":"group","techniques":["T1021.004","T1036.002","T1046","T1106","T1190","T1203","T1204.001","T1204.002","T1566.001","T1566.002","T1574.001","T1588.002","T1588.003","T1588.004"]},{"id":"G0108","name":"Blue Mockingbird","type":"group","techniques":["T1003.001","T1021.001","T1021.002","T1027.013","T1036.005","T1047","T1053.005","T1059.001","T1059.003","T1082","T1090","T1112","T1134","T1190","T1218.010","T1218.011","T1496.001","T1543.003","T1546.003","T1569.002","T1574.012","T1588.002"]},{"id":"G1012","name":"CURIUM","type":"group","techniques":["T1005","T1041","T1048.002","T1059.001","T1082","T1124","T1189","T1204.002","T1505.003","T1566.001","T1566.003","T1583.001","T1583.003","T1583.004","T1584.006","T1585.001","T1585.002","T1598.003","T1608.004"]},{"id":"G0008","name":"Carbanak","type":"group","techniques":["T1036.004","T1036.005","T1078","T1102.002","T1218.011","T1219","T1543.003","T1562.004","T1588.002"]},{"id":"G0114","name":"Chimera","type":"group","techniques":["T1003.003","T1007","T1012","T1016","T1018","T1021.001","T1021.002","T1021.006","T1027.010","T1033","T1036.005","T1039","T1041","T1046","T1047","T1049","T1053.005","T1057","T1059.001","T1059.003","T1069.001","T1070.001","T1070.004","T1070.006","T1071.001","T1071.004","T1074.001","T1074.002","T1078","T1078.002","T1083","T1087.001","T1087.002","T1105","T1106","T1110.003","T1110.004","T1111","T1114.001","T1114.002","T1119","T1124","T1133","T1135","T1201","T1213.002","T1217","T1482","T1550.002","T1556.001","T1560.001","T1567.002","T1569.002","T1570","T1572","T1574.001","T1588.002","T1589.001","T1680"]},{"id":"G1021","name":"Cinnamon Tempest","type":"group","techniques":["T1021.002","T1047","T1059.001","T1059.003","T1059.006","T1078","T1078.002","T1080","T1090","T1105","T1140","T1190","T1484.001","T1543.003","T1567.002","T1572","T1574.001","T1588.002","T1657"]},{"id":"G0003","name":"Cleaver","type":"group","techniques":["T1003.001","T1557.002","T1585.001","T1587.001","T1588.002"]},{"id":"G0080","name":"Cobalt Group","type":"group","techniques":["T1021.001","T1027.010","T1037.001","T1046","T1053.005","T1055","T1059.001","T1059.003","T1059.005","T1059.007","T1068","T1070.004","T1071.001","T1071.004","T1105","T1195.002","T1203","T1204.001","T1204.002","T1218.003","T1218.008","T1218.010","T1219","T1220","T1518.001","T1543.003","T1547.001","T1548.002","T1559.002","T1566.001","T1566.002","T1572","T1573.002","T1588.002"]},{"id":"G0142","name":"Confucius","type":"group","techniques":["T1041","T1053.005","T1059.001","T1059.005","T1071.001","T1083","T1105","T1119","T1203","T1204.001","T1204.002","T1218.005","T1221","T1547.001","T1566.001","T1566.002","T1567.002","T1583.006","T1680"]},{"id":"G1052","name":"Contagious Interview","type":"group","techniques":["T1027.010","T1027.013","T1036","T1041","T1048.003","T1059.003","T1059.004","T1059.005","T1059.006","T1059.007","T1070.004","T1071.003","T1082","T1083","T1090","T1204.001","T1204.002","T1204.004","T1204.005","T1219.002","T1480","T1497","T1543.001","T1546.004","T1547.001","T1547.013","T1555.001","T1562.001","T1566.003","T1567","T1567.002","T1571","T1573.001","T1583","T1583.001","T1583.003","T1583.006","T1585","T1585.001","T1585.002","T1587","T1587.001","T1588.002","T1588.007","T1589","T1593","T1593.001","T1593.003","T1608.001","T1656","T1657","T1681"]},{"id":"G0052","name":"CopyKittens","type":"group","techniques":["T1059.001","T1090","T1218.011","T1553.002","T1560.001","T1560.003","T1564.003","T1588.002"]},{"id":"G1034","name":"Daggerfly","type":"group","techniques":["T1003.002","T1012","T1036.003","T1053.005","T1059.001","T1071.001","T1082","T1105","T1136.001","T1189","T1195.002","T1204.001","T1218.011","T1553.002","T1574.001","T1584.004","T1587.002"]},{"id":"G0070","name":"Dark Caracal","type":"group","techniques":["T1005","T1027.002","T1027.013","T1059.003","T1071.001","T1083","T1113","T1189","T1204.002","T1218.001","T1547.001","T1566.003"]},{"id":"G0079","name":"DarkHydrus","type":"group","techniques":["T1059.001","T1187","T1204.002","T1221","T1564.003","T1566.001","T1588.002"]},{"id":"G0105","name":"DarkVishnya","type":"group","techniques":["T1040","T1046","T1059.001","T1110","T1135","T1200","T1219","T1543.003","T1571","T1588.002"]},{"id":"G0012","name":"Darkhotel","type":"group","techniques":["T1016","T1027.013","T1036.005","T1056.001","T1057","T1059.003","T1080","T1082","T1083","T1091","T1105","T1124","T1140","T1189","T1203","T1204.002","T1497","T1497.001","T1497.002","T1518.001","T1547.001","T1553.002","T1566.001","T1573.001"]},{"id":"G0009","name":"Deep Panda","type":"group","techniques":["T1018","T1021.002","T1027.005","T1047","T1057","T1059.001","T1218.010","T1505.003","T1546.008","T1564.003"]},{"id":"G0035","name":"Dragonfly","type":"group","techniques":["T1003.002","T1003.003","T1003.004","T1005","T1012","T1016","T1018","T1021.001","T1033","T1036.010","T1053.005","T1059","T1059.001","T1059.003","T1059.006","T1069.002","T1070.001","T1070.004","T1071.002","T1074.001","T1078","T1083","T1087.002","T1098.007","T1105","T1110","T1110.002","T1112","T1113","T1114.002","T1133","T1135","T1136.001","T1187","T1189","T1190","T1195.002","T1203","T1204.002","T1210","T1221","T1505.003","T1547.001","T1560","T1562.004","T1564.002","T1566.001","T1583.001","T1583.003","T1584.004","T1588.002","T1591.002","T1595.002","T1598.002","T1598.003","T1608.004"]},{"id":"G1011","name":"EXOTIC LILY","type":"group","techniques":["T1102","T1203","T1204.001","T1204.002","T1566.001","T1566.002","T1566.003","T1583.001","T1585.001","T1585.002","T1589.002","T1593.001","T1594","T1597","T1608.001"]},{"id":"G1006","name":"Earth Lusca","type":"group","techniques":["T1003.001","T1003.006","T1007","T1016","T1018","T1027","T1027.003","T1033","T1036.005","T1047","T1049","T1053.005","T1057","T1059.001","T1059.005","T1059.006","T1059.007","T1090","T1098.004","T1112","T1140","T1189","T1190","T1204.001","T1204.002","T1210","T1218.005","T1482","T1543.003","T1547.012","T1548.002","T1560.001","T1566.002","T1567.002","T1574.001","T1583.001","T1583.004","T1583.006","T1584.004","T1584.006","T1588.001","T1588.002","T1595.002","T1608.001"]},{"id":"G0066","name":"Elderwood","type":"group","techniques":["T1027.002","T1027.013","T1105","T1189","T1203","T1204.001","T1204.002","T1566.001","T1566.002"]},{"id":"G1003","name":"Ember Bear","type":"group","techniques":["T1003","T1003.001","T1003.002","T1003.004","T1005","T1018","T1021","T1036","T1036.005","T1046","T1047","T1053.005","T1059.001","T1070.004","T1071.004","T1078.001","T1090.003","T1095","T1110","T1110.003","T1112","T1114","T1119","T1125","T1133","T1190","T1195","T1203","T1210","T1491.002","T1505.003","T1550.002","T1552.001","T1560","T1561.002","T1562.001","T1567.002","T1570","T1571","T1572","T1583","T1583.003","T1585","T1588.001","T1588.005","T1595.001","T1595.002","T1654"]},{"id":"G0020","name":"Equation","type":"group","techniques":["T1120","T1480.001","T1542.002","T1564.005"]},{"id":"G0120","name":"Evilnum","type":"group","techniques":["T1059.007","T1070.004","T1105","T1204.001","T1219.002","T1497.001","T1539","T1548.002","T1555","T1566.002","T1574.001"]},{"id":"G0051","name":"FIN10","type":"group","techniques":["T1021.001","T1033","T1053.005","T1059.001","T1059.003","T1070.004","T1078","T1078.003","T1547.001","T1570","T1588.002"]},{"id":"G1016","name":"FIN13","type":"group","techniques":["T1003.001","T1003.002","T1003.003","T1005","T1016","T1016.001","T1021.001","T1021.002","T1021.004","T1021.006","T1036","T1036.004","T1036.005","T1046","T1047","T1049","T1053.005","T1056.001","T1059.001","T1059.003","T1059.005","T1069","T1071.001","T1074.001","T1078.001","T1082","T1083","T1087","T1087.002","T1090.001","T1098.007","T1105","T1133","T1134.003","T1135","T1136.001","T1140","T1190","T1505.003","T1547.001","T1550.002","T1552.001","T1556","T1560.001","T1564.001","T1565","T1572","T1574.001","T1587.001","T1588.002","T1589","T1590.004","T1657"]},{"id":"G0085","name":"FIN4","type":"group","techniques":["T1056.001","T1056.002","T1059.005","T1071.001","T1078","T1090.003","T1114.002","T1204.001","T1204.002","T1564.008","T1566.001","T1566.002"]},{"id":"G0053","name":"FIN5","type":"group","techniques":["T1018","T1059","T1070.001","T1070.004","T1074.001","T1078","T1090.002","T1110","T1119","T1133","T1588.002"]},{"id":"G0037","name":"FIN6","type":"group","techniques":["T1003.001","T1003.003","T1005","T1018","T1021.001","T1027.010","T1036.004","T1046","T1047","T1048.003","T1053.005","T1059","T1059.001","T1059.003","T1059.007","T1068","T1070.004","T1074.002","T1078","T1087.002","T1095","T1102","T1110.002","T1119","T1134","T1204.002","T1213.006","T1547.001","T1553.002","T1555","T1555.003","T1560","T1560.003","T1562.001","T1566.001","T1566.003","T1569.002","T1572","T1573.002","T1588.002"]},{"id":"G0046","name":"FIN7","type":"group","techniques":["T1005","T1008","T1021.001","T1021.004","T1021.005","T1027.010","T1027.016","T1033","T1036.004","T1036.005","T1047","T1053.005","T1057","T1059","T1059.001","T1059.003","T1059.005","T1059.007","T1069.002","T1071.004","T1078","T1078.003","T1082","T1087.002","T1091","T1102.002","T1105","T1113","T1124","T1125","T1140","T1190","T1195.002","T1204.001","T1204.002","T1210","T1218.005","T1218.011","T1219","T1486","T1497.002","T1543.003","T1546.011","T1547.001","T1553.002","T1558.003","T1559.002","T1562.004","T1564.001","T1564.003","T1566.001","T1566.002","T1567.002","T1569.002","T1571","T1572","T1583.001","T1583.006","T1587.001","T1588.002","T1591","T1591.004","T1608.001","T1608.004","T1608.005","T1620","T1674"]},{"id":"G0061","name":"FIN8","type":"group","techniques":["T1003.001","T1016.001","T1018","T1021.001","T1021.002","T1027.010","T1033","T1047","T1048.003","T1053.005","T1055.004","T1059.001","T1059.003","T1068","T1070.001","T1070.004","T1071.001","T1074.002","T1078","T1082","T1102","T1105","T1112","T1134.001","T1204.001","T1204.002","T1482","T1486","T1518.001","T1546.003","T1560.001","T1566.001","T1566.002","T1573.002","T1588.002","T1588.003"]},{"id":"G0137","name":"Ferocious Kitten","type":"group","techniques":["T1036.002","T1036.005","T1204.002","T1566.001","T1583.001","T1588.002"]},{"id":"G0117","name":"Fox Kitten","type":"group","techniques":["T1003.001","T1003.003","T1005","T1012","T1018","T1021.001","T1021.002","T1021.004","T1021.005","T1027.010","T1027.013","T1036.004","T1036.005","T1039","T1046","T1053.005","T1059","T1059.001","T1059.003","T1078","T1083","T1087.001","T1087.002","T1090","T1102","T1105","T1110","T1136.001","T1190","T1210","T1213.005","T1217","T1505.003","T1530","T1546.008","T1552.001","T1555.005","T1560.001","T1572","T1585","T1585.001"]},{"id":"G0093","name":"GALLIUM","type":"group","techniques":["T1003.001","T1003.002","T1005","T1016","T1018","T1027","T1027.002","T1027.005","T1033","T1036.003","T1041","T1047","T1049","T1053.005","T1059.001","T1059.003","T1074.001","T1078","T1090.002","T1105","T1133","T1136.002","T1190","T1505.003","T1550.002","T1553.002","T1560.001","T1570","T1574.001","T1583.004","T1588.002"]},{"id":"G0036","name":"GCMAN","type":"group","techniques":["T1021.004","T1021.005"]},{"id":"G0115","name":"GOLD SOUTHFIELD","type":"group","techniques":["T1027.010","T1059.001","T1113","T1133","T1190","T1195.002","T1199","T1219","T1566"]},{"id":"G0084","name":"Gallmaker","type":"group","techniques":["T1027","T1059.001","T1204.002","T1559.002","T1560.001","T1566.001"]},{"id":"G0047","name":"Gamaredon Group","type":"group","techniques":["T1001","T1005","T1012","T1016.001","T1020","T1021.005","T1025","T1027","T1027.004","T1027.010","T1027.012","T1027.015","T1027.016","T1033","T1036.005","T1039","T1041","T1047","T1053.005","T1055","T1057","T1059.001","T1059.003","T1059.005","T1070.004","T1071.001","T1080","T1082","T1083","T1090","T1090.003","T1091","T1095","T1102","T1102.002","T1102.003","T1105","T1106","T1112","T1113","T1119","T1120","T1137","T1140","T1204.001","T1204.002","T1218.005","T1218.011","T1221","T1480","T1491.001","T1497.001","T1518.001","T1534","T1547.001","T1559.001","T1561.001","T1562.001","T1564.003","T1566.001","T1568","T1568.001","T1571","T1583.001","T1583.003","T1583.006","T1587.003","T1588.002","T1608.001","T1620"]},{"id":"G0078","name":"Gorgon Group","type":"group","techniques":["T1055.002","T1055.012","T1059.001","T1059.003","T1059.005","T1105","T1106","T1112","T1140","T1204.002","T1547.001","T1547.009","T1562.001","T1564.003","T1566.001","T1588.002"]},{"id":"G0043","name":"Group5","type":"group","techniques":["T1027.013","T1056.001","T1070.004","T1113"]},{"id":"G0125","name":"HAFNIUM","type":"group","techniques":["T1003.001","T1003.003","T1005","T1016","T1016.001","T1018","T1033","T1057","T1059.001","T1059.003","T1068","T1070.001","T1071.001","T1078.003","T1078.004","T1083","T1095","T1098","T1105","T1110.003","T1114.002","T1119","T1132.001","T1136.002","T1190","T1199","T1213.002","T1218.011","T1505.003","T1530","T1550.001","T1555.006","T1560.001","T1564.001","T1567.002","T1583.003","T1583.005","T1583.006","T1584.005","T1589.002","T1590","T1590.005","T1592.004","T1593.003"]},{"id":"G1001","name":"HEXANE","type":"group","techniques":["T1010","T1016","T1016.001","T1018","T1021.001","T1027.010","T1033","T1049","T1053.005","T1056.001","T1057","T1059.001","T1059.005","T1069.001","T1082","T1102.002","T1105","T1110","T1110.003","T1204.002","T1518","T1534","T1546.003","T1555","T1555.003","T1567.002","T1583.001","T1583.002","T1585.001","T1585.002","T1586.002","T1588.002","T1589","T1589.002","T1591.004","T1608.001"]},{"id":"G0126","name":"Higaisa","type":"group","techniques":["T1001.003","T1016","T1027.001","T1027.013","T1027.015","T1029","T1036.004","T1041","T1053.005","T1057","T1059.003","T1059.005","T1059.007","T1071.001","T1082","T1090.001","T1106","T1124","T1140","T1203","T1204.002","T1220","T1547.001","T1564.003","T1566.001","T1573.001","T1574.001","T1680"]},{"id":"G1032","name":"INC Ransom","type":"group","techniques":["T1021.001","T1036.005","T1046","T1047","T1049","T1059.003","T1069.002","T1070.004","T1071","T1074","T1078","T1087.002","T1105","T1135","T1190","T1219","T1486","T1537","T1560.001","T1562.001","T1566","T1569.002","T1570","T1588.002","T1657"]},{"id":"G0100","name":"Inception","type":"group","techniques":["T1005","T1027.013","T1057","T1059.001","T1059.005","T1069.002","T1071.001","T1082","T1083","T1090.003","T1102","T1203","T1204.002","T1218.005","T1218.010","T1221","T1518","T1547.001","T1555.003","T1566.001","T1573.001","T1588.002"]},{"id":"G0136","name":"IndigoZebra","type":"group","techniques":["T1105","T1204.002","T1566.001","T1583.001","T1583.006","T1586.002","T1588.002"]},{"id":"G0119","name":"Indrik Spider","type":"group","techniques":["T1003.001","T1007","T1012","T1018","T1021.001","T1021.004","T1036.005","T1047","T1059.001","T1059.003","T1059.007","T1070.001","T1074.001","T1078","T1078.002","T1105","T1112","T1136","T1136.001","T1204.002","T1484.001","T1486","T1489","T1552.001","T1555.005","T1558.003","T1562.001","T1567.002","T1583","T1584.004","T1585.002","T1587.001","T1590"]},{"id":"G0004","name":"Ke3chang","type":"group","techniques":["T1003.001","T1003.002","T1003.003","T1003.004","T1005","T1007","T1016","T1018","T1020","T1021.002","T1027","T1033","T1036.002","T1036.005","T1041","T1049","T1056.001","T1057","T1059","T1059.003","T1069.002","T1071.001","T1071.004","T1078","T1078.004","T1082","T1083","T1087.001","T1087.002","T1105","T1114.002","T1119","T1133","T1140","T1190","T1213.002","T1543.003","T1547.001","T1558.001","T1560","T1560.001","T1569.002","T1583.005","T1587.001","T1588.002","T1614.001"]},{"id":"G0094","name":"Kimsuky","type":"group","techniques":["T1003.001","T1005","T1007","T1012","T1016","T1021.001","T1027","T1027.001","T1027.002","T1027.010","T1027.012","T1027.016","T1036.004","T1036.005","T1036.007","T1040","T1041","T1053.005","T1055","T1055.012","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1059.006","T1059.007","T1070.004","T1070.006","T1071.001","T1071.002","T1071.003","T1074.001","T1078.003","T1082","T1083","T1098.007","T1102.001","T1102.002","T1105","T1111","T1112","T1113","T1114.002","T1114.003","T1133","T1136.001","T1140","T1176.001","T1185","T1190","T1204.001","T1204.002","T1205","T1218.005","T1218.010","T1218.011","T1219.002","T1505.003","T1518.001","T1534","T1539","T1543.003","T1546.001","T1547.001","T1550.002","T1552.001","T1553.002","T1555.003","T1557","T1560.001","T1560.003","T1562.001","T1562.004","T1564.002","T1564.003","T1566","T1566.001","T1566.002","T1567.002","T1583","T1583.001","T1583.004","T1583.006","T1584.001","T1585","T1585.001","T1585.002","T1586.002","T1587","T1587.001","T1588.002","T1588.003","T1588.005","T1589.002","T1589.003","T1591","T1593","T1593.001","T1593.002","T1594","T1596","T1598","T1598.003","T1608.001","T1620","T1656","T1657","T1680"]},{"id":"G1004","name":"LAPSUS$","type":"group","techniques":["T1003.003","T1003.006","T1005","T1068","T1069.002","T1078","T1078.004","T1087.002","T1090","T1098.003","T1111","T1114.003","T1133","T1136.003","T1199","T1204","T1213.001","T1213.002","T1213.003","T1213.005","T1485","T1489","T1531","T1552.008","T1555.003","T1555.005","T1578.002","T1578.003","T1583.003","T1584.002","T1586.002","T1588.001","T1588.002","T1589","T1589.001","T1589.002","T1591.002","T1591.004","T1593.003","T1597.002","T1598.004","T1621","T1656"]},{"id":"G0032","name":"Lazarus Group","type":"group","techniques":["T1001.003","T1005","T1008","T1010","T1012","T1016","T1021.001","T1021.002","T1021.004","T1027.007","T1027.009","T1027.013","T1033","T1036.003","T1036.004","T1036.005","T1041","T1046","T1047","T1048.003","T1049","T1053.005","T1055.001","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1070","T1070.003","T1070.004","T1070.006","T1071.001","T1074.001","T1078","T1082","T1083","T1090.001","T1090.002","T1098","T1102.002","T1104","T1105","T1106","T1110.003","T1124","T1132.001","T1134.002","T1140","T1189","T1202","T1203","T1204.002","T1218","T1218.005","T1218.011","T1485","T1489","T1491.001","T1529","T1542.003","T1543.003","T1547.001","T1547.009","T1553.002","T1557.001","T1560","T1560.002","T1560.003","T1561.001","T1561.002","T1562.001","T1562.004","T1564.001","T1566.001","T1566.002","T1566.003","T1571","T1573.001","T1574.001","T1574.013","T1583.001","T1583.006","T1584.004","T1585.001","T1585.002","T1587.001","T1588.002","T1588.004","T1589.002","T1591","T1620","T1680"]},{"id":"G0140","name":"LazyScripter","type":"group","techniques":["T1027.010","T1036","T1059.001","T1059.003","T1059.005","T1059.007","T1071.004","T1102","T1105","T1204.001","T1204.002","T1218.005","T1218.011","T1547.001","T1566.001","T1566.002","T1583.001","T1583.006","T1588.001","T1608.001"]},{"id":"G0077","name":"Leafminer","type":"group","techniques":["T1003.001","T1003.004","T1003.005","T1018","T1027.010","T1046","T1055.013","T1059.007","T1083","T1110.003","T1114.002","T1136.001","T1189","T1552.001","T1555","T1555.003","T1588.002"]},{"id":"G0065","name":"Leviathan","type":"group","techniques":["T1003","T1003.001","T1021.001","T1021.004","T1027.001","T1027.003","T1027.013","T1027.015","T1041","T1047","T1055.001","T1059.001","T1059.005","T1074.001","T1074.002","T1078","T1090.003","T1102.003","T1105","T1133","T1140","T1189","T1190","T1197","T1203","T1204.001","T1204.002","T1218.010","T1505.003","T1534","T1546.003","T1547.001","T1547.009","T1553.002","T1559.002","T1560","T1566.001","T1566.002","T1567.002","T1572","T1583.001","T1584.004","T1584.008","T1585.001","T1585.002","T1586.001","T1586.002","T1587.004","T1589.001","T1595.002"]},{"id":"G0030","name":"Lotus Blossom","type":"group","techniques":["T1012","T1016","T1016.001","T1018","T1046","T1047","T1049","T1074.001","T1083","T1087.001","T1087.002","T1090.001","T1090.003","T1112","T1134","T1482","T1539","T1543.003","T1560.001","T1560.003","T1588.002"]},{"id":"G1014","name":"LuminousMoth","type":"group","techniques":["T1005","T1030","T1033","T1036.005","T1041","T1053.005","T1071.001","T1083","T1091","T1105","T1112","T1204.001","T1539","T1547.001","T1553.002","T1557.002","T1560","T1564.001","T1566.002","T1567.002","T1574.001","T1587.001","T1588.001","T1588.002","T1588.004","T1608.001","T1608.004","T1608.005"]},{"id":"G0095","name":"Machete","type":"group","techniques":["T1036.005","T1053.005","T1059.003","T1059.005","T1059.006","T1189","T1204.001","T1204.002","T1218.007","T1566.001","T1566.002"]},{"id":"G0059","name":"Magic Hound","type":"group","techniques":["T1003.001","T1005","T1016","T1016.001","T1016.002","T1018","T1021.001","T1027.010","T1027.013","T1033","T1036.004","T1036.005","T1036.010","T1046","T1047","T1049","T1053.005","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1070.003","T1070.004","T1071","T1071.001","T1078.001","T1078.002","T1082","T1083","T1087.003","T1090","T1098.002","T1098.007","T1102.002","T1105","T1112","T1113","T1114","T1114.001","T1114.002","T1136.001","T1189","T1190","T1204.001","T1204.002","T1218.011","T1482","T1486","T1505.003","T1547.001","T1560.001","T1562","T1562.001","T1562.002","T1562.004","T1564.003","T1566.002","T1566.003","T1567","T1570","T1571","T1572","T1573","T1583.001","T1583.006","T1584.001","T1585.001","T1585.002","T1586.002","T1588.002","T1589","T1589.001","T1589.002","T1590.005","T1591.001","T1592.002","T1595.002","T1598.003"]},{"id":"G1026","name":"Malteiro","type":"group","techniques":["T1027.013","T1055.001","T1059.005","T1082","T1140","T1204.002","T1518.001","T1555","T1555.003","T1566.001","T1614.001","T1657"]},{"id":"G1051","name":"Medusa Group","type":"group","techniques":["T1003.001","T1003.003","T1016","T1018","T1021.001","T1027.002","T1027.010","T1033","T1046","T1047","T1057","T1059.001","T1059.003","T1069.002","T1070.003","T1070.004","T1071.001","T1072","T1078","T1082","T1083","T1087.001","T1090.003","T1105","T1106","T1112","T1135","T1136.002","T1190","T1218.014","T1219","T1486","T1489","T1490","T1505.003","T1518.001","T1529","T1543.003","T1548.002","T1553.002","T1559.001","T1562.001","T1562.003","T1562.004","T1564.003","T1567.002","T1569.002","T1570","T1573.002","T1583.006","T1585.001","T1585.002","T1588.002","T1608.002","T1650","T1652","T1657"]},{"id":"G1013","name":"Metador","type":"group","techniques":["T1027.013","T1059.003","T1070.004","T1071.001","T1095","T1105","T1546.003","T1588.001","T1588.002"]},{"id":"G0103","name":"Mofang","type":"group","techniques":["T1027.013","T1027.015","T1204.001","T1204.002","T1566.001","T1566.002"]},{"id":"G0021","name":"Molerats","type":"group","techniques":["T1027.015","T1053.005","T1057","T1059.001","T1059.005","T1059.007","T1105","T1140","T1204.001","T1204.002","T1218.007","T1547.001","T1553.002","T1555.003","T1566.001","T1566.002"]},{"id":"G1036","name":"Moonstone Sleet","type":"group","techniques":["T1003.001","T1016","T1027","T1027.009","T1027.013","T1033","T1053.005","T1071.001","T1082","T1105","T1140","T1195.002","T1204.002","T1217","T1486","T1547.001","T1566.001","T1566.003","T1569.002","T1583.001","T1583.003","T1585.001","T1585.002","T1587","T1587.001","T1589.002","T1591","T1598","T1598.003","T1608.001"]},{"id":"G1009","name":"Moses Staff","type":"group","techniques":["T1016","T1021.002","T1027.013","T1082","T1087.001","T1105","T1190","T1505.003","T1553.002","T1562.004","T1587.001","T1588.002"]},{"id":"G1019","name":"MoustachedBouncer","type":"group","techniques":["T1027.002","T1059.001","T1059.007","T1068","T1074.002","T1090","T1113","T1659"]},{"id":"G0069","name":"MuddyWater","type":"group","techniques":["T1003.001","T1003.004","T1003.005","T1016","T1027.003","T1027.004","T1027.010","T1033","T1036.005","T1041","T1047","T1049","T1053.005","T1057","T1059.001","T1059.003","T1059.005","T1059.006","T1059.007","T1071.001","T1074.001","T1082","T1083","T1087.002","T1090.002","T1102.002","T1104","T1105","T1113","T1132.001","T1137.001","T1140","T1190","T1203","T1204.001","T1204.002","T1210","T1218.003","T1218.005","T1218.011","T1219","T1518","T1518.001","T1547.001","T1548.002","T1552.001","T1555","T1555.003","T1559.001","T1559.002","T1560.001","T1562.001","T1566.001","T1566.002","T1573.001","T1574.001","T1583.006","T1588.002"]},{"id":"G0129","name":"Mustang Panda","type":"group","techniques":["T1001.003","T1003","T1003.001","T1003.003","T1003.006","T1016","T1018","T1027","T1027.007","T1027.012","T1027.016","T1036.005","T1036.007","T1036.008","T1041","T1046","T1047","T1048.003","T1049","T1052.001","T1053.005","T1057","T1059","T1059.001","T1059.003","T1059.005","T1059.007","T1069.002","T1070","T1070.004","T1070.006","T1071.001","T1072","T1074.001","T1082","T1083","T1087.002","T1091","T1095","T1102","T1105","T1106","T1119","T1129","T1140","T1176.002","T1203","T1204.001","T1204.002","T1205","T1218.004","T1218.005","T1219.001","T1219.002","T1505.003","T1518","T1546.003","T1547.001","T1553.002","T1557","T1560.001","T1560.003","T1564.001","T1566.001","T1566.002","T1567.002","T1572","T1573.001","T1574.001","T1574.005","T1583.001","T1583.006","T1585.002","T1586.002","T1587.001","T1588.002","T1588.003","T1588.004","T1593","T1598.003","T1608","T1608.001","T1622","T1654","T1678"]},{"id":"G1020","name":"Mustard Tempest","type":"group","techniques":["T1036.005","T1082","T1105","T1189","T1204.001","T1566.002","T1583.004","T1583.008","T1584.001","T1608.001","T1608.004","T1608.006"]},{"id":"G0019","name":"Naikon","type":"group","techniques":["T1016","T1018","T1036.004","T1036.005","T1046","T1047","T1053.005","T1078.002","T1137.006","T1204.002","T1518.001","T1547.001","T1566.001","T1574.001"]},{"id":"G0133","name":"Nomadic Octopus","type":"group","techniques":["T1036","T1059.001","T1059.003","T1105","T1204.002","T1564.003","T1566.001"]},{"id":"G0049","name":"OilRig","type":"group","techniques":["T1003.001","T1003.004","T1003.005","T1005","T1007","T1008","T1012","T1016","T1021.001","T1021.004","T1025","T1027.005","T1027.013","T1033","T1036","T1036.005","T1046","T1047","T1048.003","T1049","T1053.005","T1056.001","T1057","T1059","T1059.001","T1059.003","T1059.005","T1068","T1069.001","T1069.002","T1070.004","T1071.001","T1071.004","T1078","T1078.002","T1082","T1087.001","T1087.002","T1105","T1110","T1112","T1113","T1115","T1119","T1120","T1133","T1137.004","T1140","T1195","T1201","T1203","T1204.001","T1204.002","T1218.001","T1219","T1497.001","T1505.003","T1543.003","T1552.001","T1553.002","T1555","T1555.003","T1555.004","T1556.002","T1562.004","T1566.001","T1566.002","T1566.003","T1572","T1573.002","T1583.001","T1586.002","T1587.001","T1588.002","T1588.003","T1608.001"]},{"id":"G0071","name":"Orangeworm","type":"group","techniques":["T1021.002","T1071.001"]},{"id":"G0068","name":"PLATINUM","type":"group","techniques":["T1003.001","T1036","T1055","T1056.001","T1056.004","T1068","T1095","T1105","T1189","T1204.002","T1566.001"]},{"id":"G1005","name":"POLONIUM","type":"group","techniques":["T1078","T1090","T1102.002","T1199","T1567.002","T1583.006","T1588.002"]},{"id":"G0056","name":"PROMETHIUM","type":"group","techniques":["T1036.004","T1036.005","T1078.003","T1189","T1204.002","T1205.001","T1543.003","T1547.001","T1553.002","T1587.002","T1587.003"]},{"id":"G0040","name":"Patchwork","type":"group","techniques":["T1005","T1021.001","T1027.001","T1027.002","T1027.005","T1027.010","T1033","T1036.005","T1053.005","T1055.012","T1059.001","T1059.003","T1059.005","T1070.004","T1074.001","T1082","T1083","T1102.001","T1105","T1112","T1119","T1132.001","T1189","T1197","T1203","T1204.001","T1204.002","T1518.001","T1547.001","T1548.002","T1553.002","T1555.003","T1559.002","T1560","T1566.001","T1566.002","T1574.001","T1587.002","T1588.002","T1598.003","T1680"]},{"id":"G0011","name":"PittyTiger","type":"group","techniques":["T1078","T1588.002"]},{"id":"G1040","name":"Play","type":"group","techniques":["T1003.001","T1016","T1018","T1021.002","T1027.010","T1030","T1048","T1057","T1059.001","T1059.003","T1070.001","T1070.004","T1078","T1078.002","T1078.003","T1082","T1083","T1105","T1133","T1190","T1518.001","T1560.001","T1562.001","T1587.001","T1588.002","T1657"]},{"id":"G0033","name":"Poseidon Group","type":"group","techniques":["T1003","T1007","T1036.005","T1049","T1057","T1059.001","T1087.001","T1087.002"]},{"id":"G0024","name":"Putter Panda","type":"group","techniques":["T1027.013","T1055.001","T1547.001","T1562.001"]},{"id":"G0048","name":"RTM","type":"group","techniques":["T1102.001","T1189","T1204.002","T1219.002","T1547.001","T1566.001","T1574.001"]},{"id":"G0075","name":"Rancor","type":"group","techniques":["T1053.005","T1059.003","T1059.005","T1071.001","T1105","T1204.002","T1218.007","T1546.003","T1566.001"]},{"id":"G1039","name":"RedCurl","type":"group","techniques":["T1003.001","T1005","T1020","T1027","T1036.005","T1039","T1046","T1053.005","T1056.002","T1059.001","T1059.003","T1059.005","T1059.006","T1070.004","T1071.001","T1080","T1082","T1083","T1087.001","T1087.002","T1087.003","T1102","T1114.001","T1119","T1199","T1202","T1204.001","T1204.002","T1218.011","T1537","T1547.001","T1552.001","T1552.002","T1555.003","T1560.001","T1564.001","T1566.001","T1566.002","T1573.001","T1573.002","T1587.001"]},{"id":"G1042","name":"RedEcho","type":"group","techniques":["T1071.001","T1568","T1571","T1573.002","T1583.001"]},{"id":"G0106","name":"Rocke","type":"group","techniques":["T1014","T1018","T1021.004","T1027","T1027.002","T1027.004","T1036.005","T1037","T1046","T1053.003","T1055.002","T1057","T1059.004","T1059.006","T1070.002","T1070.004","T1070.006","T1071","T1071.001","T1082","T1102","T1102.001","T1105","T1140","T1190","T1222.002","T1496.001","T1518.001","T1543.002","T1547.001","T1552.004","T1562.001","T1562.004","T1564.001","T1571","T1574.006"]},{"id":"G1031","name":"Saint Bear","type":"group","techniques":["T1027.002","T1027.013","T1059","T1059.001","T1059.003","T1059.007","T1112","T1203","T1204.001","T1204.002","T1497","T1553.002","T1562.001","T1566.001","T1583.006","T1589.002","T1608.001","T1656"]},{"id":"G1045","name":"Salt Typhoon","type":"group","techniques":["T1021.004","T1040","T1048.003","T1070.002","T1098.004","T1110.002","T1136","T1190","T1562.004","T1572","T1587.001","T1588.002","T1590.004","T1602.002"]},{"id":"G0034","name":"Sandworm Team","type":"group","techniques":["T1003.001","T1003.003","T1005","T1018","T1021.002","T1027","T1027.010","T1033","T1036","T1036.005","T1040","T1041","T1047","T1049","T1053.005","T1056.001","T1059.001","T1059.005","T1070.004","T1071.001","T1072","T1078","T1078.002","T1082","T1083","T1087.002","T1087.003","T1090","T1102.002","T1105","T1106","T1132.001","T1133","T1140","T1190","T1195","T1195.002","T1199","T1203","T1204.001","T1204.002","T1213.006","T1218.011","T1219","T1485","T1486","T1489","T1490","T1491.002","T1499","T1505.003","T1539","T1555.003","T1561.002","T1566.001","T1566.002","T1570","T1571","T1583","T1583.001","T1583.004","T1584.004","T1584.005","T1585.001","T1585.002","T1586.001","T1587.001","T1588.002","T1588.006","T1589.002","T1589.003","T1590.001","T1591.002","T1592.002","T1593","T1594","T1595.002","T1598.003","T1608.001"]},{"id":"G1015","name":"Scattered Spider","type":"group","techniques":["T1003.003","T1006","T1016","T1018","T1021.001","T1021.004","T1021.007","T1041","T1059.001","T1059.004","T1068","T1069","T1069.002","T1070.008","T1074","T1078","T1078.004","T1082","T1083","T1087","T1087.002","T1090","T1098","T1098.003","T1105","T1114","T1114.003","T1133","T1136","T1204","T1213.003","T1213.005","T1217","T1219.002","T1484.002","T1486","T1490","T1530","T1538","T1539","T1543.002","T1552.001","T1552.004","T1553.002","T1555.005","T1556.006","T1556.009","T1562.001","T1564.008","T1567.002","T1572","T1578.002","T1580","T1583.001","T1585.001","T1588.001","T1588.002","T1589","T1598","T1598.003","T1598.004","T1621","T1656","T1657"]},{"id":"G1041","name":"Sea Turtle","type":"group","techniques":["T1027.004","T1059.004","T1070.002","T1071.001","T1074.002","T1078","T1078.003","T1114.001","T1133","T1190","T1199","T1203","T1213.006","T1505.003","T1557","T1560.001","T1562.003","T1564.011","T1566","T1583","T1583.001","T1583.002","T1583.003","T1584.002","T1588.002","T1588.004","T1608.003"]},{"id":"G1008","name":"SideCopy","type":"group","techniques":["T1016","T1036.005","T1059.005","T1082","T1105","T1106","T1204.002","T1218.005","T1518","T1518.001","T1566.001","T1574.001","T1584.001","T1598.002","T1608.001","T1614"]},{"id":"G0121","name":"Sidewinder","type":"group","techniques":["T1016","T1020","T1027.010","T1027.013","T1033","T1036.005","T1057","T1059.001","T1059.005","T1059.007","T1071.001","T1074.001","T1082","T1083","T1105","T1119","T1124","T1203","T1204.001","T1204.002","T1218.005","T1518","T1518.001","T1547.001","T1559.002","T1566.001","T1566.002","T1574.001","T1598.002","T1598.003"]},{"id":"G0091","name":"Silence","type":"group","techniques":["T1003.001","T1018","T1021.001","T1027.010","T1036.005","T1053.005","T1055","T1059.001","T1059.003","T1059.005","T1059.007","T1070.004","T1072","T1078","T1090.002","T1105","T1106","T1112","T1113","T1125","T1204.002","T1218.001","T1547.001","T1553.002","T1566.001","T1569.002","T1571","T1588.002"]},{"id":"G0122","name":"Silent Librarian","type":"group","techniques":["T1078","T1110.003","T1114","T1114.003","T1583.001","T1585.002","T1588.002","T1588.004","T1589.002","T1589.003","T1594","T1598.003","T1608.005"]},{"id":"G0083","name":"SilverTerrier","type":"group","techniques":["T1071.001","T1071.002","T1071.003","T1657"]},{"id":"G0054","name":"Sowbug","type":"group","techniques":["T1003","T1036.005","T1039","T1056.001","T1059.003","T1082","T1083","T1135","T1560.001"]},{"id":"G1033","name":"Star Blizzard","type":"group","techniques":["T1059.007","T1078","T1114.002","T1114.003","T1204.002","T1539","T1550.004","T1566.001","T1583","T1583.001","T1585.001","T1585.002","T1586.002","T1588.002","T1589","T1593","T1598.002","T1598.003","T1608.001"]},{"id":"G0038","name":"Stealth Falcon","type":"group","techniques":["T1005","T1012","T1016","T1033","T1041","T1047","T1053.005","T1057","T1059","T1059.001","T1071.001","T1082","T1555","T1555.003","T1555.004","T1573.001"]},{"id":"G1053","name":"Storm-0501","type":"group","techniques":["T1003","T1003.006","T1021.006","T1021.007","T1027.002","T1036.004","T1053.005","T1057","T1059.001","T1059.009","T1078.004","T1082","T1087.002","T1087.004","T1098.001","T1098.003","T1110","T1190","T1218.010","T1218.011","T1219.002","T1482","T1484.001","T1484.002","T1485","T1486","T1490","T1518.001","T1526","T1530","T1537","T1552.004","T1555.005","T1555.006","T1556.009","T1567.002","T1578.003","T1580","T1587.003","T1588.006","T1614.001","T1657"]},{"id":"G1046","name":"Storm-1811","type":"group","techniques":["T1021.002","T1021.004","T1027.013","T1033","T1036","T1036.005","T1036.010","T1048.002","T1056","T1059.001","T1059.003","T1074.001","T1087.002","T1105","T1140","T1204.002","T1219.002","T1222.001","T1482","T1486","T1547.001","T1566.002","T1566.003","T1566.004","T1570","T1574.001","T1583.001","T1585.003","T1588.002","T1656","T1667"]},{"id":"G0041","name":"Strider","type":"group","techniques":["T1090.001","T1556.002","T1564.005"]},{"id":"G0039","name":"Suckfly","type":"group","techniques":["T1003","T1046","T1059.003","T1078","T1553.002"]},{"id":"G1018","name":"TA2541","type":"group","techniques":["T1016.001","T1027.002","T1027.013","T1027.015","T1036.005","T1047","T1053.005","T1055","T1055.012","T1059.001","T1059.005","T1082","T1105","T1204.001","T1204.002","T1218.005","T1518.001","T1547.001","T1562.001","T1566.001","T1566.002","T1568","T1573.002","T1583.001","T1583.006","T1588.001","T1588.002","T1608.001"]},{"id":"G0062","name":"TA459","type":"group","techniques":["T1059.001","T1059.005","T1203","T1204.002","T1566.001"]},{"id":"G0092","name":"TA505","type":"group","techniques":["T1027.002","T1027.010","T1027.013","T1055.001","T1059.001","T1059.003","T1059.005","T1059.007","T1069","T1071.001","T1078.002","T1087.003","T1105","T1106","T1112","T1140","T1204.001","T1204.002","T1218.007","T1218.011","T1486","T1552.001","T1553.002","T1553.005","T1555.003","T1559.002","T1562.001","T1566.001","T1566.002","T1568.001","T1583.001","T1588.001","T1588.002","T1608.001"]},{"id":"G0127","name":"TA551","type":"group","techniques":["T1027.003","T1027.010","T1036","T1059.003","T1071.001","T1105","T1132.001","T1204.002","T1218.005","T1218.010","T1218.011","T1566.001","T1568.002","T1589.002"]},{"id":"G1037","name":"TA577","type":"group","techniques":["T1027.009","T1059.003","T1059.007","T1204.001","T1566.002","T1586.002"]},{"id":"G1038","name":"TA578","type":"group","techniques":["T1059.007","T1204.001","T1583.006","T1594"]},{"id":"G0139","name":"TeamTNT","type":"group","techniques":["T1007","T1014","T1016","T1021.004","T1027.002","T1027.013","T1036","T1036.005","T1046","T1048","T1049","T1057","T1059.001","T1059.003","T1059.004","T1059.009","T1059.013","T1070.002","T1070.003","T1070.004","T1071","T1071.001","T1074.001","T1082","T1083","T1098.004","T1102","T1105","T1120","T1133","T1136.001","T1140","T1204.003","T1219","T1222.002","T1496.001","T1518.001","T1543.002","T1543.003","T1547.001","T1552.001","T1552.004","T1552.005","T1562.001","T1562.004","T1569.003","T1583.001","T1587.001","T1595.001","T1595.002","T1608.001","T1609","T1610","T1611","T1613","T1680"]},{"id":"G0089","name":"The White Company","type":"group","techniques":["T1027.002","T1070.004","T1124","T1203","T1204.002","T1518.001","T1566.001"]},{"id":"G0028","name":"Threat Group-1314","type":"group","techniques":["T1021.002","T1059.003","T1072","T1078.002"]},{"id":"G0027","name":"Threat Group-3390","type":"group","techniques":["T1003.001","T1003.002","T1003.004","T1005","T1012","T1016","T1018","T1021.006","T1027.002","T1027.013","T1027.015","T1030","T1033","T1046","T1047","T1049","T1053.002","T1055.012","T1056.001","T1059.001","T1059.003","T1068","T1070.004","T1070.005","T1071.001","T1074.001","T1074.002","T1078","T1087.001","T1105","T1112","T1119","T1133","T1140","T1189","T1190","T1195.002","T1199","T1203","T1204.002","T1210","T1505.003","T1543.003","T1547.001","T1548.002","T1555.005","T1560.002","T1562.002","T1566.001","T1567.002","T1574.001","T1583.001","T1588.002","T1588.003","T1608.001","T1608.002","T1608.004"]},{"id":"G0076","name":"Thrip","type":"group","techniques":["T1048.003","T1059.001","T1219.002","T1588.002"]},{"id":"G1022","name":"ToddyCat","type":"group","techniques":["T1005","T1018","T1021.002","T1036.005","T1047","T1049","T1053.005","T1057","T1059.001","T1059.003","T1069.002","T1074.002","T1078.002","T1083","T1087.002","T1095","T1106","T1190","T1518.001","T1560.001","T1562.004","T1564.003","T1566.003","T1567.002","T1680"]},{"id":"G0131","name":"Tonto Team","type":"group","techniques":["T1003","T1056.001","T1059.001","T1059.006","T1068","T1069.001","T1090.002","T1105","T1135","T1203","T1204.002","T1210","T1505.003","T1566.001","T1574.001"]},{"id":"G0134","name":"Transparent Tribe","type":"group","techniques":["T1027.013","T1036.005","T1059.005","T1189","T1203","T1204.001","T1204.002","T1564.001","T1566.001","T1566.002","T1568","T1583.001","T1584.001","T1608.004"]},{"id":"G0081","name":"Tropic Trooper","type":"group","techniques":["T1016","T1020","T1027.003","T1027.013","T1033","T1036.005","T1046","T1049","T1052.001","T1055.001","T1057","T1059.003","T1070.004","T1071.001","T1071.004","T1078.003","T1082","T1083","T1091","T1105","T1106","T1119","T1132.001","T1135","T1140","T1203","T1204.002","T1221","T1505.003","T1518","T1518.001","T1543.003","T1547.001","T1547.004","T1564.001","T1566.001","T1573","T1573.002","T1574.001","T1680"]},{"id":"G0010","name":"Turla","type":"group","techniques":["T1005","T1007","T1012","T1016","T1016.001","T1018","T1021.002","T1025","T1027.005","T1027.010","T1027.011","T1036.005","T1049","T1055","T1055.001","T1057","T1059.001","T1059.003","T1059.005","T1059.006","T1059.007","T1068","T1069.001","T1069.002","T1071.001","T1071.003","T1078.003","T1082","T1083","T1087.001","T1087.002","T1090","T1090.001","T1102","T1102.002","T1105","T1106","T1110","T1112","T1120","T1124","T1134.002","T1140","T1189","T1201","T1204.001","T1213.006","T1518.001","T1546.003","T1546.013","T1547.001","T1547.004","T1553.006","T1555.004","T1560.001","T1562.001","T1564.012","T1566.002","T1567.002","T1570","T1583.006","T1584.003","T1584.004","T1584.006","T1587.001","T1588.001","T1588.002","T1615"]},{"id":"G1048","name":"UNC3886","type":"group","techniques":["T1003.001","T1008","T1014","T1021.004","T1027.005","T1036.004","T1037","T1037.004","T1040","T1057","T1059.001","T1059.003","T1059.004","T1059.006","T1059.012","T1068","T1070.004","T1070.006","T1070.007","T1074.001","T1078","T1078.001","T1083","T1095","T1124","T1190","T1203","T1205","T1205.001","T1212","T1218.011","T1505.006","T1548","T1554","T1555.005","T1560.001","T1560.003","T1562.001","T1562.003","T1562.004","T1564.011","T1570","T1587.001","T1587.004","T1588.001","T1588.004","T1673","T1675","T1681"]},{"id":"G1047","name":"Velvet Ant","type":"group","techniques":["T1021.002","T1036.005","T1037.004","T1040","T1047","T1049","T1055","T1059.004","T1071","T1078.003","T1083","T1090.001","T1132","T1133","T1211","T1562.001","T1562.004","T1569.002","T1570","T1571","T1573.002","T1574.001"]},{"id":"G0123","name":"Volatile Cedar","type":"group","techniques":["T1105","T1190","T1505.003","T1595.002","T1595.003"]},{"id":"G1017","name":"Volt Typhoon","type":"group","techniques":["T1003.001","T1003.003","T1005","T1006","T1007","T1010","T1012","T1016","T1016.001","T1018","T1021.001","T1027.002","T1033","T1036.005","T1036.008","T1046","T1047","T1049","T1056.001","T1057","T1059.001","T1059.003","T1059.004","T1068","T1069","T1069.001","T1069.002","T1070.001","T1070.004","T1070.007","T1074","T1074.001","T1078","T1078.002","T1083","T1087.001","T1087.002","T1090","T1090.001","T1090.003","T1105","T1112","T1113","T1120","T1124","T1133","T1140","T1190","T1217","T1218","T1497.001","T1505.003","T1518","T1552","T1552.004","T1555","T1555.003","T1560.001","T1570","T1573.001","T1584.003","T1584.004","T1584.005","T1584.008","T1587.004","T1588.002","T1588.006","T1589","T1589.002","T1590","T1590.004","T1590.006","T1591","T1591.004","T1592","T1593","T1594","T1596.005","T1614","T1654","T1680"]},{"id":"G0090","name":"WIRTE","type":"group","techniques":["T1036.005","T1059.001","T1059.005","T1071.001","T1105","T1140","T1204.002","T1218.010","T1566.001","T1571","T1588.002"]},{"id":"G1050","name":"Water Galura","type":"group","techniques":["T1486","T1585.001","T1657"]},{"id":"G0107","name":"Whitefly","type":"group","techniques":["T1003.001","T1027.013","T1036.005","T1059","T1068","T1105","T1204.002","T1574.001","T1588.002"]},{"id":"G0124","name":"Windigo","type":"group","techniques":["T1005","T1059","T1082","T1083","T1090","T1189","T1518"]},{"id":"G0112","name":"Windshift","type":"group","techniques":["T1027","T1033","T1036","T1036.001","T1047","T1057","T1059.005","T1071.001","T1082","T1105","T1189","T1204.001","T1204.002","T1518","T1518.001","T1547.001","T1566.001","T1566.002","T1566.003"]},{"id":"G0044","name":"Winnti Group","type":"group","techniques":["T1014","T1057","T1083","T1105","T1553.002","T1583.001"]},{"id":"G1035","name":"Winter Vivern","type":"group","techniques":["T1020","T1033","T1036","T1036.004","T1041","T1053.005","T1056.003","T1059","T1059.001","T1059.003","T1059.007","T1071.001","T1082","T1083","T1105","T1113","T1114.001","T1119","T1140","T1189","T1190","T1204.001","T1566.001","T1583.001","T1583.003","T1584.006","T1595.002"]},{"id":"G0102","name":"Wizard Spider","type":"group","techniques":["T1003.001","T1003.002","T1003.003","T1005","T1016","T1018","T1021","T1021.001","T1021.002","T1021.006","T1027.010","T1033","T1036.004","T1041","T1047","T1048.003","T1053.005","T1055","T1055.001","T1059.001","T1059.003","T1070.004","T1071.001","T1074","T1074.001","T1078","T1078.002","T1082","T1087.002","T1105","T1112","T1133","T1135","T1136.001","T1136.002","T1197","T1204.001","T1204.002","T1210","T1218.011","T1222.001","T1489","T1490","T1518.001","T1518.002","T1543.003","T1547.001","T1547.004","T1550.002","T1552.006","T1553.002","T1555.004","T1557.001","T1558.003","T1560.001","T1562.001","T1566.001","T1566.002","T1567.002","T1569.002","T1570","T1585.002","T1588.002","T1588.003"]},{"id":"G0128","name":"ZIRCONIUM","type":"group","techniques":["T1012","T1016","T1027.002","T1033","T1036","T1036.004","T1041","T1059.003","T1059.006","T1068","T1082","T1090.003","T1102.002","T1105","T1124","T1140","T1204.001","T1218.007","T1547.001","T1555.003","T1566.002","T1567.002","T1573.001","T1583.001","T1583.006","T1584.008","T1598","T1598.003","T1665"]},{"id":"G0018","name":"admin@338","type":"group","techniques":["T1007","T1016","T1036.005","T1049","T1059.003","T1069.001","T1082","T1083","T1087.001","T1203","T1204.002","T1566.001"]},{"id":"G0045","name":"menuPass","type":"group","techniques":["T1003.002","T1003.003","T1003.004","T1005","T1016","T1018","T1021.001","T1021.004","T1027.013","T1036","T1036.003","T1036.005","T1039","T1046","T1047","T1049","T1053.005","T1055.012","T1056.001","T1059.001","T1059.003","T1070.003","T1070.004","T1074.001","T1074.002","T1078","T1083","T1087.002","T1090.002","T1105","T1106","T1119","T1140","T1190","T1199","T1204.002","T1210","T1218.004","T1553.002","T1560","T1560.001","T1566.001","T1568.001","T1574.001","T1583.001","T1588.002"]},{"id":"S0066","name":"3PARA RAT","type":"software","techniques":["T1070.006","T1071.001","T1083","T1573.001"]},{"id":"S0065","name":"4H RAT","type":"software","techniques":["T1057","T1059.003","T1071.001","T1082","T1083","T1573.001"]},{"id":"S0677","name":"AADInternals","type":"software","techniques":["T1003.004","T1048","T1059.001","T1069.003","T1087.004","T1098.005","T1112","T1136.003","T1484.002","T1526","T1528","T1530","T1552.001","T1552.004","T1556.006","T1556.007","T1558.002","T1566.002","T1589.002","T1590.001","T1598.003","T1606.002","T1649","T1651"]},{"id":"S0469","name":"ABK","type":"software","techniques":["T1027.003","T1055","T1059.003","T1071.001","T1105","T1140","T1518.001"]},{"id":"S0045","name":"ADVSTORESHELL","type":"software","techniques":["T1012","T1027","T1029","T1041","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1074.001","T1082","T1083","T1106","T1112","T1120","T1132.001","T1218.011","T1546.015","T1547.001","T1560","T1560.003","T1573.001","T1573.002"]},{"id":"S1074","name":"ANDROMEDA","type":"software","techniques":["T1036.005","T1036.008","T1055","T1071.001","T1091","T1105","T1547.001"]},{"id":"S1167","name":"AcidPour","type":"software","techniques":["T1070.004","T1082","T1083","T1120","T1485","T1529","T1561.001"]},{"id":"S1125","name":"AcidRain","type":"software","techniques":["T1083","T1485","T1529","T1561.001"]},{"id":"S1028","name":"Action RAT","type":"software","techniques":["T1005","T1016","T1027","T1033","T1047","T1059.003","T1071.001","T1082","T1083","T1105","T1140","T1518.001"]},{"id":"S0552","name":"AdFind","type":"software","techniques":["T1016","T1018","T1069.002","T1087.002","T1482"]},{"id":"S0331","name":"Agent Tesla","type":"software","techniques":["T1016","T1016.002","T1027","T1033","T1047","T1048.003","T1053.005","T1055","T1055.012","T1056.001","T1057","T1071.001","T1071.003","T1082","T1087.001","T1105","T1112","T1113","T1115","T1124","T1125","T1140","T1185","T1203","T1204.002","T1218.009","T1497","T1547.001","T1552.001","T1552.002","T1555","T1555.003","T1560","T1562.001","T1564.001","T1564.003","T1566.001"]},{"id":"S0092","name":"Agent.btz","type":"software","techniques":["T1016","T1033","T1052.001","T1091","T1105","T1560.003"]},{"id":"S1129","name":"Akira","type":"software","techniques":["T1047","T1057","T1059.001","T1059.003","T1082","T1083","T1106","T1135","T1486","T1490"]},{"id":"S1194","name":"Akira _v2","type":"software","techniques":["T1083","T1480","T1486","T1489","T1543","T1654"]},{"id":"S1025","name":"Amadey","type":"software","techniques":["T1005","T1016","T1027","T1033","T1041","T1071.001","T1082","T1083","T1105","T1106","T1112","T1140","T1518.001","T1547.001","T1553.005","T1568.001","T1614"]},{"id":"S0504","name":"Anchor","type":"software","techniques":["T1008","T1016","T1021.002","T1027","T1027.002","T1053.003","T1053.005","T1059.003","T1059.004","T1070.004","T1071.001","T1071.004","T1082","T1095","T1105","T1480","T1543.003","T1553.002","T1564.004","T1569.002"]},{"id":"S1133","name":"Apostle","type":"software","techniques":["T1053.005","T1057","T1070.001","T1070.004","T1140","T1480","T1485","T1486","T1529","T1561.001"]},{"id":"S0584","name":"AppleJeus","type":"software","techniques":["T1027","T1041","T1053.005","T1059.004","T1070.004","T1071.001","T1082","T1140","T1204.001","T1204.002","T1218.007","T1497.003","T1543.003","T1543.004","T1546.016","T1548.002","T1553.002","T1564.001","T1566.002","T1569.001"]},{"id":"S0622","name":"AppleSeed","type":"software","techniques":["T1005","T1008","T1016","T1025","T1027","T1027.002","T1030","T1036","T1036.005","T1041","T1056.001","T1057","T1059.001","T1059.007","T1070.004","T1071.001","T1074.001","T1082","T1083","T1106","T1113","T1119","T1124","T1134","T1140","T1204.002","T1218.010","T1547.001","T1560","T1560.001","T1566.001","T1567"]},{"id":"S0456","name":"Aria-body","type":"software","techniques":["T1010","T1016","T1025","T1027.013","T1033","T1049","T1055.001","T1057","T1070.004","T1071.001","T1082","T1083","T1090","T1095","T1105","T1106","T1113","T1134.001","T1134.002","T1140","T1547.001","T1560","T1568.002","T1680"]},{"id":"S0099","name":"Arp","type":"software","techniques":["T1016","T1018"]},{"id":"S0373","name":"Astaroth","type":"software","techniques":["T1016","T1027.002","T1027.010","T1027.013","T1041","T1047","T1055.012","T1056.001","T1057","T1059.003","T1059.005","T1059.007","T1074.001","T1082","T1102.001","T1105","T1115","T1124","T1129","T1132.001","T1140","T1204.002","T1218.001","T1218.010","T1220","T1497.001","T1518.001","T1547.001","T1547.009","T1552","T1555","T1564.003","T1564.004","T1566.001","T1568.002","T1574.001"]},{"id":"S1087","name":"AsyncRAT","type":"software","techniques":["T1033","T1053.005","T1056.001","T1057","T1105","T1106","T1113","T1125","T1497.001","T1564.003","T1568","T1622","T1680"]},{"id":"S0438","name":"Attor","type":"software","techniques":["T1010","T1012","T1020","T1027.013","T1036.004","T1037.001","T1041","T1053.005","T1055","T1055.004","T1056.001","T1070.004","T1070.006","T1071.002","T1074.001","T1083","T1090.003","T1105","T1106","T1112","T1113","T1115","T1119","T1120","T1123","T1129","T1218.011","T1497.001","T1543.003","T1560.003","T1564.001","T1569.002","T1573.001","T1573.002","T1680"]},{"id":"S1029","name":"AuTo Stealer","type":"software","techniques":["T1005","T1033","T1041","T1059.003","T1071.001","T1074.001","T1082","T1095","T1518.001","T1547.001"]},{"id":"S0347","name":"AuditCred","type":"software","techniques":["T1027.013","T1055","T1059.003","T1070.004","T1083","T1090","T1105","T1140","T1543.003"]},{"id":"S0129","name":"AutoIt backdoor","type":"software","techniques":["T1059.001","T1083","T1132.001","T1548.002"]},{"id":"S0640","name":"Avaddon","type":"software","techniques":["T1016","T1027","T1047","T1057","T1059.007","T1083","T1106","T1112","T1135","T1140","T1486","T1489","T1490","T1547.001","T1548.002","T1562.001","T1614.001"]},{"id":"S0473","name":"Avenger","type":"software","techniques":["T1016","T1027.003","T1027.013","T1055","T1057","T1071.001","T1082","T1083","T1105","T1140","T1518.001","T1680"]},{"id":"S1053","name":"AvosLocker","type":"software","techniques":["T1027","T1027.007","T1036.008","T1057","T1083","T1106","T1124","T1135","T1140","T1486","T1489","T1529","T1547.001","T1562.009","T1564.003"]},{"id":"S0344","name":"Azorult","type":"software","techniques":["T1012","T1016","T1033","T1055.012","T1057","T1070.004","T1082","T1083","T1105","T1113","T1124","T1134.002","T1140","T1552.001","T1555.003","T1573.001"]},{"id":"S0031","name":"BACKSPACE","type":"software","techniques":["T1012","T1041","T1057","T1059.003","T1071.001","T1082","T1083","T1090.001","T1104","T1112","T1132.002","T1547.001","T1547.009","T1562.004"]},{"id":"S0245","name":"BADCALL","type":"software","techniques":["T1001.003","T1016","T1082","T1090","T1112","T1562.004","T1571","T1573.001"]},{"id":"S0642","name":"BADFLICK","type":"software","techniques":["T1005","T1016","T1082","T1083","T1105","T1140","T1204.002","T1497.003","T1560.002","T1566.001"]},{"id":"S1081","name":"BADHATCH","type":"software","techniques":["T1018","T1027.009","T1027.010","T1027.015","T1033","T1041","T1046","T1047","T1049","T1053.005","T1055","T1055.001","T1055.004","T1057","T1059.001","T1059.003","T1069.002","T1070.004","T1071.001","T1071.002","T1082","T1090","T1102","T1105","T1106","T1113","T1124","T1134.001","T1135","T1482","T1546.003","T1548.002","T1550.002","T1573.002","T1620"]},{"id":"S0128","name":"BADNEWS","type":"software","techniques":["T1005","T1025","T1036.001","T1036.005","T1039","T1053.005","T1055.012","T1056.001","T1059.003","T1071.001","T1074.001","T1083","T1102.001","T1102.002","T1105","T1106","T1113","T1119","T1120","T1132","T1132.001","T1547.001","T1573.001","T1574.001"]},{"id":"S0470","name":"BBK","type":"software","techniques":["T1027.003","T1055","T1059.003","T1071.001","T1105","T1106","T1140"]},{"id":"S0127","name":"BBSRAT","type":"software","techniques":["T1007","T1055.012","T1057","T1070.004","T1071.001","T1083","T1140","T1543.003","T1546.015","T1547.001","T1560.002","T1569.002","T1573.001","T1574.001"]},{"id":"S1136","name":"BFG Agonizer","type":"software","techniques":["T1490","T1529","T1554","T1561.002"]},{"id":"S0017","name":"BISCUIT","type":"software","techniques":["T1008","T1033","T1056.001","T1057","T1059.003","T1082","T1105","T1113","T1124","T1573.002"]},{"id":"S0190","name":"BITSAdmin","type":"software","techniques":["T1048.003","T1105","T1197","T1570"]},{"id":"S0069","name":"BLACKCOFFEE","type":"software","techniques":["T1057","T1059.003","T1070.004","T1083","T1102.001","T1102.002","T1104"]},{"id":"S0520","name":"BLINDINGCAN","type":"software","techniques":["T1005","T1016","T1027.002","T1027.013","T1036.005","T1041","T1059.003","T1070.004","T1070.006","T1071.001","T1082","T1083","T1105","T1129","T1132.001","T1140","T1204.002","T1218.011","T1553.002","T1566.001","T1573.001","T1680"]},{"id":"S0657","name":"BLUELIGHT","type":"software","techniques":["T1016","T1027.013","T1033","T1041","T1057","T1070.004","T1071.001","T1082","T1083","T1102.002","T1105","T1113","T1124","T1497.001","T1518.001","T1539","T1555.003","T1560","T1560.003"]},{"id":"S1184","name":"BOLDMOVE","type":"software","techniques":["T1016","T1059.004","T1070.004","T1071.001","T1082","T1083","T1090.003","T1190","T1480","T1543","T1554","T1562","T1562.006","T1564.011","T1573.002"]},{"id":"S0360","name":"BONDUPDATER","type":"software","techniques":["T1053.005","T1059.001","T1059.003","T1071.004","T1105","T1564.003","T1568.002"]},{"id":"S1226","name":"BOOKWORM","type":"software","techniques":["T1001.003","T1027","T1027.013","T1033","T1036.004","T1056.001","T1070.006","T1071.001","T1106","T1112","T1115","T1140","T1543.003","T1553.002","T1564.003","T1573.001","T1574.001"]},{"id":"S0415","name":"BOOSTWRITE","type":"software","techniques":["T1027.013","T1129","T1140","T1553.002","T1574.001"]},{"id":"S0114","name":"BOOTRASH","type":"software","techniques":["T1542.003","T1564.005"]},{"id":"S1161","name":"BPFDoor","type":"software","techniques":["T1027","T1036.009","T1036.011","T1059.004","T1070","T1070.004","T1070.006","T1205.002","T1480","T1480.002","T1562.003","T1562.004","T1564.011"]},{"id":"S0043","name":"BUBBLEWRAP","type":"software","techniques":["T1071.001","T1082","T1095"]},{"id":"S1118","name":"BUSHWALK","type":"software","techniques":["T1027","T1105","T1140","T1205","T1505.003","T1554"]},{"id":"S0638","name":"Babuk","type":"software","techniques":["T1007","T1027.002","T1049","T1057","T1059.003","T1083","T1106","T1135","T1140","T1486","T1489","T1490","T1562.001","T1680"]},{"id":"S0414","name":"BabyShark","type":"software","techniques":["T1012","T1016","T1033","T1053.005","T1056.001","T1057","T1059.003","T1059.005","T1070.004","T1082","T1083","T1105","T1132.001","T1140","T1218.005","T1547.001"]},{"id":"S0475","name":"BackConfig","type":"software","techniques":["T1027.010","T1036.005","T1053.005","T1059.003","T1059.005","T1070.004","T1071.001","T1082","T1083","T1105","T1106","T1137.001","T1140","T1204.001","T1553.002","T1564.001"]},{"id":"S0093","name":"Backdoor.Oldrea","type":"software","techniques":["T1016","T1018","T1033","T1046","T1055","T1057","T1070.004","T1082","T1083","T1087.003","T1105","T1132.001","T1218.011","T1547.001","T1555.003","T1560"]},{"id":"S0606","name":"Bad Rabbit","type":"software","techniques":["T1003.001","T1036.005","T1053.005","T1057","T1106","T1110.003","T1135","T1189","T1204.002","T1210","T1218.011","T1486","T1495","T1548.002","T1569.002"]},{"id":"S0337","name":"BadPatch","type":"software","techniques":["T1005","T1056.001","T1071.001","T1071.003","T1074.001","T1082","T1083","T1105","T1113","T1497.001","T1518.001","T1547.001"]},{"id":"S0234","name":"Bandook","type":"software","techniques":["T1005","T1016","T1027.003","T1041","T1055.012","T1056.001","T1059","T1059.001","T1059.003","T1059.005","T1059.006","T1070.004","T1083","T1095","T1105","T1106","T1113","T1120","T1123","T1125","T1140","T1204.002","T1553.002","T1566.001","T1573.001","T1680"]},{"id":"S0239","name":"Bankshot","type":"software","techniques":["T1001.003","T1005","T1012","T1041","T1057","T1059.003","T1070","T1070.004","T1070.006","T1071.001","T1082","T1083","T1087.001","T1087.002","T1105","T1106","T1112","T1119","T1132.002","T1134.002","T1140","T1203","T1543.003","T1571","T1680"]},{"id":"S0534","name":"Bazar","type":"software","techniques":["T1005","T1008","T1012","T1016","T1018","T1027.002","T1027.007","T1027.013","T1033","T1036.004","T1036.005","T1036.007","T1047","T1053.005","T1055","T1055.012","T1055.013","T1057","T1059.001","T1059.003","T1070.004","T1070.009","T1071.001","T1082","T1083","T1087.001","T1087.002","T1102","T1104","T1105","T1106","T1124","T1135","T1140","T1197","T1204.001","T1482","T1497","T1497.003","T1518","T1518.001","T1547.001","T1547.004","T1547.009","T1553.002","T1562.001","T1566.002","T1568.002","T1573.001","T1573.002","T1614.001"]},{"id":"S1246","name":"BeaverTail","type":"software","techniques":["T1001.001","T1005","T1027.013","T1036","T1041","T1059.007","T1070.004","T1071.001","T1074.001","T1082","T1083","T1105","T1124","T1195.001","T1204.002","T1217","T1555","T1555.001","T1555.003","T1560.001","T1571","T1654","T1657"]},{"id":"S0574","name":"BendyBear","type":"software","techniques":["T1001.001","T1012","T1027.013","T1027.014","T1105","T1106","T1124","T1140","T1497.003","T1571","T1573.001"]},{"id":"S0268","name":"Bisonal","type":"software","techniques":["T1005","T1012","T1016","T1027.001","T1027.002","T1027.013","T1036","T1036.005","T1041","T1057","T1059.003","T1059.005","T1070.004","T1071.001","T1082","T1083","T1090","T1095","T1105","T1106","T1112","T1124","T1132.001","T1137.006","T1140","T1204.002","T1218.011","T1497","T1497.003","T1543.003","T1547.001","T1566.001","T1568","T1573.001"]},{"id":"S0570","name":"BitPaymer","type":"software","techniques":["T1007","T1012","T1018","T1027.013","T1070.006","T1087.001","T1106","T1112","T1134.001","T1135","T1222.001","T1480","T1486","T1490","T1543.003","T1547.001","T1548.002","T1564.004"]},{"id":"S1070","name":"Black Basta","type":"software","techniques":["T1007","T1018","T1027.001","T1036.004","T1036.005","T1047","T1059.001","T1059.003","T1082","T1083","T1106","T1112","T1204.002","T1222.002","T1480.002","T1486","T1490","T1491.001","T1497","T1497.001","T1529","T1543.003","T1553.002","T1562.009","T1622","T1680"]},{"id":"S1181","name":"BlackByte 2.0 Ransomware","type":"software","techniques":["T1055","T1068","T1070.004","T1070.006","T1112","T1135","T1486","T1489","T1490","T1562.004","T1569.002"]},{"id":"S1180","name":"BlackByte Ransomware","type":"software","techniques":["T1012","T1021.002","T1027.013","T1046","T1053.005","T1059.007","T1082","T1106","T1112","T1135","T1140","T1222.001","T1480","T1486","T1490","T1497.001","T1518.001","T1562.001","T1562.010","T1570","T1614.001"]},{"id":"S1068","name":"BlackCat","type":"software","techniques":["T1018","T1033","T1047","T1059.003","T1069.002","T1070.001","T1082","T1083","T1087.002","T1112","T1134","T1135","T1222.001","T1486","T1489","T1490","T1491.001","T1548.002","T1561.001","T1570","T1680"]},{"id":"S0089","name":"BlackEnergy","type":"software","techniques":["T1008","T1016","T1021.002","T1046","T1047","T1049","T1055.001","T1056.001","T1057","T1070","T1070.001","T1071.001","T1082","T1083","T1113","T1120","T1485","T1543.003","T1547.001","T1547.009","T1548.002","T1552.001","T1553.006","T1555.003","T1574.010"]},{"id":"S0564","name":"BlackMould","type":"software","techniques":["T1005","T1059.003","T1071.001","T1083","T1105","T1680"]},{"id":"S0521","name":"BloodHound","type":"software","techniques":["T1018","T1033","T1059.001","T1069.001","T1069.002","T1087.001","T1087.002","T1106","T1482","T1560","T1615"]},{"id":"S0486","name":"Bonadan","type":"software","techniques":["T1016","T1033","T1057","T1059","T1082","T1105","T1496.001","T1554","T1573.001"]},{"id":"S0635","name":"BoomBox","type":"software","techniques":["T1027","T1033","T1036","T1071.001","T1082","T1083","T1087.002","T1087.003","T1102","T1105","T1140","T1204.002","T1218.011","T1480","T1547.001","T1567.002"]},{"id":"S0651","name":"BoxCaon","type":"software","techniques":["T1005","T1016","T1027","T1041","T1059.003","T1074.001","T1083","T1102.002","T1105","T1106","T1547","T1567.002"]},{"id":"S0252","name":"Brave Prince","type":"software","techniques":["T1012","T1016","T1048.003","T1057","T1082","T1083","T1562.001"]},{"id":"S0204","name":"Briba","type":"software","techniques":["T1105","T1218.011","T1543.003","T1547.001"]},{"id":"S1063","name":"Brute Ratel C4","type":"software","techniques":["T1005","T1021","T1021.002","T1021.006","T1027","T1027.007","T1036.005","T1036.008","T1046","T1047","T1055.002","T1057","T1059.003","T1069.002","T1071.001","T1071.004","T1087.002","T1095","T1102","T1105","T1106","T1113","T1140","T1204.002","T1482","T1497.003","T1518.001","T1558.003","T1562.006","T1569.002","T1572","T1574.001","T1620"]},{"id":"S1039","name":"Bumblebee","type":"software","techniques":["T1005","T1008","T1012","T1027","T1033","T1036.005","T1041","T1047","T1053.005","T1055","T1055.001","T1055.004","T1057","T1059.001","T1059.003","T1059.005","T1070.004","T1082","T1102","T1105","T1106","T1129","T1132.001","T1140","T1204.001","T1204.002","T1218.008","T1218.011","T1497","T1497.001","T1497.003","T1518.001","T1548.002","T1559.001","T1560","T1566.001","T1566.002","T1573.001","T1622"]},{"id":"S0482","name":"Bundlore","type":"software","techniques":["T1027","T1036.005","T1048","T1056.002","T1057","T1059.002","T1059.004","T1059.006","T1059.007","T1071.001","T1082","T1098.004","T1105","T1140","T1176.001","T1189","T1204.002","T1222.002","T1518","T1543.001","T1543.004","T1562.001","T1564"]},{"id":"S0025","name":"CALENDAR","type":"software","techniques":["T1059.003","T1102.002"]},{"id":"S1237","name":"CANONSTAGER","type":"software","techniques":["T1027.007","T1036.005","T1055.005","T1106","T1564.003","T1574.001"]},{"id":"S0465","name":"CARROTBALL","type":"software","techniques":["T1027","T1071.002","T1105","T1204.002"]},{"id":"S0462","name":"CARROTBAT","type":"software","techniques":["T1027.010","T1027.013","T1059.003","T1070.004","T1082","T1105"]},{"id":"S1224","name":"CASTLETAP","type":"software","techniques":["T1005","T1040","T1059.004","T1105","T1140","T1205.002","T1573.001","T1573.002"]},{"id":"S0222","name":"CCBkdr","type":"software","techniques":["T1195.002","T1568.002"]},{"id":"S1149","name":"CHIMNEYSWEEP","type":"software","techniques":["T1005","T1027","T1027.001","T1027.007","T1027.009","T1033","T1041","T1053.005","T1056.001","T1057","T1059.001","T1059.005","T1070.006","T1071.001","T1074.001","T1083","T1102","T1105","T1106","T1112","T1113","T1115","T1120","T1132.002","T1140","T1218.003","T1480","T1518.001","T1529","T1548.002","T1553.002"]},{"id":"S0023","name":"CHOPSTICK","type":"software","techniques":["T1008","T1012","T1027.011","T1056.001","T1059","T1071.001","T1071.003","T1083","T1090.001","T1091","T1092","T1105","T1112","T1113","T1497","T1518.001","T1568.002","T1573.001","T1573.002"]},{"id":"S1236","name":"CLAIMLOADER","type":"software","techniques":["T1027.007","T1036.005","T1053.005","T1106","T1140","T1204.002","T1480.002","T1547.001","T1559.001","T1564.001","T1574.001"]},{"id":"S1105","name":"COATHANGER","type":"software","techniques":["T1014","T1027","T1027.002","T1055","T1057","T1059.004","T1070.004","T1071.001","T1083","T1095","T1140","T1190","T1222.002","T1543.004","T1564.001","T1573.002","T1574","T1574.006"]},{"id":"S0212","name":"CORALDECK","type":"software","techniques":["T1048.003","T1083","T1560.001"]},{"id":"S0137","name":"CORESHELL","type":"software","techniques":["T1027","T1027.016","T1071.001","T1071.003","T1082","T1105","T1132.001","T1218.011","T1547.001","T1573.001","T1680"]},{"id":"S0527","name":"CSPY Downloader","type":"software","techniques":["T1027.002","T1036.004","T1053.005","T1070","T1070.004","T1071.001","T1105","T1112","T1204.002","T1497.001","T1548.002","T1553.002"]},{"id":"S0693","name":"CaddyWiper","type":"software","techniques":["T1057","T1082","T1083","T1106","T1222.001","T1485","T1561.002"]},{"id":"S0454","name":"Cadelspy","type":"software","techniques":["T1010","T1056.001","T1082","T1113","T1115","T1120","T1123","T1560"]},{"id":"S0274","name":"Calisto","type":"software","techniques":["T1005","T1016","T1036.005","T1056.002","T1070.004","T1074.001","T1098","T1105","T1136.001","T1217","T1543.001","T1555.001","T1560.001","T1564.001","T1569.001"]},{"id":"S0077","name":"CallMe","type":"software","techniques":["T1041","T1059.004","T1105","T1573.001"]},{"id":"S0351","name":"Cannon","type":"software","techniques":["T1033","T1041","T1057","T1071.003","T1082","T1083","T1105","T1113","T1124","T1547.004","T1680"]},{"id":"S0030","name":"Carbanak","type":"software","techniques":["T1003","T1012","T1021.001","T1027","T1030","T1055.002","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1113","T1114.001","T1132.001","T1136.001","T1219","T1547.001","T1573.001"]},{"id":"S0484","name":"Carberp","type":"software","techniques":["T1012","T1014","T1021.005","T1027.013","T1036.005","T1041","T1055.001","T1055.004","T1056.004","T1057","T1068","T1071.001","T1082","T1105","T1106","T1113","T1185","T1497","T1518.001","T1542.003","T1547.001","T1555","T1555.003","T1562.001","T1564.001"]},{"id":"S0335","name":"Carbon","type":"software","techniques":["T1012","T1016","T1018","T1027","T1048.003","T1049","T1053.005","T1055.001","T1057","T1069","T1071.001","T1074.001","T1095","T1102","T1124","T1140","T1543.003","T1573.002"]},{"id":"S0348","name":"Cardinal RAT","type":"software","techniques":["T1008","T1012","T1027.004","T1027.013","T1033","T1055","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1082","T1083","T1090","T1105","T1112","T1113","T1140","T1204.002","T1547.001","T1560.002","T1573.001"]},{"id":"S0261","name":"Catchamas","type":"software","techniques":["T1010","T1016","T1036.004","T1056.001","T1074.001","T1112","T1113","T1115","T1543.003"]},{"id":"S0572","name":"Caterpillar WebShell","type":"software","techniques":["T1005","T1007","T1014","T1016","T1033","T1041","T1046","T1057","T1059.003","T1069.001","T1082","T1083","T1105","T1110","T1112"]},{"id":"S0144","name":"ChChes","type":"software","techniques":["T1036.005","T1057","T1071.001","T1082","T1083","T1105","T1132.001","T1547.001","T1553.002","T1555.003","T1562.001","T1573.001"]},{"id":"S0631","name":"Chaes","type":"software","techniques":["T1027.011","T1033","T1036.005","T1048","T1056","T1059.003","T1059.005","T1059.006","T1059.007","T1071.001","T1082","T1105","T1106","T1112","T1113","T1132.001","T1140","T1185","T1204.002","T1218.004","T1218.007","T1221","T1539","T1547.001","T1555.003","T1566.001","T1573","T1574.001"]},{"id":"S0220","name":"Chaos","type":"software","techniques":["T1059.004","T1104","T1110","T1205","T1573.001"]},{"id":"S0674","name":"CharmPower","type":"software","techniques":["T1005","T1008","T1012","T1016","T1016.002","T1041","T1047","T1048.003","T1057","T1059.001","T1059.003","T1070.004","T1071.001","T1082","T1083","T1102","T1102.001","T1105","T1112","T1113","T1132.001","T1140","T1518","T1573.001"]},{"id":"S1096","name":"Cheerscrypt","type":"software","techniques":["T1059.012","T1083","T1486","T1489","T1673"]},{"id":"S0107","name":"Cherry Picker","type":"software","techniques":["T1048.003","T1070.004","T1546.010"]},{"id":"S0020","name":"China Chopper","type":"software","techniques":["T1005","T1027.002","T1046","T1059.003","T1070.006","T1071.001","T1083","T1105","T1110.001","T1505.003"]},{"id":"S1041","name":"Chinoxy","type":"software","techniques":["T1027.013","T1036.005","T1140","T1547.001","T1574.001"]},{"id":"S0667","name":"Chrommme","type":"software","techniques":["T1005","T1016","T1027.013","T1029","T1033","T1041","T1074.001","T1082","T1105","T1106","T1113","T1140","T1560","T1680"]},{"id":"S0660","name":"Clambling","type":"software","techniques":["T1005","T1012","T1016","T1027","T1033","T1055","T1055.012","T1056.001","T1057","T1059.001","T1059.003","T1071","T1071.001","T1082","T1083","T1095","T1102.002","T1112","T1113","T1115","T1124","T1125","T1135","T1140","T1204.002","T1497.003","T1543.003","T1547.001","T1548.002","T1564.001","T1566.001","T1567.002","T1569.002","T1574.001"]},{"id":"S0611","name":"Clop","type":"software","techniques":["T1027.002","T1057","T1059.003","T1083","T1106","T1112","T1135","T1140","T1218.007","T1486","T1489","T1490","T1497.003","T1518.001","T1553.002","T1562.001","T1614.001"]},{"id":"S0054","name":"CloudDuke","type":"software","techniques":["T1071.001","T1102.002","T1105"]},{"id":"S0154","name":"Cobalt Strike","type":"software","techniques":["T1001.003","T1003.001","T1003.002","T1005","T1007","T1012","T1016","T1018","T1021.001","T1021.002","T1021.003","T1021.004","T1021.006","T1027","T1027.005","T1029","T1030","T1046","T1047","T1049","T1055","T1055.001","T1055.012","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1059.006","T1059.007","T1068","T1069.001","T1069.002","T1070.006","T1071.001","T1071.002","T1071.004","T1078.002","T1078.003","T1083","T1087.002","T1090.001","T1090.004","T1095","T1105","T1106","T1112","T1113","T1132.001","T1134.001","T1134.003","T1134.004","T1135","T1137.001","T1140","T1185","T1197","T1203","T1218.011","T1518","T1543.003","T1548.002","T1548.003","T1550.002","T1553.002","T1562.001","T1564.010","T1569.002","T1572","T1573.001","T1573.002","T1620"]},{"id":"S0338","name":"Cobian RAT","type":"software","techniques":["T1056.001","T1059.003","T1071.004","T1113","T1123","T1125","T1132.001","T1547.001"]},{"id":"S0369","name":"CoinTicker","type":"software","techniques":["T1027","T1059.003","T1059.004","T1059.006","T1105","T1140","T1543.001","T1553.001","T1564.001"]},{"id":"S0126","name":"ComRAT","type":"software","techniques":["T1012","T1027","T1027.009","T1027.010","T1027.011","T1029","T1036.004","T1053.005","T1055.001","T1059.001","T1059.003","T1071.001","T1071.003","T1102.002","T1106","T1112","T1124","T1140","T1518","T1546.015","T1564.005","T1573.002"]},{"id":"S0244","name":"Comnie","type":"software","techniques":["T1007","T1016","T1018","T1027","T1027.001","T1049","T1057","T1059.003","T1059.005","T1071.001","T1082","T1087.001","T1102.002","T1119","T1218.011","T1518.001","T1547.001","T1547.009","T1573.001"]},{"id":"S0608","name":"Conficker","type":"software","techniques":["T1021.002","T1027","T1046","T1091","T1105","T1112","T1124","T1210","T1490","T1543.003","T1547.001","T1562.001","T1568.002"]},{"id":"S0591","name":"ConnectWise","type":"software","techniques":["T1059.001","T1113","T1125"]},{"id":"S0575","name":"Conti","type":"software","techniques":["T1016","T1018","T1021.002","T1027","T1049","T1055.001","T1057","T1059.003","T1080","T1083","T1106","T1135","T1140","T1486","T1489","T1490"]},{"id":"S0492","name":"CookieMiner","type":"software","techniques":["T1005","T1027.010","T1048.003","T1059.004","T1059.006","T1083","T1105","T1140","T1496.001","T1518.001","T1539","T1543.001","T1555.003","T1562.004"]},{"id":"S1235","name":"CorKLOG","type":"software","techniques":["T1027.013","T1053.005","T1056.001","T1074.001","T1140","T1543.003","T1553.002","T1574.001"]},{"id":"S0050","name":"CosmicDuke","type":"software","techniques":["T1003.002","T1003.004","T1005","T1020","T1025","T1039","T1048.003","T1053.005","T1056.001","T1068","T1071.001","T1083","T1113","T1114.001","T1115","T1543.003","T1555","T1555.003","T1573.001"]},{"id":"S0614","name":"CostaBricks","type":"software","techniques":["T1027.001","T1027.002","T1055","T1105","T1106","T1140"]},{"id":"S1155","name":"Covenant","type":"software","techniques":["T1047","T1059.001","T1059.003","T1071.001","T1082","T1218.004","T1218.005","T1218.010","T1571","T1573.002"]},{"id":"S0046","name":"CozyCar","type":"software","techniques":["T1003.001","T1003.002","T1027.013","T1036.003","T1053.005","T1059.003","T1071.001","T1082","T1102.002","T1218.011","T1497","T1518.001","T1543.003","T1547.001"]},{"id":"S0488","name":"CrackMapExec","type":"software","techniques":["T1003.002","T1003.003","T1003.004","T1016","T1018","T1047","T1049","T1053.002","T1059.001","T1069.002","T1083","T1087.002","T1110","T1110.001","T1110.003","T1112","T1135","T1201","T1550.002","T1680"]},{"id":"S1023","name":"CreepyDrive","type":"software","techniques":["T1005","T1059.001","T1071.001","T1083","T1102.002","T1105","T1550.001","T1567.002"]},{"id":"S1024","name":"CreepySnail","type":"software","techniques":["T1016","T1033","T1041","T1059.001","T1071.001","T1078.002","T1132.001"]},{"id":"S0115","name":"Crimson","type":"software","techniques":["T1005","T1012","T1016","T1025","T1033","T1041","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1082","T1083","T1091","T1095","T1105","T1112","T1113","T1114.001","T1120","T1123","T1124","T1125","T1140","T1497.003","T1518.001","T1547.001","T1555.003","T1614","T1680"]},{"id":"S0235","name":"CrossRAT","type":"software","techniques":["T1083","T1113","T1543.001","T1547.001","T1547.013"]},{"id":"S0538","name":"Crutch","type":"software","techniques":["T1005","T1008","T1020","T1025","T1036.004","T1041","T1053.005","T1071.001","T1074.001","T1102.002","T1119","T1120","T1560.001","T1567.002","T1574.001"]},{"id":"S0498","name":"Cryptoistic","type":"software","techniques":["T1005","T1033","T1070.004","T1083","T1095","T1105","T1573"]},{"id":"S0625","name":"Cuba","type":"software","techniques":["T1007","T1016","T1027","T1027.002","T1036.005","T1049","T1056.001","T1057","T1059.001","T1059.003","T1070.004","T1083","T1105","T1106","T1134","T1135","T1486","T1489","T1543.003","T1564.003","T1614.001","T1620","T1680"]},{"id":"S1153","name":"Cuckoo Stealer","type":"software","techniques":["T1027.008","T1027.013","T1033","T1036.005","T1041","T1056.002","T1057","T1059.002","T1059.004","T1071.001","T1074.001","T1082","T1083","T1095","T1113","T1140","T1217","T1518","T1543.001","T1553.001","T1555.001","T1564.001","T1569.001","T1614","T1614.001","T1647"]},{"id":"S0687","name":"Cyclops Blink","type":"software","techniques":["T1005","T1016","T1036.005","T1037.004","T1041","T1057","T1070.006","T1071.001","T1082","T1083","T1090.003","T1105","T1106","T1132.002","T1140","T1542.002","T1559","T1562.004","T1571","T1572","T1573.002"]},{"id":"S1033","name":"DCSrv","type":"software","techniques":["T1027.013","T1036.004","T1106","T1112","T1124","T1486","T1529","T1543.003"]},{"id":"S0255","name":"DDKONG","type":"software","techniques":["T1083","T1105","T1140","T1218.011"]},{"id":"S1052","name":"DEADEYE","type":"software","techniques":["T1016","T1027.009","T1027.013","T1036.004","T1059.003","T1082","T1106","T1140","T1218.007","T1218.011","T1480","T1564.004"]},{"id":"S1134","name":"DEADWOOD","type":"software","techniques":["T1027.009","T1027.013","T1036.004","T1124","T1140","T1485","T1531","T1561.001","T1561.002","T1569.002"]},{"id":"S0616","name":"DEATHRANSOM","type":"software","techniques":["T1047","T1071.001","T1083","T1105","T1135","T1486","T1490","T1614.001","T1680"]},{"id":"S0213","name":"DOGCALL","type":"software","techniques":["T1027.013","T1056.001","T1102.002","T1105","T1113","T1123"]},{"id":"S0694","name":"DRATzarus","type":"software","techniques":["T1005","T1018","T1027","T1027.002","T1033","T1036.005","T1057","T1071.001","T1105","T1106","T1124","T1497.003","T1622"]},{"id":"S1158","name":"DUSTPAN","type":"software","techniques":["T1027.009","T1027.013","T1036.005","T1055.002","T1140","T1543.003"]},{"id":"S1159","name":"DUSTTRAP","type":"software","techniques":["T1005","T1010","T1012","T1016","T1018","T1027.009","T1027.013","T1041","T1055","T1056.001","T1057","T1059.003","T1070","T1070.001","T1070.005","T1082","T1083","T1087.001","T1087.002","T1105","T1113","T1124","T1135","T1140","T1482","T1497.001","T1518.001","T1615","T1654"]},{"id":"S0497","name":"Dacls","type":"software","techniques":["T1027.013","T1036","T1057","T1071.001","T1083","T1105","T1543.001","T1543.004","T1564.001"]},{"id":"S1014","name":"DanBot","type":"software","techniques":["T1005","T1021.005","T1027.013","T1036.005","T1053.005","T1059.003","T1059.005","T1070.004","T1071.001","T1071.004","T1105","T1140","T1204.002","T1566.001"]},{"id":"S0334","name":"DarkComet","type":"software","techniques":["T1021.001","T1027.002","T1033","T1036.005","T1056.001","T1057","T1059","T1059.003","T1071.001","T1082","T1105","T1112","T1115","T1123","T1125","T1547.001","T1562.001","T1562.004"]},{"id":"S1111","name":"DarkGate","type":"software","techniques":["T1001","T1005","T1010","T1027","T1027.013","T1036","T1036.003","T1036.007","T1041","T1047","T1055.012","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1059.010","T1070.004","T1071.004","T1082","T1083","T1098.007","T1105","T1106","T1115","T1119","T1124","T1134.004","T1136.001","T1140","T1204.002","T1480","T1486","T1490","T1496.001","T1497.001","T1518.001","T1529","T1539","T1547.001","T1548.002","T1552","T1555","T1561.001","T1562.001","T1564.001","T1566.001","T1566.002","T1569.002","T1574","T1574.001","T1574.007","T1583.001","T1614","T1622","T1657","T1665","T1680"]},{"id":"S1066","name":"DarkTortilla","type":"software","techniques":["T1007","T1016.001","T1027","T1036","T1047","T1055.001","T1056.001","T1057","T1059.003","T1071.001","T1082","T1102","T1105","T1106","T1112","T1115","T1140","T1204.002","T1497.001","T1497.003","T1518.001","T1547.001","T1547.004","T1559.001","T1564","T1566.001","T1574.012","T1622"]},{"id":"S0673","name":"DarkWatchman","type":"software","techniques":["T1005","T1010","T1012","T1027.004","T1027.010","T1027.011","T1027.015","T1033","T1036","T1047","T1053.005","T1056.001","T1059.001","T1059.003","T1059.007","T1070","T1070.004","T1071.001","T1074.001","T1082","T1083","T1112","T1120","T1124","T1129","T1132.001","T1140","T1217","T1490","T1518.001","T1566.001","T1568.002","T1573.002","T1614"]},{"id":"S0187","name":"Daserf","type":"software","techniques":["T1001.002","T1003.001","T1027","T1027.002","T1027.005","T1036.005","T1056.001","T1059.003","T1071.001","T1105","T1113","T1132.001","T1553.002","T1560","T1560.001","T1573.001"]},{"id":"S0243","name":"DealersChoice","type":"software","techniques":["T1059.003","T1071.001","T1203"]},{"id":"S0354","name":"Denis","type":"software","techniques":["T1012","T1016","T1027","T1027.010","T1033","T1055.012","T1059.001","T1059.003","T1070.004","T1071.004","T1082","T1083","T1105","T1106","T1132.001","T1140","T1497.001","T1560.002","T1574","T1574.001"]},{"id":"S0021","name":"Derusbi","type":"software","techniques":["T1008","T1012","T1033","T1055.001","T1056.001","T1057","T1059.004","T1070.004","T1070.006","T1082","T1083","T1095","T1113","T1123","T1125","T1218.010","T1571","T1573.001"]},{"id":"S0659","name":"Diavol","type":"software","techniques":["T1016","T1018","T1021.002","T1027","T1027.003","T1033","T1057","T1071.001","T1082","T1083","T1105","T1106","T1135","T1485","T1486","T1489","T1490","T1491.001","T1562.001"]},{"id":"S0200","name":"Dipsind","type":"software","techniques":["T1029","T1059.003","T1071.001","T1105","T1132.001","T1547.004","T1573.001"]},{"id":"S1088","name":"Disco","type":"software","techniques":["T1053.005","T1071.002","T1105","T1204.002","T1659"]},{"id":"S1021","name":"DnsSystem","type":"software","techniques":["T1005","T1033","T1041","T1059.003","T1071.004","T1105","T1132.001","T1204.002","T1547.001"]},{"id":"S0281","name":"Dok","type":"software","techniques":["T1027.002","T1048.003","T1056.002","T1059.002","T1090.003","T1222.002","T1543.001","T1547.015","T1548.003","T1553.004","T1557"]},{"id":"S0600","name":"Doki","type":"software","techniques":["T1020","T1036.005","T1041","T1057","T1059.004","T1071.001","T1083","T1102","T1105","T1133","T1568.002","T1573.002","T1610","T1611"]},{"id":"S0695","name":"Donut","type":"software","techniques":["T1027.002","T1027.013","T1027.015","T1055","T1057","T1059","T1059.001","T1059.005","T1059.006","T1059.007","T1070","T1071.001","T1105","T1106","T1562.001","T1620"]},{"id":"S0186","name":"DownPaper","type":"software","techniques":["T1012","T1033","T1059.001","T1059.003","T1071.001","T1082","T1547.001"]},{"id":"S0134","name":"Downdelph","type":"software","techniques":["T1001.001","T1105","T1548.002","T1573.001","T1574.001"]},{"id":"S0384","name":"Dridex","type":"software","techniques":["T1027","T1053.005","T1071.001","T1082","T1090","T1090.003","T1106","T1185","T1204.002","T1218.010","T1219","T1518","T1573.001","T1573.002","T1574.001"]},{"id":"S0547","name":"DropBook","type":"software","techniques":["T1059.003","T1059.006","T1082","T1083","T1102","T1105","T1140","T1567","T1614.001"]},{"id":"S0502","name":"Drovorub","type":"software","techniques":["T1005","T1014","T1027","T1041","T1059.004","T1070.004","T1071.001","T1090.001","T1095","T1105","T1140","T1547.006"]},{"id":"S0567","name":"Dtrack","type":"software","techniques":["T1005","T1012","T1016","T1027.009","T1036.005","T1049","T1055.012","T1056.001","T1057","T1059.003","T1070.004","T1074.001","T1078","T1082","T1083","T1105","T1129","T1140","T1217","T1543.003","T1547","T1560","T1574"]},{"id":"S0038","name":"Duqu","type":"software","techniques":["T1001.002","T1010","T1016","T1021.002","T1049","T1053.005","T1055.001","T1055.012","T1056.001","T1057","T1071","T1074.001","T1078","T1087.001","T1090.001","T1134","T1218.007","T1543.003","T1560.003","T1572","T1573.001"]},{"id":"S0062","name":"DustySky","type":"software","techniques":["T1008","T1027","T1041","T1047","T1056.001","T1057","T1070.004","T1071.001","T1074.001","T1082","T1083","T1091","T1113","T1120","T1518","T1518.001","T1547.001","T1560.001","T1570"]},{"id":"S0024","name":"Dyre","type":"software","techniques":["T1007","T1016","T1027.002","T1033","T1041","T1053.005","T1055","T1055.001","T1071.001","T1074.001","T1082","T1105","T1140","T1497.001","T1518","T1543.003"]},{"id":"S0593","name":"ECCENTRICBANDWAGON","type":"software","techniques":["T1027","T1056.001","T1059.003","T1070.004","T1074.001","T1113"]},{"id":"S0605","name":"EKANS","type":"software","techniques":["T1016","T1027","T1036.005","T1047","T1057","T1486","T1489","T1490","T1562.001"]},{"id":"S0064","name":"ELMER","type":"software","techniques":["T1057","T1071.001","T1083"]},{"id":"S0568","name":"EVILNUM","type":"software","techniques":["T1033","T1041","T1047","T1070","T1070.006","T1082","T1102.003","T1105","T1112","T1218.010","T1218.011","T1518.001","T1539","T1547.001"]},{"id":"S0377","name":"Ebury","type":"software","techniques":["T1008","T1014","T1020","T1027","T1041","T1059.004","T1059.006","T1071.004","T1129","T1132.001","T1140","T1552.004","T1553.002","T1554","T1556","T1556.003","T1562.001","T1562.006","T1562.012","T1568.002","T1573.001","T1574.006"]},{"id":"S0624","name":"Ecipekac","type":"software","techniques":["T1027","T1105","T1140","T1553.002","T1574.001"]},{"id":"S0554","name":"Egregor","type":"software","techniques":["T1027.002","T1033","T1036.004","T1039","T1049","T1055","T1059.001","T1059.003","T1069.002","T1071.001","T1082","T1105","T1106","T1124","T1140","T1197","T1218.010","T1218.011","T1219","T1484.001","T1486","T1497","T1497.003","T1562.001","T1574.001"]},{"id":"S0081","name":"Elise","type":"software","techniques":["T1007","T1016","T1027.013","T1036.005","T1055.001","T1057","T1070.004","T1070.006","T1071.001","T1074.001","T1082","T1083","T1087.001","T1105","T1132.001","T1218.011","T1543.003","T1547.001","T1573.001"]},{"id":"S1247","name":"Embargo","type":"software","techniques":["T1007","T1027.013","T1053.005","T1057","T1059.003","T1068","T1070.004","T1083","T1106","T1112","T1135","T1140","T1480.002","T1486","T1489","T1490","T1543.003","T1547.001","T1562.009","T1569.002","T1657","T1679"]},{"id":"S0082","name":"Emissary","type":"software","techniques":["T1007","T1016","T1027.001","T1027.013","T1055.001","T1059.003","T1069.001","T1071.001","T1082","T1105","T1218.011","T1543.003","T1547.001","T1573.001","T1615"]},{"id":"S0367","name":"Emotet","type":"software","techniques":["T1003.001","T1016.002","T1021.002","T1027.001","T1027.002","T1027.009","T1027.010","T1027.013","T1033","T1036.004","T1040","T1041","T1047","T1053.005","T1055.001","T1055.012","T1057","T1059.001","T1059.003","T1059.005","T1071.001","T1078.003","T1087.003","T1105","T1106","T1110.001","T1114","T1114.001","T1132.001","T1134.001","T1135","T1140","T1204.001","T1204.002","T1210","T1218.010","T1543.003","T1547.001","T1552.001","T1555.003","T1566.001","T1566.002","T1570","T1571","T1573","T1573.001","T1620"]},{"id":"S0363","name":"Empire","type":"software","techniques":["T1003.001","T1016","T1020","T1021.003","T1021.004","T1027.010","T1033","T1040","T1041","T1046","T1047","T1049","T1053.005","T1055","T1056.001","T1056.004","T1057","T1059","T1059.001","T1059.003","T1068","T1070.006","T1071.001","T1082","T1083","T1087.001","T1087.002","T1102.002","T1105","T1106","T1113","T1114.001","T1115","T1119","T1125","T1127.001","T1134","T1134.002","T1134.005","T1135","T1136.001","T1136.002","T1210","T1217","T1482","T1484.001","T1518.001","T1543.003","T1546.008","T1547.001","T1547.005","T1547.009","T1548.002","T1550.002","T1552.001","T1552.004","T1555.001","T1555.003","T1557.001","T1558.001","T1558.002","T1558.003","T1560","T1567.001","T1567.002","T1569.002","T1573.002","T1574.001","T1574.004","T1574.007","T1574.008","T1574.009","T1615"]},{"id":"S0634","name":"EnvyScout","type":"software","techniques":["T1005","T1027.006","T1027.013","T1036","T1059.003","T1059.007","T1082","T1140","T1187","T1204.002","T1218.011","T1480","T1564.001","T1566.001"]},{"id":"S0091","name":"Epic","type":"software","techniques":["T1007","T1012","T1016","T1018","T1027","T1033","T1049","T1055.011","T1057","T1069.001","T1070.004","T1071.001","T1082","T1083","T1087.001","T1124","T1518.001","T1553.002","T1560","T1560.002","T1573.001","T1680"]},{"id":"S0396","name":"EvilBunny","type":"software","techniques":["T1047","T1053.005","T1057","T1059.003","T1059.011","T1070.004","T1071.001","T1105","T1106","T1124","T1203","T1497.001","T1497.003","T1518.001","T1547.001"]},{"id":"S0152","name":"EvilGrab","type":"software","techniques":["T1056.001","T1113","T1123","T1125","T1547.001"]},{"id":"S0401","name":"Exaramel for Linux","type":"software","techniques":["T1008","T1027.013","T1033","T1053.003","T1059.004","T1070.004","T1071.001","T1105","T1140","T1543","T1543.002","T1548.001"]},{"id":"S0343","name":"Exaramel for Windows","type":"software","techniques":["T1027.011","T1036.004","T1059.003","T1059.005","T1074.001","T1112","T1543.003","T1560"]},{"id":"S1179","name":"Exbyte","type":"software","techniques":["T1069.001","T1070.004","T1083","T1106","T1140","T1480","T1497.001","T1518.001","T1567"]},{"id":"S0361","name":"Expand","type":"software","techniques":["T1140","T1564.004","T1570"]},{"id":"S0569","name":"Explosive","type":"software","techniques":["T1016","T1025","T1033","T1056.001","T1071.001","T1082","T1105","T1106","T1112","T1115","T1564.001","T1573.001"]},{"id":"S0181","name":"FALLCHILL","type":"software","techniques":["T1001.003","T1016","T1070.004","T1070.006","T1082","T1083","T1543.003","T1573.001","T1680"]},{"id":"S0267","name":"FELIXROOT","type":"software","techniques":["T1012","T1016","T1027.013","T1033","T1047","T1057","T1059.003","T1070.004","T1071.001","T1082","T1105","T1112","T1124","T1218.011","T1518.001","T1547.001","T1547.009","T1560","T1680"]},{"id":"S0618","name":"FIVEHANDS","type":"software","techniques":["T1027.013","T1047","T1059","T1083","T1135","T1140","T1486","T1490"]},{"id":"S0036","name":"FLASHFLOOD","type":"software","techniques":["T1005","T1025","T1074.001","T1083","T1547.001","T1560.003"]},{"id":"S1120","name":"FRAMESTING","type":"software","techniques":["T1001","T1001.003","T1059.006","T1071.001","T1140","T1505.003","T1554"]},{"id":"S1144","name":"FRP","type":"software","techniques":["T1046","T1049","T1059.007","T1071.001","T1090","T1090.003","T1095","T1572","T1573.001","T1573.002"]},{"id":"S0628","name":"FYAnti","type":"software","techniques":["T1027.002","T1083","T1105","T1140"]},{"id":"S0076","name":"FakeM","type":"software","techniques":["T1001.003","T1056.001","T1095","T1573.001"]},{"id":"S0512","name":"FatDuke","type":"software","techniques":["T1005","T1008","T1012","T1016","T1027","T1027.002","T1027.016","T1036.012","T1057","T1059.001","T1070.004","T1071.001","T1082","T1083","T1090.001","T1106","T1140","T1218.011","T1497.003","T1547.001","T1573.001"]},{"id":"S0171","name":"Felismus","type":"software","techniques":["T1016","T1033","T1036.005","T1059.003","T1071.001","T1082","T1105","T1132.001","T1518.001","T1573.001"]},{"id":"S0679","name":"Ferocious","type":"software","techniques":["T1059.001","T1059.005","T1070.004","T1082","T1112","T1120","T1497.001","T1518.001","T1546.015"]},{"id":"S0182","name":"FinFisher","type":"software","techniques":["T1012","T1027","T1027.002","T1027.016","T1036.005","T1055.001","T1056.004","T1057","T1070.001","T1082","T1083","T1113","T1134.001","T1140","T1497.001","T1518.001","T1542.003","T1543.003","T1547.001","T1548.002","T1574.001","T1574.013"]},{"id":"S0355","name":"Final1stspy","type":"software","techniques":["T1027","T1057","T1071.001","T1082","T1140","T1547.001"]},{"id":"S0696","name":"Flagpro","type":"software","techniques":["T1005","T1010","T1016","T1018","T1027","T1029","T1033","T1036","T1041","T1049","T1057","T1059.003","T1059.005","T1069.001","T1070","T1071.001","T1105","T1106","T1132.001","T1135","T1204.002","T1547.001","T1566.001","T1614.001"]},{"id":"S0143","name":"Flame","type":"software","techniques":["T1011.001","T1036.010","T1091","T1113","T1123","T1136.001","T1210","T1218.011","T1518.001","T1547.002"]},{"id":"S0381","name":"FlawedAmmyy","type":"software","techniques":["T1001","T1005","T1033","T1041","T1047","T1056","T1056.001","T1059.001","T1059.003","T1069.001","T1070.004","T1071.001","T1082","T1105","T1113","T1115","T1120","T1218.007","T1218.011","T1518.001","T1547.001","T1573.001"]},{"id":"S0661","name":"FoggyWeb","type":"software","techniques":["T1005","T1027.004","T1027.013","T1036","T1036.005","T1040","T1041","T1057","T1071.001","T1083","T1105","T1106","T1129","T1140","T1550","T1552.004","T1560.002","T1560.003","T1573.001","T1574.001","T1620"]},{"id":"S0193","name":"Forfiles","type":"software","techniques":["T1005","T1083","T1202"]},{"id":"S0503","name":"FrameworkPOS","type":"software","techniques":["T1005","T1048","T1057","T1074.001","T1560.003"]},{"id":"S0277","name":"FruitFly","type":"software","techniques":["T1027.010","T1057","T1070.004","T1083","T1113","T1543.001","T1564.001"]},{"id":"S1044","name":"FunnyDream","type":"software","techniques":["T1001","T1005","T1010","T1012","T1016","T1018","T1025","T1027.013","T1033","T1036.004","T1041","T1047","T1055.001","T1056.001","T1057","T1059.003","T1070","T1070.004","T1074.001","T1083","T1090","T1095","T1105","T1106","T1113","T1119","T1120","T1124","T1218.011","T1518.001","T1543.003","T1547.001","T1559.001","T1560.002","T1560.003","T1572","T1680"]},{"id":"S0410","name":"Fysbis","type":"software","techniques":["T1027.013","T1036.004","T1036.005","T1056.001","T1057","T1059.004","T1070.004","T1082","T1083","T1132.001","T1543.002","T1547.013"]},{"id":"S1117","name":"GLASSTOKEN","type":"software","techniques":["T1059.001","T1132.001","T1140","T1505.003"]},{"id":"S0026","name":"GLOOXMAIL","type":"software","techniques":["T1071.005","T1102.002"]},{"id":"S0417","name":"GRIFFON","type":"software","techniques":["T1053.005","T1059.001","T1059.007","T1069.002","T1082","T1113","T1124","T1547.001"]},{"id":"S0168","name":"Gazer","type":"software","techniques":["T1027.013","T1033","T1053.005","T1055","T1055.003","T1070.004","T1070.006","T1071.001","T1105","T1480.002","T1546.002","T1547.001","T1547.004","T1547.009","T1553.002","T1564.004","T1573.001","T1573.002"]},{"id":"S0666","name":"Gelsemium","type":"software","techniques":["T1005","T1008","T1012","T1027.011","T1027.015","T1027.016","T1033","T1036.001","T1036.005","T1055.001","T1057","T1059.003","T1070.004","T1070.006","T1071.001","T1071.004","T1082","T1083","T1095","T1105","T1106","T1112","T1134","T1140","T1497","T1518.001","T1543.003","T1547.001","T1547.012","T1548.002","T1559.001","T1568","T1620"]},{"id":"S0049","name":"GeminiDuke","type":"software","techniques":["T1007","T1016","T1057","T1071.001","T1083","T1087.001"]},{"id":"S0460","name":"Get2","type":"software","techniques":["T1033","T1055.001","T1057","T1059","T1071.001","T1082"]},{"id":"S1197","name":"GoBear","type":"software","techniques":["T1036.005","T1090","T1553.002"]},{"id":"S0249","name":"Gold Dragon","type":"software","techniques":["T1012","T1033","T1057","T1059.003","T1070.004","T1071.001","T1074.001","T1082","T1083","T1105","T1518.001","T1547.001","T1560","T1562.001"]},{"id":"S0597","name":"GoldFinder","type":"software","techniques":["T1016.001","T1071.001","T1119"]},{"id":"S0588","name":"GoldMax","type":"software","techniques":["T1001.001","T1016","T1027.002","T1027.013","T1036.004","T1036.005","T1041","T1053.003","T1053.005","T1059.003","T1071.001","T1105","T1124","T1140","T1497.001","T1497.003","T1564.011","T1573.002"]},{"id":"S0493","name":"GoldenSpy","type":"software","techniques":["T1027.013","T1036.005","T1041","T1059.003","T1070.004","T1071.001","T1082","T1083","T1105","T1106","T1136.001","T1195.002","T1497.003","T1543.003","T1571"]},{"id":"S1198","name":"Gomir","type":"software","techniques":["T1016","T1018","T1053.003","T1059.004","T1069.001","T1070.004","T1071.001","T1082","T1083","T1090.001","T1132.001","T1543.002","T1573","T1573.002"]},{"id":"S0477","name":"Goopy","type":"software","techniques":["T1005","T1027.001","T1027.016","T1033","T1036.005","T1041","T1053.005","T1057","T1059.003","T1059.005","T1070.008","T1071.001","T1071.003","T1071.004","T1106","T1140","T1562.001","T1574.001"]},{"id":"S1138","name":"Gootloader","type":"software","techniques":["T1016","T1027","T1055.002","T1055.012","T1059.001","T1059.007","T1069.002","T1082","T1105","T1132.001","T1140","T1204.001","T1497.003","T1547.001","T1584.001","T1584.006","T1614","T1614.001"]},{"id":"S0531","name":"Grandoreiro","type":"software","techniques":["T1010","T1016","T1027.001","T1027.011","T1027.013","T1033","T1036.005","T1041","T1056.001","T1057","T1059.005","T1070.004","T1071.001","T1082","T1087.003","T1102.001","T1102.002","T1105","T1106","T1112","T1115","T1124","T1140","T1176.001","T1185","T1189","T1204.001","T1204.002","T1218.007","T1222.001","T1497.001","T1518.001","T1539","T1547.001","T1547.009","T1548.002","T1555.003","T1562.001","T1562.004","T1562.013","T1566.002","T1568.002","T1573.002"]},{"id":"S0237","name":"GravityRAT","type":"software","techniques":["T1005","T1007","T1016","T1025","T1027.005","T1027.013","T1033","T1047","T1049","T1053.005","T1057","T1059.003","T1071.001","T1082","T1083","T1124","T1497.001","T1559.002","T1571"]},{"id":"S0690","name":"Green Lambert","type":"software","techniques":["T1005","T1016","T1027","T1036.004","T1036.005","T1037.004","T1059.004","T1070.004","T1071.004","T1082","T1090","T1124","T1140","T1543.001","T1543.004","T1546.004","T1547.015","T1555.001"]},{"id":"S0342","name":"GreyEnergy","type":"software","techniques":["T1003.001","T1007","T1027.002","T1027.013","T1055.002","T1056.001","T1059.003","T1070.004","T1071.001","T1090.003","T1105","T1112","T1218.011","T1543.003","T1553.002","T1573.001","T1573.002"]},{"id":"S0632","name":"GrimAgent","type":"software","techniques":["T1001.001","T1005","T1016","T1027","T1027.001","T1033","T1041","T1053.005","T1059.003","T1070.004","T1070.009","T1071.001","T1082","T1083","T1105","T1106","T1132.001","T1140","T1480.002","T1497.003","T1547.001","T1573.001","T1573.002","T1614","T1614.001"]},{"id":"S0561","name":"GuLoader","type":"software","techniques":["T1055","T1070.004","T1071.001","T1102","T1105","T1106","T1204.001","T1204.002","T1497.001","T1497.003","T1547.001","T1566.002"]},{"id":"S0132","name":"H1N1","type":"software","techniques":["T1027","T1027.002","T1059.003","T1080","T1091","T1105","T1132","T1490","T1548.002","T1555.003","T1562.001","T1562.004","T1573.001"]},{"id":"S0151","name":"HALFBAKED","type":"software","techniques":["T1047","T1057","T1059.001","T1070.004","T1082","T1113"]},{"id":"S0037","name":"HAMMERTOSS","type":"software","techniques":["T1001.002","T1059.001","T1071.001","T1102.003","T1564.003","T1567.002","T1573.001"]},{"id":"S0214","name":"HAPPYWORK","type":"software","techniques":["T1033","T1082","T1105"]},{"id":"S0246","name":"HARDRAIN","type":"software","techniques":["T1001.003","T1059.003","T1090","T1562.004","T1571"]},{"id":"S0391","name":"HAWKBALL","type":"software","techniques":["T1027.013","T1033","T1041","T1059.003","T1070.004","T1071.001","T1082","T1106","T1203","T1559.002","T1560.003"]},{"id":"S0061","name":"HDoor","type":"software","techniques":["T1046","T1562.001"]},{"id":"S0617","name":"HELLOKITTY","type":"software","techniques":["T1047","T1057","T1135","T1486","T1490","T1680"]},{"id":"S0135","name":"HIDEDRV","type":"software","techniques":["T1014","T1055.001"]},{"id":"S1230","name":"HIUPAN","type":"software","techniques":["T1057","T1091","T1112","T1120","T1204.002","T1547.001","T1564.001","T1574.001","T1678"]},{"id":"S0232","name":"HOMEFRY","type":"software","techniques":["T1003","T1027.013","T1059.003"]},{"id":"S0376","name":"HOPLIGHT","type":"software","techniques":["T1003.002","T1008","T1012","T1041","T1047","T1055","T1059.003","T1082","T1083","T1090","T1105","T1112","T1124","T1132.001","T1546.003","T1550.002","T1562.004","T1569.002","T1571","T1652","T1680"]},{"id":"S0040","name":"HTRAN","type":"software","techniques":["T1014","T1055","T1090"]},{"id":"S0070","name":"HTTPBrowser","type":"software","techniques":["T1027","T1036.005","T1056.001","T1059.003","T1070.004","T1071.001","T1071.004","T1083","T1105","T1547.001","T1574.001"]},{"id":"S1097","name":"HUI Loader","type":"software","techniques":["T1140","T1562.006","T1574.001"]},{"id":"S0047","name":"Hacking Team UEFI Rootkit","type":"software","techniques":["T1014","T1542.001"]},{"id":"S0499","name":"Hancitor","type":"software","techniques":["T1027","T1027.015","T1059.001","T1070.004","T1105","T1106","T1140","T1204.001","T1204.002","T1218.012","T1497","T1547.001","T1566.001","T1566.002"]},{"id":"S1211","name":"Hannotog","type":"software","techniques":["T1020","T1059.003","T1105","T1489","T1543.003","T1562.004","T1571"]},{"id":"S1229","name":"Havoc","type":"software","techniques":["T1005","T1016","T1016.001","T1018","T1033","T1055.001","T1055.002","T1057","T1059.001","T1059.003","T1071.001","T1071.002","T1082","T1083","T1087","T1090","T1105","T1106","T1113","T1134.001","T1204.004","T1497.003","T1559","T1566.002","T1570","T1573.001"]},{"id":"S0170","name":"Helminth","type":"software","techniques":["T1027.013","T1030","T1053.005","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1069.001","T1069.002","T1071.001","T1071.004","T1074.001","T1105","T1115","T1119","T1132.001","T1547.001","T1547.009","T1553.002","T1573.001"]},{"id":"S0697","name":"HermeticWiper","type":"software","techniques":["T1027.015","T1036.005","T1053.005","T1059.003","T1070","T1070.001","T1070.004","T1082","T1083","T1106","T1112","T1134","T1140","T1484.001","T1485","T1489","T1490","T1497.003","T1529","T1543.003","T1553.002","T1561.001","T1561.002","T1562.006","T1569.002","T1680"]},{"id":"S0698","name":"HermeticWizard","type":"software","techniques":["T1018","T1021.002","T1027.013","T1036.005","T1046","T1047","T1059.003","T1070.001","T1106","T1110.001","T1218.010","T1218.011","T1553.002","T1559.001","T1569.002","T1570"]},{"id":"S1249","name":"HexEval Loader","type":"software","techniques":["T1016","T1027.013","T1033","T1036.005","T1041","T1056.001","T1059.007","T1071.001","T1082","T1105","T1140","T1614"]},{"id":"S1027","name":"Heyoka Backdoor","type":"software","techniques":["T1007","T1027.013","T1036.004","T1055.001","T1057","T1070.004","T1071.004","T1083","T1120","T1140","T1204.002","T1218.011","T1547.001","T1572","T1680"]},{"id":"S0087","name":"Hi-Zor","type":"software","techniques":["T1027.013","T1059.003","T1070.004","T1071.001","T1105","T1218.010","T1547.001","T1573.001","T1573.002"]},{"id":"S0394","name":"HiddenWasp","type":"software","techniques":["T1014","T1027.013","T1037.004","T1059.003","T1095","T1105","T1136.001","T1140","T1573.001","T1574.006"]},{"id":"S0009","name":"Hikit","type":"software","techniques":["T1005","T1014","T1059.003","T1071.001","T1090.001","T1105","T1553.004","T1553.006","T1566","T1573.001","T1574.001"]},{"id":"S0601","name":"Hildegard","type":"software","techniques":["T1014","T1027.002","T1027.013","T1036.004","T1046","T1059.004","T1068","T1070.003","T1070.004","T1071","T1082","T1102","T1105","T1133","T1136.001","T1140","T1219","T1496.001","T1543.002","T1552.001","T1552.004","T1552.005","T1562.001","T1574.006","T1609","T1611","T1613"]},{"id":"S0431","name":"HotCroissant","type":"software","techniques":["T1007","T1010","T1016","T1027.002","T1027.013","T1033","T1041","T1053.005","T1057","T1059.003","T1070.004","T1082","T1083","T1105","T1106","T1113","T1489","T1518","T1564.003","T1573.001"]},{"id":"S0203","name":"Hydraq","type":"software","techniques":["T1005","T1007","T1012","T1016","T1027","T1048","T1057","T1070.001","T1070.004","T1082","T1083","T1105","T1112","T1113","T1129","T1134","T1543.003","T1569.002","T1573.001"]},{"id":"S0398","name":"HyperBro","type":"software","techniques":["T1007","T1027.002","T1027.013","T1055","T1070.004","T1071.001","T1105","T1106","T1113","T1140","T1569.002","T1574.001"]},{"id":"S0537","name":"HyperStack","type":"software","techniques":["T1078.001","T1087.001","T1106","T1112","T1559","T1573.001"]},{"id":"S1152","name":"IMAPLoader","type":"software","techniques":["T1047","T1053.005","T1071.003","T1082","T1105","T1106","T1543","T1564.003","T1574.014"]},{"id":"S1139","name":"INC Ransomware","type":"software","techniques":["T1047","T1057","T1083","T1106","T1120","T1135","T1140","T1486","T1489","T1490","T1491.001","T1566","T1570","T1652","T1680"]},{"id":"S1132","name":"IPsec Helper","type":"software","techniques":["T1005","T1027.013","T1041","T1057","T1059.001","T1059.003","T1059.005","T1070","T1070.004","T1070.009","T1071.001","T1112","T1497.003","T1569.002","T1570"]},{"id":"S0189","name":"ISMInjector","type":"software","techniques":["T1027","T1053.005","T1055.012","T1140"]},{"id":"S1022","name":"IceApple","type":"software","techniques":["T1003.002","T1003.004","T1005","T1016","T1027.010","T1036.005","T1041","T1056.003","T1070.004","T1071.001","T1082","T1083","T1087.002","T1140","T1505.004","T1552.002","T1560.001","T1573.001","T1620"]},{"id":"S0483","name":"IcedID","type":"software","techniques":["T1016","T1027.002","T1027.003","T1027.009","T1027.013","T1036.005","T1047","T1048.002","T1053.005","T1055.004","T1055.012","T1059.005","T1069","T1071.001","T1082","T1087.002","T1105","T1106","T1135","T1185","T1189","T1204.002","T1218.007","T1218.011","T1482","T1497","T1518.001","T1547.001","T1566.001","T1573.002","T1614.001"]},{"id":"S0434","name":"Imminent Monitor","type":"software","techniques":["T1021.001","T1027","T1041","T1056.001","T1057","T1059","T1070.004","T1083","T1106","T1123","T1125","T1140","T1496.001","T1555.003","T1562.001","T1564.001"]},{"id":"S0357","name":"Impacket","type":"software","techniques":["T1003.001","T1003.002","T1003.003","T1003.004","T1040","T1047","T1557.001","T1558.003","T1558.005","T1569.002","T1570"]},{"id":"S0604","name":"Industroyer","type":"software","techniques":["T1012","T1016","T1018","T1027","T1041","T1046","T1071.001","T1078","T1082","T1083","T1090.003","T1105","T1140","T1485","T1489","T1499.004","T1543.003","T1554","T1572"]},{"id":"S0259","name":"InnaputRAT","type":"software","techniques":["T1027","T1036.004","T1036.005","T1059.003","T1070.004","T1082","T1083","T1106","T1543.003","T1547.001","T1680"]},{"id":"S0260","name":"InvisiMole","type":"software","techniques":["T1001.003","T1005","T1007","T1008","T1010","T1012","T1016","T1025","T1027","T1027.005","T1033","T1036.004","T1036.005","T1046","T1053.005","T1055","T1055.002","T1055.004","T1055.015","T1056.001","T1057","T1059.003","T1059.007","T1068","T1070.004","T1070.005","T1070.006","T1071.001","T1071.004","T1074.001","T1080","T1082","T1083","T1087.001","T1090.001","T1090.002","T1095","T1105","T1106","T1112","T1113","T1119","T1123","T1124","T1125","T1132.002","T1135","T1140","T1203","T1204.002","T1210","T1218.002","T1218.011","T1480.001","T1490","T1497.001","T1518","T1518.001","T1543.003","T1547.001","T1547.009","T1548.002","T1559.001","T1560.001","T1560.002","T1560.003","T1562.004","T1564.001","T1564.003","T1569.002","T1573.001","T1574.001","T1680"]},{"id":"S1245","name":"InvisibleFerret","type":"software","techniques":["T1005","T1016","T1027.013","T1033","T1041","T1048.003","T1056","T1056.001","T1057","T1059.001","T1059.006","T1071.001","T1074.001","T1082","T1083","T1087.001","T1095","T1105","T1115","T1140","T1219","T1489","T1518","T1543.001","T1547.001","T1547.013","T1555.003","T1555.005","T1560.001","T1564.003","T1567","T1571","T1614","T1657","T1679"]},{"id":"S0231","name":"Invoke-PSImage","type":"software","techniques":["T1027.003","T1027.009"]},{"id":"S0581","name":"IronNetInjector","type":"software","techniques":["T1027.013","T1036.004","T1053.005","T1055","T1055.001","T1057","T1059.006","T1140"]},{"id":"S0015","name":"Ixeshe","type":"software","techniques":["T1005","T1007","T1016","T1033","T1036.005","T1057","T1059.003","T1070.004","T1071.001","T1082","T1083","T1105","T1132.001","T1547.001","T1564.001"]},{"id":"S1203","name":"J-magic","type":"software","techniques":["T1016","T1036.005","T1040","T1059.004","T1070.003","T1095","T1205","T1573.002"]},{"id":"S0389","name":"JCry","type":"software","techniques":["T1059.001","T1059.003","T1059.005","T1204.002","T1486","T1490","T1547.001"]},{"id":"S0044","name":"JHUHUGIT","type":"software","techniques":["T1008","T1016","T1027.013","T1037.001","T1053.005","T1055","T1057","T1059.003","T1068","T1070.004","T1071.001","T1105","T1113","T1115","T1132.001","T1218.011","T1543.003","T1546.015","T1547.001","T1680"]},{"id":"S0201","name":"JPIN","type":"software","techniques":["T1007","T1012","T1016","T1027","T1033","T1055","T1056.001","T1057","T1059.003","T1069.001","T1070.004","T1071.002","T1071.003","T1082","T1083","T1105","T1197","T1222.001","T1518.001","T1562.001"]},{"id":"S0648","name":"JSS Loader","type":"software","techniques":["T1053.005","T1059.001","T1059.005","T1059.007","T1105","T1204.002","T1566.001"]},{"id":"S0163","name":"Janicab","type":"software","techniques":["T1053.003","T1113","T1123","T1553.002"]},{"id":"S0528","name":"Javali","type":"software","techniques":["T1027.001","T1057","T1059.005","T1102.001","T1105","T1204.001","T1204.002","T1218.007","T1555.003","T1566.001","T1566.002","T1574.001"]},{"id":"S1206","name":"JumbledPath","type":"software","techniques":["T1040","T1070.002","T1104","T1560","T1562","T1665"]},{"id":"S0215","name":"KARAE","type":"software","techniques":["T1082","T1102.002","T1105","T1189"]},{"id":"S0271","name":"KEYMARBLE","type":"software","techniques":["T1016","T1057","T1059.003","T1070.004","T1082","T1083","T1105","T1112","T1113","T1573.001","T1680"]},{"id":"S1051","name":"KEYPLUG","type":"software","techniques":["T1027.013","T1071.001","T1090","T1095","T1102.001","T1124","T1140","T1573.002"]},{"id":"S0526","name":"KGH_SPY","type":"software","techniques":["T1005","T1027.013","T1036.005","T1037.001","T1041","T1056.001","T1059.001","T1059.003","T1071.001","T1074.001","T1083","T1105","T1114.001","T1140","T1204.002","T1518","T1555","T1555.003","T1555.004","T1680"]},{"id":"S0669","name":"KOCTOPUS","type":"software","techniques":["T1027.010","T1036.005","T1059.001","T1059.003","T1059.005","T1070.009","T1082","T1090","T1105","T1106","T1112","T1140","T1204.001","T1204.002","T1547.001","T1548.002","T1562.001","T1564.003","T1566.001","T1566.002"]},{"id":"S0156","name":"KOMPROGO","type":"software","techniques":["T1047","T1059.003","T1082"]},{"id":"S0356","name":"KONNI","type":"software","techniques":["T1005","T1016","T1027.002","T1027.013","T1033","T1036.004","T1036.005","T1041","T1048.003","T1049","T1056.001","T1057","T1059.001","T1059.003","T1059.007","T1070.004","T1071.001","T1082","T1083","T1105","T1106","T1112","T1113","T1115","T1132.001","T1134.002","T1134.004","T1140","T1204.002","T1218.011","T1543.003","T1546.015","T1547.001","T1547.009","T1548.002","T1555.003","T1560","T1566.001","T1573.001","T1680"]},{"id":"S1075","name":"KOPILUWAK","type":"software","techniques":["T1005","T1016","T1033","T1041","T1049","T1057","T1059.007","T1071.001","T1074.001","T1135","T1204.002","T1566.001","T1680"]},{"id":"S1190","name":"Kapeka","type":"software","techniques":["T1012","T1027.013","T1036.008","T1053.005","T1059.003","T1070.009","T1071.001","T1082","T1090","T1106","T1112","T1132.001","T1140","T1218.011"]},{"id":"S0088","name":"Kasidet","type":"software","techniques":["T1056.001","T1057","T1059.003","T1082","T1083","T1105","T1113","T1518.001","T1547.001","T1562.004"]},{"id":"S0265","name":"Kazuar","type":"software","techniques":["T1005","T1008","T1010","T1016","T1027","T1029","T1033","T1047","T1055.001","T1057","T1059.003","T1059.004","T1069.001","T1070.004","T1071.001","T1071.002","T1074.001","T1082","T1083","T1087.001","T1090.001","T1102.002","T1105","T1113","T1125","T1132.001","T1485","T1543.003","T1547.001","T1547.009","T1680"]},{"id":"S0585","name":"Kerrdown","type":"software","techniques":["T1027.013","T1027.015","T1059.005","T1082","T1105","T1140","T1204.001","T1204.002","T1566.001","T1566.002","T1574.001"]},{"id":"S0487","name":"Kessel","type":"software","techniques":["T1016","T1027.013","T1030","T1041","T1048.003","T1059","T1082","T1090","T1105","T1132.001","T1140","T1554","T1556","T1560"]},{"id":"S1020","name":"Kevin","type":"software","techniques":["T1001.001","T1005","T1008","T1016","T1027.013","T1030","T1036.003","T1041","T1059.003","T1070.004","T1071.001","T1071.004","T1074","T1082","T1105","T1106","T1132.001","T1497","T1546.003","T1564.003","T1572"]},{"id":"S0387","name":"KeyBoy","type":"software","techniques":["T1001.003","T1016","T1027.013","T1056.001","T1059.001","T1059.003","T1059.005","T1059.006","T1070.006","T1082","T1083","T1105","T1113","T1543.003","T1547.004","T1555.003","T1559.002","T1564.003"]},{"id":"S0276","name":"Keydnap","type":"software","techniques":["T1036.006","T1056.002","T1059.006","T1071.001","T1090.003","T1543.001","T1548.001","T1555.002","T1564.009"]},{"id":"S0607","name":"KillDisk","type":"software","techniques":["T1027","T1036.004","T1057","T1070.001","T1070.004","T1083","T1106","T1129","T1134","T1485","T1486","T1489","T1529","T1561.002","T1680"]},{"id":"S0599","name":"Kinsing","type":"software","techniques":["T1018","T1021.004","T1053.003","T1057","T1059.004","T1071.001","T1078","T1083","T1105","T1110","T1133","T1222.002","T1496.001","T1552.003","T1552.004","T1609","T1610"]},{"id":"S0437","name":"Kivars","type":"software","techniques":["T1021","T1056.001","T1070.004","T1083","T1105","T1113","T1564.003"]},{"id":"S0250","name":"Koadic","type":"software","techniques":["T1003.002","T1003.003","T1005","T1016","T1021.001","T1033","T1046","T1047","T1053.005","T1055.001","T1059.001","T1059.003","T1059.005","T1071.001","T1082","T1083","T1105","T1115","T1135","T1218.005","T1218.010","T1218.011","T1547.001","T1548.002","T1564.003","T1569.002","T1573.002"]},{"id":"S0641","name":"Kobalos","type":"software","techniques":["T1016","T1027","T1048","T1056","T1059.004","T1070.003","T1070.006","T1074","T1082","T1090.003","T1140","T1205","T1554","T1573.001","T1573.002"]},{"id":"S0162","name":"Komplex","type":"software","techniques":["T1033","T1057","T1070.004","T1071.001","T1543.001","T1564.001","T1573.001"]},{"id":"S0236","name":"Kwampirs","type":"software","techniques":["T1007","T1008","T1016","T1018","T1021.002","T1027.001","T1027.013","T1033","T1036.004","T1049","T1057","T1069.001","T1069.002","T1082","T1083","T1087.001","T1105","T1135","T1140","T1201","T1218.011","T1543.003"]},{"id":"S1119","name":"LIGHTWIRE","type":"software","techniques":["T1071.001","T1140","T1505.003","T1554","T1573.001"]},{"id":"S1121","name":"LITTLELAMB.WOOLTEA","type":"software","techniques":["T1082","T1083","T1090","T1095","T1543","T1554","T1573.002"]},{"id":"S0042","name":"LOWBALL","type":"software","techniques":["T1071.001","T1102.002","T1105"]},{"id":"S0349","name":"LaZagne","type":"software","techniques":["T1003.001","T1003.004","T1003.005","T1003.007","T1003.008","T1552.001","T1555","T1555.001","T1555.003","T1555.004"]},{"id":"S1160","name":"Latrodectus","type":"software","techniques":["T1005","T1016","T1021.005","T1027.001","T1027.002","T1027.007","T1027.013","T1033","T1036.005","T1041","T1047","T1053.005","T1057","T1059.003","T1059.007","T1069.002","T1070.004","T1071.001","T1082","T1083","T1087.002","T1102","T1104","T1105","T1106","T1132.001","T1135","T1140","T1204.001","T1204.002","T1218.007","T1218.011","T1482","T1497.001","T1518.001","T1529","T1547.001","T1559.001","T1564.004","T1566.001","T1566.002","T1573.001","T1622"]},{"id":"S0395","name":"LightNeuron","type":"software","techniques":["T1001.002","T1005","T1016","T1020","T1027.013","T1029","T1036.005","T1041","T1059.003","T1070.004","T1071.003","T1074.001","T1082","T1105","T1106","T1114.002","T1119","T1140","T1505.002","T1560","T1565.002","T1573.001"]},{"id":"S1185","name":"LightSpy","type":"software","techniques":["T1027.001","T1027.013","T1041","T1046","T1057","T1071.001","T1082","T1083","T1105","T1113","T1123","T1129","T1217","T1480","T1518","T1555.001"]},{"id":"S1186","name":"Line Dancer","type":"software","techniques":["T1014","T1040","T1041","T1059.008","T1071.001","T1082","T1140","T1562.003","T1653"]},{"id":"S1188","name":"Line Runner","type":"software","techniques":["T1027.015","T1041","T1059.011","T1070.004","T1071.001","T1505.003","T1557","T1653"]},{"id":"S0211","name":"Linfo","type":"software","techniques":["T1005","T1008","T1029","T1057","T1059.003","T1070.004","T1082","T1083","T1105"]},{"id":"S0362","name":"Linux Rabbit","type":"software","techniques":["T1033","T1078","T1110.003","T1132","T1133","T1546.004"]},{"id":"S0513","name":"LiteDuke","type":"software","techniques":["T1012","T1016","T1027.002","T1027.003","T1033","T1070.004","T1071.001","T1082","T1105","T1140","T1497.003","T1518.001","T1547.001"]},{"id":"S0680","name":"LitePower","type":"software","techniques":["T1012","T1033","T1041","T1053.005","T1059.001","T1071.001","T1082","T1105","T1106","T1113","T1518.001","T1680"]},{"id":"S0681","name":"Lizar","type":"software","techniques":["T1003.001","T1016","T1027","T1033","T1049","T1055","T1055.001","T1055.002","T1057","T1059.001","T1059.003","T1059.006","T1082","T1087.003","T1095","T1105","T1106","T1113","T1132.002","T1140","T1217","T1518.001","T1555.003","T1555.004","T1560","T1573","T1588.002","T1620"]},{"id":"S1101","name":"LoFiSe","type":"software","techniques":["T1005","T1074.001","T1083","T1119","T1560","T1574.001"]},{"id":"S0397","name":"LoJax","type":"software","techniques":["T1014","T1112","T1542.001","T1547.001","T1564.004"]},{"id":"S1199","name":"LockBit 2.0","type":"software","techniques":["T1021.002","T1047","T1053.005","T1057","T1059.001","T1059.003","T1070.001","T1070.004","T1082","T1083","T1112","T1120","T1135","T1136","T1140","T1480","T1484.001","T1486","T1489","T1490","T1547.001","T1548.002","T1562.001","T1564.003","T1614.001","T1680"]},{"id":"S1202","name":"LockBit 3.0","type":"software","techniques":["T1021.002","T1027.002","T1027.013","T1057","T1059.001","T1070.001","T1070.004","T1071.001","T1078.003","T1082","T1083","T1106","T1112","T1120","T1132.001","T1135","T1140","T1218.003","T1480","T1480.002","T1484.001","T1486","T1489","T1490","T1543.003","T1547.004","T1548.002","T1562.001","T1562.009","T1569.002","T1573.001","T1614.001","T1622","T1680"]},{"id":"S0372","name":"LockerGoga","type":"software","techniques":["T1070.004","T1486","T1529","T1531","T1553.002","T1562.001","T1570"]},{"id":"S0447","name":"Lokibot","type":"software","techniques":["T1016","T1027","T1027.002","T1033","T1041","T1053","T1053.005","T1055.012","T1056.001","T1059.001","T1059.003","T1059.005","T1070.004","T1071.001","T1082","T1083","T1105","T1106","T1112","T1140","T1204.002","T1497.003","T1548.002","T1555","T1555.003","T1564.001","T1566.001","T1620"]},{"id":"S0582","name":"LookBack","type":"software","techniques":["T1007","T1036.005","T1057","T1059.003","T1059.005","T1070.004","T1071.001","T1083","T1095","T1113","T1140","T1489","T1529","T1547.001","T1573.001","T1574.001"]},{"id":"S0451","name":"LoudMiner","type":"software","techniques":["T1016","T1027.010","T1027.013","T1057","T1059.003","T1059.004","T1070.004","T1082","T1105","T1189","T1218.007","T1496.001","T1543.003","T1543.004","T1564.001","T1564.006","T1569.001","T1569.002"]},{"id":"S0532","name":"Lucifer","type":"software","techniques":["T1012","T1016","T1021.002","T1027.002","T1033","T1046","T1047","T1049","T1053.005","T1057","T1059.003","T1070.001","T1071","T1082","T1105","T1110.001","T1140","T1210","T1496.001","T1497.001","T1498","T1547.001","T1570","T1573.001"]},{"id":"S1213","name":"Lumma Stealer","type":"software","techniques":["T1027","T1027.013","T1036.008","T1041","T1055.012","T1059.001","T1059.006","T1059.010","T1071.001","T1074.001","T1082","T1113","T1119","T1140","T1176.001","T1195","T1204","T1204.002","T1217","T1218.005","T1218.015","T1497.001","T1518.001","T1539","T1547.001","T1553.002","T1555.003","T1562.001","T1564.003","T1566.001","T1566.002","T1573.002","T1574.001","T1620","T1622"]},{"id":"S1143","name":"LunarLoader","type":"software","techniques":["T1016","T1137.006","T1140","T1480","T1620"]},{"id":"S1142","name":"LunarMail","type":"software","techniques":["T1001.002","T1027.013","T1041","T1059.005","T1070.004","T1070.008","T1071.003","T1074.001","T1082","T1083","T1095","T1113","T1114.001","T1137.006","T1140","T1204.002","T1543"]},{"id":"S1141","name":"LunarWeb","type":"software","techniques":["T1001.002","T1016","T1027.013","T1030","T1033","T1047","T1049","T1057","T1059.001","T1059.003","T1069.001","T1070.004","T1071.001","T1082","T1083","T1090","T1104","T1132.001","T1135","T1140","T1497.003","T1518","T1518.001","T1559","T1560.001","T1560.002","T1572","T1573.001","T1573.002","T1615"]},{"id":"S0010","name":"Lurid","type":"software","techniques":["T1560","T1573.001"]},{"id":"S0500","name":"MCMD","type":"software","techniques":["T1005","T1027","T1036.005","T1053.005","T1059.003","T1070.009","T1071.001","T1105","T1547.001","T1564.003"]},{"id":"S1220","name":"MEDUSA","type":"software","techniques":["T1014","T1027.013","T1563.001","T1574.006"]},{"id":"S0443","name":"MESSAGETAP","type":"software","techniques":["T1040","T1049","T1070.004","T1074.001","T1083","T1119","T1140","T1560.003"]},{"id":"S1221","name":"MOPSLED","type":"software","techniques":["T1027.013","T1071.001","T1095","T1102","T1102.001","T1140"]},{"id":"S0233","name":"MURKYTOP","type":"software","techniques":["T1018","T1046","T1053.002","T1059.003","T1069","T1070.004","T1082","T1087.001","T1135"]},{"id":"S1016","name":"MacMa","type":"software","techniques":["T1005","T1016","T1021","T1033","T1041","T1056.001","T1057","T1059.004","T1070.002","T1070.004","T1070.006","T1074.001","T1082","T1083","T1095","T1105","T1106","T1113","T1123","T1140","T1543.001","T1553.001","T1553.002","T1555.001","T1571","T1573","T1680"]},{"id":"S0282","name":"MacSpy","type":"software","techniques":["T1056.001","T1070.004","T1071.001","T1090.003","T1113","T1115","T1123","T1543.001","T1564.001"]},{"id":"S0409","name":"Machete","type":"software","techniques":["T1005","T1008","T1010","T1016","T1016.002","T1020","T1025","T1027.002","T1027.010","T1029","T1036.004","T1036.005","T1041","T1052.001","T1053.005","T1056.001","T1057","T1059.006","T1070.004","T1071.001","T1071.002","T1074.001","T1082","T1083","T1105","T1113","T1115","T1120","T1123","T1125","T1132.001","T1140","T1217","T1547.001","T1552.004","T1555.003","T1560","T1560.003","T1564.001","T1573.001","T1573.002"]},{"id":"S1060","name":"Mafalda","type":"software","techniques":["T1003.001","T1005","T1012","T1016","T1027.013","T1033","T1041","T1049","T1056","T1057","T1059.001","T1059.003","T1070.001","T1071.001","T1074.001","T1082","T1083","T1090.001","T1095","T1105","T1106","T1112","T1113","T1132.001","T1133","T1134","T1134.003","T1140","T1205.001","T1217","T1518.001","T1552.004","T1569.002","T1573.001","T1622","T1680"]},{"id":"S1182","name":"MagicRAT","type":"software","techniques":["T1016","T1027.013","T1036.005","T1036.008","T1041","T1053.005","T1059.003","T1070.004","T1071.001","T1082","T1105","T1140","T1547.001"]},{"id":"S0413","name":"MailSniper","type":"software","techniques":["T1087.003","T1110.003","T1114.002"]},{"id":"S1169","name":"Mango","type":"software","techniques":["T1027.013","T1033","T1041","T1053.005","T1071.001","T1082","T1083","T1106","T1132.001","T1204.002","T1562.001","T1573.001","T1573.002"]},{"id":"S1156","name":"Manjusaka","type":"software","techniques":["T1016","T1041","T1059.003","T1071.001","T1082","T1083","T1113","T1132.001","T1555","T1555.003"]},{"id":"S0652","name":"MarkiRAT","type":"software","techniques":["T1005","T1033","T1036.005","T1041","T1056.001","T1057","T1059.003","T1071.001","T1074.001","T1082","T1083","T1105","T1106","T1113","T1115","T1197","T1518","T1518.001","T1547.001","T1547.009","T1555.005","T1614.001"]},{"id":"S0167","name":"Matryoshka","type":"software","techniques":["T1027","T1053.005","T1055.001","T1056.001","T1059","T1071.004","T1113","T1218.011","T1547.001","T1555"]},{"id":"S0449","name":"Maze","type":"software","techniques":["T1027","T1027.016","T1036.004","T1047","T1049","T1053.005","T1055.001","T1057","T1059.003","T1070","T1071.001","T1082","T1106","T1218.007","T1486","T1489","T1490","T1529","T1547.001","T1562.001","T1564.006","T1568","T1614.001"]},{"id":"S0459","name":"MechaFlounder","type":"software","techniques":["T1033","T1036.005","T1041","T1059.003","T1059.006","T1071.001","T1105","T1132.001"]},{"id":"S1244","name":"Medusa Ransomware","type":"software","techniques":["T1007","T1027.013","T1057","T1059.001","T1059.003","T1070.004","T1082","T1083","T1106","T1124","T1135","T1140","T1486","T1489","T1490","T1518.001","T1543.003","T1559","T1562.001","T1564.003","T1679","T1680"]},{"id":"S0576","name":"MegaCortex","type":"software","techniques":["T1055.001","T1059.003","T1083","T1106","T1112","T1134","T1140","T1218.011","T1486","T1489","T1490","T1497.001","T1531","T1561.001","T1562.001","T1588.003"]},{"id":"S1191","name":"Megazord","type":"software","techniques":["T1057","T1059.003","T1083","T1486","T1489","T1654"]},{"id":"S0530","name":"Melcoz","type":"software","techniques":["T1027.002","T1059.005","T1059.010","T1105","T1115","T1185","T1204.001","T1218.007","T1555.003","T1565.002","T1566.002","T1574.001"]},{"id":"S0455","name":"Metamorfo","type":"software","techniques":["T1010","T1027.002","T1027.013","T1033","T1036.005","T1041","T1055.001","T1056.001","T1056.002","T1057","T1059.003","T1059.005","T1059.007","T1070","T1070.004","T1071.001","T1082","T1083","T1095","T1102.001","T1102.003","T1105","T1106","T1112","T1113","T1115","T1119","T1124","T1129","T1140","T1204.002","T1218.005","T1218.007","T1497","T1518","T1518.001","T1547.001","T1553.002","T1562.001","T1564.003","T1565.002","T1566.001","T1571","T1573.001","T1573.002","T1574.001"]},{"id":"S0688","name":"Meteor","type":"software","techniques":["T1036.004","T1047","T1053.005","T1057","T1059.001","T1059.003","T1070.001","T1070.004","T1082","T1105","T1106","T1484.001","T1485","T1489","T1490","T1491.001","T1518.001","T1531","T1562.001","T1564.003"]},{"id":"S1146","name":"MgBot","type":"software","techniques":["T1003","T1005","T1018","T1025","T1033","T1046","T1056.001","T1057","T1087.001","T1087.002","T1115","T1123","T1213.006","T1482","T1539","T1555","T1555.003"]},{"id":"S0339","name":"Micropsia","type":"software","techniques":["T1027.013","T1033","T1047","T1056.001","T1059.003","T1071.001","T1082","T1083","T1105","T1113","T1119","T1123","T1518.001","T1547.009","T1560.001","T1564.001"]},{"id":"S1015","name":"Milan","type":"software","techniques":["T1005","T1012","T1016","T1027.013","T1033","T1036","T1036.007","T1053.005","T1059.003","T1070.004","T1071.001","T1071.004","T1074.001","T1082","T1087.001","T1105","T1106","T1559.001","T1568.002","T1572"]},{"id":"S0002","name":"Mimikatz","type":"software","techniques":["T1003.001","T1003.002","T1003.004","T1003.006","T1098","T1134.005","T1207","T1547.005","T1550.002","T1550.003","T1552.004","T1555","T1555.003","T1555.004","T1558.001","T1558.002","T1649"]},{"id":"S0051","name":"MiniDuke","type":"software","techniques":["T1008","T1027","T1071.001","T1082","T1083","T1090.001","T1102.001","T1105","T1568.002"]},{"id":"S0280","name":"MirageFox","type":"software","techniques":["T1033","T1059.003","T1082","T1140","T1574.001"]},{"id":"S0084","name":"Mis-Type","type":"software","techniques":["T1005","T1008","T1016","T1033","T1036.005","T1041","T1055","T1059.003","T1071.001","T1074.001","T1082","T1087.001","T1095","T1105","T1106","T1132.001","T1136.001","T1547"]},{"id":"S0083","name":"Misdat","type":"software","techniques":["T1005","T1027.002","T1036.005","T1041","T1059.003","T1070.004","T1070.006","T1070.009","T1082","T1083","T1095","T1105","T1106","T1132.001","T1547","T1614.001"]},{"id":"S1122","name":"Mispadu","type":"software","techniques":["T1027.013","T1041","T1055","T1056.001","T1056.002","T1057","T1059.005","T1082","T1083","T1106","T1113","T1115","T1140","T1176.001","T1204.002","T1217","T1218.007","T1218.011","T1497.001","T1518.001","T1547.001","T1555","T1555.003","T1566.002","T1573.002","T1614.001"]},{"id":"S0080","name":"Mivast","type":"software","techniques":["T1003.002","T1059.003","T1105","T1547.001"]},{"id":"S0079","name":"MobileOrder","type":"software","techniques":["T1005","T1041","T1057","T1082","T1083","T1105","T1217"]},{"id":"S0553","name":"MoleNet","type":"software","techniques":["T1047","T1059.001","T1059.003","T1082","T1105","T1518.001","T1547.001"]},{"id":"S1137","name":"Moneybird","type":"software","techniques":["T1027.009","T1486"]},{"id":"S1026","name":"Mongall","type":"software","techniques":["T1005","T1027.002","T1041","T1055.001","T1071.001","T1082","T1105","T1120","T1132.001","T1140","T1204.002","T1218.011","T1547.001","T1573.001","T1680"]},{"id":"S0149","name":"MoonWind","type":"software","techniques":["T1016","T1033","T1056.001","T1057","T1059.003","T1070.004","T1074.001","T1082","T1083","T1095","T1120","T1124","T1543.003","T1571","T1573.001"]},{"id":"S0284","name":"More_eggs","type":"software","techniques":["T1016","T1016.001","T1027.013","T1033","T1059.003","T1070.004","T1071.001","T1082","T1105","T1132.001","T1140","T1218.010","T1518.001","T1553.002","T1573.001"]},{"id":"S1047","name":"Mori","type":"software","techniques":["T1001.001","T1012","T1070.004","T1071.001","T1071.004","T1112","T1132.001","T1140","T1218.010"]},{"id":"S0256","name":"Mosquito","type":"software","techniques":["T1016","T1027.011","T1027.013","T1033","T1047","T1057","T1059.001","T1059.003","T1070.004","T1105","T1106","T1112","T1218.011","T1518.001","T1546.015","T1547.001","T1573.001"]},{"id":"S1135","name":"MultiLayer Wiper","type":"software","techniques":["T1027.009","T1053.005","T1059.003","T1070","T1070.001","T1070.004","T1070.006","T1083","T1485","T1490","T1529","T1561.002","T1562.001","T1565.001"]},{"id":"S0699","name":"Mythic","type":"software","techniques":["T1008","T1030","T1071.001","T1071.002","T1071.004","T1090.001","T1090.002","T1090.004","T1095","T1119","T1132","T1572","T1573.002"]},{"id":"S0590","name":"NBTscan","type":"software","techniques":["T1016","T1018","T1033","T1040","T1046"]},{"id":"S0272","name":"NDiskMonitor","type":"software","techniques":["T1033","T1082","T1083","T1105","T1573.001"]},{"id":"S0034","name":"NETEAGLE","type":"software","techniques":["T1008","T1041","T1057","T1059.003","T1071","T1071.001","T1083","T1095","T1547.001","T1568","T1573.001"]},{"id":"S0198","name":"NETWIRE","type":"software","techniques":["T1010","T1016","T1027","T1027.002","T1027.011","T1036.001","T1036.005","T1049","T1053.003","T1053.005","T1055","T1055.012","T1056.001","T1057","T1059.001","T1059.003","T1059.004","T1059.005","T1071.001","T1074.001","T1082","T1083","T1090","T1095","T1102","T1105","T1106","T1112","T1113","T1119","T1204.001","T1204.002","T1543.001","T1547.001","T1547.013","T1547.015","T1555","T1555.003","T1560","T1560.003","T1564.001","T1566.001","T1566.002","T1573","T1573.001"]},{"id":"S1106","name":"NGLite","type":"software","techniques":["T1016","T1033","T1071.001","T1090.003","T1573.001"]},{"id":"S1192","name":"NICECURL","type":"software","techniques":["T1059","T1070.004","T1071.001","T1105","T1573.002"]},{"id":"S1107","name":"NKAbuse","type":"software","techniques":["T1016.001","T1053.003","T1057","T1059.004","T1082","T1090.003","T1113","T1498"]},{"id":"S0353","name":"NOKKI","type":"software","techniques":["T1016","T1027","T1033","T1036.005","T1056.004","T1070.004","T1071.001","T1071.002","T1074.001","T1082","T1105","T1124","T1140","T1218.011","T1547.001","T1680"]},{"id":"S1131","name":"NPPSPY","type":"software","techniques":["T1005","T1056","T1112","T1119","T1552","T1557","T1656"]},{"id":"S0205","name":"Naid","type":"software","techniques":["T1016","T1082","T1112","T1543.003"]},{"id":"S0228","name":"NanHaiShu","type":"software","techniques":["T1016","T1027.013","T1033","T1059.005","T1059.007","T1070.004","T1071.004","T1082","T1105","T1218.005","T1547.001","T1562.001"]},{"id":"S0336","name":"NanoCore","type":"software","techniques":["T1016","T1027","T1056.001","T1059.003","T1059.005","T1105","T1112","T1123","T1125","T1547.001","T1562.001","T1562.004","T1573.001"]},{"id":"S0637","name":"NativeZone","type":"software","techniques":["T1036","T1140","T1204.002","T1218.011","T1480","T1497.001"]},{"id":"S0247","name":"NavRAT","type":"software","techniques":["T1055","T1056.001","T1057","T1059.003","T1071.003","T1074.001","T1082","T1105","T1547.001"]},{"id":"S0630","name":"Nebulae","type":"software","techniques":["T1005","T1036.004","T1036.005","T1057","T1059.003","T1070.004","T1083","T1095","T1105","T1106","T1543.003","T1547.001","T1573.001","T1574.001","T1680"]},{"id":"S1189","name":"Neo-reGeorg","type":"software","techniques":["T1059.006","T1071.001","T1090","T1095","T1105","T1132.002","T1505.003","T1572"]},{"id":"S0691","name":"Neoichor","type":"software","techniques":["T1005","T1016","T1016.001","T1033","T1070","T1071.001","T1082","T1105","T1112","T1559.001","T1614.001"]},{"id":"S0210","name":"Nerex","type":"software","techniques":["T1105","T1112","T1543.003","T1553.002"]},{"id":"S0039","name":"Net","type":"software","techniques":["T1007","T1018","T1021.002","T1049","T1069.001","T1069.002","T1070.005","T1087.001","T1087.002","T1098.007","T1124","T1135","T1136.001","T1136.002","T1201","T1569.002"]},{"id":"S0056","name":"Net Crawler","type":"software","techniques":["T1003.001","T1021.002","T1110.002","T1569.002"]},{"id":"S0033","name":"NetTraveler","type":"software","techniques":["T1010","T1056.001"]},{"id":"S0457","name":"Netwalker","type":"software","techniques":["T1027.009","T1027.010","T1047","T1055.001","T1059.001","T1059.003","T1082","T1105","T1106","T1112","T1140","T1486","T1489","T1490","T1518.001","T1562.001","T1569.002","T1570"]},{"id":"S0118","name":"Nidiran","type":"software","techniques":["T1036.004","T1105","T1543.003"]},{"id":"S1090","name":"NightClub","type":"software","techniques":["T1005","T1010","T1027","T1036.004","T1036.005","T1041","T1056.001","T1057","T1070.006","T1071.003","T1071.004","T1074.001","T1083","T1105","T1106","T1112","T1113","T1120","T1123","T1132.002","T1543.003"]},{"id":"S1147","name":"Nightdoor","type":"software","techniques":["T1016","T1033","T1053.005","T1057","T1059.003","T1070.004","T1071","T1082","T1102","T1124","T1140","T1497.001","T1574","T1680"]},{"id":"S1100","name":"Ninja","type":"software","techniques":["T1001","T1001.003","T1016","T1027.013","T1027.015","T1029","T1036.005","T1055","T1057","T1070.006","T1071.001","T1082","T1083","T1090.001","T1090.003","T1095","T1106","T1132.002","T1140","T1204.002","T1218.011","T1480.001","T1543.003","T1559","T1566.003","T1573.001","T1574.001","T1680"]},{"id":"S0359","name":"Nltest","type":"software","techniques":["T1016","T1018","T1482"]},{"id":"S0368","name":"NotPetya","type":"software","techniques":["T1003.001","T1021.002","T1036","T1047","T1053.005","T1070.001","T1078.003","T1083","T1210","T1218.011","T1486","T1518.001","T1529","T1569.002"]},{"id":"S1170","name":"ODAgent","type":"software","techniques":["T1041","T1059.003","T1070.004","T1083","T1102.002","T1105","T1106","T1140","T1567.002"]},{"id":"S0138","name":"OLDBAIT","type":"software","techniques":["T1027","T1036.005","T1071.001","T1071.003","T1555","T1555.003"]},{"id":"S0165","name":"OSInfo","type":"software","techniques":["T1012","T1016","T1018","T1049","T1069.001","T1069.002","T1082","T1087.001","T1087.002","T1135"]},{"id":"S0402","name":"OSX/Shlayer","type":"software","techniques":["T1036.005","T1059.004","T1082","T1083","T1105","T1140","T1176.001","T1204.002","T1222.002","T1548.004","T1553.001","T1564","T1564.001","T1564.009","T1564.011"]},{"id":"S0352","name":"OSX_OCEANLOTUS.D","type":"software","techniques":["T1005","T1016","T1027.002","T1027.013","T1036.004","T1036.008","T1059.001","T1059.004","T1059.005","T1070.004","T1070.006","T1071.001","T1082","T1095","T1105","T1129","T1132.001","T1140","T1222.002","T1497.001","T1543.001","T1543.004","T1553.001","T1560.002","T1560.003","T1564.001","T1571","T1573.001"]},{"id":"S0644","name":"ObliqueRAT","type":"software","techniques":["T1025","T1027.003","T1030","T1033","T1057","T1074.001","T1082","T1083","T1113","T1120","T1125","T1204.001","T1497.001","T1547.001"]},{"id":"S0346","name":"OceanSalt","type":"software","techniques":["T1016","T1057","T1059.003","T1070.004","T1082","T1083","T1132.002","T1566.001"]},{"id":"S0340","name":"Octopus","type":"software","techniques":["T1005","T1016","T1033","T1036.005","T1041","T1047","T1071.001","T1074.001","T1082","T1083","T1105","T1113","T1132.001","T1204.002","T1547.001","T1560.001","T1566.001","T1567.002","T1680"]},{"id":"S1172","name":"OilBooster","type":"software","techniques":["T1008","T1033","T1041","T1059.003","T1071.001","T1074.001","T1082","T1102.002","T1105","T1106","T1140","T1559","T1564.003","T1567.002","T1573.002"]},{"id":"S1171","name":"OilCheck","type":"software","techniques":["T1102.002","T1105","T1567"]},{"id":"S0439","name":"Okrum","type":"software","techniques":["T1001","T1001.003","T1003.001","T1003.005","T1016","T1027.003","T1033","T1036.004","T1041","T1049","T1053.005","T1056.001","T1059.003","T1070.004","T1071.001","T1082","T1083","T1090.002","T1105","T1124","T1132.001","T1134.001","T1140","T1497.001","T1497.002","T1497.003","T1543.003","T1547.001","T1547.009","T1560.001","T1560.003","T1564.001","T1569.002","T1573.001"]},{"id":"S0365","name":"Olympic Destroyer","type":"software","techniques":["T1003.001","T1016","T1018","T1021.002","T1047","T1070.001","T1135","T1485","T1489","T1490","T1529","T1555.003","T1569.002","T1570"]},{"id":"S0052","name":"OnionDuke","type":"software","techniques":["T1003","T1071.001","T1102.003","T1140","T1499"]},{"id":"S0264","name":"OopsIE","type":"software","techniques":["T1027","T1027.002","T1030","T1041","T1047","T1053.005","T1059.003","T1059.005","T1070.004","T1071.001","T1074.001","T1082","T1105","T1124","T1132.001","T1140","T1497.001","T1560.001","T1560.003"]},{"id":"S0229","name":"Orz","type":"software","techniques":["T1016","T1027","T1055.012","T1057","T1059.003","T1070","T1082","T1083","T1102.002","T1105","T1112","T1218.010","T1518"]},{"id":"S0594","name":"Out1","type":"software","techniques":["T1005","T1027","T1059.003","T1071.001","T1114.001"]},{"id":"S1017","name":"OutSteel","type":"software","techniques":["T1005","T1020","T1036.005","T1041","T1057","T1059.003","T1059.010","T1070.004","T1071.001","T1083","T1105","T1119","T1204.001","T1204.002","T1566.001","T1566.002","T1570"]},{"id":"S0072","name":"OwaAuth","type":"software","techniques":["T1036.005","T1056.001","T1070.006","T1071.001","T1083","T1505.003","T1505.004","T1560.003"]},{"id":"S0598","name":"P.A.S. Webshell","type":"software","techniques":["T1005","T1027","T1046","T1059","T1070.004","T1071.001","T1083","T1087.001","T1105","T1110.001","T1140","T1213.006","T1222.002","T1505.003","T1518"]},{"id":"S0626","name":"P8RAT","type":"software","techniques":["T1001.001","T1057","T1105","T1497.001","T1497.003"]},{"id":"S1109","name":"PACEMAKER","type":"software","techniques":["T1003.007","T1055.008","T1059.004","T1074.001","T1083","T1119"]},{"id":"S1233","name":"PAKLOG","type":"software","techniques":["T1010","T1027.013","T1056.001","T1057","T1074.001","T1106","T1115","T1124","T1553.002","T1574.001"]},{"id":"S0158","name":"PHOREAL","type":"software","techniques":["T1059.003","T1095","T1112"]},{"id":"S1123","name":"PITSTOP","type":"software","techniques":["T1059.004","T1140","T1205.002","T1559","T1573.002"]},{"id":"S0254","name":"PLAINTEE","type":"software","techniques":["T1016","T1057","T1059.003","T1082","T1105","T1112","T1547.001","T1548.002","T1573.001"]},{"id":"S0435","name":"PLEAD","type":"software","techniques":["T1001.001","T1010","T1057","T1059.003","T1070.004","T1071.001","T1083","T1090","T1105","T1106","T1204.001","T1204.002","T1555","T1555.003","T1573.001"]},{"id":"S0216","name":"POORAIM","type":"software","techniques":["T1057","T1082","T1083","T1102.002","T1113","T1189"]},{"id":"S0150","name":"POSHSPY","type":"software","techniques":["T1027","T1030","T1059.001","T1070.006","T1105","T1546.003","T1568.002","T1573.002"]},{"id":"S0145","name":"POWERSOURCE","type":"software","techniques":["T1012","T1059.001","T1071.004","T1105","T1547.001","T1564.004"]},{"id":"S0223","name":"POWERSTATS","type":"software","techniques":["T1005","T1016","T1027.010","T1027.016","T1029","T1033","T1036.004","T1047","T1053.005","T1057","T1059.001","T1059.005","T1059.007","T1070.004","T1082","T1087.001","T1090.002","T1105","T1113","T1132.001","T1140","T1218.005","T1518.001","T1559.001","T1559.002","T1562.001","T1573.002"]},{"id":"S0371","name":"POWERTON","type":"software","techniques":["T1003.002","T1059.001","T1071.001","T1546.003","T1547.001","T1573.001"]},{"id":"S0184","name":"POWRUNER","type":"software","techniques":["T1012","T1016","T1033","T1047","T1049","T1053.005","T1057","T1059.001","T1059.003","T1069.001","T1069.002","T1071.001","T1071.004","T1082","T1083","T1087.002","T1105","T1113","T1132.001","T1518.001"]},{"id":"S0613","name":"PS1","type":"software","techniques":["T1027.013","T1055.001","T1059.001","T1105","T1140"]},{"id":"S1228","name":"PUBLOAD","type":"software","techniques":["T1001.003","T1007","T1012","T1016","T1016.001","T1016.002","T1027","T1027.015","T1033","T1036.005","T1047","T1048.003","T1049","T1053.005","T1057","T1059.003","T1071.001","T1071.002","T1082","T1105","T1106","T1124","T1140","T1205","T1480.001","T1518","T1518.001","T1547.001","T1553.002","T1560.001","T1573.001","T1574.001","T1614.001","T1622","T1680"]},{"id":"S1108","name":"PULSECHECK","type":"software","techniques":["T1059.004","T1071.001","T1132.001","T1505.003"]},{"id":"S0196","name":"PUNCHBUGGY","type":"software","techniques":["T1027","T1036.005","T1059.001","T1059.006","T1070.004","T1071.001","T1074.001","T1082","T1087.001","T1105","T1129","T1140","T1218.011","T1518.001","T1546.009","T1547.001","T1560.001"]},{"id":"S0197","name":"PUNCHTRACK","type":"software","techniques":["T1005","T1027","T1074.001"]},{"id":"S1091","name":"Pacu","type":"software","techniques":["T1049","T1059.009","T1069.003","T1078.004","T1087.004","T1098.001","T1119","T1518.001","T1526","T1530","T1546","T1552","T1555.006","T1562.007","T1562.008","T1578.001","T1580","T1619","T1648","T1651","T1654"]},{"id":"S0664","name":"Pandora","type":"software","techniques":["T1027.015","T1055","T1057","T1068","T1071.001","T1105","T1112","T1205","T1543.003","T1553.006","T1569.002","T1573.001","T1574.001"]},{"id":"S0208","name":"Pasam","type":"software","techniques":["T1005","T1057","T1070.004","T1082","T1083","T1105","T1547.008","T1680"]},{"id":"S0556","name":"Pay2Key","type":"software","techniques":["T1016","T1070.004","T1082","T1090.001","T1095","T1486","T1489","T1573.002"]},{"id":"S1050","name":"PcShare","type":"software","techniques":["T1005","T1012","T1016","T1027.013","T1027.015","T1036.001","T1036.005","T1041","T1055","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1106","T1112","T1113","T1125","T1140","T1218.011","T1546.015"]},{"id":"S1102","name":"Pcexter","type":"software","techniques":["T1005","T1083","T1567.002","T1574.001"]},{"id":"S0683","name":"Peirates","type":"software","techniques":["T1046","T1078.004","T1528","T1530","T1550.001","T1552.005","T1552.007","T1609","T1610","T1611","T1613","T1619"]},{"id":"S0587","name":"Penquin","type":"software","techniques":["T1016","T1027.005","T1027.013","T1036.005","T1040","T1041","T1053.003","T1059.004","T1070.004","T1082","T1083","T1095","T1105","T1205","T1205.002","T1222.002","T1573.002","T1680"]},{"id":"S0643","name":"Peppy","type":"software","techniques":["T1020","T1056.001","T1059.003","T1071.001","T1083","T1105","T1113"]},{"id":"S1145","name":"Pikabot","type":"software","techniques":["T1016","T1027.003","T1027.009","T1027.011","T1041","T1055.002","T1055.003","T1059.003","T1082","T1087.001","T1106","T1132.001","T1140","T1480.001","T1482","T1497.001","T1547.001","T1571","T1573.001","T1620","T1622"]},{"id":"S0517","name":"Pillowmint","type":"software","techniques":["T1005","T1012","T1027","T1027.011","T1027.015","T1055.004","T1057","T1059.001","T1070.004","T1070.009","T1106","T1112","T1140","T1546.011","T1560"]},{"id":"S0048","name":"PinchDuke","type":"software","techniques":["T1003","T1005","T1071.001","T1082","T1083","T1555","T1555.003"]},{"id":"S1031","name":"PingPull","type":"software","techniques":["T1005","T1016","T1036.004","T1041","T1059.003","T1070.006","T1071.001","T1082","T1083","T1095","T1132.001","T1140","T1543.003","T1571","T1573.001"]},{"id":"S0501","name":"PipeMon","type":"software","techniques":["T1008","T1016","T1027.011","T1027.013","T1036.005","T1055.001","T1057","T1082","T1095","T1105","T1106","T1112","T1124","T1129","T1134.002","T1134.004","T1140","T1518.001","T1543.003","T1547.012","T1548.002","T1553.002","T1573.001"]},{"id":"S0124","name":"Pisloader","type":"software","techniques":["T1016","T1027","T1059.003","T1071.004","T1082","T1083","T1105","T1132.001","T1547.001"]},{"id":"S1162","name":"Playcrypt","type":"software","techniques":["T1083","T1486","T1490"]},{"id":"S0013","name":"PlugX","type":"software","techniques":["T1012","T1016","T1027","T1027.001","T1027.007","T1027.013","T1033","T1036.004","T1036.005","T1041","T1049","T1053.005","T1056.001","T1057","T1059.003","T1070.004","T1070.009","T1071.001","T1071.004","T1074.001","T1082","T1083","T1091","T1095","T1102.001","T1105","T1106","T1112","T1113","T1120","T1124","T1127.001","T1135","T1140","T1204.002","T1480.002","T1497.001","T1543.003","T1547.001","T1562.004","T1564.001","T1564.003","T1571","T1573.001","T1574.001","T1614","T1620","T1622","T1680"]},{"id":"S0428","name":"PoetRAT","type":"software","techniques":["T1003.001","T1018","T1027","T1027.010","T1033","T1041","T1048","T1048.003","T1056.001","T1057","T1059.003","T1059.005","T1059.006","T1059.011","T1070.004","T1071.001","T1071.002","T1082","T1083","T1105","T1112","T1113","T1119","T1125","T1140","T1204.002","T1497.001","T1547.001","T1555.003","T1559.002","T1560.001","T1564.001","T1566.001","T1571","T1573.002"]},{"id":"S0012","name":"PoisonIvy","type":"software","techniques":["T1005","T1010","T1014","T1027","T1055.001","T1056.001","T1059.003","T1074.001","T1105","T1112","T1480.002","T1543.003","T1547.001","T1547.014","T1573.001"]},{"id":"S0518","name":"PolyglotDuke","type":"software","techniques":["T1027","T1027.003","T1027.011","T1071.001","T1102.001","T1105","T1106","T1112","T1140","T1218.011"]},{"id":"S0453","name":"Pony","type":"software","techniques":["T1027.015","T1027.016","T1036","T1059.003","T1070.004","T1071.001","T1082","T1087.001","T1105","T1106","T1110.001","T1204.001","T1204.002","T1497.003","T1566.001","T1566.002"]},{"id":"S0378","name":"PoshC2","type":"software","techniques":["T1003.001","T1007","T1016","T1040","T1046","T1047","T1049","T1055","T1056.001","T1068","T1069.001","T1071.001","T1082","T1083","T1087.001","T1087.002","T1090","T1110","T1119","T1134","T1134.002","T1201","T1210","T1482","T1546.003","T1548.002","T1550.002","T1552.001","T1555","T1557.001","T1560.001","T1569.002"]},{"id":"S1046","name":"PowGoop","type":"software","techniques":["T1036","T1036.005","T1059.001","T1071.001","T1132.002","T1140","T1573","T1574.001"]},{"id":"S0139","name":"PowerDuke","type":"software","techniques":["T1010","T1016","T1027.003","T1033","T1057","T1059.003","T1070.004","T1082","T1083","T1105","T1124","T1218.011","T1485","T1547.001","T1564.004"]},{"id":"S1173","name":"PowerExchange","type":"software","techniques":["T1041","T1059.001","T1071.003","T1105","T1140"]},{"id":"S1012","name":"PowerLess","type":"software","techniques":["T1005","T1056.001","T1059.001","T1074.001","T1105","T1140","T1217","T1560","T1573"]},{"id":"S0685","name":"PowerPunch","type":"software","techniques":["T1027.010","T1059.001","T1105","T1480.001"]},{"id":"S0441","name":"PowerShower","type":"software","techniques":["T1016","T1033","T1041","T1057","T1059.001","T1059.005","T1070.004","T1071.001","T1082","T1112","T1132.001","T1547.001","T1560.001","T1564.003"]},{"id":"S0194","name":"PowerSploit","type":"software","techniques":["T1003.001","T1005","T1012","T1027.005","T1027.010","T1047","T1053.005","T1055.001","T1056.001","T1057","T1059.001","T1087.001","T1113","T1123","T1134","T1482","T1543.003","T1547.001","T1547.005","T1552.002","T1552.006","T1555.004","T1558.003","T1574.001","T1574.007","T1574.008","T1574.009","T1620"]},{"id":"S0393","name":"PowerStallion","type":"software","techniques":["T1027","T1057","T1059.001","T1070.006","T1102.002"]},{"id":"S1058","name":"Prestige","type":"software","techniques":["T1053.005","T1059.001","T1083","T1106","T1112","T1484.001","T1486","T1489","T1490"]},{"id":"S0113","name":"Prikormka","type":"software","techniques":["T1016","T1025","T1027.013","T1033","T1056.001","T1070.004","T1074.001","T1082","T1083","T1113","T1120","T1132.001","T1218.011","T1518.001","T1547.001","T1555","T1555.003","T1560","T1573.001","T1574.001"]},{"id":"S0654","name":"ProLock","type":"software","techniques":["T1027.003","T1047","T1068","T1070.004","T1197","T1486","T1490"]},{"id":"S0279","name":"Proton","type":"software","techniques":["T1021.005","T1056.001","T1056.002","T1059.004","T1070.002","T1070.004","T1113","T1140","T1543.001","T1548.003","T1555.001","T1555.003","T1555.005","T1560","T1562.001"]},{"id":"S0238","name":"Proxysvc","type":"software","techniques":["T1005","T1012","T1016","T1041","T1057","T1059.003","T1070.004","T1071.001","T1082","T1083","T1119","T1124","T1485","T1569.002","T1680"]},{"id":"S0029","name":"PsExec","type":"software","techniques":["T1021.002","T1136.002","T1543.003","T1569.002","T1570"]},{"id":"S0078","name":"Psylo","type":"software","techniques":["T1041","T1070.006","T1071.001","T1083","T1105"]},{"id":"S0147","name":"Pteranodon","type":"software","techniques":["T1027.007","T1041","T1053.005","T1059.003","T1059.005","T1070.004","T1071.001","T1074.001","T1083","T1105","T1106","T1113","T1140","T1218.005","T1218.011","T1497","T1547.001"]},{"id":"S0192","name":"Pupy","type":"software","techniques":["T1003.001","T1003.004","T1003.005","T1016","T1021.001","T1033","T1041","T1046","T1049","T1055.001","T1056.001","T1057","T1059.001","T1059.006","T1070.001","T1071.001","T1082","T1083","T1087.001","T1105","T1113","T1114.001","T1123","T1125","T1134.001","T1135","T1136.001","T1136.002","T1497.001","T1543.002","T1547.001","T1547.013","T1548.002","T1550.003","T1552.001","T1555","T1555.003","T1557.001","T1560.001","T1569.002","T1573.002"]},{"id":"S1032","name":"PyDCrypt","type":"software","techniques":["T1027.013","T1033","T1036.005","T1047","T1049","T1059.001","T1059.003","T1059.006","T1070.004","T1140","T1562.004"]},{"id":"S0583","name":"Pysa","type":"software","techniques":["T1003.001","T1016","T1021.001","T1036.005","T1046","T1059.001","T1059.006","T1070.004","T1110","T1112","T1486","T1489","T1490","T1552.001","T1562.001","T1569.002"]},{"id":"S0269","name":"QUADAGENT","type":"software","techniques":["T1008","T1012","T1016","T1027.010","T1027.011","T1033","T1036.005","T1053.005","T1059.001","T1059.003","T1059.005","T1070.004","T1071.001","T1071.004","T1112","T1132.001","T1140"]},{"id":"S1076","name":"QUIETCANARY","type":"software","techniques":["T1012","T1016","T1071.001","T1074","T1106","T1132.001","T1140","T1564.003","T1573.001"]},{"id":"S1084","name":"QUIETEXIT","type":"software","techniques":["T1008","T1036.005","T1071","T1090.002","T1095"]},{"id":"S0650","name":"QakBot","type":"software","techniques":["T1005","T1010","T1016","T1016.001","T1018","T1027","T1027.001","T1027.002","T1027.005","T1027.006","T1027.010","T1027.011","T1033","T1036.008","T1041","T1047","T1049","T1053.005","T1055","T1055.012","T1056.001","T1057","T1059.001","T1059.003","T1059.005","T1059.007","T1069.001","T1070.004","T1071.001","T1074.001","T1082","T1083","T1090.002","T1091","T1095","T1105","T1106","T1110","T1112","T1114.001","T1120","T1124","T1132.001","T1135","T1140","T1185","T1204.001","T1204.002","T1210","T1218.007","T1218.010","T1218.011","T1482","T1497.001","T1497.003","T1518","T1518.001","T1539","T1543.003","T1547.001","T1553.002","T1553.005","T1555.003","T1562.001","T1564.001","T1566.001","T1566.002","T1568.002","T1572","T1573.001","T1574.001"]},{"id":"S1242","name":"Qilin","type":"software","techniques":["T1003.001","T1007","T1012","T1016","T1018","T1021.002","T1027.013","T1053.005","T1055.001","T1057","T1059.001","T1070.001","T1070.004","T1083","T1087.001","T1106","T1112","T1134","T1135","T1190","T1204.001","T1204.002","T1222","T1480","T1480.002","T1484.001","T1486","T1489","T1490","T1491.001","T1529","T1547.001","T1547.004","T1548.002","T1562.001","T1562.009","T1566.001","T1566.002","T1673","T1680"]},{"id":"S0262","name":"QuasarRAT","type":"software","techniques":["T1005","T1016","T1021.001","T1033","T1053.005","T1056.001","T1059.003","T1082","T1090","T1095","T1105","T1112","T1125","T1547.001","T1548.002","T1552.001","T1553.002","T1555","T1555.003","T1564.001","T1564.003","T1571","T1573.001","T1614"]},{"id":"S1209","name":"Quick Assist","type":"software","techniques":["T1071.001","T1113","T1125"]},{"id":"S0686","name":"QuietSieve","type":"software","techniques":["T1005","T1016.001","T1071.001","T1083","T1105","T1113","T1120","T1135","T1564.003"]},{"id":"S1113","name":"RAPIDPULSE","type":"software","techniques":["T1005","T1027.013","T1140","T1505.003"]},{"id":"S0055","name":"RARSTONE","type":"software","techniques":["T1055.001","T1083","T1095","T1105"]},{"id":"S0241","name":"RATANKBA","type":"software","techniques":["T1007","T1012","T1016","T1018","T1033","T1047","T1049","T1055.001","T1057","T1059.001","T1059.003","T1071.001","T1082","T1087.001","T1105"]},{"id":"S0662","name":"RCSession","type":"software","techniques":["T1005","T1027.011","T1027.015","T1033","T1036","T1055.012","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1082","T1095","T1105","T1106","T1112","T1113","T1218.007","T1547.001","T1548.002","T1573","T1574.001"]},{"id":"S0495","name":"RDAT","type":"software","techniques":["T1001","T1001.002","T1008","T1027.003","T1030","T1036.004","T1036.005","T1041","T1059.003","T1070.004","T1071.001","T1071.003","T1071.004","T1105","T1113","T1132.001","T1132.002","T1140","T1543.003","T1573.001"]},{"id":"S0416","name":"RDFSNIFFER","type":"software","techniques":["T1056.004","T1070.004","T1106"]},{"id":"S1219","name":"REPTILE","type":"software","techniques":["T1014","T1059.004","T1095","T1140","T1205","T1205.001","T1543.004","T1546.017","T1547.006","T1564.001","T1573.002"]},{"id":"S0496","name":"REvil","type":"software","techniques":["T1007","T1012","T1027.011","T1027.013","T1036.005","T1041","T1047","T1055","T1059.001","T1059.003","T1059.005","T1069.002","T1070.004","T1071.001","T1082","T1083","T1105","T1106","T1112","T1134.001","T1134.002","T1140","T1189","T1204.002","T1480.002","T1485","T1486","T1489","T1490","T1562.001","T1562.009","T1566.001","T1573.002","T1614.001","T1680"]},{"id":"S0258","name":"RGDoor","type":"software","techniques":["T1033","T1059.003","T1071.001","T1105","T1140","T1505.004","T1560.003"]},{"id":"S1222","name":"RIFLESPINE","type":"software","techniques":["T1059.004","T1071.001","T1074.001","T1082","T1102.002","T1105","T1140","T1543.002","T1567.002","T1573.001"]},{"id":"S0003","name":"RIPTIDE","type":"software","techniques":["T1071.001","T1573.001"]},{"id":"S1150","name":"ROADSWEEP","type":"software","techniques":["T1027.013","T1059.003","T1070.004","T1083","T1120","T1140","T1480","T1486","T1489","T1490","T1491.001","T1547.001","T1553.002","T1559","T1680"]},{"id":"S0684","name":"ROADTools","type":"software","techniques":["T1018","T1069.003","T1078.004","T1087.004","T1119","T1526"]},{"id":"S0240","name":"ROKRAT","type":"software","techniques":["T1005","T1010","T1012","T1027","T1033","T1041","T1055","T1056.001","T1057","T1059.005","T1070.004","T1071.001","T1082","T1083","T1102.002","T1105","T1106","T1112","T1113","T1115","T1123","T1140","T1204.002","T1480.001","T1497.001","T1555.003","T1555.004","T1566.001","T1567.002","T1622"]},{"id":"S0148","name":"RTM","type":"software","techniques":["T1027","T1027.015","T1033","T1036","T1036.004","T1053.005","T1056.001","T1057","T1059.003","T1070.004","T1070.009","T1071.001","T1082","T1083","T1102.001","T1105","T1106","T1112","T1113","T1115","T1119","T1120","T1124","T1204.002","T1218.011","T1219","T1497","T1518","T1518.001","T1547.001","T1548.002","T1553.002","T1553.004","T1559.002","T1566.001","T1568","T1571","T1573.001"]},{"id":"S1148","name":"Raccoon Stealer","type":"software","techniques":["T1005","T1012","T1020","T1027.007","T1027.013","T1033","T1041","T1070.004","T1071.001","T1082","T1083","T1087.001","T1105","T1113","T1119","T1124","T1140","T1195","T1213","T1518","T1539","T1555.003","T1560","T1614"]},{"id":"S0481","name":"Ragnar Locker","type":"software","techniques":["T1059.003","T1120","T1218.007","T1218.010","T1218.011","T1486","T1489","T1490","T1543.003","T1562.001","T1564.006","T1569.002","T1614"]},{"id":"S0565","name":"Raindrop","type":"software","techniques":["T1027.002","T1027.003","T1027.013","T1036","T1036.005","T1140","T1497.003"]},{"id":"S0629","name":"RainyDay","type":"software","techniques":["T1005","T1007","T1008","T1027.013","T1036.004","T1036.005","T1053.005","T1057","T1059.003","T1070.004","T1071.001","T1074.001","T1083","T1090","T1095","T1105","T1106","T1113","T1140","T1543.003","T1555.003","T1555.004","T1567.002","T1573.001","T1574.001"]},{"id":"S0458","name":"Ramsay","type":"software","techniques":["T1005","T1014","T1016","T1025","T1027","T1027.003","T1036","T1036.005","T1039","T1046","T1049","T1053.005","T1055.001","T1057","T1059.005","T1071.001","T1074.001","T1080","T1083","T1091","T1106","T1113","T1119","T1120","T1132.001","T1135","T1140","T1203","T1204.002","T1546.010","T1547.001","T1548.002","T1559.001","T1559.002","T1560.001","T1560.003","T1566.001","T1574.001","T1680"]},{"id":"S1212","name":"RansomHub","type":"software","techniques":["T1018","T1021.002","T1027.013","T1057","T1059.001","T1059.003","T1070.001","T1070.004","T1082","T1083","T1090","T1135","T1140","T1480","T1486","T1489","T1490","T1491.001","T1497.003","T1547.001","T1562.009"]},{"id":"S1130","name":"Raspberry Robin","type":"software","techniques":["T1027","T1027.002","T1033","T1036.004","T1036.008","T1047","T1055.012","T1057","T1059","T1059.003","T1070.004","T1070.009","T1071","T1071.001","T1082","T1083","T1091","T1102","T1105","T1140","T1204","T1218.007","T1218.008","T1218.010","T1218.011","T1480","T1497","T1497.001","T1518.001","T1547.001","T1548","T1548.002","T1559","T1559.001","T1562.001","T1571","T1574","T1574.001","T1583.001","T1583.008","T1622"]},{"id":"S0364","name":"RawDisk","type":"software","techniques":["T1485","T1561.001","T1561.002"]},{"id":"S0169","name":"RawPOS","type":"software","techniques":["T1005","T1036.004","T1074.001","T1543.003","T1560.003"]},{"id":"S1040","name":"Rclone","type":"software","techniques":["T1030","T1048.002","T1048.003","T1083","T1560.001","T1567.002"]},{"id":"S0172","name":"Reaver","type":"software","techniques":["T1012","T1016","T1027.013","T1033","T1070.004","T1071.001","T1082","T1095","T1218.002","T1543.003","T1547.001","T1547.009","T1560.003","T1680"]},{"id":"S0153","name":"RedLeaves","type":"software","techniques":["T1016","T1027.013","T1033","T1049","T1059.003","T1070.004","T1071.001","T1082","T1083","T1105","T1113","T1547.001","T1547.009","T1555.003","T1571","T1573.001","T1574.001"]},{"id":"S1240","name":"RedLine Stealer","type":"software","techniques":["T1005","T1012","T1016","T1027.002","T1027.010","T1027.013","T1033","T1036","T1041","T1053.005","T1059.003","T1059.011","T1071.001","T1082","T1087.001","T1102","T1105","T1113","T1132.001","T1140","T1204.002","T1217","T1218.007","T1480","T1497","T1518","T1518.001","T1539","T1553.002","T1555","T1555.003","T1562.001","T1614","T1614.001","T1657"]},{"id":"S0075","name":"Reg","type":"software","techniques":["T1012","T1112","T1552.002"]},{"id":"S0511","name":"RegDuke","type":"software","techniques":["T1027","T1027.003","T1027.011","T1059.001","T1102.002","T1105","T1112","T1140","T1546.003"]},{"id":"S0019","name":"Regin","type":"software","techniques":["T1021.002","T1036.001","T1040","T1056.001","T1071.001","T1071.002","T1090.002","T1095","T1112","T1564.004","T1564.005"]},{"id":"S0332","name":"Remcos","type":"software","techniques":["T1027","T1055","T1056.001","T1059.003","T1059.006","T1083","T1090","T1105","T1112","T1113","T1115","T1123","T1125","T1497.001","T1547.001","T1548.002"]},{"id":"S0375","name":"Remexi","type":"software","techniques":["T1010","T1027.013","T1041","T1047","T1053.005","T1056.001","T1059.003","T1059.005","T1071.001","T1083","T1113","T1115","T1140","T1547.001","T1547.004","T1560"]},{"id":"S0166","name":"RemoteCMD","type":"software","techniques":["T1053.005","T1105","T1569.002"]},{"id":"S0592","name":"RemoteUtilities","type":"software","techniques":["T1083","T1105","T1113","T1218.007"]},{"id":"S0125","name":"Remsec","type":"software","techniques":["T1003.002","T1016","T1018","T1025","T1027.013","T1033","T1036.005","T1046","T1048.003","T1049","T1052.001","T1053.005","T1055.001","T1056.001","T1057","T1059.011","T1068","T1070.004","T1071.001","T1071.003","T1071.004","T1082","T1083","T1087.001","T1095","T1105","T1518.001","T1556.002","T1562.004","T1652"]},{"id":"S0174","name":"Responder","type":"software","techniques":["T1040","T1557.001"]},{"id":"S0379","name":"Revenge RAT","type":"software","techniques":["T1003","T1016","T1021.001","T1033","T1053.005","T1056.001","T1059.001","T1059.003","T1082","T1102.002","T1105","T1113","T1123","T1125","T1132.001","T1202","T1218.005","T1547.004"]},{"id":"S0433","name":"Rifdoor","type":"software","techniques":["T1016","T1027.001","T1027.013","T1033","T1082","T1204.002","T1547.001","T1566.001","T1573.001"]},{"id":"S0448","name":"Rising Sun","type":"software","techniques":["T1005","T1012","T1016","T1016.001","T1027.013","T1033","T1041","T1057","T1059.003","T1070","T1070.004","T1071.001","T1082","T1083","T1106","T1140","T1560.003","T1564.001","T1573.002","T1680"]},{"id":"S0400","name":"RobbinHood","type":"software","techniques":["T1059.003","T1070.005","T1486","T1489","T1490","T1562.001"]},{"id":"S0270","name":"RogueRobin","type":"software","techniques":["T1016","T1027.010","T1033","T1047","T1057","T1059.001","T1059.003","T1082","T1102.002","T1105","T1113","T1132.001","T1140","T1218.010","T1497.001","T1518.001","T1547.001","T1547.009"]},{"id":"S1078","name":"RotaJakiro","type":"software","techniques":["T1036.005","T1037","T1041","T1057","T1082","T1095","T1106","T1119","T1129","T1132.001","T1140","T1543.002","T1546.004","T1547.013","T1559","T1571","T1573.001"]},{"id":"S0090","name":"Rover","type":"software","techniques":["T1005","T1020","T1025","T1056.001","T1074.001","T1083","T1112","T1113","T1119","T1547.001"]},{"id":"S1073","name":"Royal","type":"software","techniques":["T1016","T1021.002","T1046","T1057","T1059.012","T1082","T1083","T1095","T1106","T1135","T1486","T1489","T1490","T1566","T1680"]},{"id":"S1071","name":"Rubeus","type":"software","techniques":["T1482","T1558.001","T1558.002","T1558.003","T1558.004"]},{"id":"S0358","name":"Ruler","type":"software","techniques":["T1087.003","T1137.003","T1137.004","T1137.005"]},{"id":"S0253","name":"RunningRAT","type":"software","techniques":["T1056.001","T1059.003","T1070.001","T1070.004","T1082","T1115","T1547.001","T1560","T1562.001","T1680"]},{"id":"S0446","name":"Ryuk","type":"software","techniques":["T1016","T1021.002","T1027","T1036","T1036.005","T1053.005","T1055","T1057","T1059.003","T1078.002","T1083","T1106","T1134","T1205","T1222.001","T1486","T1489","T1490","T1547.001","T1562.001","T1614.001","T1680"]},{"id":"S0085","name":"S-Type","type":"software","techniques":["T1007","T1008","T1016","T1027.002","T1033","T1036.005","T1041","T1059.003","T1070.004","T1070.009","T1071.001","T1082","T1087.001","T1105","T1106","T1132.001","T1136.001","T1547.001","T1547.009","T1614.001"]},{"id":"S0461","name":"SDBbot","type":"software","techniques":["T1005","T1016","T1021.001","T1027","T1027.002","T1033","T1041","T1055.001","T1057","T1059.003","T1070","T1070.004","T1082","T1083","T1090","T1095","T1105","T1125","T1140","T1218.011","T1546.011","T1546.012","T1547.001","T1614"]},{"id":"S0195","name":"SDelete","type":"software","techniques":["T1070.004","T1485"]},{"id":"S0185","name":"SEASHARPEE","type":"software","techniques":["T1059.003","T1070.006","T1105","T1505.003"]},{"id":"S0450","name":"SHARPSTATS","type":"software","techniques":["T1016","T1027.010","T1033","T1059.001","T1082","T1105","T1124"]},{"id":"S0028","name":"SHIPSHAPE","type":"software","techniques":["T1091","T1547.001","T1547.009"]},{"id":"S0063","name":"SHOTPUT","type":"software","techniques":["T1018","T1027","T1049","T1057","T1083","T1087.001"]},{"id":"S0217","name":"SHUTTERSPEED","type":"software","techniques":["T1082","T1105","T1113"]},{"id":"S0692","name":"SILENTTRINITY","type":"software","techniques":["T1003.001","T1007","T1010","T1012","T1018","T1021.003","T1021.006","T1033","T1041","T1046","T1047","T1055","T1056.001","T1056.002","T1057","T1059.001","T1059.003","T1059.006","T1069.001","T1069.002","T1070","T1070.004","T1082","T1083","T1087.002","T1105","T1106","T1112","T1113","T1115","T1124","T1134.001","T1134.003","T1135","T1518.001","T1543.003","T1546.001","T1546.003","T1546.015","T1547.001","T1548.002","T1552.006","T1555.003","T1555.004","T1556","T1558.003","T1559.001","T1562.001","T1562.003","T1562.010","T1564.003","T1620","T1680"]},{"id":"S1110","name":"SLIGHTPULSE","type":"software","techniques":["T1005","T1059","T1071.001","T1074.001","T1105","T1132.001","T1140","T1505.003","T1573.001"]},{"id":"S0533","name":"SLOTHFULMEDIA","type":"software","techniques":["T1001","T1005","T1007","T1033","T1036.004","T1036.005","T1041","T1049","T1055","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1082","T1083","T1105","T1112","T1113","T1489","T1543.003","T1564.001","T1569.002","T1680"]},{"id":"S0218","name":"SLOWDRIFT","type":"software","techniques":["T1082","T1102.002","T1105"]},{"id":"S1104","name":"SLOWPULSE","type":"software","techniques":["T1027","T1074.001","T1111","T1554","T1556.004","T1556.006"]},{"id":"S0649","name":"SMOKEDHAM","type":"software","techniques":["T1027.009","T1033","T1041","T1056.001","T1059.001","T1071.001","T1082","T1087.001","T1090.004","T1098.007","T1102","T1105","T1112","T1113","T1132.001","T1136.001","T1204.001","T1547.001","T1564.002","T1573.001","T1598.003"]},{"id":"S0159","name":"SNUGRIDE","type":"software","techniques":["T1059.003","T1071.001","T1547.001","T1573.001"]},{"id":"S0157","name":"SOUNDBITE","type":"software","techniques":["T1010","T1071.004","T1082","T1083","T1112"]},{"id":"S0035","name":"SPACESHIP","type":"software","techniques":["T1052.001","T1074.001","T1083","T1547.001","T1547.009","T1560.003"]},{"id":"S0390","name":"SQLRat","type":"software","techniques":["T1027.010","T1053.005","T1059.001","T1059.003","T1070.004","T1105","T1140","T1204.002"]},{"id":"S1037","name":"STARWHALE","type":"software","techniques":["T1005","T1016","T1027.013","T1033","T1041","T1059.003","T1059.005","T1071.001","T1074.001","T1082","T1132.001","T1204.002","T1543.003","T1547.001"]},{"id":"S1238","name":"STATICPLUGIN","type":"software","techniques":["T1036.005","T1036.008","T1204.002","T1553.002","T1559.001"]},{"id":"S1112","name":"STEADYPULSE","type":"software","techniques":["T1071.001","T1105","T1132.001","T1140","T1505.003"]},{"id":"S1042","name":"SUGARDUMP","type":"software","techniques":["T1036.004","T1036.005","T1041","T1053.005","T1071.001","T1071.003","T1074.001","T1083","T1204.002","T1217","T1518","T1555.003","T1560.003"]},{"id":"S1049","name":"SUGARUSH","type":"software","techniques":["T1016.001","T1059.003","T1095","T1543.003","T1571","T1680"]},{"id":"S0559","name":"SUNBURST","type":"software","techniques":["T1001.001","T1001.002","T1001.003","T1005","T1007","T1012","T1016","T1027","T1027.005","T1027.015","T1033","T1036.005","T1047","T1057","T1059.005","T1070","T1070.004","T1070.007","T1070.009","T1071.001","T1071.004","T1082","T1083","T1105","T1112","T1124","T1132.001","T1218.011","T1497.001","T1497.003","T1518.001","T1546.012","T1553.002","T1562.001","T1568","T1573.001"]},{"id":"S0562","name":"SUNSPOT","type":"software","techniques":["T1027","T1036.005","T1057","T1070.004","T1083","T1106","T1134","T1140","T1195.002","T1480","T1480.002","T1565.001"]},{"id":"S0578","name":"SUPERNOVA","type":"software","techniques":["T1027.013","T1036.005","T1071.001","T1203","T1505.003"]},{"id":"S1064","name":"SVCReady","type":"software","techniques":["T1005","T1012","T1027","T1033","T1036.004","T1041","T1047","T1053.005","T1057","T1059.005","T1071.001","T1082","T1105","T1106","T1113","T1120","T1124","T1204.002","T1218.011","T1497.001","T1497.003","T1518","T1546.015","T1566.001"]},{"id":"S0519","name":"SYNful Knock","type":"software","techniques":["T1205","T1556.004","T1601.001"]},{"id":"S0464","name":"SYSCON","type":"software","techniques":["T1057","T1059.003","T1071.002","T1082","T1204.002"]},{"id":"S1210","name":"Sagerunex","type":"software","techniques":["T1016","T1027.002","T1027.013","T1041","T1055.001","T1057","T1071.001","T1074.001","T1082","T1090","T1102.002","T1102.003","T1106","T1134","T1140","T1480","T1560.001","T1573.002"]},{"id":"S1018","name":"Saint Bot","type":"software","techniques":["T1005","T1012","T1016","T1027","T1027.002","T1033","T1036","T1036.005","T1053.005","T1055.001","T1055.004","T1055.012","T1057","T1059.001","T1059.003","T1059.005","T1070.004","T1071.001","T1082","T1083","T1105","T1106","T1132.001","T1140","T1204.001","T1204.002","T1218.004","T1218.010","T1497.001","T1497.003","T1547.001","T1548.002","T1566.001","T1566.002","T1574","T1614","T1622"]},{"id":"S0074","name":"Sakula","type":"software","techniques":["T1027.013","T1059.003","T1070.004","T1071.001","T1105","T1218.011","T1543.003","T1547.001","T1548.002","T1573.001","T1574.001"]},{"id":"S0370","name":"SamSam","type":"software","techniques":["T1027.013","T1027.016","T1059.003","T1070.004","T1486"]},{"id":"S1168","name":"SampleCheck5000","type":"software","techniques":["T1059.003","T1071.001","T1074.001","T1082","T1102.002","T1105","T1140","T1560.001","T1567","T1680"]},{"id":"S1099","name":"Samurai","type":"software","techniques":["T1005","T1012","T1027","T1027.004","T1027.007","T1027.015","T1036.005","T1059.003","T1071.001","T1083","T1090","T1095","T1105","T1106","T1112","T1132.001","T1518","T1543.003","T1573.001"]},{"id":"S1085","name":"Sardonic","type":"software","techniques":["T1005","T1007","T1016","T1027","T1027.010","T1047","T1049","T1055.004","T1057","T1059.001","T1059.003","T1070","T1082","T1095","T1105","T1106","T1132.001","T1135","T1140","T1546.003","T1571","T1573.001","T1573.002","T1620","T1680"]},{"id":"S0053","name":"SeaDuke","type":"software","techniques":["T1027.002","T1059.001","T1059.003","T1070.004","T1071.001","T1078","T1105","T1114.002","T1132.001","T1546.003","T1547.001","T1547.009","T1550.003","T1560.002","T1573.001"]},{"id":"S0345","name":"Seasalt","type":"software","techniques":["T1027.013","T1036.004","T1057","T1059.003","T1070.004","T1071.001","T1083","T1105","T1543.003","T1547.001"]},{"id":"S0382","name":"ServHelper","type":"software","techniques":["T1021.001","T1033","T1036.010","T1053.005","T1059.001","T1059.003","T1070.004","T1071.001","T1082","T1098.007","T1105","T1136.001","T1218.011","T1547.001","T1573.002"]},{"id":"S0639","name":"Seth-Locker","type":"software","techniques":["T1059.003","T1105","T1486"]},{"id":"S0596","name":"ShadowPad","type":"software","techniques":["T1016","T1027","T1027.011","T1029","T1033","T1055","T1055.001","T1057","T1070","T1071.001","T1071.002","T1071.004","T1082","T1095","T1105","T1112","T1124","T1132.002","T1140","T1568.002","T1680"]},{"id":"S0140","name":"Shamoon","type":"software","techniques":["T1012","T1016","T1018","T1021.002","T1027","T1036.004","T1053.005","T1070.006","T1071.001","T1078.002","T1082","T1105","T1112","T1124","T1134.001","T1140","T1485","T1486","T1529","T1543.003","T1548.002","T1561.002","T1569.002","T1570"]},{"id":"S1019","name":"Shark","type":"software","techniques":["T1005","T1008","T1012","T1027.013","T1029","T1036.005","T1041","T1059.003","T1070.004","T1071.001","T1071.004","T1074","T1082","T1105","T1140","T1497.001","T1568.002"]},{"id":"S1089","name":"SharpDisco","type":"software","techniques":["T1005","T1041","T1053.005","T1059.003","T1071.002","T1083","T1105","T1106","T1120","T1564.003","T1680"]},{"id":"S0546","name":"SharpStage","type":"software","techniques":["T1047","T1053.005","T1059.001","T1059.003","T1082","T1102","T1105","T1113","T1140","T1547.001","T1614.001"]},{"id":"S0444","name":"ShimRat","type":"software","techniques":["T1005","T1008","T1027.002","T1027.015","T1029","T1036.004","T1059.003","T1070.004","T1071.001","T1083","T1090.002","T1105","T1106","T1112","T1135","T1140","T1543.003","T1546.011","T1547.001","T1548.002","T1574"]},{"id":"S0445","name":"ShimRatReporter","type":"software","techniques":["T1016","T1020","T1027","T1036.005","T1041","T1049","T1057","T1069","T1071.001","T1082","T1087","T1105","T1106","T1119","T1518","T1560"]},{"id":"S1178","name":"ShrinkLocker","type":"software","techniques":["T1016","T1041","T1047","T1057","T1059.001","T1059.005","T1070.001","T1070.004","T1071.001","T1082","T1102","T1112","T1124","T1480","T1485","T1486","T1491.001","T1529","T1562.001","T1562.004"]},{"id":"S0589","name":"Sibot","type":"software","techniques":["T1012","T1016","T1027.010","T1027.011","T1036.005","T1047","T1049","T1053.005","T1059.005","T1070","T1070.004","T1071.001","T1102","T1105","T1112","T1140","T1218.005","T1218.011"]},{"id":"S0610","name":"SideTwist","type":"software","techniques":["T1001","T1005","T1008","T1016","T1033","T1041","T1059.003","T1071.001","T1082","T1083","T1105","T1106","T1132.001","T1140","T1573.001"]},{"id":"S0623","name":"Siloscape","type":"software","techniques":["T1027","T1059.003","T1068","T1069","T1071","T1083","T1090.003","T1106","T1134.001","T1140","T1190","T1518","T1609","T1611"]},{"id":"S0468","name":"Skidmap","type":"software","techniques":["T1014","T1027.013","T1036.005","T1053.003","T1057","T1059.004","T1082","T1083","T1098.004","T1105","T1140","T1496.001","T1518.001","T1547.006","T1556.003","T1562.001"]},{"id":"S0633","name":"Sliver","type":"software","techniques":["T1001.002","T1003.001","T1016","T1027","T1027.004","T1027.013","T1041","T1049","T1055","T1059.001","T1071","T1071.001","T1071.004","T1083","T1090.001","T1105","T1113","T1132.001","T1134","T1548.002","T1558.001","T1573.001","T1573.002"]},{"id":"S1035","name":"Small Sieve","type":"software","techniques":["T1016","T1027","T1033","T1036.005","T1059.003","T1059.006","T1071.001","T1102.002","T1105","T1132.002","T1480","T1547.001","T1573.002"]},{"id":"S0226","name":"Smoke Loader","type":"software","techniques":["T1027.013","T1053.005","T1055","T1055.012","T1059.005","T1071.001","T1083","T1105","T1114.001","T1140","T1497.001","T1547.001","T1552.001","T1555.003"]},{"id":"S1163","name":"SnappyTCP","type":"software","techniques":["T1059.004","T1071.001","T1095","T1505.003","T1573.002"]},{"id":"S1086","name":"Snip3","type":"software","techniques":["T1027","T1027.001","T1047","T1055.012","T1059.001","T1059.005","T1082","T1102","T1104","T1105","T1140","T1189","T1204.001","T1204.002","T1497.001","T1497.003","T1547.001","T1564.003","T1566.001","T1566.002"]},{"id":"S1124","name":"SocGholish","type":"software","techniques":["T1016","T1027.013","T1027.015","T1033","T1036.005","T1047","T1048.003","T1057","T1059.007","T1074.001","T1082","T1102","T1105","T1189","T1204.001","T1482","T1518","T1566.002","T1614"]},{"id":"S0273","name":"Socksbot","type":"software","techniques":["T1055.001","T1057","T1059.001","T1090","T1113"]},{"id":"S0627","name":"SodaMaster","type":"software","techniques":["T1012","T1027","T1033","T1057","T1082","T1105","T1106","T1497.001","T1497.003","T1573.001","T1573.002"]},{"id":"S1166","name":"Solar","type":"software","techniques":["T1020","T1041","T1053.005","T1070.004","T1082","T1105","T1132.001","T1573.001"]},{"id":"S0615","name":"SombRAT","type":"software","techniques":["T1005","T1007","T1027","T1033","T1036","T1041","T1055.001","T1057","T1070.004","T1071.004","T1074.001","T1082","T1083","T1090","T1095","T1105","T1106","T1124","T1140","T1560.003","T1564.010","T1568.002","T1573.001","T1573.002"]},{"id":"S0516","name":"SoreFang","type":"software","techniques":["T1016","T1027","T1053.005","T1057","T1069.002","T1071.001","T1082","T1083","T1087.001","T1087.002","T1105","T1140","T1190","T1680"]},{"id":"S0543","name":"Spark","type":"software","techniques":["T1027.002","T1033","T1041","T1059.003","T1071.001","T1082","T1132.001","T1140","T1497.002","T1614.001"]},{"id":"S0374","name":"SpeakUp","type":"software","techniques":["T1016","T1027.013","T1033","T1046","T1049","T1053.003","T1059","T1059.006","T1070.004","T1071.001","T1082","T1105","T1110.001","T1132.001","T1203"]},{"id":"S1140","name":"Spica","type":"software","techniques":["T1036.004","T1053.005","T1059.001","T1083","T1095","T1105","T1140","T1539","T1560"]},{"id":"S0646","name":"SpicyOmelette","type":"software","techniques":["T1005","T1016","T1018","T1059.007","T1082","T1105","T1204.001","T1518","T1518.001","T1553.002","T1566.002"]},{"id":"S1234","name":"SplatCloak","type":"software","techniques":["T1036.001","T1082","T1083","T1106","T1518.001","T1562.001"]},{"id":"S1232","name":"SplatDropper","type":"software","techniques":["T1027.007","T1027.013","T1070.009","T1106","T1140","T1543.003","T1553.002","T1574.001"]},{"id":"S1030","name":"Squirrelwaffle","type":"software","techniques":["T1016","T1027.002","T1027.013","T1033","T1041","T1059.001","T1059.003","T1059.005","T1071.001","T1082","T1105","T1132.001","T1140","T1204.001","T1204.002","T1218.010","T1218.011","T1497","T1560.003","T1566.001","T1566.002"]},{"id":"S0058","name":"SslMM","type":"software","techniques":["T1008","T1033","T1036.005","T1056.001","T1082","T1134","T1547.001","T1547.009","T1562.001"]},{"id":"S1227","name":"StarProxy","type":"software","techniques":["T1001.003","T1059","T1090.001","T1095","T1106","T1124","T1140","T1573.001","T1574.001"]},{"id":"S0188","name":"Starloader","type":"software","techniques":["T1036.005","T1140"]},{"id":"S1200","name":"StealBit","type":"software","techniques":["T1005","T1027.013","T1030","T1070.004","T1071.001","T1082","T1083","T1095","T1106","T1140","T1480","T1559","T1562.006","T1614.001","T1622"]},{"id":"S0380","name":"StoneDrill","type":"software","techniques":["T1012","T1027.013","T1047","T1055","T1059.005","T1070.004","T1082","T1105","T1113","T1124","T1485","T1497","T1518.001","T1561.001","T1561.002"]},{"id":"S0142","name":"StreamEx","type":"software","techniques":["T1027","T1057","T1059.003","T1082","T1083","T1112","T1218.011","T1518.001","T1543.003"]},{"id":"S1183","name":"StrelaStealer","type":"software","techniques":["T1001","T1020","T1027","T1027.002","T1027.013","T1027.015","T1027.016","T1036","T1036.003","T1036.005","T1036.008","T1041","T1059.001","T1059.003","T1059.007","T1071.001","T1082","T1105","T1119","T1132.001","T1140","T1204.002","T1218.011","T1480","T1480.002","T1497","T1518","T1552.001","T1552.002","T1553.002","T1566.001","T1574.001","T1614.001","T1622"]},{"id":"S1034","name":"StrifeWater","type":"software","techniques":["T1005","T1033","T1036.005","T1041","T1053.005","T1059.003","T1070.004","T1082","T1083","T1105","T1106","T1113","T1124","T1497.003","T1573.001"]},{"id":"S0491","name":"StrongPity","type":"software","techniques":["T1016","T1020","T1027.013","T1036.004","T1036.005","T1041","T1057","T1059.001","T1070.004","T1071.001","T1083","T1090.003","T1105","T1119","T1204.002","T1518.001","T1543.003","T1547.001","T1553.002","T1560.003","T1562.001","T1564.003","T1569.002","T1571","T1573.002","T1680"]},{"id":"S0603","name":"Stuxnet","type":"software","techniques":["T1008","T1012","T1014","T1016","T1021","T1021.002","T1027.013","T1041","T1047","T1053.005","T1055.001","T1068","T1070","T1070.004","T1070.006","T1071.001","T1078.001","T1078.002","T1080","T1082","T1083","T1087.001","T1087.002","T1090.001","T1091","T1106","T1112","T1120","T1124","T1129","T1132.001","T1134.001","T1135","T1140","T1210","T1480","T1505.001","T1518.001","T1543.003","T1553.002","T1560.003","T1562","T1570","T1573.001"]},{"id":"S0018","name":"Sykipot","type":"software","techniques":["T1007","T1016","T1018","T1049","T1055.001","T1056.001","T1057","T1087.002","T1111","T1547.001","T1573.002"]},{"id":"S0242","name":"SynAck","type":"software","techniques":["T1007","T1012","T1027","T1033","T1055.013","T1057","T1070.001","T1082","T1083","T1106","T1112","T1486","T1497.001","T1614.001"]},{"id":"S0060","name":"Sys10","type":"software","techniques":["T1016","T1033","T1069.001","T1071.001","T1082","T1573.001"]},{"id":"S0663","name":"SysUpdate","type":"software","techniques":["T1005","T1007","T1016","T1016.001","T1027.002","T1027.011","T1027.013","T1033","T1036.004","T1041","T1047","T1057","T1070.004","T1071.004","T1082","T1083","T1105","T1106","T1112","T1113","T1132.001","T1140","T1543.002","T1543.003","T1547.001","T1553.002","T1564.001","T1569.002","T1573.001","T1574.001","T1680"]},{"id":"S0098","name":"T9000","type":"software","techniques":["T1016","T1033","T1082","T1113","T1119","T1120","T1123","T1124","T1125","T1518.001","T1546.010","T1560.003","T1574.001"]},{"id":"S0586","name":"TAINTEDSCRIBE","type":"software","techniques":["T1001.003","T1008","T1018","T1027.001","T1036.005","T1057","T1059.003","T1070.004","T1070.006","T1083","T1105","T1124","T1547.001","T1560","T1573.001","T1680"]},{"id":"S1193","name":"TAMECAT","type":"software","techniques":["T1047","T1059.001","T1059.003","T1059.005","T1071.001","T1105","T1132.001","T1518.001","T1573.001"]},{"id":"S0164","name":"TDTESS","type":"software","techniques":["T1059.003","T1070.004","T1070.006","T1105","T1543.003"]},{"id":"S0560","name":"TEARDROP","type":"software","techniques":["T1012","T1027","T1036.005","T1112","T1140","T1543.003"]},{"id":"S0146","name":"TEXTMATE","type":"software","techniques":["T1059.003","T1071.004"]},{"id":"S1223","name":"THINCRUST","type":"software","techniques":["T1059.006","T1071.001","T1140","T1562.004","T1573.001"]},{"id":"S0131","name":"TINYTYPHON","type":"software","techniques":["T1020","T1027.013","T1083","T1547.001"]},{"id":"S1239","name":"TONESHELL","type":"software","techniques":["T1001.003","T1010","T1027.001","T1027.007","T1027.012","T1033","T1036.004","T1036.005","T1047","T1053.005","T1055.001","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1082","T1087","T1095","T1105","T1106","T1113","T1132.002","T1134.002","T1140","T1205","T1218.010","T1218.013","T1480","T1480.001","T1480.002","T1497.002","T1518.001","T1543.003","T1547.001","T1553.002","T1559","T1560.001","T1573.001","T1574.001","T1622","T1678","T1680"]},{"id":"S1201","name":"TRANSLATEXT","type":"software","techniques":["T1012","T1036.005","T1041","T1059.001","T1071.001","T1102.001","T1102.002","T1112","T1113","T1114","T1176.001","T1185","T1205","T1539","T1555.003"]},{"id":"S0436","name":"TSCookie","type":"software","techniques":["T1016","T1055","T1057","T1059.003","T1071.001","T1083","T1090","T1095","T1105","T1140","T1204.001","T1555.003","T1573.001"]},{"id":"S0199","name":"TURNEDUP","type":"software","techniques":["T1055.004","T1059.003","T1082","T1105","T1113","T1547.001"]},{"id":"S0263","name":"TYPEFRAME","type":"software","techniques":["T1027.011","T1027.013","T1059.003","T1059.005","T1070.004","T1083","T1090","T1105","T1112","T1140","T1204.002","T1543.003","T1562.004","T1571","T1680"]},{"id":"S0011","name":"Taidoor","type":"software","techniques":["T1005","T1012","T1016","T1027.013","T1055.001","T1057","T1059.003","T1070.004","T1071.001","T1083","T1095","T1105","T1106","T1112","T1124","T1140","T1204.002","T1547.001","T1566.001","T1573.001"]},{"id":"S0467","name":"TajMahal","type":"software","techniques":["T1005","T1016","T1020","T1025","T1027","T1041","T1055.001","T1056.001","T1057","T1082","T1083","T1112","T1113","T1115","T1119","T1120","T1123","T1124","T1125","T1129","T1518","T1518.001","T1539","T1560.002"]},{"id":"S1011","name":"Tarrask","type":"software","techniques":["T1036.004","T1036.005","T1053.005","T1059.003","T1112","T1134.001","T1564"]},{"id":"S0057","name":"Tasklist","type":"software","techniques":["T1007","T1057","T1518.001"]},{"id":"S0595","name":"ThiefQuest","type":"software","techniques":["T1036.005","T1041","T1056.001","T1057","T1059.002","T1071.001","T1105","T1106","T1486","T1497.003","T1518.001","T1543.001","T1543.004","T1554","T1562.001","T1564.001","T1620","T1622"]},{"id":"S0665","name":"ThreatNeedle","type":"software","techniques":["T1005","T1027.011","T1027.013","T1027.015","T1036.005","T1082","T1083","T1105","T1112","T1140","T1204.002","T1543.003","T1547.001","T1566.001"]},{"id":"S0668","name":"TinyTurla","type":"software","techniques":["T1005","T1008","T1012","T1027.011","T1029","T1036.004","T1036.005","T1059.003","T1071.001","T1105","T1106","T1112","T1569.002","T1573.002"]},{"id":"S0004","name":"TinyZBot","type":"software","techniques":["T1056.001","T1059.003","T1113","T1115","T1543.003","T1547.001","T1547.009","T1562.001"]},{"id":"S0671","name":"Tomiris","type":"software","techniques":["T1005","T1027.002","T1041","T1053.005","T1071.001","T1105","T1497.003","T1568"]},{"id":"S0183","name":"Tor","type":"software","techniques":["T1090.003","T1573.002"]},{"id":"S0678","name":"Torisma","type":"software","techniques":["T1016","T1027.002","T1027.013","T1041","T1049","T1071.001","T1106","T1124","T1132.001","T1140","T1480","T1573.001","T1680"]},{"id":"S0682","name":"TrailBlazer","type":"software","techniques":["T1001","T1001.001","T1036","T1071.001","T1546.003"]},{"id":"S0266","name":"TrickBot","type":"software","techniques":["T1005","T1007","T1008","T1016","T1018","T1021.005","T1027","T1027.002","T1027.013","T1033","T1036","T1041","T1053.005","T1055","T1055.012","T1056.004","T1057","T1059.001","T1059.003","T1069","T1071.001","T1082","T1083","T1087.001","T1087.003","T1090.002","T1105","T1106","T1110.004","T1112","T1132.001","T1135","T1140","T1185","T1204.002","T1210","T1219","T1482","T1495","T1497.003","T1542.003","T1543.003","T1547.001","T1552.001","T1552.002","T1553.002","T1555.003","T1555.005","T1559.001","T1562.001","T1564.003","T1566.001","T1566.002","T1571","T1573.001"]},{"id":"S0094","name":"Trojan.Karagany","type":"software","techniques":["T1003","T1010","T1016","T1027","T1027.002","T1033","T1049","T1055.003","T1056.001","T1057","T1059.003","T1070.004","T1071.001","T1074.001","T1082","T1083","T1105","T1113","T1497.001","T1547.001","T1555.003","T1573.002"]},{"id":"S1196","name":"Troll Stealer","type":"software","techniques":["T1005","T1016","T1027.002","T1036.005","T1041","T1059.001","T1059.003","T1070.004","T1071.001","T1074.001","T1082","T1083","T1113","T1132.001","T1213","T1217","T1218.011","T1480.002","T1552.004","T1553.002","T1560","T1573.001"]},{"id":"S0178","name":"Truvasys","type":"software","techniques":["T1036.004","T1547.001"]},{"id":"S0647","name":"Turian","type":"software","techniques":["T1001.001","T1016","T1027","T1033","T1036.004","T1059.003","T1059.004","T1059.006","T1071.001","T1074.001","T1082","T1083","T1105","T1113","T1120","T1140","T1547.001","T1560.001"]},{"id":"S0333","name":"UBoatRAT","type":"software","techniques":["T1057","T1059.003","T1071.001","T1102.002","T1105","T1197","T1497.001","T1573.001"]},{"id":"S0275","name":"UPPERCUT","type":"software","techniques":["T1016","T1033","T1059.003","T1071.001","T1082","T1083","T1105","T1113","T1124","T1573.001"]},{"id":"S1164","name":"UPSTYLE","type":"software","techniques":["T1001.001","T1027.013","T1036","T1057","T1059.006","T1070.002","T1070.004","T1070.006","T1102.003","T1140","T1546","T1665"]},{"id":"S0136","name":"USBStealer","type":"software","techniques":["T1020","T1025","T1027.013","T1036.005","T1052.001","T1070.004","T1070.006","T1074.001","T1083","T1091","T1092","T1119","T1120","T1547.001"]},{"id":"S0452","name":"USBferry","type":"software","techniques":["T1005","T1016","T1018","T1049","T1057","T1059.003","T1083","T1087.001","T1091","T1120","T1218.011"]},{"id":"S0221","name":"Umbreon","type":"software","techniques":["T1014","T1059.003","T1078.003","T1095","T1205"]},{"id":"S0130","name":"Unknown Logger","type":"software","techniques":["T1016","T1033","T1056.001","T1082","T1091","T1105","T1555.003","T1562.001"]},{"id":"S0022","name":"Uroburos","type":"software","techniques":["T1001.001","T1001.003","T1005","T1008","T1012","T1014","T1027.002","T1027.009","T1027.011","T1027.013","T1036.004","T1055.001","T1057","T1059.003","T1070.004","T1071.001","T1071.003","T1071.004","T1082","T1083","T1090.003","T1095","T1104","T1105","T1106","T1112","T1132.002","T1140","T1205","T1543.003","T1559","T1564.005","T1572","T1573.001","T1573.002","T1620"]},{"id":"S0386","name":"Ursnif","type":"software","techniques":["T1005","T1007","T1012","T1027.010","T1027.013","T1036.005","T1041","T1047","T1055.005","T1055.012","T1056.004","T1057","T1059.001","T1059.005","T1070.004","T1071.001","T1074.001","T1080","T1082","T1090","T1090.003","T1091","T1105","T1106","T1112","T1113","T1132","T1140","T1185","T1497.003","T1543.003","T1547.001","T1559.001","T1564.003","T1568.002"]},{"id":"S0442","name":"VBShower","type":"software","techniques":["T1059.005","T1070.004","T1071.001","T1105","T1547.001"]},{"id":"S0257","name":"VERMIN","type":"software","techniques":["T1016","T1027.002","T1027.013","T1033","T1056.001","T1057","T1070.004","T1071.001","T1082","T1105","T1113","T1115","T1119","T1123","T1140","T1518.001","T1560"]},{"id":"S1218","name":"VIRTUALPIE","type":"software","techniques":["T1059.006","T1059.012","T1505.006","T1570","T1571","T1573.001"]},{"id":"S1217","name":"VIRTUALPITA","type":"software","techniques":["T1036.004","T1036.005","T1037","T1059.004","T1059.006","T1105","T1489","T1562.003","T1570","T1571","T1673","T1675"]},{"id":"S0476","name":"Valak","type":"software","techniques":["T1008","T1012","T1016","T1027","T1027.002","T1027.011","T1033","T1041","T1047","T1053.005","T1057","T1059.001","T1059.007","T1071.001","T1082","T1087.001","T1087.002","T1104","T1105","T1112","T1113","T1114.002","T1119","T1132.001","T1140","T1204.002","T1218.010","T1518.001","T1552.002","T1555.004","T1559.002","T1564.004","T1566.001","T1566.002"]},{"id":"S0636","name":"VaporRage","type":"software","techniques":["T1071.001","T1105","T1140","T1480"]},{"id":"S0207","name":"Vasport","type":"software","techniques":["T1071.001","T1090","T1105","T1547.001"]},{"id":"S1154","name":"VersaMem","type":"software","techniques":["T1027.013","T1040","T1056.004","T1059","T1070.004","T1074.001","T1129","T1203"]},{"id":"S0180","name":"Volgmer","type":"software","techniques":["T1007","T1012","T1016","T1027.011","T1027.013","T1036.004","T1049","T1057","T1059.003","T1070.004","T1082","T1083","T1105","T1106","T1112","T1140","T1543.003","T1573.001","T1573.002"]},{"id":"S1116","name":"WARPWIRE","type":"software","techniques":["T1048.003","T1056.003","T1059.007","T1132.001","T1554"]},{"id":"S0109","name":"WEBC2","type":"software","techniques":["T1059.003","T1105","T1574.001"]},{"id":"S0155","name":"WINDSHIELD","type":"software","techniques":["T1012","T1033","T1070.004","T1082","T1095"]},{"id":"S0219","name":"WINERACK","type":"software","techniques":["T1007","T1010","T1033","T1057","T1059","T1082","T1083"]},{"id":"S1115","name":"WIREFIRE","type":"software","techniques":["T1071.001","T1105","T1132.001","T1140","T1505.003","T1554","T1573.001"]},{"id":"S0366","name":"WannaCry","type":"software","techniques":["T1016","T1018","T1047","T1083","T1090.003","T1120","T1210","T1222.001","T1486","T1489","T1490","T1543.003","T1563.002","T1564.001","T1570","T1573.002"]},{"id":"S0670","name":"WarzoneRAT","type":"software","techniques":["T1005","T1014","T1021.001","T1021.005","T1041","T1055","T1056.001","T1057","T1059.001","T1059.003","T1082","T1083","T1090","T1095","T1105","T1106","T1112","T1125","T1140","T1204.002","T1221","T1546.015","T1547.001","T1548.002","T1555.003","T1562.001","T1564","T1564.003","T1566.001","T1573.001"]},{"id":"S0612","name":"WastedLocker","type":"software","techniques":["T1012","T1027.013","T1027.016","T1059.003","T1083","T1106","T1112","T1120","T1135","T1140","T1222.001","T1486","T1490","T1497.001","T1543.003","T1548.002","T1564.001","T1564.004","T1569.002","T1574.001"]},{"id":"S0579","name":"Waterbear","type":"software","techniques":["T1012","T1027.005","T1027.013","T1049","T1055","T1055.003","T1057","T1105","T1106","T1112","T1140","T1518.001","T1562.006","T1574.001"]},{"id":"S0515","name":"WellMail","type":"software","techniques":["T1005","T1016","T1033","T1095","T1105","T1140","T1560","T1571","T1573.002"]},{"id":"S0514","name":"WellMess","type":"software","techniques":["T1001.001","T1005","T1016","T1033","T1059.001","T1059.003","T1069.002","T1071.001","T1071.004","T1082","T1105","T1132.001","T1140","T1573.001","T1573.002"]},{"id":"S0645","name":"Wevtutil","type":"software","techniques":["T1005","T1070.001","T1562.002"]},{"id":"S0689","name":"WhisperGate","type":"software","techniques":["T1027.013","T1036","T1055.012","T1059.001","T1059.003","T1059.005","T1070.004","T1071.001","T1083","T1102","T1105","T1106","T1134.002","T1135","T1140","T1218.004","T1485","T1497.001","T1497.003","T1518.001","T1529","T1542.003","T1561.001","T1561.002","T1562.001","T1569.002","T1620","T1680"]},{"id":"S0206","name":"Wiarp","type":"software","techniques":["T1055","T1059.003","T1105","T1543.003"]},{"id":"S0059","name":"WinMM","type":"software","techniques":["T1008","T1033","T1057","T1071.001","T1082","T1083"]},{"id":"S0466","name":"WindTail","type":"software","techniques":["T1027.013","T1027.015","T1036","T1036.001","T1048.003","T1059.004","T1070.004","T1071.001","T1083","T1106","T1119","T1124","T1140","T1560.001","T1564.003"]},{"id":"S0176","name":"Wingbird","type":"software","techniques":["T1055","T1068","T1070.004","T1082","T1518.001","T1543.003","T1547.008","T1569.002","T1574.001"]},{"id":"S0430","name":"Winnti for Linux","type":"software","techniques":["T1014","T1027.013","T1071.001","T1095","T1105","T1140","T1205","T1573.001"]},{"id":"S0141","name":"Winnti for Windows","type":"software","techniques":["T1027.013","T1027.015","T1036.005","T1057","T1070.004","T1070.006","T1071.001","T1082","T1083","T1090.001","T1090.002","T1095","T1105","T1106","T1140","T1218.011","T1480.001","T1543.003","T1547.001","T1548.002","T1569.002","T1573.001"]},{"id":"S1065","name":"Woody RAT","type":"software","techniques":["T1005","T1012","T1016","T1016.001","T1027.013","T1033","T1041","T1055","T1055.012","T1057","T1059.001","T1059.003","T1070.004","T1071.001","T1082","T1083","T1087","T1105","T1106","T1113","T1140","T1203","T1204.002","T1518","T1518.001","T1562.006","T1566.001","T1573.001","T1573.002","T1680"]},{"id":"S0161","name":"XAgentOSX","type":"software","techniques":["T1033","T1056.001","T1057","T1070.004","T1071.002","T1082","T1083","T1106","T1113","T1555.003"]},{"id":"S0658","name":"XCSSET","type":"software","techniques":["T1005","T1027.013","T1036","T1041","T1056.002","T1059.004","T1068","T1082","T1083","T1087","T1098.004","T1105","T1113","T1195.001","T1222.002","T1486","T1497.003","T1518","T1518.001","T1539","T1543.004","T1546","T1546.004","T1548.006","T1553.001","T1554","T1560","T1564.001","T1569.001","T1573.001","T1574.006","T1614.001","T1647"]},{"id":"S1207","name":"XLoader","type":"software","techniques":["T1027.002","T1027.013","T1033","T1053.005","T1055.004","T1055.012","T1056.001","T1059.010","T1070.004","T1071.001","T1082","T1106","T1113","T1115","T1140","T1185","T1203","T1497","T1497.001","T1529","T1539","T1547.001","T1555","T1555.003","T1562.001","T1566.001","T1583.001","T1622"]},{"id":"S1248","name":"XORIndex Loader","type":"software","techniques":["T1016","T1027.010","T1027.013","T1033","T1036.005","T1041","T1059.007","T1071.001","T1082","T1105","T1140","T1614"]},{"id":"S0117","name":"XTunnel","type":"software","techniques":["T1008","T1027","T1027.016","T1046","T1059.003","T1090","T1552.001","T1573.002"]},{"id":"S0341","name":"Xbash","type":"software","techniques":["T1016","T1046","T1053.003","T1059.001","T1059.005","T1059.007","T1071.001","T1102.001","T1105","T1110.001","T1203","T1218.005","T1218.010","T1485","T1486","T1547.001"]},{"id":"S0388","name":"YAHOYAH","type":"software","techniques":["T1027.013","T1071.001","T1082","T1105","T1140","T1518.001"]},{"id":"S1114","name":"ZIPLINE","type":"software","techniques":["T1057","T1059.004","T1083","T1090","T1095","T1105","T1205","T1562.001","T1573.001"]},{"id":"S0086","name":"ZLib","type":"software","techniques":["T1007","T1036.005","T1041","T1059.003","T1071.001","T1082","T1083","T1105","T1113","T1543.003","T1560.002"]},{"id":"S0251","name":"Zebrocy","type":"software","techniques":["T1012","T1016","T1027.002","T1033","T1037.001","T1041","T1047","T1049","T1053.005","T1056.004","T1057","T1059.003","T1070.004","T1071.001","T1071.003","T1074.001","T1082","T1083","T1105","T1113","T1119","T1120","T1124","T1132.001","T1135","T1140","T1547.001","T1555.003","T1560","T1573.002","T1680"]},{"id":"S1151","name":"ZeroCleare","type":"software","techniques":["T1059","T1059.001","T1068","T1070.004","T1106","T1553.002","T1561.002","T1680"]},{"id":"S0230","name":"ZeroT","type":"software","techniques":["T1001.002","T1016","T1027.002","T1027.013","T1027.016","T1071.001","T1082","T1105","T1140","T1543.003","T1548.002","T1573.001","T1574.001"]},{"id":"S0027","name":"Zeroaccess","type":"software","techniques":["T1014","T1564.004"]},{"id":"S0330","name":"Zeus Panda","type":"software","techniques":["T1012","T1027.010","T1027.013","T1055.002","T1056.001","T1056.004","T1057","T1059","T1059.001","T1059.003","T1070.004","T1071.001","T1082","T1083","T1105","T1112","T1113","T1115","T1124","T1140","T1518.001","T1547.001","T1614.001"]},{"id":"S0672","name":"Zox","type":"software","techniques":["T1001.002","T1005","T1021.002","T1027.013","T1057","T1068","T1083","T1105","T1680"]},{"id":"S0412","name":"ZxShell","type":"software","techniques":["T1005","T1007","T1012","T1021.001","T1021.005","T1033","T1046","T1055.001","T1056.001","T1056.004","T1057","T1059.003","T1070.001","T1070.004","T1071.001","T1071.002","T1082","T1083","T1090","T1105","T1106","T1112","T1113","T1125","T1134.002","T1136.001","T1190","T1218.011","T1499","T1543.003","T1562.001","T1562.004","T1569.002","T1571"]},{"id":"S1013","name":"ZxxZ","type":"software","techniques":["T1005","T1012","T1027.013","T1033","T1036.004","T1053.005","T1057","T1082","T1105","T1106","T1140","T1204.002","T1518.001","T1566.001"]},{"id":"S0202","name":"adbupd","type":"software","techniques":["T1059.003","T1546.003","T1573.002"]},{"id":"S0471","name":"build_downer","type":"software","techniques":["T1027.003","T1036.004","T1105","T1106","T1124","T1518.001","T1547.001","T1680"]},{"id":"S1043","name":"ccf32","type":"software","techniques":["T1005","T1048.003","T1053.005","T1059.003","T1070.004","T1074.001","T1074.002","T1083","T1119","T1124","T1560.001","T1564.001"]},{"id":"S1204","name":"cd00r","type":"software","techniques":["T1016","T1040","T1095","T1205.001"]},{"id":"S0160","name":"certutil","type":"software","techniques":["T1105","T1140","T1553.004","T1560.001"]},{"id":"S0106","name":"cmd","type":"software","techniques":["T1059.003","T1070.004","T1082","T1083","T1105","T1570"]},{"id":"S0472","name":"down_new","type":"software","techniques":["T1016","T1057","T1071.001","T1083","T1105","T1132.001","T1518","T1518.001","T1573.001","T1680"]},{"id":"S0105","name":"dsquery","type":"software","techniques":["T1069.002","T1082","T1087.002","T1482"]},{"id":"S0404","name":"esentutl","type":"software","techniques":["T1003.003","T1005","T1006","T1105","T1564.004","T1570"]},{"id":"S0095","name":"ftp","type":"software","techniques":["T1048.003","T1105","T1570"]},{"id":"S0032","name":"gh0st RAT","type":"software","techniques":["T1012","T1055","T1056.001","T1057","T1059","T1070.001","T1070.004","T1082","T1095","T1105","T1106","T1112","T1113","T1129","T1132.001","T1140","T1218.011","T1543.003","T1547.001","T1568.001","T1569.002","T1573","T1573.001","T1574.001"]},{"id":"S0008","name":"gsecdump","type":"software","techniques":["T1003.002","T1003.004"]},{"id":"S0071","name":"hcdLoader","type":"software","techniques":["T1059.003","T1543.003"]},{"id":"S0068","name":"httpclient","type":"software","techniques":["T1059.003","T1071.001","T1573.001"]},{"id":"S0278","name":"iKitten","type":"software","techniques":["T1016","T1037.004","T1056.002","T1057","T1555.001","T1560.001","T1564.001"]},{"id":"S0283","name":"jRAT","type":"software","techniques":["T1007","T1016","T1021.001","T1027","T1027.002","T1029","T1037.005","T1047","T1049","T1056.001","T1057","T1059.003","T1059.005","T1059.007","T1070.004","T1082","T1083","T1090","T1105","T1113","T1115","T1120","T1123","T1125","T1518.001","T1552.001","T1552.004","T1555.003"]},{"id":"S1048","name":"macOS.OSAMiner","type":"software","techniques":["T1027.008","T1027.009","T1057","T1059.002","T1082","T1105","T1497.001","T1543.001","T1562.001","T1569.001","T1680"]},{"id":"S1059","name":"metaMain","type":"software","techniques":["T1005","T1027.013","T1033","T1041","T1055","T1056","T1056.001","T1057","T1070.004","T1070.006","T1071.001","T1074.001","T1082","T1083","T1090.001","T1095","T1105","T1106","T1112","T1113","T1140","T1205.001","T1497.003","T1546.003","T1560.003","T1573.001","T1574.001","T1620"]},{"id":"S0102","name":"nbtstat","type":"software","techniques":["T1016","T1049"]},{"id":"S0108","name":"netsh","type":"software","techniques":["T1090","T1518.001","T1546.007","T1562.004"]},{"id":"S0508","name":"ngrok","type":"software","techniques":["T1090","T1102","T1567","T1568.002","T1572"]},{"id":"S0385","name":"njRAT","type":"software","techniques":["T1005","T1010","T1012","T1018","T1021.001","T1027.004","T1027.013","T1033","T1041","T1056.001","T1057","T1059.001","T1059.003","T1070.004","T1070.009","T1071.001","T1082","T1083","T1091","T1105","T1106","T1112","T1113","T1120","T1125","T1132.001","T1547.001","T1555.003","T1562.004","T1568.001","T1571"]},{"id":"S0067","name":"pngdowner","type":"software","techniques":["T1070.004","T1071.001","T1552.001"]},{"id":"S1187","name":"reGeorg","type":"software","techniques":["T1021.001","T1021.002","T1021.004","T1059.006","T1071.001","T1090","T1095","T1105","T1505.003","T1572"]},{"id":"S0653","name":"xCaon","type":"software","techniques":["T1005","T1016","T1059.003","T1071.001","T1105","T1106","T1132.001","T1140","T1518.001","T1547","T1573.001"]},{"id":"S0248","name":"yty","type":"software","techniques":["T1005","T1016","T1018","T1027.002","T1027.016","T1033","T1053.005","T1056.001","T1057","T1082","T1083","T1102.002","T1113","T1497.001","T1680"]},{"id":"S0350","name":"zwShell","type":"software","techniques":["T1016","T1021.001","T1021.002","T1033","T1053.005","T1059.003","T1070.004","T1082","T1083","T1112","T1543.003"]}]'),_U={version:jU,tacticOrder:FU,techniques:LU,entities:PU},qU=Math.PI*(3-Math.sqrt(5)),Gi=(e,t)=>`${e}:${t}`;function My(e,t,n=0){const a=t*Math.sqrt(e+1),i=e*qU+n;return{x:Math.cos(i)*a,y:Math.sin(i)*a}}function jy(e){let t=2166136261;for(let n=0;n>>0)/4294967295*Math.PI*2}function Fy(e,t){const n=e.map(i=>t.get(i)).filter(i=>!!i);if(!n.length)return{x:0,y:0};const a=n.reduce((i,r)=>({x:i.x+r.x,y:i.y+r.y}),{x:0,y:0});return{x:a.x/n.length,y:a.y/n.length}}function BU(e,t){if(!e.length)return{nodes:[],edges:[]};const n=[],a=[],i=new Map(t.techniques.map(y=>[y.id,y])),r=[...new Set(e.flatMap(y=>y.categories?.length?y.categories:[y.category]))].filter(Boolean).sort((y,w)=>y.localeCompare(w,"en-US")),c=[...new Set(e.flatMap(y=>y.defenses??[]))].filter(Boolean).sort((y,w)=>y.localeCompare(w,"en-US")),l=[...new Set(e.flatMap(y=>y.targets??[]))].filter(Boolean).sort((y,w)=>y.localeCompare(w,"en-US")),f=t.tacticOrder.filter(y=>e.some(w=>w.tactics.includes(y))),T=new Map,p=[...r.map(y=>({kind:"category",label:y})),...c.map(y=>({kind:"defense",label:y})),...l.map(y=>({kind:"target",label:y})),...f.map(y=>({kind:"tactic",label:y}))].sort((y,w)=>y.label.localeCompare(w.label,"en-US")||y.kind.localeCompare(w.kind)),m=Math.min(1280,Math.max(460,p.length*88));p.forEach((y,w)=>{const C=p.length===1?0:w/p.length*Math.PI*2-Math.PI/2,k={x:Math.cos(C)*m,y:Math.sin(C)*m},E=Gi(y.kind,y.label);T.set(E,k),n.push({id:E,kind:y.kind,label:y.label,...k,radius:y.kind==="category"?12:y.kind==="defense"?9:10})});const g=[...new Set(e.flatMap(y=>y.techniqueIds))],S=new Map;g.forEach(y=>{const k=(i.get(y)?.tactics??e.find(O=>O.techniqueIds.includes(y))?.tactics??[]).filter(O=>f.includes(O)).sort().join("|"),E=S.get(k)??[];E.push(y),S.set(k,E)});for(const[y,w]of S){const C=y?y.split("|"):[],k=C.map(O=>Gi("tactic",O)),E=Fy(k,T);w.sort().forEach((O,N)=>{const B=My(N,96,jy(y||O)),A={x:E.x+B.x,y:E.y+B.y},z=Gi("technique",O);T.set(z,A),n.push({id:z,kind:"technique",label:`${O} · ${i.get(O)?.name??"MITRE technique"}`,...A,radius:7});for(const P of C)a.push({id:`technique-tactic:${O}:${P}`,source:z,target:Gi("tactic",P),kind:"technique"})})}const x=new Map;e.forEach(y=>{const w=(y.categories?.length?y.categories:[y.category]).filter(z=>r.includes(z)).map(z=>Gi("category",z)),C=(y.defenses??[]).filter(z=>c.includes(z)).map(z=>Gi("defense",z)),k=(y.targets??[]).filter(z=>l.includes(z)).map(z=>Gi("target",z)),E=y.techniqueIds.map(z=>Gi("technique",z)).filter(z=>T.has(z)),O=E.length?[]:y.tactics.map(z=>Gi("tactic",z)).filter(z=>T.has(z)),N=[...new Set([...w,...C,...k,...E,...O])],B=[...N].sort().join("|"),A=x.get(B)??[];A.push({item:y,relationIds:N}),x.set(B,A)});for(const[y,w]of x){const C=Fy(w[0]?.relationIds??[],T);w.sort((k,E)=>E.item.risk-k.item.risk||k.item.id.localeCompare(E.item.id)).forEach(({item:k,relationIds:E},O)=>{const N=My(O,92,jy(y||k.id)),B={x:C.x+N.x,y:C.y+N.y},A=Gi("finding",k.id);n.push({id:A,kind:"finding",itemId:k.id,label:k.title,severity:k.severity,...B,radius:Math.min(7,4+k.risk/220)}),E.forEach(z=>{const P=z.startsWith("category:")?"category":z.startsWith("defense:")?"defense":z.startsWith("target:")?"target":z.startsWith("technique:")?"technique":"tactic";a.push({id:`finding-${P}:${k.id}:${z}`,source:A,target:z,kind:P})})})}return{nodes:n,edges:a}}const s7=["Result Status","Result message","SI version"];function UU(e,t){return e.values.find(n=>n.value===t)?.label??t}function zU(e,t,n){if(t&&n)return`${e.label}: ${t}–${n}`;if(t)return`${e.label}: ≥ ${t}`;if(n)return`${e.label}: ≤ ${n}`}function WU({facets:e,filters:t,search:n,actionOnly:a}){const i=[],r=n.trim();return r&&i.push(`Search: ${r}`),e.forEach(c=>{if(c.source==="profile-status"||s7.includes(c.label))return;const l=t[c.id];if(!l)return;if(c.kind==="category"&&l.values?.length){i.push(`${c.label}: ${l.values.map(T=>UU(c,T)).join(", ")}`);return}const f=zU(c,l.minimum,l.maximum);f&&i.push(f)}),a&&i.push("My Workspace"),i}const Ly=(e,t,n)=>Math.min(n,Math.max(t,e));function Ih(e,t,n=5){let a=Ly(e.x,t.x,t.x+t.width),i=Ly(e.y,t.y,t.y+t.height);if(a===e.x&&i===e.y){const p=[{distance:Math.abs(e.x-t.x),x:t.x,y:e.y},{distance:Math.abs(t.x+t.width-e.x),x:t.x+t.width,y:e.y},{distance:Math.abs(e.y-t.y),x:e.x,y:t.y},{distance:Math.abs(t.y+t.height-e.y),x:e.x,y:t.y+t.height}].sort((m,g)=>m.distance-g.distance)[0];a=p.x,i=p.y}const r=a-e.x,c=i-e.y,l=Math.hypot(r,c)||1,f=Math.min(l,e.radius+n);return{startX:e.x+r/l*f,startY:e.y+c/l*f,endX:a,endY:i}}const r7=(e,t)=>Math.max(e,t)*1.6;function Py(e,t,n,a,i,r){return e>=n&&e<=i&&t>=a&&t<=r}function Tu(e,t,n,a,i,r){return(n-e)*(r-t)-(a-t)*(i-e)}function Uc(e,t,n,a,i,r,c,l){const f=Tu(e,t,n,a,i,r),T=Tu(e,t,n,a,c,l),p=Tu(i,r,c,l,e,t),m=Tu(i,r,c,l,n,a),g=1e-6,S=(x,y,w,C,k,E)=>w>=Math.min(x,k)-g&&w<=Math.max(x,k)+g&&C>=Math.min(y,E)-g&&C<=Math.max(y,E)+g;return(f>g&&T<-g||f<-g&&T>g)&&(p>g&&m<-g||p<-g&&m>g)||Math.abs(f)<=g&&S(e,t,i,r,n,a)||Math.abs(T)<=g&&S(e,t,c,l,n,a)||Math.abs(p)<=g&&S(i,r,e,t,c,l)?!0:Math.abs(m)<=g&&S(i,r,n,a,c,l)}function VU(e,t,n){const a=e.x2-e.x1,i=e.y2-e.y1,r=a*a+i*i;if(r===0)return Math.hypot(t-e.x1,n-e.y1);const c=Math.max(0,Math.min(1,((t-e.x1)*a+(n-e.y1)*i)/r));return Math.hypot(t-(e.x1+c*a),n-(e.y1+c*i))}function bp(e,t,n,a,i=4){const r=e.x-i,c=e.y-i,l=e.x+t+i,f=e.y+n+i;return a.reduce((T,p)=>{const m=Py(p.x1,p.y1,r,c,l,f)||Py(p.x2,p.y2,r,c,l,f)||Uc(p.x1,p.y1,p.x2,p.y2,r,c,l,c)||Uc(p.x1,p.y1,p.x2,p.y2,l,c,l,f)||Uc(p.x1,p.y1,p.x2,p.y2,l,f,r,f)||Uc(p.x1,p.y1,p.x2,p.y2,r,f,r,c);return T+Number(m)},0)}function HU(e,t,n,a,i,r=()=>0){const c=Math.min(140,Math.max(n,a)*.65),l=r7(n,a);let f,T=Number.POSITIVE_INFINITY;for(const p of e){const m=Math.hypot(p.x-t.x,p.y-t.y),g=Math.max(0,m-l)*12,S=m+bp(p,n,a,i)*c+g+r(p);S>=T||(f=p,T=S)}return f}function GU(e,t,n){const a=Math.max(.001,e),i=Math.log2(Math.max(1,a))*.06,r=Math.min(n,Math.max(t,t+i));return{screenScale:r,graphScale:r/a}}function XU(e){return e<=2?0:Math.min(.8,.28+Math.log2(e)*.08)}const zc="__filtered-graph-selection__";function Nh(e,t){if(e.source===t)return e.target;if(e.target===t)return e.source}function KU(e,t){const n=new Map(e.nodes.map(f=>[f.id,f.kind])),a=n.get(t);if(!a||a==="finding")return[];const i=new Set([t]),r=a==="tactic"?[t,...e.edges.flatMap(f=>{const T=Nh(f,t);return T&&n.get(T)==="technique"?[T]:[]})]:[t];r.forEach(f=>i.add(f));const c=e.edges.flatMap(f=>r.flatMap(T=>{const p=Nh(f,T);return p&&n.get(p)==="finding"?[p]:[]}));c.forEach(f=>i.add(f)),e.edges.forEach(f=>{const T=c.includes(f.source),p=c.includes(f.target);if(!T&&!p)return;const m=T?f.target:f.source;i.add(m)});const l=[...i].filter(f=>n.get(f)==="technique");return e.edges.forEach(f=>{const T=l.includes(f.source)?f.source:l.includes(f.target)?f.target:void 0;if(!T)return;const p=Nh(f,T);p&&n.get(p)==="tactic"&&(a!=="tactic"||p===t)&&i.add(p)}),e.nodes.map(f=>f.id).filter(f=>i.has(f))}function Oh(e,t){const n=new Set;for(const a of t){if(a===zc)return e.nodes.map(r=>r.id);const i=KU(e,a);if(i.length){i.forEach(r=>n.add(r));continue}e.nodes.some(r=>r.id===a)&&(n.add(a),e.edges.forEach(r=>{r.source===a&&n.add(r.target),r.target===a&&n.add(r.source)}))}return e.nodes.map(a=>a.id).filter(a=>n.has(a))}function Ru(e){return e.trim().replace(/\s+/g," ").toLocaleLowerCase("de-DE")}function $U(e,t){const n=Ru(e.label);return e.kind!=="category"||e.source==="profile-status"?!1:t==="category"?e.role==="category"||/^(?:cis\s+)?(?:category|kategorie)$/.test(n):t==="target"?e.role==="asset"||/^(?:target|ziel|affected object|betroffenes objekt|asset)$/.test(n):t==="defense"?/^mitre\s*d3fend$/.test(n):t==="technique"||t==="tactic"?/^mitre\s*att&?ck$/.test(n):t==="finding"?e.role==="rule-id"||/^(?:rule|regel)(?:\s+|-)?id$/.test(n):!1}function YU(e,t){const n=Ru(e.label),a=e.kind==="technique"?/\bt\d{4}(?:\.\d{3})?\b/i.exec(e.label)?.[0]?.toLocaleLowerCase("en-US"):void 0;return t.values.find(i=>{const r=Ru(i.value),c=Ru(i.label);return n===r||n===c||a&&(r.includes(a)||c.includes(a))?!0:e.kind==="finding"?n.startsWith(`${r} `)||n.startsWith(`${c} `):!1})?.value}function o7(e,t){for(const n of t){if(!$U(n,e.kind))continue;const a=YU(e,n);if(a!==void 0)return{facetId:n.id,value:a}}}function ZU(e,t,n){for(const a of e){if(a.kind==="finding")continue;const i=o7(a,t);if(i&&n[i.facetId]?.values?.includes(i.value))return a.id}return""}const vr={screenScale:{minimum:.7,maximum:.76},finding:{width:240,height:232},relation:{width:190,height:130},category:{width:220,height:150}};function _y({variant:e,relationKind:t,children:n}){const a=e==="finding"?"pathfinder-micro-card pathfinder-micro-card-finding obsidian-node-matrix-card":`pathfinder-micro-card pathfinder-micro-card-relation obsidian-node-card data-tile obsidian-node-card-${t??"relation"}`;return d.jsx("div",{className:a,"data-pathfinder-micro-card":e,children:n})}const JU=_U,QU={critical:"Critical",high:"High",medium:"Medium",low:"Low",info:"Info",unknown:"Unknown"},Mh={finding:"Finding",category:"Category",defense:"D3FEND",target:"Target",technique:"Technique",tactic:"Tactic"},qy=["#7c3aed","#0f766e","#b45309","#be123c","#1d4ed8","#6d28d9"],Du=(e,t,n)=>Math.min(n,Math.max(t,e)),jh=e=>e.length>44?`${e.slice(0,41).trimEnd()}…`:e,By=vr.finding.width,Uy=vr.finding.height,zy=vr.relation.width,Wy=vr.relation.height,Vy=vr.category.width,Hy=vr.category.height;function fu(e,t,n){if(!e.length)return{x:0,y:0,scale:1};const a=e.map(p=>p.x),i=e.map(p=>p.y),r=Math.min(...a)-170,c=Math.max(...a)+170,l=Math.min(...i)-90,f=Math.max(...i)+90,T=Du(Math.min(t/(c-r),n/(f-l))*.88,.12,1.8);return{x:-((r+c)/2)*T,y:-((l+f)/2)*T,scale:T}}const ez=H.memo(tz);function tz({active:e,onOpenFinding:t,pathSnapshotRequest:n,onPathSnapshotApplied:a}){const i=ca(),{dataset:r,activeSheet:c,activeSheetId:l,activeProfile:f,titleColumn:T,reviews:p,actionOnly:m,facetFilters:g,pathFindingIds:S,search:x,statusFilter:y,setFacetFilter:w,setSelectedRecord:C,setView:k,toggleWorkspace:E,updateReview:O}=i,[N]=H.useState(()=>D6()??JU),[B,A]=H.useState(""),[z,P]=H.useState([]),[K,I]=H.useState(""),[L,le]=H.useState("off"),ue=L==="labels",X=L==="text",[F,re]=H.useState({x:0,y:0,scale:1}),me=GU(F.scale,vr.screenScale.minimum,vr.screenScale.maximum).graphScale,[te,Ce]=H.useState({width:1200,height:720}),[ee,M]=H.useState({}),[Y,Z]=H.useState({}),[J,he]=H.useState([]),[ge,de]=H.useState([]),[fe,ye]=H.useState([]),[qe,ae]=H.useState(),[Ne,Ve]=H.useState(0),tt=H.useRef(null),We=H.useRef(null),Le=H.useRef(""),_e=H.useRef(0),Xe=H.useRef(2100),pt=H.useRef(""),Pt=H.useRef(void 0),Kt=H.useRef(""),Dt=H.useRef(void 0),dt=H.useRef(0),jt=H.useRef(F),Gt=H.useRef(void 0);jt.current=F;const ln=Object.values(p).filter(oe=>oe.include).length,Et=XU(z.length),_t=ue&&F.scalel0(c,r,f,p),[f,c,r,p]),rt=H.useMemo(()=>E_(He,N,T,c?.toolId??r?.profileId),[c?.toolId,r?.profileId,N,T,He]),Ye=H.useMemo(()=>BU(rt,N),[rt,N]),mt=H.useMemo(()=>Ye.nodes.map(oe=>oe.id).join("|"),[Ye.nodes]),Qe=H.useMemo(()=>Ye.nodes.map(oe=>({...oe,...ee[oe.id]??{}})),[Ye.nodes,ee]),qt=H.useMemo(()=>Oh(Ye,J),[Ye,J]),ot=H.useMemo(()=>ge.length?new Set(Oh(Ye,ge)):void 0,[ge,Ye]),Pe=H.useMemo(()=>ot?Qe.filter(oe=>ot.has(oe.id)):Qe,[ot,Qe]),Me=H.useMemo(()=>{const oe=[],Ee={};if(!X)return Ee;const ze=[0,-22,22,-44,44,-66,66,-88,88,-110,110,-132,132,-154,154,-176,176,-198,198,-220,220],lt=[...Pe].sort((nt,ut)=>+(nt.kind==="finding")-+(ut.kind==="finding")||nt.y-ut.y);for(const nt of lt){const ut=jh(nt.label),Tt=Math.max(48,Math.min(352,ut.length*8.6)),bt=te.width/2+F.x+nt.x*F.scale,Ea=te.height/2+F.y+nt.y*F.scale,za=nt.radius*F.scale+6,ua=nt.x>0?bt-za-Tt:bt+za,It=ua+Tt,Bt=ze.find(Hn=>{const Jn=Ea+Hn-15,Tn=Jn+20;return Jn>=6&&Tn<=te.height-6&&oe.every(yn=>It+4<=yn.left||ua>=yn.right+4||Tn+3<=yn.top||Jn>=yn.bottom+3)})??0;Ee[nt.id]=Bt,oe.push({left:ua,right:It,top:Ea+Bt-15,bottom:Ea+Bt+5})}return Ee},[F.scale,F.x,F.y,te.height,te.width,Pe,X]),Ke=H.useMemo(()=>new Map(Qe.map(oe=>[oe.id,oe])),[Qe]),st=H.useMemo(()=>new Map(rt.map(oe=>[oe.id,oe])),[rt]),Vt=H.useMemo(()=>{const oe=new Set(Pe.map(It=>It.id)),Ee=K&&oe.has(K)?K:"";if(!pe&&!Ee||!Pe.length)return[];const ze=[...Ke.values()],lt=ze.length?(Math.min(...ze.map(It=>It.x))+Math.max(...ze.map(It=>It.x)))/2:0,nt=ot?18:10,ut=[],Tt=[],bt=[],Ea=Ye.edges.flatMap(It=>{if(!z.includes(It.source)&&!z.includes(It.target))return[];if(ot&&(!ot.has(It.source)||!ot.has(It.target)))return[];const Bt=Ke.get(It.source),Hn=Ke.get(It.target);return Bt&&Hn?[{x1:Bt.x,y1:Bt.y,x2:Hn.x,y2:Hn.y}]:[]}),ua=[...new Set([...pe?z.filter(It=>oe.has(It)):[],...Ee?[Ee]:[]])].sort((It,Bt)=>{const Hn=Y[It]?0:1,Jn=Y[Bt]?0:1;if(Hn!==Jn)return Hn-Jn;if(!ot)return 0;const Tn=Ke.get(It),yn=Ke.get(Bt);return(Tn?.y??0)-(yn?.y??0)||(Tn?.x??0)-(yn?.x??0)});for(const It of ua){if(ot&&!ot.has(It))continue;const Bt=Ke.get(It);if(!Bt)continue;const Hn=Bt.itemId?st.get(Bt.itemId):void 0,Jn=Bt.kind==="category"?Vy:zy,Tn=(Hn?By:Jn)*me,yn=Bt.kind==="category"?Hy:Wy,da=(Hn?Uy:yn)*me,rs=Bt.x<=lt,Fs=Bt.radius+(Hn?12:9),os=rs?Bt.x+Fs:Bt.x-Fs-Tn,Gn=Bt.y-da/2,wi=da+nt,g0=Y[Bt.id],Do=Math.min(8,Math.max(4,Math.ceil(Math.sqrt(ua.length))+2)),Ls=Array.from({length:Do*2+1},(yt,$t)=>{if($t===0)return 0;const fn=Math.ceil($t/2);return($t%2?fn:-fn)*wi}),cs=rs?1:-1,Io=ot?4:3,No=rs?Bt.x-Fs-Tn:Bt.x+Fs,L1=Ls.flatMap(yt=>[...Array.from({length:Io},($t,fn)=>({x:os+cs*fn*(Tn+nt),y:Gn+yt})),...Array.from({length:Io},($t,fn)=>({x:No-cs*fn*(Tn+nt),y:Gn+yt}))]),yr=yt=>ut.every($t=>yt.x+Tn+nt<=$t.left||yt.x>=$t.right+nt||yt.y+da+nt<=$t.top||yt.y>=$t.bottom+nt),Ci=yt=>ze.every($t=>{const fn=$t.radius+8;return yt.x+Tn+fn<=$t.x||yt.x>=$t.x+fn||yt.y+da+fn<=$t.y||yt.y>=$t.y+fn}),Oo=yt=>yr(yt)&&Ci(yt),Sr=r7(Tn,da),Ei=L1.filter(yt=>Math.hypot(yt.x-os,yt.y-Gn)<=Sr),v0=Ei.filter(Oo),x0=yt=>{const $t=Ih(Bt,{x:yt.x,y:yt.y,width:Tn,height:da}),fn={x1:$t.startX,y1:$t.startY,x2:$t.endX,y2:$t.endY},wr=ut.filter(hn=>bp({x:hn.left,y:hn.top},hn.right-hn.left,hn.bottom-hn.top,[fn],2)>0).length,kd=bp(yt,Tn,da,Tt,2),jo=Tt.filter(hn=>Uc(fn.x1,fn.y1,fn.x2,fn.y2,hn.x1,hn.y1,hn.x2,hn.y2)).length,Fo=ze.filter(hn=>hn.id!==Bt.id&&VU(fn,hn.x,hn.y)<=hn.radius+5).length;return(wr+kd)*5e3+Fo*2400+jo*900},Mo=HU(v0.length?v0:Ei,{x:os,y:Gn},Tn,da,Ea,x0)??{x:os,y:Gn},ls=g0?.x??Mo.x,us=g0?.y??Mo.y;ut.push({left:ls,right:ls+Tn,top:us,bottom:us+da});const br=Ih(Bt,{x:ls,y:us,width:Tn,height:da});Tt.push({x1:br.startX,y1:br.startY,x2:br.endX,y2:br.endY}),bt.push({node:Bt,finding:Hn,x:ls,y:us,width:Tn,height:da})}return bt},[Y,Pe,ot,st,Ye.edges,me,K,Ke,z,pe]),Xt=Ke.get(B),Fn=H.useMemo(()=>ZU(Qe,Je,g),[g,Je,Qe]),Sa=f.defaults(c).statusFilter,Zn=!!(x||Object.keys(g).length||y!==Sa||m||S.length),ba=[...z].reverse().find(oe=>Ke.get(oe)?.kind!=="finding")??"",Wn=ge[0]||ba||Fn||(Zn&&Qe.length?zc:""),Ln=Wn?[Wn]:[],Si=Ke.get(Wn),wa=Ln.length>0&&Ln.length===J.length&&Ln.every(oe=>J.includes(oe)),ti=Ke.get(K),Pn=Xt?.itemId?st.get(Xt.itemId):void 0,Vn=Xt??ti,q=Vn?.itemId?st.get(Vn.itemId):void 0,ne=K?[K]:z,V=H.useMemo(()=>{const oe=new Set(z);for(const Ee of Ye.edges)(z.includes(Ee.source)||z.includes(Ee.target))&&(oe.add(Ee.source),oe.add(Ee.target));return{activeNodeIds:[...z],nodeIds:[...oe]}},[Ye.edges,z]),G=Vn?Ye.edges.filter(oe=>oe.source===Vn.id||oe.target===Vn.id).length:0,Q=(oe,Ee)=>{const ze=Dt.current;if(!Ee){const lt=g[oe.facetId]?.values;lt?.length===1&<[0]===oe.value&&w(oe.facetId,null),Dt.current=void 0;return}if(ze&&ze.facetId!==oe.facetId){const lt=g[ze.facetId]?.values;lt?.length===1&<[0]===ze.value&&w(ze.facetId,null)}w(oe.facetId,{values:[oe.value]}),Dt.current=oe},ie=oe=>{const Ee=Ke.get(oe);if(!Ee)return;const ze=z.includes(oe),lt=Ee.kind!=="finding"&&!ge.length?o7(Ee,Je):void 0;lt&&(!ze||L==="labels")&&Q(lt,!ze),P(nt=>{if(L!=="labels")return Ee.kind!=="finding"&&!ge.length&&he([]),le("labels"),A(oe),[oe];const ut=nt.includes(oe),Tt=ut?nt.filter(bt=>bt!==oe):Ee.kind!=="finding"&&!ge.length?[...nt.filter(bt=>Ke.get(bt)?.kind==="finding"),oe]:[...nt,oe];return!ut&&Ee.kind!=="finding"&&!ge.length&&he([]),ut&&!Tt.length&&le("off"),A(bt=>ut?bt===oe?Tt.at(-1)??"":bt:oe),Tt})};H.useEffect(()=>{const oe=tt.current;if(!e||!oe||typeof ResizeObserver>"u")return;const Ee=new ResizeObserver(ze=>{const lt=ze[0]?.contentRect;lt&&Ce(nt=>{const ut=Math.max(1,lt.width),Tt=Math.max(1,lt.height);return nt.width===ut&&nt.height===Tt?nt:{width:ut,height:Tt}})});return Ee.observe(oe),()=>Ee.disconnect()},[e]);const W=H.useCallback(()=>{Gt.current!==void 0&&globalThis.cancelAnimationFrame(Gt.current),Gt.current=void 0},[]),D=H.useCallback((oe,Ee=620)=>{W();const ze=jt.current;if(typeof globalThis.matchMedia=="function"&&globalThis.matchMedia("(prefers-reduced-motion: reduce)").matches){jt.current=oe,re(oe);return}const lt=globalThis.performance.now(),nt=ut=>{const Tt=Du((ut-lt)/Ee,0,1),bt=Tt*Tt*Tt*(Tt*(Tt*6-15)+10),Ea=Math.sin(Math.PI*Tt)*.032,za=Math.exp(Math.log(ze.scale)+(Math.log(oe.scale)-Math.log(ze.scale))*bt),ua={x:ze.x+(oe.x-ze.x)*bt,y:ze.y+(oe.y-ze.y)*bt,scale:za*(1-Ea)};jt.current=ua,re(ua),Tt<1?Gt.current=globalThis.requestAnimationFrame(nt):Gt.current=void 0};Gt.current=globalThis.requestAnimationFrame(nt)},[W]),j=H.useCallback((oe,Ee)=>{re(fu(Pe,oe,Ee))},[Pe]),_=H.useCallback(()=>D(fu(Pe,te.width,te.height),520),[D,te.height,te.width,Pe]);H.useEffect(()=>{M({}),Z({}),P(oe=>oe.filter(Ee=>Ye.nodes.some(ze=>ze.id===Ee))),A(oe=>Ye.nodes.some(Ee=>Ee.id===oe)?oe:""),he(oe=>oe.filter(Ee=>Ee===zc||Ye.nodes.some(ze=>ze.id===Ee))),de(oe=>oe.filter(Ee=>Ee===zc||Ye.nodes.some(ze=>ze.id===Ee)))},[mt]),H.useEffect(()=>{e&&n&&ae(n)},[e,n]),H.useEffect(()=>{if(!e||!qe)return;const oe=new Set(Ye.nodes.map(ze=>ze.id)),Ee=qe.path.activeNodeIds.filter(ze=>oe.has(ze));P(Ee),A(Ee.at(-1)??""),ae(void 0),a?.()},[e,Ye.nodes,mt,a,qe]),H.useEffect(()=>{if(!e||pt.current===mt)return;const oe=globalThis.requestAnimationFrame(()=>{const Ee=tt.current?.getBoundingClientRect();!Ee||Ee.width<=1||Ee.height<=1||(pt.current=mt,Ce({width:Ee.width,height:Ee.height}),j(Ee.width,Ee.height))});return()=>globalThis.cancelAnimationFrame(oe)},[e,j,mt]),H.useEffect(()=>{if(!e)return;const oe=ge.join("|");if(!oe){Kt.current="";return}if(Kt.current===oe)return;Kt.current=oe;const Ee=globalThis.requestAnimationFrame(()=>D(fu(Pe,te.width,te.height),520));return()=>globalThis.cancelAnimationFrame(Ee)},[e,D,te.height,te.width,Pe,ge]),H.useEffect(()=>{if(!e||!Ne||dt.current===Ne)return;dt.current=Ne;const oe=globalThis.requestAnimationFrame(()=>D(fu(Pe,te.width,te.height)));return()=>globalThis.cancelAnimationFrame(oe)},[e,D,te.height,te.width,Pe,Ne]),H.useEffect(()=>{e||W()},[e,W]),H.useEffect(()=>W,[W]);const se=oe=>r&&c?[...H6(oe.record,r.sheets,l),...X6(oe.record,r.sheets),...wd(oe.record,c.toolId??r.profileId)?[]:K6(oe.record)]:[],xe=oe=>Am(oe.record,c?.toolId??r?.profileId),Ae=oe=>fe.find(Ee=>Ee.recordId===oe),Fe=oe=>ye(Ee=>Ee.map(ze=>ze.recordId===oe?{...ze,zIndex:++Xe.current}:ze)),Oe=oe=>{if(Ae(oe.id))return ye(lt=>lt.filter(nt=>nt.recordId!==oe.id));const Ee=se(oe);if(!Ee.length&&!xe(oe).length)return;const ze=Ee.reduce((lt,nt)=>lt+nt.analysis.records.length,0);ye(lt=>[...lt,{recordId:oe.id,toolId:oa(oe.record,c?.toolId??r?.profileId),title:Ee.length?`Results (${ze.toLocaleString("en-US")}) – ${oe.title}`:`Result – ${oe.title}`,color:qy[_e.current++%qy.length],zIndex:++Xe.current,minimized:!1}])},Ue=oe=>{C(oe.id),k("records"),t()},Ge=oe=>{const Ee=jt.current;D({...Ee,scale:Du(Ee.scale*oe,.08,4)},280)},kt=()=>{const oe=jt.current;D({...oe,scale:Math.max(oe.scale,Et+.04)},360)},Be=oe=>{oe.preventDefault(),W();const Ee=oe.currentTarget.getBoundingClientRect(),ze=Du(F.scale*Math.exp(-oe.deltaY*.0012),.08,4),lt=oe.clientX-Ee.left-te.width/2,nt=oe.clientY-Ee.top-te.height/2,ut=(lt-F.x)/F.scale,Tt=(nt-F.y)/F.scale;re({x:lt-ut*ze,y:nt-Tt*ze,scale:ze})},ct=oe=>{oe.button===0&&(W(),oe.currentTarget.setPointerCapture(oe.pointerId),We.current={kind:"pan",pointerId:oe.pointerId,moved:!1,startX:oe.clientX,startY:oe.clientY,camera:F})},St=(oe,Ee)=>{if(oe.button!==0)return;W(),oe.stopPropagation(),oe.currentTarget.setPointerCapture(oe.pointerId);const ze=Vt.find(lt=>lt.node.id===Ee.id);We.current={kind:"node",pointerId:oe.pointerId,moved:!1,nodeId:Ee.id,startX:oe.clientX,startY:oe.clientY,camera:F,nodeStart:{x:Ee.x,y:Ee.y},cardStart:ze?{x:ze.x,y:ze.y}:void 0}},kn=(oe,Ee)=>{oe.stopPropagation(),!(oe.button!==0||oe.target.closest("button, a, input, select, textarea"))&&(W(),oe.currentTarget.setPointerCapture(oe.pointerId),A(Ee.node.id),We.current={kind:"card",pointerId:oe.pointerId,moved:!1,nodeId:Ee.node.id,startX:oe.clientX,startY:oe.clientY,camera:F,nodeStart:{x:Ee.node.x,y:Ee.node.y},cardStart:{x:Ee.x,y:Ee.y}})},ni=oe=>{const Ee=We.current;if(!Ee||Ee.pointerId!==oe.pointerId)return;const ze=oe.clientX-Ee.startX,lt=oe.clientY-Ee.startY;if(Math.hypot(ze,lt)>3&&(Ee.moved=!0),Ee.kind==="pan")re({...Ee.camera,x:Ee.camera.x+ze,y:Ee.camera.y+lt});else if(Ee.nodeId&&Ee.nodeStart){const nt=ze/Ee.camera.scale,ut=lt/Ee.camera.scale;M(Tt=>({...Tt,[Ee.nodeId]:{x:Ee.nodeStart.x+nt,y:Ee.nodeStart.y+ut}})),Ee.cardStart&&Z(Tt=>({...Tt,[Ee.nodeId]:{x:Ee.cardStart.x+nt,y:Ee.cardStart.y+ut}}))}},Ca=oe=>{const Ee=We.current;!Ee||Ee.pointerId!==oe.pointerId||(Ee.kind==="node"&&Ee.nodeId&&!Ee.moved&&ie(Ee.nodeId),Ee.kind==="card"&&Ee.nodeId&&Ee.moved&&(Le.current=Ee.nodeId,globalThis.setTimeout(()=>{Le.current===Ee.nodeId&&(Le.current="")},0)),We.current=null)},ss=()=>{Ln.length&&he(wa?[]:[...Ln])},la=()=>{if(!Ln.length)return;const oe=Oh(Ye,Ln);oe.length&&(Pt.current={camera:jt.current,pinnedNodeIds:z,selectedNodeId:B,displayMode:L,markedSelectionIds:J},P(oe),le("labels"),he([...Ln]),de([...Ln]))},m0=()=>{de([]);const oe=Pt.current;Pt.current=void 0,oe&&(D(oe.camera,520),P(oe.pinnedNodeIds),A(oe.selectedNodeId),le(oe.displayMode),he(oe.markedSelectionIds))},bi=()=>{P([]),A(""),I(""),he([]),de([]),M({}),Z({}),le("off"),Pt.current=void 0,Kt.current="",Ve(oe=>oe+1)};return d.jsxs("div",{className:"obsidian-graph","data-testid":"obsidian-graph",children:[d.jsxs("div",{className:"obsidian-graph-layout",children:[d.jsxs("aside",{className:"obsidian-graph-filter-panel","aria-label":"Shared Work and Graph filters",children:[d.jsxs("header",{children:[d.jsx("strong",{children:"Filters"}),d.jsxs("span",{children:[rt.length.toLocaleString("en-US")," findings"]})]}),d.jsxs("div",{className:"obsidian-graph-filter-scroll",children:[d.jsxs("section",{className:"obsidian-graph-filter-section",children:[d.jsx("span",{className:"obsidian-panel-label",children:"Search"}),d.jsx(P6,{})]}),d.jsx(_6,{hiddenFacetLabels:s7}),d.jsxs("section",{className:"obsidian-graph-workspace-tools","aria-label":"Workspace and snapshots",children:[d.jsxs("label",{className:"obsidian-graph-workspace-check",children:[d.jsx("input",{type:"checkbox",checked:m,disabled:!ln,onChange:()=>E()}),d.jsx("span",{children:"My Workspace"})]}),d.jsx(i7,{mode:"path",path:V,onApplyPathSnapshot:oe=>oe.path&&ae({id:oe.id,path:oe.path})})]})]})]}),d.jsxs("section",{className:"obsidian-graph-stage","aria-label":"Graph workspace",children:[d.jsxs("div",{className:"obsidian-graph-toolbar","aria-label":"Graph controls",children:[d.jsx("button",{className:`btn${L==="off"?" active":""}`,type:"button","aria-pressed":L==="off",title:"Hide labels and node text",onClick:()=>le("off"),children:"Off"}),d.jsx("button",{className:`btn${ue?" active":""}`,type:"button","aria-pressed":ue,title:"Show or hide the currently selected node cards",onClick:()=>le(ue?"off":"labels"),children:"Labels"}),d.jsx("button",{className:`btn${X?" active":""}`,type:"button","aria-pressed":X,title:"Show node text",onClick:()=>le("text"),children:"Text"}),d.jsxs("button",{className:"btn obsidian-graph-reset-view",type:"button",title:"Clear all marked nodes and restore the default graph view",onClick:bi,children:[d.jsx("span",{"aria-hidden":"true",children:"○"}),"Reset view"]}),d.jsxs("span",{className:"obsidian-graph-count",children:[Pe.length.toLocaleString("en-US")," nodes · ",Ye.edges.filter(oe=>!ot||ot.has(oe.source)&&ot.has(oe.target)).length.toLocaleString("en-US")," links"]}),d.jsxs("div",{className:"obsidian-graph-branch-actions",role:"group","aria-label":"Selected graph branch actions",children:[d.jsx("span",{children:Si?Mh[Si.kind]:Wn===zc?"Filters":"Selection"}),d.jsx("button",{className:`btn${wa?" active":""}`,type:"button",disabled:!Ln.length,"aria-pressed":wa,onClick:ss,children:wa?"Unmark all":"Mark all"}),d.jsx("button",{className:`btn${ge.length?" active":""}`,type:"button",disabled:!Ln.length,"aria-pressed":!!ge.length,onClick:ge.length?m0:la,children:ge.length?"Exit extract":"Extract"})]})]}),d.jsxs("div",{className:"obsidian-graph-zoom","aria-label":"Zoom controls",children:[d.jsx("button",{type:"button",onClick:()=>Ge(1.2),title:"Zoom in","aria-label":"Zoom in",children:"+"}),d.jsx("button",{type:"button",onClick:_,title:"Fit graph","aria-label":"Fit graph",children:"◎"}),d.jsx("button",{type:"button",onClick:()=>Ge(1/1.2),title:"Zoom out","aria-label":"Zoom out",children:"−"})]}),d.jsx("svg",{ref:tt,className:"obsidian-graph-surface",role:"img","aria-label":"Interactive network of deviation findings, categories, targets, MITRE techniques, tactics and D3FEND mappings",onWheel:Be,onPointerDown:ct,onPointerMove:ni,onPointerUp:Ca,onPointerCancel:Ca,children:d.jsxs("g",{transform:`translate(${te.width/2+F.x} ${te.height/2+F.y}) scale(${F.scale})`,children:[d.jsx("g",{className:"obsidian-graph-edges","aria-hidden":"true",children:Ye.edges.map(oe=>{const Ee=Ke.get(oe.source),ze=Ke.get(oe.target);if(ot&&(!ot.has(oe.source)||!ot.has(oe.target)))return null;const lt=ne.includes(oe.source)||ne.includes(oe.target),nt=qt.includes(oe.source)&&qt.includes(oe.target),ut=qt.length>0&&!nt&&!lt,Tt=!qt.length&&z.length>0&&!z.includes(oe.source)&&!z.includes(oe.target);return Ee&&ze?d.jsx("line",{className:`obsidian-edge-${oe.kind}${lt?" is-direct-path":""}${nt?" is-branch-path":""}${ut?" is-branch-muted":""}${Tt?" is-selection-muted":""}`,x1:Ee.x,y1:Ee.y,x2:ze.x,y2:ze.y},oe.id):null})}),d.jsx("g",{className:"obsidian-graph-card-connectors","aria-hidden":"true",children:Vt.map(oe=>{const Ee=Ih(oe.node,oe);return d.jsxs("g",{children:[d.jsx("line",{className:"obsidian-card-connector-backdrop",x1:Ee.startX,y1:Ee.startY,x2:Ee.endX,y2:Ee.endY}),d.jsx("line",{className:"obsidian-card-connector",x1:Ee.startX,y1:Ee.startY,x2:Ee.endX,y2:Ee.endY}),d.jsx("circle",{className:"obsidian-card-connector-anchor",cx:Ee.endX,cy:Ee.endY,r:2.5})]},`connector:${oe.node.id}`)})}),d.jsx("g",{className:"obsidian-graph-nodes",children:Pe.map(oe=>{const Ee=z.includes(oe.id),ze=qt.includes(oe.id),lt=qt.length>0&&!ze&&!Ee,nt=!qt.length&&z.length>0&&!Ee,ut=oe.x>0,Tt=Me[oe.id]??0,bt=jh(oe.label),Ea=te.width/2+F.x+oe.x*F.scale,za=te.height/2+F.y+oe.y*F.scale,ua=Math.max(32,bt.length*7.2),It=Ea+(ut?-1:1)*(oe.radius*F.scale+6),Bt=ut?It-ua:It,Hn=ut?It:It+ua,Jn=za+Tt-15,Tn=za+Tt+5,yn=6,da=Ea>=yn&&Ea<=te.width-yn&&za>=yn&&za<=te.height-yn,rs=Bt>=yn&&Hn<=te.width-yn&&Jn>=yn&&Tn<=te.height-yn,Fs=X&&da&&rs,os=oe.itemId?st.get(oe.itemId):void 0;return d.jsxs("g",{className:`obsidian-node obsidian-node-${oe.kind}${oe.severity?` severity-${oe.severity}`:""}${Ee?" is-selected":""}${ze?" is-branch-marked":""}${lt?" is-branch-muted":""}${nt?" is-selection-muted":""}`,transform:`translate(${oe.x} ${oe.y})`,tabIndex:0,role:"button","aria-pressed":Ee,"aria-label":oe.label,onPointerDown:Gn=>St(Gn,oe),onPointerEnter:()=>I(oe.id),onPointerLeave:()=>I(Gn=>Gn===oe.id?"":Gn),onDoubleClick:()=>os&&Ue(os),onKeyDown:Gn=>{(Gn.key==="Enter"||Gn.key===" ")&&ie(oe.id)},children:[ze&&!Ee&&d.jsx("circle",{className:"obsidian-node-branch-ring",r:oe.radius+4}),Ee&&d.jsx("circle",{className:"obsidian-node-selection-ring",r:oe.radius+5}),oe.kind!=="finding"&&d.jsx("circle",{className:"obsidian-node-role-ring",r:oe.radius+4}),d.jsx("circle",{className:"obsidian-node-core",r:oe.radius}),Fs&&d.jsx("g",{transform:`scale(${1/F.scale})`,children:d.jsx("text",{className:"obsidian-node-inline-label",x:(ut?-1:1)*(oe.radius*F.scale+6),y:Tt+4,textAnchor:ut?"end":"start",children:bt})})]},oe.id)})}),d.jsx("g",{className:"obsidian-graph-cards",children:Vt.map(oe=>{const{node:Ee,finding:ze,x:lt,y:nt}=oe,ut=ze?By:Ee.kind==="category"?Vy:zy,Tt=ze?Uy:Ee.kind==="category"?Hy:Wy;return d.jsx("g",{className:"obsidian-graph-card is-selected",transform:`translate(${lt} ${nt}) scale(${me})`,children:d.jsx("foreignObject",{className:`obsidian-node-card-wrap${ze?" obsidian-node-matrix-card-wrap":""}`,x:0,y:0,width:ut,height:Tt,onPointerDown:bt=>kn(bt,oe),onClickCapture:bt=>{Le.current===Ee.id&&(Le.current="",bt.preventDefault(),bt.stopPropagation())},children:ze?d.jsx(_y,{variant:"finding",children:d.jsx(W6,{record:ze.record,title:ze.title,bookmarked:!!p[ze.id]?.include,resultColor:Ae(ze.id)?.color,toolId:c?.toolId??r?.profileId,onOpen:()=>ie(Ee.id),onBookmark:()=>O(ze.id,{include:!p[ze.id]?.include}),onResults:se(ze).length||xe(ze).length?()=>Oe(ze):void 0})}):d.jsxs(_y,{variant:"relation",relationKind:Ee.kind,children:[d.jsx("span",{className:"data-tile-hex","aria-hidden":"true"}),d.jsxs("div",{className:"data-tile-content",children:[d.jsx("h3",{children:jh(Ee.label)}),d.jsx("div",{className:"data-tile-badges",children:d.jsx("span",{className:"reader-severity",children:Mh[Ee.kind]})})]})]})})},`card:${Ee.id}`)})})]})}),_t&&d.jsxs("button",{className:"obsidian-graph-card-zoom-hint",type:"button",onClick:kt,children:["Zoom in to show ",z.length.toLocaleString("en-US")," labels"]}),!Qe.length&&d.jsxs("div",{className:"obsidian-graph-empty",children:[d.jsx("strong",{children:"No matching graph nodes."}),d.jsx("span",{children:"Change the shared filters or open a scan with MITRE mappings."})]})]}),d.jsxs("aside",{className:`obsidian-graph-inspector${Xt?" is-pinned":""}`,"aria-live":"polite",children:[d.jsxs("header",{children:[d.jsx("strong",{children:"Details"}),Xt&&d.jsx("button",{className:"obsidian-inspector-close",type:"button",onClick:()=>ie(Xt.id),"aria-label":"Close details",children:"×"})]}),Vn?d.jsxs("div",{className:"obsidian-graph-inspector-content",children:[d.jsx("small",{children:Mh[Vn.kind]}),d.jsx("strong",{children:Vn.label}),d.jsx("span",{children:Xt?`${G} direct connections`:"Click the node to keep these details open"}),q&&d.jsx(d.Fragment,{children:d.jsxs("dl",{children:[d.jsxs("div",{children:[d.jsx("dt",{children:"Severity"}),d.jsx("dd",{children:QU[q.severity]})]}),d.jsxs("div",{children:[d.jsx("dt",{children:"Mapping"}),d.jsx("dd",{children:q.mappingOrigin})]}),d.jsxs("div",{children:[d.jsx("dt",{children:"Risk"}),d.jsx("dd",{children:Math.round(q.risk)})]})]})}),Pn&&d.jsx(d.Fragment,{children:d.jsxs("div",{className:"obsidian-graph-inspector-actions",children:[d.jsx("button",{className:"btn primary",type:"button",onClick:()=>Ue(Pn),children:"Open in Work"}),d.jsx("button",{className:"btn",type:"button",disabled:!se(Pn).length&&!xe(Pn).length,onClick:()=>Oe(Pn),children:"Results"}),d.jsx("button",{className:`btn${p[Pn.id]?.include?" active":""}`,type:"button",onClick:()=>O(Pn.id,{include:!p[Pn.id]?.include}),children:p[Pn.id]?.include?"In Workspace":"Add to Workspace"})]})})]}):d.jsxs("div",{className:"obsidian-graph-inspector-empty",children:[d.jsx("strong",{children:"Select a node"}),d.jsx("span",{children:"Hover for a preview or click to keep details and actions visible."})]})]})]}),fe.map((oe,Ee)=>{if(oe.minimized&&fe.some(ut=>!ut.minimized))return null;const ze=rt.find(ut=>ut.id===oe.recordId),lt=ze?se(ze):[],nt=ze?xe(ze):[];return d.jsx(n7,{id:`graph-results-${oe.recordId}`,title:oe.title,sheets:lt,toolId:oe.toolId,sections:nt,color:oe.color,zIndex:oe.zIndex,offset:Ee*24,search:x,onActivate:()=>Fe(oe.recordId),onClose:()=>ye(ut=>ut.filter(Tt=>Tt.recordId!==oe.recordId)),onOpenRecord:ze?()=>Ue(ze):void 0,actionLabel:"To Report",actionTitle:"Jump to this finding’s record in the Report",minimized:oe.minimized,onToggleMinimize:()=>ye(ut=>ut.map(Tt=>Tt.recordId===oe.recordId?{...Tt,minimized:!Tt.minimized}:Tt))},oe.recordId)})]})}const nz="data:font/woff2;base64,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",az="1.0.0",c7=["Soll-Zustand","Abweichungen"],iz=/^(?:baseline value|expected(?: value| result)?|desired(?: value| state)?|recommended value|soll(?:-zustand|wert)?)$/i,sz=/^(?:remediation(?: guidance| recommendation| action)?|advised solution|solution|recommendation|resolution)$/i,rz=/^(?:audit(?: procedure)?|verification|verify|test procedure)$/i,oz=/^(?:description|rationale|impact|technical explanation|documentation|references?|notes)$/i,cz=/^(?:id|rule id|shortname|technical identity|scope|target|registry path|baseline|policy type|policy section|imported|evaluated|source: .+|source file|source sheet)$/i,lz=/^(?:title|name|finding|benchmark item|check title)$/i,uz=new Set(["Not configured","No baseline rule","Not comparable","Review required"]),dz="Vergleich importierter GPO-Backups, kein Nachweis der wirksamen Endpoint-Konfiguration. Baseline-Varianten sind getrennte Empfehlungen; ihre Anwendbarkeit und Zielrolle vor einer Änderung bestätigen. Keine GPO-Priorität aus der Quellenreihenfolge ableiten.";function Tz(e){return Xb(e.policySourceEvidence??[]).flatMap(t=>[{label:t.label,value:[t.backupLabel,`Backup-Identität: ${t.id}`].filter(Boolean).join(` +`)},...t.observations.map(n=>{const a=[`Evidence: ${n.sourceReference}`,`Observation: ${n.id}`,n.sequence===void 0?"":`Source sequence: ${n.sequence}`].filter(Boolean).map(r=>({text:r})),i=n.values.flatMap((r,c)=>Kb(r,n.deviationFields?.[c],n.deviationItems?.[c]));return{label:"GPO-Quellbeleg",value:[...a,...i].map(r=>r.text).join(` +`),lines:[...a,...i]}})])}function fz(e,t){const n=oa(t,e.sheet.toolId??e.dataset.profileId),a=n==="group-policy",i=Cd(t,n),r=i?.value??"Unknown",c=t.fields.find(N=>N.label===e.titleColumn)?.value||t.title,l=[],f=[{label:"Result Status",value:r}],T=[`Finding: ${c}`,`Record ID: ${t.id}`,`Source tool: ${n??"Unknown"}`,t.findingOccurrenceId?`Occurrence: ${t.findingOccurrenceId}`:"",t.scanRunId?`Scan run: ${t.scanRunId}`:"",t.importFileId?`Import file: ${t.importFileId}`:""],p=$6(t,e.dataset.sheets,e.sheet.id,n),m=Am(t,n),g=new Set(m.map(N=>N.value));let S=!1,x=!1,y=!1;for(const N of t.fields)if(!(!N.value||lz.test(N.label)||N.index===i?.index)){if(cz.test(N.label)){T.push(`${N.label}: ${N.value}`);continue}g.has(N.value)||(iz.test(N.label)?(S=!0,l.push({label:"Sollwert · "+N.label,value:a?c0(N.value):N.value}),a&&l.push({label:"Sollwert · typisierter Originalwert",value:N.value})):sz.test(N.label)?(x=!0,l.push({label:"Behebung laut Quelle · "+N.label,value:N.value,rich:!0})):rz.test(N.label)?(y=!0,l.push({label:"Prüfung laut Quelle · "+N.label,value:N.value,rich:!0})):oz.test(N.label)&&!a?l.push({label:"Regel und Anleitung laut Quelle · "+N.label,value:N.value,rich:!0}):a&&N.label==="Configured Value"?t.policySourceEvidence?.length||f.push({label:"Konfiguration im Backup",value:c0(N.value)}):a&&["Sources","GPO conflict details","GPO duplicate details"].includes(N.label)?!p.length&&!t.policySourceEvidence?.length&&f.push({label:N.label,value:N.value}):/^(?:results?|verwandte daten)$/i.test(N.label)&&p.length||f.push({label:N.label,value:N.value,rich:!a&&/^(?:description|details?|result message)$/i.test(N.label)}))}l.unshift({label:"Finding und Geltungsbereich",value:T.filter(Boolean).join(` +`)}),a&&l.push({label:"Geltungsgrenze",value:dz}),a&&uz.has(r)&&l.push({label:"Einordnung",value:r==="Not configured"?"Score-neutral: Empfehlung im analysierten Backup-Set nicht konfiguriert. Keine automatische Behebungspflicht; vollständiges Baseline-Hardening ist ein eigener Auftrag.":r==="No baseline rule"?"Score-neutral: Keine anwendbare Baseline-Regel vorhanden. Kein belegter Sollwert und keine daraus ableitbare Behebungspflicht.":"Score-neutral: Vergleich nicht abschließend möglich. Zuerst Anwendbarkeit, technische Vergleichbarkeit und Diagnostik klären; keine Abweichung erfinden."}),S||l.push({label:"Sollwert",value:"Kein separater Sollwert hinterlegt. Maßgeblich sind die wiedergegebenen Quell-Anleitungen; es wird kein Wert aus dem Finding-Titel abgeleitet."}),x||l.push({label:"Behebung",value:"Keine separate Behebungsanleitung hinterlegt. Eingebettete Anleitung und Referenzen im Regeltext prüfen. Fehlen diese ebenfalls, ist eine fachliche Klärung erforderlich."}),y||l.push({label:"Nachweis nach Änderung",value:a?"Nach bestätigter Anwendbarkeit und freigegebener Änderung neue GPO-Backups importieren und dieselbe technische Einstellung erneut auswerten. Wirksamkeit am Endpoint separat prüfen; der Backup-Vergleich beweist sie nicht.":"Nach freigegebener Änderung dieselbe Regel im gleichen Scope erneut mit dem Quellwerkzeug ausführen. Nur ein vergleichbarer Rescan belegt die Behebung; Review-Status und Abwesenheit eines Findings reichen nicht."}),f.push(...Tz(t));const w=[...new Set(ed(t).flatMap(N=>[...N.matchAll(/source-table:(\d+)/g)].map(B=>Number(B[1]))))],C=new Set(p.map(N=>N.sourceTableIndex)),k=w.filter(N=>!C.has(N));k.length&&f.push({label:"Results · fehlende Belege",value:`Referenzierte Ergebnistabellen nicht geladen: ${k.map(N=>`source-table:${N}`).join(", ")}. Die verfügbaren Belege folgen; der Nachweis ist unvollständig.`});for(const N of m)f.push({label:"Results · "+N.title,value:N.value,rich:!/xml/i.test(N.title)});let E=0;for(const N of p){f.push({label:"Results · "+N.name,value:[`Sheet ID: ${N.id}`,N.sourceFile?`Source: ${N.sourceFile}`:"",N.resultPreamble??"",`Zeilen: ${N.analysis.records.length}`].filter(Boolean).join(` +`)});for(const[B,A]of N.analysis.records.entries())E++,f.push({label:`${N.name} · Zeile ${B+1}${A.highlighted?" · vom Quellbericht hervorgehoben":""}`,value:N.analysis.headers.map(z=>`${z}: ${A.fields.find(P=>P.label===z)?.value??""}`).join(` +`)})}if(!p.length&&!m.length){const N=ed(t).filter(Rm);f.push({label:"Results",value:N.length?`Referenzierte Results nicht geladen: ${[...new Set(N)].join(", ")}. Diese Belege fehlen im Export; Quelldateien im selben Projekt laden.`:"Keine zusätzlichen Results hinterlegt. Dies ist kein Nachweis, dass keine Abweichung besteht."})}const O=e.reviews?.[t.id];if(O){const N=[O.nextStep&&`Next step: ${O.nextStep}`,O.prerequisites&&`Prerequisites: ${O.prerequisites}`,O.access&&`Access: ${O.access}`,O.owner&&`Owner: ${O.owner}`,O.due&&`Due: ${O.due}`].filter(Boolean);N.length&&l.push({label:"Geplante Maßnahme · ungeprüfte Review-Angaben",value:N.join(` +`)}),f.push({label:"Review · kein technischer Behebungsnachweis",value:[`Status: ${O.status}`,`Priority: ${O.priority}`,O.comment&&`Comment: ${O.comment}`,O.evidence&&`Evidence (Review): ${O.evidence}`,O.riskAcceptance?`Risk acceptance: ${JSON.stringify(O.riskAcceptance)}`:""].filter(Boolean).join(` +`)})}return{id:t.id,title:c,status:r,expected:l,observed:f,resultSheetIds:p.map(N=>N.id),resultRowCount:E}}function hz(e){return{version:az,generatedAt:e.generatedAt,context:[{label:"Ansicht",value:`${e.dataset.fileName} · ${e.sheet.name}`},{label:"Exportzeitpunkt",value:e.generatedAt},{label:"Treffer",value:String(e.records.length)},...e.context??[],{label:"Umfang",value:"Alle Treffer der aktuellen Filterung und Sortierung, einschließlich Results. Nicht passende oder noch nicht bewertete Treffer bleiben unverändert; keine Neuberechnung. Quelltexte bleiben in ihrer Originalsprache."}],entries:e.records.map(t=>fz(e,t))}}function ad(e){return e.map(t=>t.kind==="strong"||t.kind==="emphasis"?ad(t.children):t.kind==="link"?`${ad(t.children)} (${t.href})`:t.text).join("")}function l7(e){return e.rich?sm(e.value).map(t=>t.kind==="code"?t.text:t.kind==="list"?t.items.map((n,a)=>`${t.ordered?`${a+1}.`:"•"} ${ad(n)}`).join(` +`):t.kind==="table"?t.table.rows.map((n,a)=>`Zeile ${a+1} +`+t.table.headers.map((i,r)=>`${i}: ${n[r]??""}`).join(` +`)).join(` + +`):ad(t.content)).join(` + +`):e.value}const go=e=>e.map(t=>`${t.label} +${l7(t)}`).join(` + +`),cr=e=>e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'"),Fh=e=>cr(e).replace(/[\\`*_{}\[\]()#!~]/g,"\\$&").replaceAll("|","|").replace(/\r\n?|\n/g,"
");function pz(e){const t=n=>{const a=[];for(;n.length>3e4;){let i=n.lastIndexOf(` +`,3e4);i<15e3?i=3e4:i+=1,/[\uD800-\uDBFF]/.test(n[i-1])&&i--,a.push(n.slice(0,i)),n=n.slice(i)}return a.push(n),a};return[[...c7],...e.entries.flatMap(n=>{const a=t(`${go(e.context)} + +${go(n.expected)}`),i=t(go(n.observed)),r=Math.max(a.length,i.length);return Array.from({length:r},(c,l)=>{const f=r>1?`Finding ID: ${n.id} +Teil ${l+1}/${r} · Fortsetzungszeile desselben Findings + +`:"";return[f+(a[l]??""),f+(i[l]??"")]})})]}function mz(e,t=";"){return"\uFEFF"+Yh(pz(e),t)}function gz(e){return`# ASSESSOR · Aktuelle Work-Ansicht + +${Fh(go(e.context))} + +| ${c7.join(" | ")} | +| --- | --- | +`+e.entries.map(t=>`| ${Fh(go(t.expected))} | ${Fh(go(t.observed))} |`).join(` +`)+` +`}function vz(e){const t=n=>n.map(a=>`

${cr(a.label)}

${a.lines?a.lines.map(i=>i.deviating?`${cr(i.text)}`:cr(i.text)).join(` +`):cr(l7(a))}
`).join("");return`ASSESSOR · Work-Ansicht

ASSESSOR · Aktuelle Work-Ansicht

${t(e.context)}
${e.entries.map((n,a)=>`
${a+1} / ${e.entries.length} · ${cr(n.status)}

${cr(n.title)}

Soll-ZustandAbweichungen
${t(n.expected)}${t(n.observed)}
`).join("")}
Exportvertrag ${cr(e.version)} · Statischer Snapshot. Review-Angaben sind kein technischer Behebungsnachweis.
`}function xz(){const e=ca(),t=bd(),[n,a]=H.useState(!1),i=r=>{if(!(!e.dataset||!e.activeSheet||!t.length))try{const c=km(e.activeSheet,e),l=e.activeProfile.presentation.statusFilters.find(g=>g.value===e.statusFilter)?.label??e.statusFilter,f=Object.entries(e.facetFilters).map(([g,S])=>{const x=c.find(y=>y.id===g);return`${x?.label??g}: ${S.values?.map(y=>x?.values.find(w=>w.value===y)?.label??y).join(", ")??""}${S.minimum?` ≥ ${S.minimum}`:""}${S.maximum?` ≤ ${S.maximum}`:""}`}),T=hz({dataset:e.dataset,sheet:e.activeSheet,records:t,generatedAt:new Date().toISOString(),reviews:e.reviews,titleColumn:e.titleColumn,context:[{label:"Scope",value:[`Project: ${e.projectId}`,`Assessments: ${e.activeAssessmentIds?.join(", ")??"geladener Workspace"}`,`Scan runs: ${e.activeScanRunIds?.join(", ")??"geladener Workspace"}`].join(` +`)},{label:"Filter",value:[`Result Status: ${l}`,...f,`Suche: ${e.search||"—"}`,`My Workspace: ${e.actionOnly?"Ja":"Nein"}`,`Drilldown: ${e.pathFindingIds.length?`${e.pathFindingIds.length} Record IDs`:"Nein"}`].join(` +`)},{label:"Sortierung",value:`${e.sortColumn} · ${e.sortDirection}`}]}),p=r==="html"?vz(T):r==="md"?gz(T):mz(T,e.delimiter==="auto"?";":e.delimiter),m=e.dataset.fileName.replace(/\.[^.]+$/,"").replace(/[<>:"/\\|?*\u0000-\u001f]/g,"_");yd(Ju,`${m}-work-view.${r}`,p,r==="html"?"text/html;charset=utf-8":r==="md"?"text/markdown;charset=utf-8":"text/csv;charset=utf-8"),a(!1)}catch{a(!0)}};return d.jsxs("div",{className:"header-export-row","aria-label":"Export current view including Results",children:[["csv","md","html"].map(r=>d.jsx("button",{className:"btn export-btn",type:"button",disabled:!t.length,title:`Export current view including Results (${t.length} records)`,onClick:()=>i(r),children:r.toUpperCase()},r)),n&&d.jsx(Ua,{title:"Export unavailable",onClose:()=>a(!1),children:d.jsx("p",{children:"The current view could not be exported completely. No partial file was downloaded."})})]})}const yz={ready:"Ready",warning:"Notice",duplicate:"Duplicate",error:"Error"};function Sz(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toLocaleString("en-US",{maximumFractionDigits:1})} KB`:`${(e/1024/1024).toLocaleString("en-US",{maximumFractionDigits:1})} MB`}function bz({entry:e,reimport:t}){const{setImportEntrySelected:n,confirmImportEntry:a}=ca(),i=[...e.warningMessages,...e.errorMessages],r=t&&!!e.duplicateOf;return d.jsxs("article",{className:`import-preview-entry import-preview-${e.status}${r?" import-preview-replacement":""}`,children:[d.jsx("div",{className:"import-preview-selection",children:d.jsx("input",{type:"checkbox",checked:e.selected,disabled:e.status==="error"||!e.dataset,"aria-label":t?`Select ${e.fileName} as replacement source`:`Select ${e.fileName} for import`,onChange:c=>n(e.id,c.target.checked)})}),d.jsxs("div",{className:"import-preview-main",children:[d.jsxs("div",{className:"import-preview-heading",children:[d.jsx("strong",{children:e.fileName}),d.jsx("span",{className:`import-status ${r?"import-status-replacement":`import-status-${e.status}`}`,children:r?"Expected replacement source":yz[e.status]})]}),d.jsxs("div",{className:"import-preview-meta",children:[d.jsx("span",{children:e.format??"Unknown format"}),d.jsx("span",{children:Sz(e.sizeBytes)}),d.jsx("span",{children:e.toolName??"Source not recognized"}),e.confidence&&d.jsxs("span",{children:["Confidence ",e.confidence," · ",Math.round((e.confidenceScore??0)*100)," %"]}),d.jsxs("span",{children:[e.tableCount," tables · ",e.rowCount.toLocaleString("en-US")," rows",e.rowCount!==e.recordCount&&d.jsxs(d.Fragment,{children:[" · ",e.recordCount.toLocaleString("en-US")," of which as finding"]})]})]}),d.jsxs("code",{className:"import-hash",title:e.sha256,children:["SHA-256 ",e.sha256.slice(0,16),"…"]}),e.duplicateOf&&d.jsxs("section",{className:t?"import-replacement-notice":"import-duplicate-notice",children:[d.jsx("h3",{children:t?"Expected replacement source":"Duplicate found"}),d.jsx("p",{children:t?"This file matches the existing scan. That is expected for a reimport. Continue to reprocess and replace the active scan. The existing scan remains active until the replacement succeeds.":`Already imported or included in this batch: ${e.duplicateOf}`})]}),e.possibleDuplicateOf&&d.jsxs("section",{className:t?"import-replacement-notice":"import-duplicate-notice",children:[d.jsx("h3",{children:t?"Replacement source rejected":"Duplicate found"}),d.jsx("p",{children:t?"This file is only similar to the selected scan. A safe reimport requires byte-identical source files and has been blocked.":`${e.possibleDuplicateOf} is already recorded for this client. Importing this report will add it a second time. Keep it selected only if this is intentional.`})]}),i.map((c,l)=>d.jsx("p",{className:"import-message",children:c},`${c}-${l}`)),!!e.unassignedFields.length&&d.jsxs("p",{className:"import-message",children:["Not semantically mapped: ",e.unassignedFields.slice(0,8).join(", "),e.unassignedFields.length>8?" …":""]}),e.mappingsToConfirm>0&&d.jsxs("button",{className:"btn",type:"button",onClick:()=>a(e.id),children:["Confirm ",e.mappingsToConfirm," mapping",e.mappingsToConfirm===1?"":"s"]})]})]})}function wz(){const{importWorkflow:e,closeImportWorkflow:t,commitImportBatch:n}=ca();if(e.phase==="idle")return null;const a=e.phase==="preparing"||e.phase==="committing",i=e.preview,r=i?.entries.filter(f=>f.selected&&f.dataset&&f.status!=="error")??[],c=r.reduce((f,T)=>f+T.mappingsToConfirm,0),l=!!e.replacesScanRunId;if(e.phase==="report"&&e.report){const f=e.report;return d.jsxs(Ua,{title:l?"Reimport Report":"Import Report",onClose:t,children:[d.jsxs("div",{className:"import-report-summary",children:[d.jsx("strong",{children:l?"Replacement completed successfully":`${f.importedFiles} files · ${f.importedRecords.toLocaleString("en-US")} records imported`}),d.jsx("span",{children:l?`${f.importedFiles} replacement source file${f.importedFiles===1?"":"s"} processed · the previous scan was retained in the audit history`:`${f.skippedFiles} skipped · ${f.failedFiles} failed · ${f.duplicateFiles} duplicates detected`})]}),d.jsx("div",{className:"import-report-list",children:f.entries.map(T=>d.jsxs("div",{className:`import-report-entry import-report-${T.status}`,children:[d.jsx("strong",{children:T.fileName}),d.jsx("span",{children:T.status==="imported"?"Imported":T.status==="failed"?"Failed":"Skipped"}),d.jsxs("small",{children:[T.recordCount.toLocaleString("en-US")," records",T.messages.length?` · ${T.messages.join(" · ")}`:""]})]},`${T.sha256}-${T.fileName}`))}),d.jsx("footer",{className:"import-dialog-footer",children:d.jsx("button",{className:"btn primary",type:"button",onClick:t,children:"Close"})})]})}return d.jsxs(Ua,{title:a?"Processing":"Review and approve import",dismissible:!a,onClose:t,children:[a&&d.jsx(w6,{label:e.phase==="preparing"?"Preparing files":"Importing files"}),!a&&d.jsxs(d.Fragment,{children:[d.jsx("p",{className:"import-dialog-intro",children:l?"Review the expected replacement source and mappings. Matching the existing scan is correct in this workflow. The existing scan remains active unless the replacement completes successfully.":'Review source, format, automatic mappings, and warnings. Only "Import selection" saves the selected files to the open client.'}),e.error&&d.jsx("p",{className:"import-workflow-error",role:"alert",children:e.error}),d.jsxs("div",{className:"import-preview-list",children:[i?.entries.map(f=>d.jsx(bz,{entry:f,reimport:l},f.id)),!i?.entries.length&&d.jsx("p",{children:"No file could be prepared for preview."})]}),d.jsxs("footer",{className:"import-dialog-footer",children:[d.jsx("span",{children:c>0?`Confirm ${c} mapping${c===1?"":"s"} before importing`:`${r.length} of ${i?.entries.length??0} files selected`}),d.jsxs("div",{children:[d.jsx("button",{className:"btn",type:"button",onClick:t,children:"Cancel"}),d.jsx("button",{className:"btn primary",type:"button",disabled:!r.length||c>0,onClick:()=>{n()},children:l?"Reimport and replace":"Import selection"})]})]})]})]})}function Cz(e,t,n){yd(n,t,JSON.stringify(e,null,2),"application/json;charset=utf-8")}const id=["critical","high","medium","low","info"];function Ez(e,t){const n=new Set(id.filter(a=>e.includes(a)));return n.has(t)?n.delete(t):n.add(t),id.filter(a=>n.has(a))}function kz(e){const{sheet:t,dataset:n,activeProfile:a,reviews:i,statusFilter:r,facetFilters:c,pathFindingIds:l,search:f,actionOnly:T}=e;if(!t)return;const m=km(t,{dataset:n,activeProfile:a,reviews:i,statusFilter:r,facetFilters:c,pathFindingIds:l,search:f,actionOnly:T}).find(x=>x.severityScale&&x.kind==="category");if(!m)return;const g=new Map(m.values.map(x=>[x.value,x.count])),S=id.reduce((x,y)=>x+(g.get(y)??0),0);return{facetId:m.id,metrics:id.map(x=>{const y=g.get(x)??0;return{severity:x,count:y,percentage:S>0?y/S*100:0}})}}function Az({sheet:e}){const{dataset:t,activeProfile:n,reviews:a,statusFilter:i,facetFilters:r,pathFindingIds:c,search:l,actionOnly:f,setFacetFilter:T}=ca(),p=H.useMemo(()=>Sd("severity-summary",()=>kz({sheet:e,dataset:t,activeProfile:n,reviews:a,statusFilter:i,facetFilters:r,pathFindingIds:c,search:l,actionOnly:f})),[f,n,t,r,c,a,l,e,i]);if(!p)return null;const m=r[p.facetId]?.values??[];return d.jsx("section",{className:"sidebar-severity-rack","aria-label":"Severity distribution",children:p.metrics.map(g=>d.jsx(Hr,{active:m.includes(g.severity),className:"sidebar-severity-card",label:Cb[g.severity],value:g.count,percentage:g.percentage,tone:g.severity,onClick:()=>{const S=Ez(m,g.severity);T(p.facetId,S.length?{values:S}:null)}},g.severity))})}function Rz(){const{activeSheet:e,activeProfile:t,dataset:n,reviews:a,facetFilters:i,search:r,actionOnly:c}=ca(),l=H.useMemo(()=>l0(e,n,t,a),[t,e,n,a]),f=H.useMemo(()=>WU({facets:l,filters:i,search:r,actionOnly:c}),[c,i,l,r]);if(!f.length)return null;const T=`Active filters: ${f.join(" plus ")}`;return d.jsxs("span",{className:"pathfinder-filter-trail","aria-label":T,title:f.join(" + "),children:[d.jsx("span",{className:"pathfinder-filter-trail-marker",children:d.jsx(vn,{direction:"right"})}),f.map((p,m)=>d.jsxs(H.Fragment,{children:[m>0&&d.jsx("span",{className:"pathfinder-filter-trail-plus","aria-hidden":"true",children:"+"}),d.jsx("span",{className:"pathfinder-filter-trail-item",children:p})]},`${p}-${m}`))]})}const Dz="2.5.5",Iz={version:Dz},Im=Iz.version,Nz={version:"1.0.0"},Oz={version:"1.1.0"},Mz={version:"1.4.0"},jz=new qi,u7="2026-09-18T13:54:52.743Z",Fz=`${Im}+${u7.replace(/\D/g,"").slice(0,14)}`;function Lz(){return new Date(u7).toLocaleString()}function Xi({label:e,value:t}){return d.jsxs("div",{className:"about-detail",children:[d.jsx("dt",{children:e}),d.jsx("dd",{children:t})]})}function Pz({onClose:e}){const[t,n]=H.useState();H.useEffect(()=>{let i=!0;return jz.health().then(r=>{i&&n(r)}).catch(()=>{}),()=>{i=!1}},[]);const a=t?`${t.productVersion}${t.releaseId?` · ${t.releaseId.slice(0,12)}`:""}`:"Unavailable";return d.jsx(Ua,{title:"About ASSESSOR",onClose:e,children:d.jsxs("div",{className:"about-sections",children:[d.jsx("div",{className:"about-brand","aria-hidden":"true",children:d.jsx("img",{src:Sm,alt:""})}),d.jsxs("section",{children:[d.jsx("h3",{children:"Product"}),d.jsxs("dl",{children:[d.jsx(Xi,{label:"Version",value:Im}),d.jsx(Xi,{label:"Build",value:Fz}),d.jsx(Xi,{label:"Built",value:Lz()}),d.jsx(Xi,{label:"Backend",value:a})]})]}),d.jsxs("section",{children:[d.jsx("h3",{children:"Processing"}),d.jsxs("dl",{children:[d.jsx(Xi,{label:"Import contract",value:PF}),d.jsx(Xi,{label:"GPO evaluation",value:d1.version}),d.jsx(Xi,{label:"GPO comparison",value:OF.version}),d.jsx(Xi,{label:"Baseline analysis",value:Mz.version}),d.jsx(Xi,{label:"Snapshot aggregation",value:Oz.version}),d.jsx(Xi,{label:"Policy identity",value:Nz.version})]})]}),d.jsx("footer",{className:"about-credits",children:"Credits · Michael Lukas · Binh Karl"})]})})}function _z({area:e}){return e==="dashboard"?d.jsx("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:d.jsx("path",{d:"M4 19V9m5 10V5m5 14v-7m5 7V8",fill:"none",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round"})}):e==="db-structure"?d.jsxs("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:[d.jsx("ellipse",{cx:"12",cy:"5",rx:"7",ry:"2.6",fill:"none",stroke:"currentColor",strokeWidth:"1.7"}),d.jsx("path",{d:"M5 5v4.7c0 1.4 3.1 2.6 7 2.6s7-1.2 7-2.6V5",fill:"none",stroke:"currentColor",strokeWidth:"1.7"}),d.jsx("path",{d:"M5 12.3V17c0 1.4 3.1 2.6 7 2.6s7-1.2 7-2.6v-4.7",fill:"none",stroke:"currentColor",strokeWidth:"1.7"})]}):e==="data-hub"?d.jsxs("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:[d.jsx("ellipse",{cx:"12",cy:"5",rx:"7",ry:"3",fill:"none",stroke:"currentColor",strokeWidth:"1.7"}),d.jsx("path",{d:"M5 5v7c0 1.7 3.1 3 7 3s7-1.3 7-3V5M5 12v7c0 1.7 3.1 3 7 3s7-1.3 7-3v-7",fill:"none",stroke:"currentColor",strokeWidth:"1.7"})]}):e==="graph"?d.jsxs("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:[d.jsx("circle",{cx:"5",cy:"12",r:"2.2",fill:"none",stroke:"currentColor",strokeWidth:"1.7"}),d.jsx("circle",{cx:"12",cy:"5",r:"2.2",fill:"none",stroke:"currentColor",strokeWidth:"1.7"}),d.jsx("circle",{cx:"19",cy:"12",r:"2.2",fill:"none",stroke:"currentColor",strokeWidth:"1.7"}),d.jsx("circle",{cx:"12",cy:"19",r:"2.2",fill:"none",stroke:"currentColor",strokeWidth:"1.7"}),d.jsx("path",{d:"m6.6 10.4 3.8-3.8m3.2 0 3.8 3.8m0 3.2-3.8 3.8m-3.2 0-3.8-3.8",fill:"none",stroke:"currentColor",strokeWidth:"1.7"})]}):e==="results"?d.jsx("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:d.jsx("path",{d:"M4 5h16l-6 8v6l-4-2v-4z",fill:"none",stroke:"currentColor",strokeWidth:"1.7",strokeLinejoin:"round"})}):d.jsx("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:d.jsx("path",{d:"M4 5h16v14H4zM4 10h16M9 10v9",fill:"none",stroke:"currentColor",strokeWidth:"1.7",strokeLinejoin:"round"})})}const qz={"db-structure":"DB Structure","data-hub":"Data Hub",dashboard:"Client Info",graph:"Pathfinder",work:"Work",results:"Result DB"},Gy=[["db-structure","DB Structure"],["data-hub","Datahub"],["dashboard","Client Info"],["work","Work"],["results","Result DB"],["graph","Pathfinder"]];function Bz(){const e=ca(),[t,n]=H.useState("data-hub"),[a,i]=H.useState(),[r,c]=H.useState(!1),[l,f]=H.useState(),[T,p]=H.useState(),[m,g]=H.useState(!1),[S,x]=H.useState(),y=S===e.workScopeId;H.useEffect(()=>{t==="graph"&&x(e.workScopeId)},[t,e.workScopeId]);const w=H.useCallback(()=>p(void 0),[]),{dataset:C,activeSheet:k,reviews:E,snapshot:O,theme:N,setTheme:B,delimiter:A,setDelimiter:z,view:P,setView:K,actionOnly:I,sidebarCollapsed:L,toggleSidebar:le,toggleWorkspace:ue,backendStatus:X,targetProjectId:F}=e,re=H.useCallback(()=>{K("records"),n("work")},[K]),me=H.useCallback(()=>{e.search.trim()||Object.keys(e.facetFilters).length||e.pathFindingIds.length||e.actionOnly||e.resetFilters(),re()},[e.actionOnly,e.facetFilters,e.pathFindingIds,e.resetFilters,e.search,re]),te=H.useMemo(()=>Object.values(E).filter(fe=>fe.include).length,[E]),Ce=bd().length,ee=X==="connected"?"Server connection available":X==="checking"?"Checking server connection":"No server connection",M=!F||S6(e.activeScanRunIds,e.activeAssessmentIds),Y=(t==="data-hub"&&r?l:a)?.trim(),Z=H.useCallback((fe,ye)=>{c(fe),f(fe?ye:void 0)},[]),J=d.jsxs("span",{className:`connection-indicator connection-${X}`,role:"status","aria-label":ee,title:ee,children:[d.jsx("i",{className:"connection-state-square is-offline","aria-hidden":"true"}),d.jsx("i",{className:"connection-state-square is-online","aria-hidden":"true"})]}),he=d.jsxs("div",{className:"app-header-context",children:[J,Y&&t!=="dashboard"&&d.jsx("span",{className:"app-header-client-name",title:Y,children:Y})]}),ge=t==="dashboard"&&Y?d.jsxs("span",{className:"area-client-context-inline",children:[d.jsx("span",{className:"area-client-marker",children:d.jsx(vn,{direction:"right"})}),d.jsx("span",{className:"area-client-name",title:Y,children:Y})]}):null,de=d.jsxs("div",{className:"reader-toolbar",children:[d.jsxs("div",{className:"live-summary","aria-live":"polite",children:[d.jsxs("span",{children:["Shown ",d.jsx("b",{children:Ce.toLocaleString("en-US")})]}),d.jsxs("span",{children:["Marked ",d.jsx("b",{children:te.toLocaleString("en-US")})]})]}),d.jsxs("div",{className:"toolbar",children:[d.jsx("button",{className:"btn",type:"button",disabled:!C,onClick:()=>{const fe=O();fe&&C&&Cz(fe,`${C.fileName.replace(/\.[^.]+$/,"")}-copy.assessor-snapshot.json`,Ju)},children:"Snapshot"}),d.jsxs("select",{className:"select delimiter-select",value:A,onChange:fe=>z(fe.target.value),title:"CSV delimiter",children:[d.jsx("option",{value:"auto",children:"CSV: Auto"}),d.jsx("option",{value:",",children:"Comma"}),d.jsx("option",{value:";",children:"Semicolon"}),d.jsx("option",{value:"\\t",children:"Tab"}),d.jsx("option",{value:"|",children:"Pipe"})]}),d.jsx("button",{className:"icon-btn",type:"button",disabled:!k,title:"Copy current table","aria-label":"Copy current table",onClick:()=>k&&navigator.clipboard.writeText(Yh(k.rows,A)),children:d.jsx("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:d.jsx("path",{d:"M8 8h11v13H8zM5 16H3V3h11v2",fill:"none",stroke:"currentColor",strokeWidth:"1.8"})})}),d.jsx("button",{className:"icon-btn",type:"button",disabled:!k,title:"Export current sheet as CSV","aria-label":"Export current sheet as CSV",onClick:()=>k&&yd(Ju,`${k.name}.csv`,`\uFEFF${Yh(k.rows,A)}`,"text/csv;charset=utf-8"),children:d.jsx("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:d.jsx("path",{d:"M12 3v12m-4-4 4 4 4-4M4 20h16",fill:"none",stroke:"currentColor",strokeWidth:"1.8"})})}),d.jsx("button",{className:`btn workspace-btn${te?" has-items":""}${I?" active":""}`,type:"button",disabled:!te,"aria-pressed":I,onClick:ue,children:"My Workspace"}),d.jsx("div",{className:"view-tabs",role:"tablist","aria-label":"View",children:[["records","Reports"],["columns","Matrix"],["table","Grid"],["raw","Raw Data"]].map(([fe,ye])=>d.jsx("button",{className:`tab-btn${P===fe?" active":""}`,type:"button",onClick:()=>K(fe),children:ye},fe))}),d.jsx(xz,{}),d.jsx(_q,{}),d.jsx(M6,{})]})]});return d.jsxs("div",{className:`app-shell app-shell-${t}${L?" sidebar-collapsed":""}`,children:[d.jsxs("header",{className:"topbar",children:[d.jsxs("button",{className:"brand",type:"button","aria-label":"About ASSESSOR",title:"About ASSESSOR",onClick:()=>g(!0),children:[d.jsx("span",{className:"brand-logo","aria-hidden":"true",children:d.jsx("img",{src:Sm,alt:""})}),d.jsxs("span",{className:"brand-copy",children:[d.jsx("h1",{children:"ASSESSOR"}),d.jsx("span",{className:"brand-version",children:Im})]})]}),d.jsx("div",{className:`app-header-panel app-header-panel-${t}`,id:t==="graph"?GP:void 0,children:t==="work"?d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"work-header-row",children:[de,he]}),d.jsx("div",{className:"workbar",children:d.jsx(_6,{})}),d.jsxs("div",{className:"status-line",children:[d.jsx(i7,{onApplyPathSnapshot:fe=>{fe.path&&(e.setPathFindingIds(EU(fe.path)),p({id:fe.id,path:fe.path}))}}),d.jsxs("div",{className:"status-line-tools",children:[d.jsx(P6,{}),d.jsx("div",{className:"result-dock-slot",id:e7})]})]})]}):d.jsxs("div",{className:"area-topbar",children:[d.jsxs("span",{className:"area-topbar-heading",children:[d.jsx("strong",{children:t==="data-hub"&&r?"Client":qz[t]}),ge,t==="graph"&&d.jsx(Rz,{})]}),he]})})]}),d.jsxs("main",{children:[d.jsx("aside",{children:d.jsxs("div",{className:"app-sidebar",children:[d.jsx("nav",{className:"sidebar-primary-actions","aria-label":"Main navigation",children:Gy.map(([fe,ye])=>d.jsxs("button",{className:`sidebar-tab-btn${t===fe?" active":""}`,type:"button",disabled:fe!=="data-hub"&&fe!=="db-structure"&&!F,onClick:()=>fe==="work"?me():n(fe),children:[d.jsx(_z,{area:fe}),d.jsx("span",{children:ye})]},fe))}),t==="work"&&d.jsx(Az,{sheet:k}),d.jsx("section",{className:"sidebar-theme-panel",children:d.jsxs("div",{className:"theme-switcher",role:"group","aria-label":"Controls and color scheme",children:[d.jsx("button",{type:"button",className:"sidebar-toggle-inline",onClick:le,title:"Collapse sidebar","aria-label":"Collapse sidebar",children:d.jsx(vn,{direction:"left"})}),d.jsx("button",{type:"button",className:`theme-switcher-btn${N==="dark"?" active":""}`,onClick:()=>B("dark"),title:"Dark Mode","aria-label":"Dark Mode",children:"◔"}),d.jsx("button",{type:"button",className:`theme-switcher-btn${N==="system"?" active":""}`,onClick:()=>B("system"),title:"System mode","aria-label":"System mode",children:"▣"}),d.jsx("button",{type:"button",className:`theme-switcher-btn${N==="light"?" active":""}`,onClick:()=>B("light"),title:"Light Mode","aria-label":"Light Mode",children:"☀"})]})})]})}),L&&d.jsx("button",{className:"sidebar-toggle",type:"button",onClick:le,title:"Expand sidebar","aria-label":"Expand sidebar",children:d.jsx(vn,{direction:"right"})}),d.jsx("section",{className:`workspace workspace-${t}`,children:d.jsxs("section",{className:`viewer app-area app-area-${t}${t===Gy[0][0]?" is-joined-top":""}${t==="work"?` view-${P}`:""}`,children:[t==="work"&&d.jsx(CU,{}),C&&M&&(y||t==="graph")&&d.jsx("div",{className:"pathfinder-view-host",hidden:t!=="graph",children:d.jsx(HP,{active:t==="graph",children:d.jsx(ez,{active:t==="graph",onOpenFinding:re,pathSnapshotRequest:T,onPathSnapshotApplied:w})},e.workScopeId)}),t==="graph"&&C&&!M&&d.jsxs("div",{className:"datahub-empty",children:[d.jsx("h3",{children:"No timeslot selected"}),d.jsx("p",{children:"Select a timeslot in Work to build its graph."})]}),t==="data-hub"&&d.jsx(__,{activeProjectId:F,backendStatus:X,onDetailViewChanged:Z,onProjectDataChanged:async fe=>{await e.openProject(fe,fe===F?e.activeScanRunIds:void 0,fe===F?e.activeAssessmentIds:void 0)},onProjectSelected:(fe,ye,qe)=>{i(fe?.name),fe?(n("dashboard"),e.openProject(fe.id,ye,qe)):e.setTargetProjectId(void 0)}}),t==="dashboard"&&d.jsx(xq,{onOpenWork:re}),t==="db-structure"&&d.jsx(Eq,{backendStatus:X}),t==="results"&&d.jsx(Rq,{backendStatus:X,projectId:F,scanRunIds:e.activeScanRunIds,assessmentIds:e.activeAssessmentIds})]})})]}),d.jsx(wz,{}),m&&d.jsx(Pz,{onClose:()=>g(!1)})]})}y8.createRoot(document.getElementById("root")).render(d.jsx(H.StrictMode,{children:d.jsx(VP,{children:d.jsx(Bz,{})})})); diff --git a/outputs/client-info-design-check/client-build/assets/index-DLrW8Yip.css b/outputs/client-info-design-check/client-build/assets/index-DLrW8Yip.css new file mode 100644 index 0000000..305f7c3 --- /dev/null +++ b/outputs/client-info-design-check/client-build/assets/index-DLrW8Yip.css @@ -0,0 +1 @@ +.security-scoring-methodology{min-width:0}.security-scoring-methodology p{font-size:var(--type-body-size);line-height:var(--lh-prose)}.security-scoring-methodology table{width:100%;border-collapse:collapse;table-layout:fixed}.security-scoring-methodology caption{text-align:left;font-size:var(--type-body-size);font-weight:var(--fw-semibold);padding-bottom:var(--space-3)}.security-scoring-methodology th,.security-scoring-methodology td{padding:var(--space-2);border-bottom:var(--border-hair) solid var(--line);text-align:left;vertical-align:top;overflow-wrap:anywhere;font-size:var(--type-table-body-size)}.security-scoring-methodology th{font-size:var(--type-table-head-size);font-weight:var(--fw-semibold)}.security-scoring-methodology th:last-child{width:50%}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-wght-normal-CkhJZR-_.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@layer tokens,base,shell,components,utilities;@layer tokens{:root{--font-ui: "Inter Variable", sans-serif;--font-mono: var(--font-ui);--font-path: ui-monospace, Consolas, "Liberation Mono", monospace;--font-donut-display: var(--font-ui);--type-h1-size: 56px;--type-h2-size: 32px;--type-h3-size: 18px;--type-detail-title-size: 20px;--type-h4-size: 16px;--type-body-size: 16px;--type-table-body-size: 14px;--type-label-size: 12px;--type-meta-size: 12px;--type-badge-size: 11px;--type-table-head-size: 12px;--type-button-size: 13px;--segment-surface: transparent;--segment-border: transparent;--segment-radius: 10px;--segment-inset: var(--space-3);--segment-gap: var(--space-3);--tile-surface: #323238;--tile-surface-hover: #3A3A42;--tile-border: transparent;--tile-selected-border: var(--marking-color);--tile-radius: var(--radius-sm);--tile-inset: var(--space-4);--tile-compact-width: 186px;--tile-content-width: 358px;--tile-content-min-height: 223px;--tile-card-shadow: none;--client-info-canvas: var(--surface-app);--client-info-surface: var(--surface-input);--client-info-surface-raised: var(--tile-surface);--client-info-surface-hover: var(--tile-surface-hover);--client-info-text: var(--text-primary);--client-info-muted: var(--text-secondary);--client-info-line: var(--border-default);--client-info-line-strong: var(--border-strong);--client-info-amber: var(--sev-medium);--client-info-red: var(--sev-critical);--client-info-green: var(--state-done);--client-info-purple: var(--donut-not-applicable);--client-info-blue: var(--donut-all);--client-info-lime: var(--state-done);--client-info-neutral: var(--donut-not-run);--donut-rack-surface: var(--segment-surface);--donut-card-surface: var(--tile-surface);--donut-card-surface-end: var(--tile-surface);--donut-track: #555B65;--donut-border: var(--segment-border);--donut-value: #E2DFE6;--donut-label: #B7BAC0;--donut-all: #348CF2;--donut-deviation: #F0AC00;--donut-passed: #3DA96C;--donut-not-applicable: #7B36F3;--donut-not-run: #8A8E95;--donut-error: #F23C47;--donut-rack-shadow: none;--donut-card-shadow: var(--tile-card-shadow);--donut-rack-radius: var(--segment-radius);--donut-card-radius: var(--tile-radius);--donut-card-min-h: 196px;--donut-ring-size: 128px;--donut-ring-stroke: 12px;--donut-progress-dash: 0 100;--donut-title-size: 16px;--donut-value-size: 26px;--donut-percent-size: 14px;--donut-compact-value-size: 22px;--donut-compact-percent-size: 12px;--donut-compact-unit-gap: 2px;--datahub-readiness-dot-size: 14px;--datahub-readiness-dot-inset: var(--space-1);--fs-micro: var(--type-badge-size);--fs-sm: var(--type-meta-size);--fs-base: var(--type-button-size);--fs-md: var(--type-table-body-size);--fs-lg: var(--type-body-size);--fs-xl: var(--type-h3-size);--pathfinder-micro-title-size: 23px;--pathfinder-micro-badge-size: 14px;--pathfinder-micro-relation-badge-size: 16px;--pathfinder-micro-action-size: 14px;--pathfinder-micro-action-group-radius: 8px;--pathfinder-micro-action-radius: 6px;--pathfinder-micro-connector-backdrop-mix: #000000;--pathfinder-micro-action-highlight-mix: #FFFFFF;--fw-regular: 400;--fw-content-medium: 500;--fw-semibold: 600;--fw-bold: 700;--fw-medium: var(--fw-semibold);--lh-ui: 1.35;--lh-prose: 1.55;--ls-caps: .06em;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--sidebar-w: 224px;--sidebar-w-collapsed: 48px;--topbar-h: 44px;--band-row-h: 34px;--contextstrip-h: 24px;--statusbar-h: 24px;--inspector-w: 380px;--facetrail-w: 236px;--table-col-min-w: 96px;--panel-content-inset: 20px;--panel-inset: var(--panel-content-inset);--app-grid-size: 22px 22px;--control-h: 24px;--control-h-sm: 20px;--icon-btn: 24px;--row-h: 32px;--tile-h: 132px;--tile-min-w: 260px;--radius-xs: 0px;--radius-sm: 0px;--radius-md: 0px;--btn-radius: 4px;--btn-h: 28px;--btn-pad-x: 12px;--radius-nav-item: 4px;--radius-result-cluster: 4px;--bw-hairline: 1px;--bw-emphasis: 2px;--marker-width: 8px;--dur-fast: 90ms;--dur-base: .14s;--dur-data-build: .7s;--ease: cubic-bezier(.2, 0, .2, 1);--ease-data-build: cubic-bezier(.22, 1, .36, 1)}:root[data-density=compact]{--control-h: 26px;--control-h-sm: 22px;--icon-btn: 22px;--row-h: 28px;--tile-h: 116px;--band-row-h: 30px}:root[data-density=reading]{--control-h: 34px;--control-h-sm: 30px;--icon-btn: 30px;--row-h: 40px;--tile-h: 148px;--band-row-h: 38px}:root,:root[data-theme=dark]{color-scheme:dark;--surface-app: #242426;--surface-shell: #1B1B1D;--surface-panel: #242426;--surface-panel-raised: #323238;--surface-input: #1A1A1C;--surface-hover: #3A3A42;--surface-active: #43434C;--surface-selected: #3A3348;--surface-selected-flat: #43434C;--text-selected-flat: #E2DFE6;--text-muted-selected-flat: #B7BAC0;--border-selected-flat: var(--marking-color);--surface-tab-active: #323238;--text-tab-active: #E2DFE6;--surface-results-action: #242426;--border-results-action: #7C5CF5;--text-results-action: #A68AF9;--surface-overlay: #242426;--surface-scrim: rgba(6, 6, 9, .62);--app-grid-pattern: radial-gradient(circle at 1px 1px, #424248 1px, transparent 0);--graph-edge: rgba(104, 143, 181, .52);--graph-finding: #D9DEE4;--graph-unknown: #8EA7C0;--graph-relation: #9333EA;--graph-category: #AEB8C3;--graph-defense: #789C99;--graph-technique: #7E8D9C;--graph-tactic: #668BB3;--graph-alert: #E45E63;--graph-selected: var(--marking-color);--border-subtle: rgba(255, 255, 255, .14);--border-default: #383840;--border-strong: #4E4E58;--button-border: #383840;--button-bg: #323238;--button-bg-hover: #3A3A42;--button-text: #E2DFE6;--button-accent: #E9A63C;--button-accent-hover: #F0B252;--button-accent-text: #000000;--marking-color: #E9A63C;--surface-nav-item: #323238;--surface-nav-item-hover: #3A3A42;--surface-nav-active: var(--surface-app);--text-primary: #E2DFE6;--text-secondary: #B7BAC0;--text-muted: #B7BAC0;--text-disabled: #55555E;--text-inverse: #0D0D10;--text-link: #7FA9F0;--accent: #7C5CF5;--accent-hover: #8E73F7;--accent-active: #6845DE;--accent-on: #FFFFFF;--accent-subtle: #241C3F;--band-surface: #D9962A;--band-surface-hover: #E5A33A;--band-surface-active: #C4831C;--band-border: #A66E12;--band-text: #17130A;--sev-critical: #E8214F;--sev-high: #E2680F;--sev-medium: #C99700;--sev-low: #2E9E6B;--sev-info: #3D8FD1;--sev-unknown: #6E6E78;--sev-on: #FFFFFF;--sev-ink: #08080A;--outcome-fail: #F2607F;--outcome-pass: #63D69A;--outcome-warning: #D9A82A;--outcome-error: #E88A45;--outcome-idle: #74747F;--state-open: #8A8A94;--state-progress: #3D8FD1;--state-done: #2E9E6B;--state-blocked: #E2680F;--state-accepted: #74747F;--state-bookmark: #1FA89E;--state-online: #2E9E6B;--state-offline: #E8214F;--focus-ring: #4CC2FF;--selection-border: var(--marking-color);--selection-marker: var(--marking-color);--search-highlight-bg: #FFE600;--search-highlight-text: #000000;--evidence-highlight-bg: #CBF8FF;--evidence-highlight-text: #000000;--criterion-highlight-bg: #176B46;--criterion-highlight-text: #FFFFFF;--violation-highlight-bg: #981B37;--violation-highlight-text: #FFFFFF;--viz-1: #7C5CF5;--viz-2: #3D8FD1;--viz-3: #1FA89E;--viz-4: #C99700;--viz-5: #E2680F;--viz-6: #B45BC4;--viz-grid: #2A2A32;--shadow-overlay: 0 8px 24px rgba(0, 0, 0, .48);--shadow-popover: 0 4px 12px rgba(0, 0, 0, .42)}:root[data-theme=light]{color-scheme:light;--segment-surface: transparent;--segment-border: transparent;--tile-surface: #FFFFFF;--tile-surface-hover: #F3F4F6;--tile-border: transparent;--tile-selected-border: var(--marking-color);--tile-card-shadow: none;--donut-rack-surface: var(--segment-surface);--donut-card-surface: var(--tile-surface);--donut-card-surface-end: var(--tile-surface);--donut-track: #B9BEC7;--donut-border: var(--segment-border);--donut-value: #20242A;--donut-label: #555B65;--donut-all: #1C70C9;--donut-deviation: #9A6500;--donut-passed: #1F7F4B;--donut-not-applicable: #6D2CE8;--donut-not-run: #626873;--donut-error: #D42836;--donut-rack-shadow: none;--donut-card-shadow: var(--tile-card-shadow);--surface-app: #F1F1F4;--surface-shell: #E4E4EA;--surface-panel: #FFFFFF;--surface-panel-raised: #F7F7F9;--surface-input: #FFFFFF;--surface-hover: #EDEDF2;--surface-active: #E3E3EA;--surface-selected: #EAE4FC;--surface-selected-flat: #E4E4EC;--text-selected-flat: #17171C;--text-muted-selected-flat: #55555F;--border-selected-flat: var(--marking-color);--surface-tab-active: #FFFFFF;--text-tab-active: #17171C;--surface-results-action: #FFFFFF;--border-results-action: #7C3AED;--text-results-action: #7C3AED;--surface-overlay: #FFFFFF;--surface-scrim: rgba(24, 24, 30, .32);--app-grid-pattern: radial-gradient(circle at 1px 1px, #CBCBD3 1px, transparent 0);--graph-edge: rgba(55, 92, 128, .45);--graph-finding: #3F4851;--graph-unknown: #58718A;--graph-relation: #9333EA;--graph-category: #667482;--graph-defense: #527A77;--graph-technique: #71808E;--graph-tactic: #426C97;--graph-alert: #C83E45;--graph-selected: var(--marking-color);--border-subtle: #E2E2E8;--border-default: #CFCFD8;--border-strong: #A8A8B4;--button-border: #888888;--button-bg: #C8C8C8;--button-bg-hover: #D5D5D5;--button-text: #111111;--button-accent: #E9A63C;--button-accent-hover: #F0B252;--button-accent-text: #000000;--marking-color: #E9A63C;--surface-nav-item: #D8D8E0;--surface-nav-item-hover: #E4E4EC;--surface-nav-active: var(--surface-app);--text-primary: #17171C;--text-secondary: #55555F;--text-muted: #74747F;--text-disabled: #A0A0AA;--text-inverse: #FFFFFF;--text-link: #2A5FBF;--accent: #5B34D9;--accent-hover: #4A28BE;--accent-active: #3F1FA8;--accent-on: #FFFFFF;--accent-subtle: #EDE7FD;--band-surface: #E9A63C;--band-surface-hover: #F0B252;--band-surface-active: #D8942A;--band-border: #B37B18;--band-text: #17130A;--sev-critical: #E8214F;--sev-high: #E2680F;--sev-medium: #C99700;--sev-low: #2E9E6B;--sev-info: #3D8FD1;--sev-unknown: #6E6E78;--sev-on: #FFFFFF;--sev-ink: #08080A;--outcome-fail: #C60F3E;--outcome-pass: #187447;--outcome-warning: #8F6B00;--outcome-error: #B85206;--outcome-idle: #74747F;--state-open: #6E6E78;--state-progress: #2A6FA8;--state-done: #1E7A50;--state-blocked: #B85206;--state-accepted: #74747F;--state-bookmark: #10756D;--state-online: #1E7A50;--state-offline: #C60F3E;--focus-ring: #0A66C2;--selection-border: var(--marking-color);--selection-marker: var(--marking-color);--search-highlight-bg: #FFE600;--search-highlight-text: #000000;--evidence-highlight-bg: #CBF8FF;--evidence-highlight-text: #000000;--criterion-highlight-bg: #CBEFD9;--criterion-highlight-text: #10261A;--violation-highlight-bg: #FFD4DB;--violation-highlight-text: #4A0714;--viz-1: #5B34D9;--viz-2: #2A6FA8;--viz-3: #10756D;--viz-4: #8F6B00;--viz-5: #B85206;--viz-6: #92389F;--viz-grid: #DFDFE6;--shadow-overlay: 0 8px 24px rgba(20, 20, 28, .18);--shadow-popover: 0 4px 12px rgba(20, 20, 28, .14)}@media(prefers-reduced-motion:reduce){:root{--dur-fast: 0ms;--dur-base: 0ms;--dur-data-build: 0ms}}}:root{--bg: var(--surface-app);--header: var(--surface-shell);--sidebar: var(--surface-shell);--panel: var(--surface-panel);--panel-soft: var(--surface-panel);--panel-raised: var(--surface-panel-raised);--panel-hover: var(--surface-hover);--surface-inset: var(--surface-input);--line: var(--border-subtle);--line-strong: var(--border-strong);--text: var(--text-primary);--heading: var(--text-primary);--muted: var(--text-secondary);--text-on-accent: var(--accent-on);--state-selected: var(--surface-selected);--state-selected-text: var(--text-primary);--state-selected-flat: var(--surface-selected-flat);--state-selected-flat-text: var(--text-selected-flat);--state-selected-flat-muted: var(--text-muted-selected-flat);--state-selected-flat-border: var(--border-selected-flat);--state-active: var(--marking-color);--state-active-text: var(--band-text);--result-color: var(--state-active);--button-border: var(--border-default);--button-bg: var(--surface-panel-raised);--button-bg-hover: var(--surface-hover);--button-text: var(--text-primary);--button-marked-bg: var(--button-accent);--button-marked-bg-hover: var(--button-accent-hover);--button-marked-text: var(--button-accent-text);--legacy-accent: var(--accent);--legacy-accent-active: var(--accent-active);--accent-strong: var(--accent-hover);--success: var(--state-done);--warning: var(--outcome-warning);--danger: var(--sev-critical);--danger-text: var(--outcome-fail);--danger-surface: color-mix(in srgb, var(--sev-critical) 16%, transparent);--critical: var(--sev-critical);--high: var(--sev-high);--medium: var(--sev-medium);--low: var(--sev-low);--info: var(--sev-info);--critical-badge: var(--sev-critical);--high-badge: var(--sev-high);--medium-badge: var(--sev-medium);--low-badge: var(--sev-low);--info-badge: var(--sev-info);--severity-ink: var(--sev-ink);--legacy-radius-sm: var(--radius-sm);--legacy-radius-md: var(--radius-md);--radius-lg: var(--radius-md);--radius-pill: 999px;--border-hair: var(--bw-hairline);--legacy-space-1: var(--space-1);--legacy-space-2: var(--space-2);--legacy-space-3: var(--space-3);--legacy-space-4: var(--space-4);--legacy-space-5: var(--space-5);--legacy-space-6: var(--space-6);--space-7: var(--space-8);--control-height: var(--control-h);--row-height: var(--row-h);--reader-inset: 28px;--shadow: none;--shadow-raised: 0 4px 12px rgba(0, 0, 0, .28), inset 0 1px 0 rgba(255, 255, 255, .08);--shadow-raised-hover: 0 8px 20px rgba(0, 0, 0, .38), inset 0 1px 0 rgba(255, 255, 255, .12);--font: var(--font-ui);--ui-label-size: var(--type-table-head-size);--ui-badge-size: var(--type-badge-size);--ui-small-size: var(--type-meta-size);--ui-value-size: var(--type-label-size);--ui-control-size: var(--type-button-size);--ui-body-size: var(--type-table-body-size);--ui-heading-size: var(--type-h3-size);--ui-reading-size: var(--type-body-size);--ui-reading-heading-size: var(--type-h2-size);--ui-glyph-size: 21px;--ui-label-weight: var(--fw-semibold);--ui-strong-weight: var(--fw-semibold);--ui-body-weight: var(--fw-regular);--ui-label-tracking: var(--ls-caps)}*{box-sizing:border-box}html,body,#root{width:100%;min-width:0;min-height:100%;margin:0}body{min-height:100vh;overflow:hidden;color:var(--text);background:var(--bg);font:var(--fw-regular) var(--type-body-size)/1.5 var(--font-ui)}button,input,select,textarea{color:inherit;font:inherit}button,select{cursor:pointer}button:disabled,select:disabled{cursor:not-allowed;opacity:.42}h1,h2,h3,h4,p{margin-top:0}h1{font-size:var(--type-h1-size);font-weight:var(--fw-semibold);line-height:1.1;letter-spacing:-.04em}h2{font-size:var(--type-h2-size);font-weight:var(--fw-semibold);line-height:1.15;letter-spacing:-.03em}h3{font-size:var(--type-h3-size);font-weight:var(--fw-semibold);line-height:1.25;letter-spacing:0}h4{font-size:var(--type-h4-size);font-weight:var(--fw-semibold);line-height:1.3;letter-spacing:0}svg{display:block;width:17px;height:17px}table{width:100%;border-collapse:collapse}th,td{padding:9px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top;overflow-wrap:anywhere}td{font-size:var(--type-table-body-size);font-weight:var(--fw-regular)}th{position:sticky;top:0;z-index:1;color:var(--muted);background:var(--panel-soft);font-size:var(--type-table-head-size);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);text-transform:uppercase}tbody tr:hover td{background:var(--panel-hover)}pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}mark{padding:1px 2px;color:var(--state-active-text);background:var(--state-active)}.hidden-input{display:none}button,.btn,.icon-btn,.tab-btn,.bookmark-btn,.results-btn{border-radius:var(--btn-radius);border:1px solid var(--button-border);color:var(--button-text);background:var(--button-bg);font-size:var(--type-button-size);font-weight:var(--fw-semibold);line-height:1.15}.select,.input{min-height:var(--control-height);border:var(--border-hair) solid var(--line);border-radius:0;color:var(--text);background-color:var(--panel-raised);font-size:var(--type-button-size);font-weight:var(--fw-regular)}.btn{display:inline-flex;align-items:center;justify-content:center;min-height:var(--btn-h);padding:0 var(--btn-pad-x)}.select,.input{padding:var(--legacy-space-1) var(--legacy-space-3)}.icon-btn,.bookmark-btn,.results-btn{display:inline-grid;place-items:center;min-width:var(--btn-h);min-height:var(--btn-h);padding:0 6px}.btn:hover,.icon-btn:hover,.tab-btn:hover,.bookmark-btn:hover,.results-btn:hover{border-color:var(--button-border);background:var(--button-bg-hover);color:var(--button-text)}.select:hover,.input:hover{border-color:var(--line-strong);background-color:var(--panel-hover)}.input{background:var(--surface-inset)}.btn.primary,.btn--primary,.btn.active,.tab-btn.active,.bookmark-btn[aria-pressed=true],.icon-btn[aria-pressed=true],.results-btn.is-open{border:1px solid var(--button-border);color:var(--button-marked-text);background:var(--button-marked-bg);font-weight:var(--fw-semibold)}.btn.primary:hover,.btn--primary:hover,.btn.active:hover,.tab-btn.active:hover,.bookmark-btn[aria-pressed=true]:hover,.icon-btn[aria-pressed=true]:hover,.results-btn.is-open:hover{border-color:var(--button-border);background:var(--button-marked-bg-hover);color:var(--button-marked-text)}:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}.app-shell{display:grid;grid-template-rows:124px minmax(0,1fr);height:100vh;min-height:0}.topbar{display:flex;align-items:flex-start;gap:10px;min-width:0;height:124px;padding:6px 12px;background:var(--header);overflow:hidden}.brand{appearance:none;display:flex;align-items:center;gap:12px;flex:0 0 204px;min-width:204px;min-height:112px;padding:6px 14px 6px 16px;margin-top:0;border:0;color:inherit;background:transparent;font:inherit;text-align:left;white-space:nowrap;cursor:pointer}.brand:hover{background:transparent}.brand:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}.brand h1{margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-bold);line-height:1;letter-spacing:.045em}.brand-copy{display:grid;gap:var(--space-1)}.brand-version{color:var(--muted);font-size:var(--type-meta-size);font-variant-numeric:tabular-nums;line-height:1;letter-spacing:var(--ls-caps)}.brand-logo{position:relative;display:block;flex:0 0 48px;width:48px;height:48px}.brand-logo img{position:absolute;inset:0;display:block;width:48px;height:48px;object-fit:contain;transition:opacity .16s ease}.app-header-panel{position:relative;display:flex;flex:1 1 0;flex-direction:column;min-width:0;min-height:112px;padding:6px 10px;background:transparent;overflow:hidden}.app-header-panel,.viewer{border-radius:10px}.app-header-panel-work{padding:3px 0 0}.work-header-row{display:flex;align-items:center;gap:18px;min-width:0}.work-header-row .reader-toolbar{flex:1 1 auto}.app-header-context{display:flex;align-items:center;gap:12px;flex:0 0 auto;min-height:30px}.work-header-row .app-header-context{margin-left:auto}.app-header-panel:not(.app-header-panel-work) .app-header-context{position:absolute;top:3px;right:0}.app-header-client-name{flex:0 1 auto;max-width:min(32vw,420px);margin-right:16px;overflow:hidden;color:var(--heading);font-size:var(--fs-xl);font-weight:var(--fw-semibold);line-height:1.2;text-align:right;text-overflow:ellipsis;white-space:nowrap}.reader-toolbar{display:flex;align-items:center;gap:10px;min-width:0;min-height:30px;padding-left:14px;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:var(--line-strong) transparent}.toolbar,.header-export-row,.live-summary,.search-tools,.view-tabs{display:flex;align-items:center;gap:6px;min-width:0}.toolbar{flex:0 0 auto;justify-content:flex-end;margin:0;padding:0;border:0;min-inline-size:0}.live-summary{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;height:30px;margin-left:0;padding:3px 8px;gap:10px;border:1px solid var(--border-default);border-radius:0;background:var(--surface-panel-raised);white-space:nowrap}.live-summary span{display:inline-flex;align-items:center;gap:8px;color:var(--text-secondary);font-weight:var(--fw-regular);font-size:var(--ui-label-size)}.live-summary span+span{border-left:1px solid var(--border-subtle);padding-left:10px}.live-summary b{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:22px;padding:1px 6px;border:1px solid var(--border-default);border-radius:0;color:var(--text-primary);background:var(--surface-input);font-size:var(--ui-label-size);font-variant-numeric:tabular-nums;font-weight:var(--fw-semibold);line-height:1;text-align:center}.delimiter-select{width:220px}.view-tabs{flex:0 0 auto;gap:0;border:1px solid var(--button-border);border-radius:0;overflow:visible;background:var(--surface-input)}.tab-btn{flex:0 0 auto;min-width:72px;padding:2px 8px;border:0;border-right:1px solid var(--button-border);border-radius:0;color:var(--button-text);background:var(--button-bg);font-size:var(--ui-label-size);font-weight:var(--fw-medium);line-height:1.15;white-space:nowrap;transition:background-color .12s ease,color .12s ease}.view-tabs .tab-btn:first-child{border-radius:0}.view-tabs .tab-btn:last-child{border-radius:0;border-right:0}.tab-btn:hover{color:var(--button-text);background:var(--button-bg-hover)}.view-tabs .tab-btn.active,.view-tabs .tab-btn.active:hover{border:1px solid var(--button-border);color:var(--button-marked-text);background:var(--button-marked-bg);font-weight:600}.export-btn{min-width:44px;padding-inline:8px;border-radius:var(--btn-radius);border:1px solid var(--button-border)}.workspace-btn{flex:0 0 auto;min-width:112px;border:1px solid var(--button-border);border-radius:var(--btn-radius);color:var(--button-text);background:var(--button-bg);white-space:nowrap}.header-export-row{flex:0 0 auto;overflow:visible}.toolbar>.btn,.toolbar>.icon-btn,.toolbar>.delimiter-select{flex-shrink:0}.workspace-btn.has-items{border-color:var(--button-border);color:var(--text);background:var(--button-bg);opacity:1}.workspace-btn.has-items:hover{border-color:var(--button-border);background:var(--button-bg-hover)}.workspace-btn.active{border-color:var(--button-border);color:var(--button-marked-text);background:var(--button-marked-bg);font-weight:600}.app-shell>main{position:relative;display:grid;grid-template-columns:218px minmax(0,1fr);min-height:0;transition:grid-template-columns .18s ease}.app-shell.sidebar-collapsed>main{grid-template-columns:0 minmax(0,1fr)}aside{position:relative;z-index:10;min-width:0;min-height:0;background:var(--sidebar);overflow:visible}.sidebar-theme-panel{margin-top:auto;padding:14px 12px}.theme-switcher{display:flex;align-items:center;justify-content:space-between;gap:4px;padding:4px;border:1px solid var(--button-border);border-radius:10px;background:var(--surface-input)}.theme-switcher-btn{display:grid;place-items:center;flex:1 1 0;height:28px;padding:0;border:1px solid transparent;border-radius:7px;color:var(--button-text);background:transparent;box-shadow:none;font-size:var(--ui-body-size);line-height:1;transition:background-color .12s ease,color .12s ease,border-color .12s ease;cursor:pointer}.theme-switcher-btn:hover:not(.active){color:var(--button-text);background:var(--button-bg-hover)}.theme-switcher-btn.active{border-color:var(--button-border);color:var(--button-marked-text);background:var(--button-marked-bg);box-shadow:none;font-weight:var(--fw-semibold)}.sidebar-toggle-inline{display:grid;place-items:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:7px;color:var(--button-text);background:transparent;font-size:16px;font-weight:var(--fw-bold);cursor:pointer}.sidebar-toggle-inline:hover{background:var(--button-bg-hover);color:var(--text-primary)}.sidebar-primary-actions{display:flex;flex-direction:column;gap:8px;margin:10px 0 0;padding:0 0 12px 10px;border-top:0;border-bottom:0}.sidebar-tab-btn{position:relative;display:flex;align-items:center;gap:13px;width:calc(100% - 10px);min-height:42px;padding:8px 14px;border:1px solid transparent;border-radius:8px;color:var(--text-secondary);background:transparent;box-shadow:none;font-size:var(--ui-heading-size);font-weight:var(--fw-regular);letter-spacing:0;text-align:left;text-shadow:none;cursor:pointer;transition:color .15s ease,background .15s ease,border-color .15s ease}.sidebar-tab-btn svg{flex:0 0 22px;width:22px;height:22px;color:var(--text-muted)}.sidebar-tab-btn span{min-width:0}.sidebar-tab-btn:hover:not(.active):not(:disabled){color:var(--text-primary);background:var(--surface-hover);border-color:transparent;box-shadow:none;transform:none}.sidebar-tab-btn:hover:not(.active):not(:disabled) svg{color:var(--text-primary)}.sidebar-tab-btn:active:not(:disabled){color:var(--text-primary);background:var(--surface-hover);box-shadow:none;transform:none}.sidebar-tab-btn:disabled{opacity:.45;cursor:not-allowed}.sidebar-tab-btn.active,.sidebar-tab-btn.active:hover{position:relative;z-index:12;width:calc(100% + 1px);margin-right:-1px;border:1px solid transparent;border-right:1px solid var(--surface-app);border-radius:8px 0 0 8px;color:var(--text-primary);background:var(--surface-app);box-shadow:none;outline:0;font-weight:var(--fw-semibold)}.sidebar-tab-btn.active svg{color:var(--band-surface)}.app-shell.sidebar-collapsed>main>aside{visibility:hidden}.sidebar-toggle{position:absolute;left:0;top:10px;z-index:30;display:grid;place-items:center;width:28px;height:28px;padding:0;border:1px solid var(--button-border);border-left:0;border-radius:0;color:var(--text-primary);background:var(--button-bg);transition:background-color .12s ease}.sidebar-toggle:hover{background:var(--surface-hover)}.sidebar-collapsed .sidebar-toggle{left:0}.workspace{display:grid;grid-template-rows:minmax(0,1fr);min-width:0;min-height:0;background:var(--sidebar);margin:0;padding:0 12px 12px 0;overflow:hidden}.workspace.graph-workspace{grid-template-rows:minmax(0,1fr)}.workbar{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-width:0;margin:9px 0 0;padding:8px 16px;border:0;background:transparent;overflow:hidden}.toolbar:disabled,.workbar:disabled{opacity:.5}.toolbar:disabled *,.workbar:disabled *{pointer-events:none}.search-tools{grid-column:1 / -1;display:flex;align-items:center;gap:6px;flex:1 1 auto;flex-wrap:wrap;margin:0;padding:0}.standard-filter-btn{flex:0 0 auto;min-width:96px;margin-left:0;font-weight:var(--fw-semibold)}.title-select{flex:0 0 215px;width:215px}.sort-select{flex:0 0 345px;width:345px}.status-select{flex:0 0 190px;width:190px}.search-tail{display:flex;align-items:center;gap:6px;flex:0 0 100%;min-width:0}.sheet-select{flex:0 1 310px;min-width:240px;margin-left:0}.work-timeslot-select{flex:0 0 180px;width:180px;min-width:180px;margin-left:0}.search-text-group{display:flex;align-items:center;flex:1 1 280px;min-width:200px;max-width:480px}.search-text-group .search-input-wrap{flex:1 1 auto;width:100%;min-width:140px}.search-input-wrap{position:relative;flex:0 0 150px;width:150px;min-width:150px}.search-input{width:100%;min-width:0;padding-right:34px}.search-clear-btn{position:absolute;inset:1px 1px 1px auto;display:grid;place-items:center;width:30px;padding:0;border:0;border-left:1px solid var(--line);border-radius:0 2px 2px 0;color:var(--muted);background:transparent;font-size:var(--ui-heading-size)}.search-clear-btn:hover:not(:disabled){color:var(--heading);background:var(--panel-hover)}.search-clear-btn:disabled{opacity:.35}.workbar-action{display:flex;grid-column:2;align-items:center;gap:12px;white-space:nowrap;color:var(--muted);font-size:var(--ui-label-size)}.workbar-action b{color:var(--heading)}.workbar-action label{display:flex;align-items:center;gap:6px}.status-line{position:relative;display:flex;justify-content:space-between;align-items:center;gap:16px;min-width:0;padding:4px 16px;color:var(--muted);border:0;font-size:var(--ui-label-size)}.status-line>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto}.status-line-tools{position:absolute;left:50%;display:flex;align-items:center;gap:8px;width:min(520px,calc(100% - 32px));min-width:0;margin:0;transform:translate(-50%)}.status-line .search-text-group{flex:1 1 auto;min-width:200px;max-width:none;margin:0}.status-line-end{display:flex;align-items:center;gap:16px;min-width:0;flex:0 1 auto}.status-line-provenance{flex:0 1 auto;cursor:help}.viewer{position:relative;grid-row:1;min-width:0;min-height:0;margin-top:10px;background:var(--surface-app);overflow:hidden}.pathfinder-view-host{min-width:0;min-height:0;height:100%}.viewer.is-joined-top{border-top-left-radius:0}.area-landing{display:grid;place-items:center;min-height:100%;padding:36px}.area-landing-card{width:min(620px,100%);padding:38px 42px;border:1px solid var(--line);border-radius:8px;background:var(--panel);box-shadow:var(--shadow);text-align:center}.area-kicker{display:block;margin-bottom:10px;color:var(--muted);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.area-landing-card h2{margin:0 0 12px;color:var(--heading);font-size:var(--ui-glyph-size)}.area-landing-card p{max-width:510px;margin:0 auto 24px;color:var(--muted);line-height:1.6}.area-landing-card .hidden-input+.btn{min-width:170px;font-weight:var(--fw-semibold)}.records-layout{display:grid;grid-template-columns:clamp(420px,27vw,520px) minmax(0,1fr);height:100%;min-height:0;background:var(--surface-app)}.record-list{min-width:0;min-height:0;padding:8px 6px;background:var(--surface-app);overflow-y:auto;scrollbar-color:var(--line-strong) var(--surface-inset);scrollbar-width:thin}.tile-view-scroll{padding:var(--panel-inset)}.tile-grid{box-sizing:border-box;display:grid;grid-template-columns:repeat(auto-fill,minmax(0,var(--tile-content-width)));align-content:start;justify-content:start;gap:var(--segment-gap);min-height:100%;padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface)}.table-scroll{max-width:100%;overflow:auto;background:var(--surface-app)}.raw-view{min-height:100%;padding:var(--panel-inset);color:var(--text);background:var(--surface-app);font:var(--type-table-body-size)/1.55 var(--font-mono)}@media(max-width:1500px){.topbar-kpi{min-width:74px;padding-inline:10px}.topbar-kpi.kpi-format{min-width:190px}.delimiter-select{width:170px}.tab-btn{min-width:68px}}@media(max-width:1200px){.status-line-tools{position:static;width:min(520px,100%);margin-left:auto;transform:none}}@media(max-width:1050px){.workbar{grid-template-columns:minmax(0,1fr)}.workbar-action{grid-column:1;justify-content:flex-end}.records-layout{grid-template-columns:minmax(320px,42%) minmax(0,1fr)}}@media(max-width:760px){.app-shell>main{grid-template-columns:0 minmax(0,1fr)}.app-shell>main>aside{visibility:hidden}.sidebar-toggle{left:0}.records-layout{grid-template-columns:1fr}.record-list{max-height:280px;border-right:0;border-bottom:1px solid var(--line)}.tile-grid{grid-template-columns:minmax(0,1fr)}}.app-sidebar{display:flex;flex-direction:column;min-height:100%;padding:0}.sidebar-primary-actions{order:0}.sidebar-severity-rack{order:1}.sidebar-theme-panel{order:2;margin-top:auto;padding:14px 12px;border-top:1px solid var(--line)}.connection-indicator{display:inline-flex;align-items:center;gap:3px;flex:0 0 auto}.connection-state-square{display:block;width:9px;height:9px;border-radius:0;opacity:.2}.connection-state-square.is-offline{background:var(--state-offline)}.connection-state-square.is-online{background:var(--state-online)}.connection-connected .connection-state-square.is-online,.connection-unavailable .connection-state-square.is-offline,.connection-checking .connection-state-square.is-offline{opacity:1}.area-topbar{display:flex;align-items:center;gap:14px;flex:1;min-width:0}.area-topbar strong{margin-right:auto;color:var(--heading);font-size:var(--type-h1-size);font-weight:var(--fw-semibold);line-height:1.1;letter-spacing:-.04em}.area-topbar-heading{display:flex;align-items:center;gap:18px;min-width:0;margin-right:auto;overflow:hidden}.area-topbar-heading>strong{flex:0 0 auto;margin-right:0}.area-client-context-inline{display:flex;align-items:center;gap:var(--space-2);min-width:0}.area-client-marker{flex:0 0 auto;color:var(--state-active)}.area-client-marker .triangle-icon{width:24px;height:24px}.area-client-name{min-width:0;overflow:hidden;color:var(--heading);font-size:var(--type-h3-size);font-weight:var(--fw-semibold);line-height:1.2;text-overflow:ellipsis;white-space:nowrap}.pathfinder-filter-trail{display:flex;align-items:center;gap:12px;min-width:0;color:var(--heading);font-size:calc(var(--fs-xl) * 1.5);font-weight:var(--fw-semibold);line-height:1.15;white-space:nowrap}.pathfinder-filter-trail-marker,.pathfinder-filter-trail-plus{flex:0 0 auto;color:var(--state-active)}.pathfinder-filter-trail-marker{display:inline-flex}.pathfinder-filter-trail-marker .triangle-icon{width:28px;height:28px}.pathfinder-filter-trail-item{min-width:0;overflow:hidden;text-overflow:ellipsis}.workspace-data-hub,.workspace-dashboard,.workspace-graph,.workspace-db-structure,.workspace-results{grid-template-rows:minmax(0,1fr)}.viewer.app-area-graph{background-color:var(--surface-app);background-image:var(--app-grid-pattern);background-size:var(--app-grid-size)}@media(max-width:1500px){.app-shell-work .delimiter-select{display:none}}mark,.search-highlight{background-color:var(--search-highlight-bg);color:var(--search-highlight-text);border-radius:2px;padding:0 2px;font-weight:600}.empty-state{display:grid;place-items:center;min-height:55vh;padding:40px;color:var(--muted);text-align:center}.empty-state-brand{min-height:100%}.work-filter-empty{padding:var(--panel-inset);color:var(--muted)}.work-filter-empty p{font-size:var(--type-body-size)}.empty-state-content{display:grid;justify-items:center;gap:24px;width:min(620px,100%)}.empty-brand-mark{display:flex;align-items:center;gap:18px;opacity:.6}.empty-brand-logo{position:relative;display:block;width:82px;height:82px}.empty-brand-logo img{position:absolute;inset:0;width:82px;height:82px;object-fit:contain}.empty-brand-mark strong{color:var(--heading);font-size:clamp(34px,4vw,58px);font-weight:var(--fw-bold);line-height:1;letter-spacing:.08em}.empty-open-data{position:relative;display:flex;align-items:center;gap:13px;width:min(310px,100%);min-height:50px;padding:10px 20px;border:0;border-radius:0 var(--legacy-radius-md) var(--legacy-radius-md) 0;color:var(--text);background:var(--panel-raised);box-shadow:none;font-size:var(--ui-heading-size);font-weight:var(--fw-semibold);text-align:left}.empty-open-data:before{content:"";position:absolute;inset:0 auto 0 0;width:4px;background:var(--legacy-accent)}.empty-open-data svg{flex:0 0 25px;width:25px;height:25px}.empty-open-data:hover{color:var(--heading);background:var(--panel-hover)}.empty-open-data:active{background:var(--panel-soft)}.empty-supported-formats{color:var(--muted);font-size:var(--ui-body-size);font-weight:var(--fw-regular);line-height:1.8;letter-spacing:.025em}.about-sections{display:grid;gap:var(--space-5)}.about-brand{display:grid;place-items:center;min-height:172px}.about-brand img{display:block;width:160px;height:160px;object-fit:contain}.about-sections section{display:grid;gap:var(--space-3)}.about-sections h3{margin:0;font-size:var(--type-h3-size);font-weight:var(--fw-semibold)}.about-sections dl{display:grid;gap:0;margin:0}.about-detail{display:grid;grid-template-columns:minmax(130px,.8fr) minmax(0,1.2fr);gap:var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--line)}.about-detail dt{color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.about-detail dd{min-width:0;margin:0;overflow-wrap:anywhere;font-size:var(--type-table-body-size);font-variant-numeric:tabular-nums}.about-credits{color:var(--muted);font-size:var(--type-meta-size);text-align:center}.panel-loading-state{box-sizing:border-box;display:grid;place-items:center;width:100%;min-height:min(560px,62vh);color:var(--muted)}.panel-loading-state-content{display:grid;justify-items:center;gap:var(--space-4);text-align:center}.panel-loading-state-message{display:flex;align-items:center;justify-content:center;gap:var(--space-3);color:var(--text);font-size:var(--type-body-size);line-height:var(--lh-prose)}.panel-loading-state.is-compact{min-height:280px}.finding-card{position:relative;display:grid;grid-template-columns:38px minmax(0,1fr) 36px;gap:12px;min-width:0;min-height:238px;padding:22px 18px;border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-md);color:var(--text);background:var(--panel-raised);box-shadow:var(--shadow-raised);cursor:pointer;transition:border-color .16s ease,background-color .16s ease,box-shadow .16s ease,transform .16s ease}.finding-card:hover,.finding-card:focus-visible{border-color:var(--line-strong);background:var(--panel-hover);box-shadow:var(--shadow-raised-hover);transform:translateY(-2px)}.finding-card.active{border-color:var(--legacy-accent-active);color:var(--text-on-accent);background:var(--legacy-accent-active)}.finding-card.is-bookmarked{outline:2px solid var(--severity, var(--info));outline-offset:-2px}.record-list .finding-card{position:relative;grid-template-columns:32px minmax(0,1fr);gap:12px;min-height:78px;margin-bottom:0;padding:14px 16px;scroll-margin-block:7px;border:0;border-radius:0;background:var(--panel-raised);box-shadow:none;transform:none}.record-list .finding-card:after{content:"";position:absolute;bottom:0;left:14px;right:14px;height:1px;background:var(--border-subtle);pointer-events:none}.record-list .finding-card.active:after,.record-list .finding-card:last-child:after{display:none}.record-list .finding-card:hover,.record-list .finding-card:focus-visible{border-color:transparent;background:var(--panel-hover);box-shadow:none;transform:none}.record-list .finding-card.active,.record-list .finding-card.active:hover,.record-list .finding-card.active:focus-visible{z-index:1;outline:0;border-color:transparent;border-left:0;color:var(--state-selected-flat-text);background:var(--state-selected-flat);box-shadow:none}.record-list .finding-card.active h3,.record-list .finding-card.active .finding-card-status{color:var(--state-selected-flat-text)}.record-list .finding-card-actions,.record-list .finding-badges{display:none}.record-list .finding-card h3{margin-top:1px;font-size:var(--type-h4-size);font-weight:var(--fw-content-medium);line-height:1.35}.finding-card-status{display:none}.record-list .finding-card-status{display:block;margin:5px 0 0;color:var(--muted);font-size:var(--ui-control-size);line-height:1.2}.finding-hex{display:grid;place-items:center;width:29px;height:34px;margin-top:1px;color:var(--sev-on);background:var(--severity, var(--muted));clip-path:polygon(50% 0,94% 24%,94% 76%,50% 100%,6% 76%,6% 24%);font-size:var(--ui-control-size);font-weight:var(--fw-bold)}.finding-hex>span{transform:translate(-3px,1px)}.reader-title-hex{position:relative;display:block;width:30px;height:34px;margin-top:1px;background:var(--severity, var(--muted));clip-path:polygon(50% 0,94% 24%,94% 76%,50% 100%,6% 76%,6% 24%)}.reader-title-hex:after{content:"";position:absolute;left:2px;top:14px;width:8px;height:4px;border-left:2px solid var(--sev-on);border-bottom:2px solid var(--sev-on);transform:rotate(-45deg);pointer-events:none}.finding-card h3{margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-semibold);line-height:1.42;overflow-wrap:normal;word-break:normal;-webkit-hyphens:manual;hyphens:manual}.workspace-label{display:inline-flex;align-items:center;justify-content:center;margin-left:6px;padding:1px 6px;border:1px solid var(--border-default);border-radius:0;color:var(--text-primary);background:var(--surface-input);font-size:var(--ui-label-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;vertical-align:middle}.finding-badges,.mitre-line{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.finding-card-actions{display:grid;align-content:start;gap:8px}.bookmark-btn{color:var(--button-text);border:1px solid var(--button-border);border-radius:var(--btn-radius);background:var(--button-bg)}.bookmark-btn[aria-pressed=true]{border-color:var(--button-border);color:var(--button-marked-text);background:var(--button-marked-bg);font-weight:600}.results-btn,.results-btn:hover{border:1px solid var(--button-border);border-radius:var(--btn-radius);color:var(--button-text);background:var(--button-bg);font-weight:var(--fw-medium)}.results-btn.is-open,.results-btn.is-open:hover{border:1px solid var(--result-color);color:var(--text-on-accent);background:var(--result-color);font-weight:600}.status-badge{border:var(--border-hair) solid var(--line)}.outcome-mark{display:inline-flex;align-items:center;gap:var(--legacy-space-1);color:var(--muted)}.outcome-mark:before{content:"–"}.outcome-mark[data-outcome=fail]{color:var(--outcome-fail)}.outcome-mark[data-outcome=fail]:before{content:"●"}.outcome-mark[data-outcome=pass]{color:var(--outcome-pass)}.outcome-mark[data-outcome=pass]:before{content:"○"}.outcome-mark[data-outcome=warning]{color:var(--outcome-warning)}.outcome-mark[data-outcome=warning]:before{content:"◐"}.outcome-mark[data-outcome=execution_error]{color:var(--outcome-fail)}.outcome-mark[data-outcome=execution_error]:before{content:"✕"}.mitre-badge{border:var(--border-hair) solid var(--line);color:var(--text);background:var(--surface-inset)}.severity-critical{--severity: var(--critical)}.severity-high{--severity: var(--high)}.severity-medium{--severity: var(--medium)}.severity-low{--severity: var(--low)}.severity-info{--severity: var(--info)}.finding-reader{min-width:0;min-height:0;padding:34px 0 60px;overflow-y:auto}.reader-nav{display:flex;align-items:center;gap:70px;margin-bottom:48px;color:var(--muted);font-size:var(--ui-value-size)}.reader-nav div{display:flex;gap:20px}.reader-nav button{border:0;color:var(--text);background:transparent;font-size:var(--ui-glyph-size)}.reader-heading{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:var(--legacy-space-3) 16px;align-items:start;padding-bottom:28px;border-bottom:1px solid var(--line)}.reader-heading h2{margin:0;color:var(--heading);font-size:var(--type-detail-title-size);font-weight:var(--ui-strong-weight);line-height:1.3;letter-spacing:0;overflow-wrap:normal;word-break:normal;-webkit-hyphens:manual;hyphens:manual}.reader-heading-actions{display:flex;flex-wrap:wrap;grid-column:1 / -1;align-items:center;justify-content:flex-end;gap:10px;align-self:center}.policy-search-key{display:grid;gap:var(--space-1);min-width:min(280px,100%);margin-right:auto;color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.policy-search-key>div{display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-3)}.policy-search-key code{width:fit-content;max-width:100%;color:var(--heading);font-family:var(--font-mono);font-size:var(--type-table-body-size);font-weight:var(--fw-regular);overflow-wrap:anywhere;-webkit-user-select:text;user-select:text}.accepted-risk-trigger{grid-column:3;grid-row:1;display:grid;gap:4px}.accepted-risk-trigger small{font-size:var(--type-meta-size);font-weight:var(--fw-regular)}.dialog-window.risk-acceptance-dialog{width:min(1040px,100%)}.risk-acceptance-form{display:grid;gap:16px}.risk-acceptance-form p{margin:0;font-size:var(--type-body-size);line-height:1.5}.risk-acceptance-context{font-weight:var(--fw-semibold)}.risk-acceptance-note{color:var(--muted)}.risk-acceptance-fields{min-width:0;display:grid;gap:24px;margin:0;padding:0;border:0}.risk-acceptance-fields h3,.risk-acceptance-history h3{margin:0 0 12px;font-size:var(--type-h3-size);font-weight:var(--fw-semibold)}.risk-acceptance-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.risk-acceptance-grid label{min-width:0;display:grid;align-content:start;gap:6px}.risk-acceptance-grid label>span{font-size:var(--type-h4-size);font-weight:var(--fw-semibold)}.risk-acceptance-grid small{font-size:var(--type-meta-size);color:var(--muted);line-height:1.5}.risk-acceptance-grid input,.risk-acceptance-grid textarea,.risk-acceptance-grid select{width:100%;min-width:0;padding:8px 11px;border:var(--border-hair) solid var(--line-strong);border-radius:var(--legacy-radius-sm);color:var(--text);background:var(--surface-inset);font:inherit;font-size:var(--type-body-size)}.risk-acceptance-grid textarea{min-height:96px;resize:vertical}.risk-acceptance-confirm{display:flex;align-items:start;gap:10px;font-size:var(--type-body-size);line-height:1.5}.risk-acceptance-confirm input{flex:0 0 auto;margin-top:5px}.risk-acceptance-actions{display:flex;flex-wrap:wrap;gap:10px}.risk-acceptance-history details{padding:12px 0;border-top:var(--border-hair) solid var(--line)}.risk-acceptance-history summary{cursor:pointer;font-size:var(--type-body-size)}.risk-acceptance-history dl{display:grid;gap:12px}.risk-acceptance-history dt{font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.risk-acceptance-history dd{margin:4px 0 0;white-space:pre-wrap;font-size:var(--type-body-size);overflow-wrap:anywhere}.dialog-window.risk-acceptance-review-dialog{width:min(720px,100%)}.risk-acceptance-review{display:grid;gap:var(--space-5)}.risk-acceptance-review-intro{padding-left:var(--space-4);border-left:var(--bw-emphasis) solid var(--marking-color)}.risk-acceptance-review-intro strong{display:block;color:var(--heading);font-size:var(--type-h3-size);font-weight:var(--fw-semibold)}.risk-acceptance-review-intro p{margin:var(--space-1) 0 0;color:var(--muted);font-size:var(--type-body-size)}.risk-acceptance-review-meta,.risk-acceptance-review-group dl{display:grid;gap:0;margin:0}.risk-acceptance-review-meta>div,.risk-acceptance-review-group dl>div{display:grid;grid-template-columns:minmax(150px,.35fr) minmax(0,1fr);gap:var(--space-4);padding:var(--space-2) 0;border-bottom:var(--border-hair) solid var(--line)}.risk-acceptance-review dt{color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.risk-acceptance-review dd{min-width:0;margin:0;color:var(--text);font-size:var(--type-table-body-size);line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.risk-acceptance-review-group h3{margin:0;padding-bottom:var(--space-2);border-bottom:var(--border-hair) solid var(--line-strong);color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-semibold)}.risk-acceptance-review-confirmation{margin:0;padding-left:var(--space-3);border-left:var(--bw-emphasis) solid var(--success);color:var(--text);font-size:var(--type-body-size);line-height:1.5}.risk-acceptance-review-actions{display:flex;gap:var(--space-3);justify-content:flex-end}@media(max-width:620px){.accepted-risk-trigger{grid-column:2;grid-row:2;justify-self:start}.risk-acceptance-grid{grid-template-columns:minmax(0,1fr)}}.bookmark-label{color:var(--text);font-size:var(--ui-control-size);font-weight:var(--ui-label-weight)}.results-detail-btn{min-width:136px}.dashboard-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:28px auto 24px}.dashboard-grid label,.review-grid>label{display:grid;gap:7px;color:var(--heading);font-size:var(--ui-value-size);font-weight:var(--fw-semibold);letter-spacing:0;text-transform:none}.dashboard-grid input,.dashboard-grid select,.review-grid textarea{width:100%;min-height:39px;padding:8px 11px;border:var(--border-hair) solid var(--line-strong);border-radius:var(--legacy-radius-sm);color:var(--text);background-color:var(--surface-inset);text-transform:none}.reader-summary,.review-grid,.all-fields{margin-top:14px;padding:20px 0;border:0;border-bottom:1px solid var(--line);background:transparent}.reader-summary h3{margin-bottom:var(--legacy-space-5);color:var(--heading);font-size:var(--type-h3-size);text-transform:none}.reader-summary h4{margin:0 0 7px;color:var(--heading);font-size:var(--ui-reading-size);text-transform:uppercase}.reader-summary>div{padding:0 0 15px;margin:0 0 15px;border-bottom:1px solid var(--line)}.reader-summary>div:last-child{margin-bottom:0}.reader-summary>.policy-value-comparison{display:grid;gap:var(--legacy-space-2);padding:0;border:0}.policy-value-block{min-width:0;padding:var(--legacy-space-3) var(--legacy-space-4);border-left:4px solid var(--line-strong);background:var(--panel-soft)}.policy-value-comparison[data-outcome=fail] .policy-value-block[data-value=configured]{border-left-color:var(--critical);background:color-mix(in srgb,var(--critical) 8%,transparent)}.policy-value-comparison[data-outcome=pass] .policy-value-block[data-value=configured],.policy-value-block[data-value=expected],.reader-summary>.reader-remediation{border-left-color:var(--success);background:color-mix(in srgb,var(--success) 8%,transparent)}.reader-summary>.reader-remediation{padding:var(--legacy-space-3) var(--legacy-space-4);border-left-width:4px;border-left-style:solid;border-bottom:0}.policy-value-block h4{margin-bottom:var(--legacy-space-2);text-transform:none}.policy-value-comparison[data-outcome=historical] .policy-value-block{border-left-color:var(--line-strong);background:var(--panel-soft)}.policy-evaluation-warning{border-left:var(--bw-emphasis) solid var(--warning);padding:var(--tile-inset)}.policy-evaluation-warning p{margin:0;font-size:var(--type-body-size)}.policy-evaluation-warning h4{text-transform:none}.policy-value-block .rich-text-value,.policy-guidance-text{white-space:pre-wrap;overflow-wrap:anywhere}.policy-guidance-text .policy-value-emphasis{font-weight:var(--fw-bold)}.policy-source-evidence{display:grid;gap:var(--space-3);min-width:0}.policy-source-evidence h4{margin:0;font-size:var(--type-h4-size);font-weight:var(--fw-semibold);text-transform:none;overflow-wrap:anywhere}.policy-source-evidence p{margin:0}.policy-source-notice{font-size:var(--type-body-size);line-height:1.5}.policy-source-groups{min-width:0;border-top:var(--border-hair) solid var(--line-strong)}.policy-source-group{display:grid;gap:var(--space-2);min-width:0;padding:var(--space-4) var(--space-3);border-bottom:var(--border-hair) solid var(--line-strong);background:transparent}.policy-source-group__header{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}.policy-source-group h5{min-width:0;margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-semibold);line-height:1.4;overflow-wrap:anywhere}.policy-source-group__badge{width:fit-content;padding:3px var(--space-2);font-size:var(--type-badge-size);font-weight:var(--fw-semibold)}.policy-source-group__badge.is-review{border:var(--border-hair) solid color-mix(in srgb,var(--warning) 45%,var(--line));color:var(--text);background:color-mix(in srgb,var(--warning) 10%,var(--tile-surface))}.policy-source-group__backup{color:var(--muted);font-size:var(--type-meta-size);overflow-wrap:anywhere}.policy-source-observation{display:grid;gap:var(--space-2);min-width:0}.policy-source-observation hr{width:100%;margin:var(--space-2) 0;border:0;border-top:var(--border-hair) solid var(--line-strong)}.policy-source-reference{width:fit-content;max-width:100%;padding:8px var(--space-2);border:var(--border-hair) solid var(--line);background:var(--tile-surface);font-size:var(--type-table-body-size);overflow-wrap:anywhere}.policy-source-sequence{color:var(--muted);font-size:var(--type-meta-size)}.policy-source-value{font-size:var(--type-body-size);line-height:1.55}.policy-source-deviation-value{display:inline-block;width:fit-content;padding:1px 5px;border-left:var(--bw-emphasis) solid var(--critical);background:color-mix(in srgb,var(--critical) 14%,transparent)}.rich-text-table.result-evidence-table td{white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--type-table-body-size)}.result-evidence-table td.result-evidence-difference{border-left:3px solid var(--warning);background:color-mix(in srgb,var(--warning) 8%,transparent);font-weight:var(--ui-strong-weight)}.variant-comparison{display:grid;gap:var(--space-5);min-width:0}.variant-comparison__header{display:grid;gap:var(--space-1)}.variant-comparison__eyebrow{margin:0;color:var(--warning);font-size:var(--type-label-size);font-weight:var(--fw-semibold);text-transform:uppercase}.variant-comparison__header h3{margin:0;color:var(--heading);font-size:var(--type-detail-title-size);font-weight:var(--fw-semibold);line-height:1.35;overflow-wrap:anywhere}.variant-comparison__scope{margin:0;color:var(--muted);font-size:var(--type-meta-size)}.variant-comparison__notice{padding:var(--space-4);border-left:4px solid var(--warning);background:color-mix(in srgb,var(--warning) 8%,transparent)}.variant-comparison__notice.is-duplicate{border-left-color:var(--info);background:color-mix(in srgb,var(--info) 8%,transparent)}.variant-comparison__notice strong{display:block;margin-bottom:var(--space-1);color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-semibold)}.variant-comparison__notice p{margin:0;color:var(--text);font-size:var(--type-body-size);line-height:1.55}.variant-comparison__notice p+p{margin-top:var(--space-1);color:var(--muted)}.variant-comparison__setting h4,.variant-comparison__variants h4{margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-semibold)}.variant-comparison dt{color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.variant-comparison__value{min-width:0}.variant-comparison__value>.technical-path{font-size:var(--type-table-body-size)}.variant-comparison__literal{width:fit-content;max-width:100%;padding:var(--space-2);color:var(--text);background:var(--surface-inset);font-family:var(--font-path);font-size:var(--type-body-size);white-space:pre-wrap;overflow-wrap:anywhere}.variant-comparison__value-note{color:var(--muted);font-size:var(--type-meta-size)}.variant-comparison__setting dl>div,.variant-comparison__technical dl>div{display:grid;grid-template-columns:minmax(112px,.2fr) minmax(0,1fr);gap:var(--space-3);align-items:start}.variant-comparison dd{min-width:0;margin:0;color:var(--text);font-size:var(--type-table-body-size);overflow-wrap:anywhere}.variant-comparison__sources,.variant-comparison__technical{min-width:0;color:var(--text)}.variant-comparison__sources{display:grid;gap:var(--space-2)}.variant-comparison__sources>.technical-path{display:block;width:100%;box-sizing:border-box}.variant-comparison__technical>summary{width:fit-content;cursor:pointer;color:var(--heading);font-size:var(--type-button-size);font-weight:var(--fw-semibold)}.variant-comparison__setting{display:grid;gap:var(--space-3);min-width:0}.variant-comparison__setting dl{display:grid;gap:var(--space-2);margin:0}.variant-comparison__variants{display:grid;gap:var(--space-3);min-width:0}.variant-comparison__variants>p{margin:0;color:var(--muted);font-size:var(--type-body-size);line-height:1.55}.variant-comparison__table-wrap{min-width:0;width:100%;overflow-x:auto}.variant-comparison__table{width:100%;min-width:680px;border-collapse:collapse;table-layout:auto;color:var(--text);background:var(--tile-surface)}.variant-comparison__table th,.variant-comparison__table td{padding:var(--space-3);border-bottom:var(--border-hair) solid var(--line);text-align:left;vertical-align:top;font-size:var(--type-table-body-size);line-height:1.5;white-space:normal;overflow-wrap:anywhere}.variant-comparison__table thead th{color:var(--muted);background:var(--surface-inset);font-size:var(--type-table-head-size);font-weight:var(--fw-semibold);text-transform:uppercase}.variant-comparison__table tbody th{width:112px;border-left:3px solid var(--warning);color:var(--heading);font-weight:var(--fw-semibold)}.variant-comparison.is-duplicate .variant-comparison__table tbody td:first-child{min-width:220px;border-left:3px solid var(--info)}.variant-comparison.is-duplicate .variant-comparison__table tbody td:nth-child(2){min-width:150px}.variant-comparison.is-duplicate .variant-comparison__table tbody td:nth-child(3){min-width:140px}.variant-comparison__table td:nth-child(2){min-width:220px}.variant-comparison__table td:nth-child(3){min-width:150px}.variant-comparison__table td:nth-child(4){min-width:140px}.variant-comparison__table .variant-comparison__sources{margin-top:var(--space-2)}.variant-comparison__technical-list{display:grid;gap:var(--space-4);margin-top:var(--space-4)}.variant-comparison__technical section{min-width:0;padding-top:var(--space-3);border-top:var(--border-hair) solid var(--line)}.variant-comparison__technical h5{margin:0 0 var(--space-2);color:var(--heading);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.variant-comparison__technical dl{display:grid;gap:var(--space-2);margin:0}.finding-optional-detail{margin-top:2px;padding:12px 14px;border:var(--border-hair) solid var(--line);background:var(--panel);min-width:0;max-width:100%;box-sizing:border-box;overflow:hidden}.finding-optional-detail>summary{cursor:pointer;color:var(--heading);font-size:var(--ui-reading-size);font-weight:var(--ui-strong-weight)}.finding-optional-detail[open]>summary{margin-bottom:10px}.finding-optional-detail>.rich-text-value{min-width:0;max-width:100%;overflow-wrap:anywhere;word-break:normal;white-space:pre-wrap}.reader-summary p{margin:0;color:var(--text);font-size:var(--ui-reading-size);line-height:1.55;white-space:pre-wrap}.review-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;padding:20px;border:1px solid var(--line);background:var(--panel)}.review-grid textarea{min-height:96px;resize:vertical}.review-markers{display:flex;flex-wrap:wrap;gap:10px 18px;grid-column:1 / -1;margin:0;padding:12px;border:1px solid var(--line)}.review-markers label{color:var(--text);font-size:var(--ui-control-size)}.all-fields{padding-inline:18px;border:1px solid var(--line);background:var(--panel)}.all-fields summary{cursor:pointer;color:var(--heading);font-weight:var(--ui-strong-weight)}.all-fields table{margin-top:12px}.all-fields th{position:static;width:220px}.linked-results-inline{margin-top:18px}.linked-results{display:grid;gap:20px;min-width:0}.linked-results-heading{margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--ui-strong-weight);line-height:1.35}.linked-results-empty{padding:18px;border-left:3px solid var(--warning);background:color-mix(in srgb,var(--warning) 12%,transparent);line-height:1.55}.result-block{min-width:0;padding:0;border:0;background:transparent;line-height:1.55}.result-block__title{margin:0 0 10px;color:var(--heading);font-size:var(--ui-heading-size);font-weight:var(--ui-strong-weight);line-height:1.35}.result-block__subtitle{margin:0 0 10px;color:var(--heading);font-size:var(--ui-body-size);font-weight:var(--ui-strong-weight);line-height:1.4}.result-block__preamble{margin:0 0 10px;color:var(--text);font-size:var(--ui-reading-size);line-height:1.55}.maester-error{display:grid;gap:var(--space-4);min-width:0}.maester-error__summary{margin:0;padding:var(--space-4);border-left:var(--bw-emphasis) solid var(--critical);color:var(--heading);background:color-mix(in srgb,var(--critical) 8%,transparent);font-size:var(--type-body-size);line-height:1.55}.maester-error__facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 var(--space-5);margin:0}.maester-error__facts>div{display:grid;grid-template-columns:minmax(110px,.35fr) minmax(0,1fr);gap:var(--space-3);padding:var(--space-2) 0;border-bottom:var(--border-hair) solid var(--line)}.maester-error__facts dt{color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.maester-error__facts dd{min-width:0;margin:0;color:var(--text);font-size:var(--type-table-body-size);line-height:1.45;overflow-wrap:anywhere}.maester-error__raw{min-width:0;color:var(--muted);font-size:var(--type-button-size)}.maester-error__raw summary{width:fit-content;cursor:pointer;color:var(--heading);font-weight:var(--fw-semibold)}.maester-error__raw pre{max-width:100%;margin:var(--space-3) 0 0;padding:var(--space-3);border:var(--border-hair) solid var(--line);color:var(--text);background:var(--surface-inset);font-family:inherit;font-size:var(--type-table-body-size);line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.result-block>.rich-text-table-wrap:last-child{margin-bottom:0}@media(max-width:760px){.maester-error__facts{grid-template-columns:minmax(0,1fr)}.variant-comparison__setting dl>div,.variant-comparison__technical dl>div{grid-template-columns:minmax(0,1fr);gap:var(--space-1)}}.results-window{--results-action-width: 84px;--result-edge: var(--marker-width);--cluster-bar-h: 34px;position:fixed;display:grid;grid-template-rows:auto minmax(0,1fr);width:min(1040px,78vw);height:auto;min-width:440px;max-width:100vw;max-height:calc(100vh - 144px);border:var(--border-hair) solid var(--line-strong);border-radius:var(--legacy-radius-sm);color:var(--text);background:var(--bg);overflow:visible}.results-window:not(.is-minimized){box-shadow:var(--shadow-overlay)}.results-window.is-minimized{height:auto;border-top:0;border-left:var(--result-edge) solid var(--result-color);border-radius:0}.results-window.is-minimized.is-dimmed{filter:grayscale(1);opacity:.42}.results-window.is-minimized .results-window-body{display:none}.results-window.is-minimized .results-window-head{min-height:33px;border-radius:0;border-bottom:0}.results-window.is-minimized.is-cluster-bottom,.results-window.is-minimized.is-cluster-bottom .results-window-head{border-radius:0 0 var(--radius-result-cluster) var(--radius-result-cluster)}.results-window.is-minimized .results-window-result-summary{align-self:stretch;min-width:78px;padding-right:10px;border-right:var(--border-hair) solid var(--line)}.results-cluster-bar{position:absolute;top:calc(-1 * var(--cluster-bar-h));left:calc(-1 * var(--result-edge));right:-1px;z-index:100;display:flex;align-items:center;height:var(--cluster-bar-h);border:var(--border-hair) solid var(--line-strong);border-radius:var(--radius-result-cluster) var(--radius-result-cluster) 0 0;color:var(--heading);background:var(--panel-raised);cursor:move;touch-action:none;-webkit-user-select:none;user-select:none}.results-cluster-slot{display:grid;place-items:center;align-self:stretch;flex:0 0 auto;width:34px;padding:0;border:0;border-right:var(--border-hair) solid var(--line);border-radius:0;color:var(--muted);background:transparent}.results-cluster-slot:hover{color:var(--legacy-accent);background:var(--panel-hover)}.results-cluster-total{display:grid;place-items:center;min-width:58px;height:22px;margin-left:10px;padding:0 8px;border:var(--border-hair) solid var(--line-strong);border-radius:var(--legacy-radius-sm);color:var(--heading);background:var(--surface-inset);font-family:var(--font-mono);font-size:var(--ui-label-size);font-variant-numeric:tabular-nums}.results-cluster-bar-actions{display:flex;align-items:center;gap:6px;margin-left:auto;padding-right:8px}.result-dock-slot{display:flex;align-items:center;flex:0 0 auto}.result-dock{display:flex;align-items:center;gap:8px}.result-dock-toggle{display:grid;place-items:center;width:var(--control-height);height:var(--control-height);padding:0;border:var(--border-hair) solid var(--line-strong);border-radius:var(--radius-result-cluster);color:var(--heading);background:var(--panel-raised)}.result-dock-toggle:hover{color:var(--legacy-accent);border-color:var(--legacy-accent);background:var(--panel-hover)}.result-dock-count{display:grid;place-items:center;min-width:58px;height:var(--control-height);padding:0 8px;border:var(--border-hair) solid var(--line-strong);border-radius:var(--legacy-radius-sm);color:var(--heading);background:var(--surface-inset);font-family:var(--font-mono);font-size:var(--ui-label-size);font-variant-numeric:tabular-nums}.result-dock-marks{display:flex;align-items:center;gap:2px;min-width:0;overflow:hidden}.result-dock-mark{display:grid;place-items:center;width:22px;height:22px;flex:0 0 auto;padding:0;border:0;border-radius:var(--legacy-radius-sm);color:var(--result-color);background:transparent}.result-dock-mark:hover{background:var(--panel-hover)}.result-dock-mark .triangle-icon{width:14px;height:14px}.results-cluster-bookmark,.results-cluster-close,.results-window-bookmark{display:grid;place-items:center;width:22px;height:22px;padding:0;border:0;border-radius:var(--legacy-radius-sm);color:var(--muted);background:transparent}.results-cluster-bookmark:hover,.results-cluster-close:hover,.results-window-bookmark:hover{color:var(--heading);background:var(--panel-hover)}.results-cluster-bookmark.is-bookmarked,.results-window-bookmark.is-bookmarked{color:var(--state-bookmark)}.results-window-resize{position:absolute;z-index:5}.results-window-resize-n,.results-window-resize-s{left:10px;right:10px;height:5px;cursor:ns-resize}.results-window-resize-n{top:0}.results-window-resize-s{bottom:0}.results-window-resize-e,.results-window-resize-w{top:10px;bottom:10px;width:5px;cursor:ew-resize}.results-window-resize-e{right:0}.results-window-resize-w{left:0}.results-window-resize-ne,.results-window-resize-nw,.results-window-resize-se,.results-window-resize-sw{width:12px;height:12px}.results-window-resize-ne{top:0;right:0;cursor:nesw-resize}.results-window-resize-nw{top:0;left:0;cursor:nwse-resize}.results-window-resize-se{bottom:0;right:0;cursor:nwse-resize}.results-window-resize-sw{bottom:0;left:0;cursor:nesw-resize}.results-window-head{display:flex;align-items:stretch;justify-content:space-between;gap:0;min-height:32px;min-width:0;padding:0 8px 0 0;color:var(--heading);background:var(--panel-soft);border-bottom:1px solid var(--line);cursor:move;touch-action:none;-webkit-user-select:none;user-select:none}.results-window-head h2{display:flex;align-items:stretch;gap:10px;min-width:0;margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--ui-strong-weight);line-height:1.35}.results-window-result-summary{display:inline-flex;align-items:center;align-self:center;flex:0 0 auto;gap:5px;padding-left:8px;color:var(--heading);font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:nowrap}.results-window-toggle,.results-window-toggle-icon{display:grid;place-items:center;width:20px;height:20px;flex:0 0 auto;color:var(--result-color)}.results-window-toggle{padding:0;border:0;border-radius:3px;background:transparent}.results-window-toggle:hover{color:var(--result-color);background:var(--panel-hover)}.results-window-toggle .triangle-icon,.results-window-toggle-icon .triangle-icon{width:16px;height:16px}.results-window-name{display:flex;align-items:center;min-width:0;padding:5px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.results-window-actions{display:flex;align-items:center;flex:0 0 auto;gap:6px;padding:0 0 0 8px}.results-window-action{align-self:center;min-width:var(--results-action-width)}.results-window-close{align-self:center;display:grid;place-items:center;width:22px;height:22px;padding:0;border:0;border-radius:3px;color:var(--muted);background:transparent}.results-window-close:hover{color:var(--heading);background:var(--panel-hover)}.results-window-body{min-height:0;padding:var(--panel-inset);overflow:auto;font-size:var(--ui-reading-size);line-height:1.45}@media(max-width:980px){.dashboard-grid,.review-grid{grid-template-columns:1fr 1fr}.finding-reader>*{width:calc(100% - 36px)}}@media(max-width:620px){.dashboard-grid,.review-grid{grid-template-columns:1fr}.reader-heading{grid-template-columns:auto minmax(0,1fr)}.reader-heading-actions{grid-column:1 / -1}.results-window:not(.is-maximized){left:8px!important;top:8px!important;width:calc(100vw - 16px);height:auto;max-height:min(78vh,680px);min-width:0}}@media(prefers-reduced-motion:reduce){.finding-card{transition:none}.finding-card:hover{transform:none}}.rich-text-value>:first-child{margin-top:0}.rich-text-value>:last-child{margin-bottom:0}.rich-text-value p{margin:0 0 14px}.rich-text-value ul,.rich-text-value ol{margin:8px 0 14px;padding-left:24px}.rich-text-value a{color:var(--heading);text-decoration:underline;text-underline-offset:2px}.rich-text-value li{margin:0 0 4px}.inline-results-link{display:inline;padding:0;margin:0;border:none;background:transparent;color:var(--heading);font-size:inherit;font-family:inherit;font-weight:var(--ui-strong-weight);text-decoration:underline;text-underline-offset:2px;cursor:pointer}.inline-results-link:hover{color:var(--legacy-accent)}.inline-results-link-disabled{text-decoration:underline;text-underline-offset:2px;opacity:.85}.rich-text-value h5,.rich-text-value h6{margin:16px 0 6px;color:var(--heading);font-size:var(--ui-body-size);font-weight:var(--ui-strong-weight)}.rich-text-value h6{color:var(--muted);font-size:var(--ui-control-size);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.rich-text-value code{padding:1px 4px;border-radius:var(--legacy-radius-sm);background:var(--surface-inset);font-family:var(--font-mono, monospace);font-size:var(--ui-control-size)}.technical-path,.rich-text-value code.technical-path{display:inline-block;vertical-align:top;max-width:100%;min-width:0;padding:var(--space-1) var(--space-2);border:var(--border-hair) solid var(--line);border-radius:0;background:var(--surface-inset);color:var(--text);font-family:var(--font-path);font-size:inherit;font-weight:var(--fw-regular);line-height:inherit;white-space:pre-wrap;overflow-wrap:anywhere;word-break:normal;text-transform:none}.rich-text-code{margin:8px 0 14px;padding:var(--legacy-space-3);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);background:var(--surface-inset);font-family:var(--font-mono, monospace);font-size:var(--ui-control-size);white-space:pre-wrap;overflow-wrap:anywhere;word-break:normal;word-wrap:break-word;width:100%;max-width:100%;box-sizing:border-box}.rich-text-table-wrap{margin:8px 0 14px;overflow-x:auto}.rich-text-table-wrap,.results-window-body{scrollbar-width:thin;scrollbar-color:var(--line-strong) var(--surface-inset)}.rich-text-table-wrap::-webkit-scrollbar,.results-window-body::-webkit-scrollbar{width:11px;height:11px}.rich-text-table-wrap::-webkit-scrollbar-track,.results-window-body::-webkit-scrollbar-track{background:var(--surface-inset)}.rich-text-table-wrap::-webkit-scrollbar-thumb,.results-window-body::-webkit-scrollbar-thumb{border:var(--border-hair) solid var(--surface-inset);border-radius:var(--legacy-radius-sm);background:var(--line-strong)}.rich-text-table-wrap::-webkit-scrollbar-thumb:hover,.results-window-body::-webkit-scrollbar-thumb:hover{background:var(--muted)}.rich-text-table-wrap::-webkit-scrollbar-corner,.results-window-body::-webkit-scrollbar-corner{background:var(--surface-inset)}.rich-text-table{border-collapse:collapse;width:auto;min-width:100%}.rich-text-table th,.rich-text-table td{padding:4px var(--legacy-space-3);border:var(--border-hair) solid var(--line);text-align:left;vertical-align:top;font-size:var(--ui-control-size)}.rich-text-table th{position:static;color:var(--heading);background:var(--surface-panel-raised);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase;white-space:nowrap}.rich-text-table.is-column-resizable th{position:relative}.rich-text-table.is-column-resizable.has-custom-column-widths{min-width:0}.results-window.is-maximized .rich-text-table.is-column-resizable:not(.has-custom-column-widths){width:max-content;min-width:max-content;table-layout:auto}.results-window.is-maximized .rich-text-table.is-column-resizable:not(.has-custom-column-widths) th,.results-window.is-maximized .rich-text-table.is-column-resizable:not(.has-custom-column-widths) td{white-space:nowrap}.result-column-resizer{position:absolute;z-index:2;top:0;right:-5px;bottom:0;width:10px;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.result-column-resizer:after{position:absolute;top:0;right:4px;bottom:0;width:var(--border-hair);background:transparent;content:""}.result-column-resizer:hover:after,.result-column-resizer:focus-visible:after{background:var(--focus-ring)}.result-column-instructions{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-text-table tr.rich-text-table-row--highlight td{background:var(--evidence-highlight-bg);color:var(--evidence-highlight-text);font-weight:var(--ui-strong-weight)}.rich-text-table tr.rich-text-table-row--criterion td{background:var(--criterion-highlight-bg);color:var(--criterion-highlight-text);font-weight:var(--ui-strong-weight)}.rich-text-table tr.rich-text-table-row--violation td{background:var(--violation-highlight-bg);color:var(--violation-highlight-text);font-weight:var(--ui-strong-weight)}.donut-metric-rack{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--segment-gap);padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface);box-shadow:none}.donut-metric-card{position:relative;display:grid;grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:var(--donut-card-min-h);padding:var(--space-5) var(--space-3) var(--space-2);overflow:hidden;border:var(--border-hair) solid var(--tile-border);border-radius:var(--tile-radius);color:var(--donut-all);background:var(--tile-surface);box-shadow:var(--tile-card-shadow)}.donut-metric-card__title{min-width:0;margin:0;overflow:hidden;color:var(--donut-label);font:var(--fw-regular) var(--donut-title-size) / 1.15 var(--font-donut-display);text-align:left;text-overflow:ellipsis;white-space:nowrap}.donut-metric-card__plot{position:relative;align-self:end;justify-self:center;width:min(100%,var(--donut-ring-size));aspect-ratio:1}.donut-metric-card__plot svg{display:block;width:100%;height:100%;overflow:visible;transform:rotate(-90deg)}.donut-metric-card__plot circle{fill:none;stroke-width:var(--donut-ring-stroke)}.donut-metric-card__track{stroke:var(--donut-track)}.donut-metric-card__progress{stroke:currentColor;animation:donut-progress-build var(--dur-data-build) var(--ease-data-build) both}@keyframes donut-progress-build{0%{stroke-dasharray:0 100}to{stroke-dasharray:var(--donut-progress-dash)}}.donut-metric-card__values{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:var(--font-donut-display);font-variant-numeric:tabular-nums;line-height:1}.donut-metric-card__primary{position:relative;display:block}.donut-metric-card__primary strong{color:var(--donut-value);font-size:var(--donut-value-size);font-weight:var(--fw-semibold)}.donut-metric-card__primary span{position:absolute;left:calc(100% + var(--space-1));bottom:0;color:var(--donut-value);font-size:var(--donut-percent-size);font-weight:var(--fw-semibold)}.donut-metric-card__primary.is-compact strong{font-size:calc(var(--donut-value-size) * .85)}.donut-metric-card__primary.is-compact span{font-size:var(--type-meta-size)}.donut-metric-card__values>small{margin-top:var(--space-2);color:var(--donut-label);font-size:var(--type-meta-size);font-weight:var(--fw-regular)}.donut-metric-card--all{color:var(--donut-all)}.donut-metric-card--deviation{color:var(--donut-deviation)}.donut-metric-card--passed{color:var(--donut-passed)}.donut-metric-card--not-applicable{color:var(--donut-not-applicable)}.donut-metric-card--not-run{color:var(--donut-not-run)}.donut-metric-card--error{color:var(--donut-error)}.donut-metric-card--critical{color:var(--critical)}.donut-metric-card--high{color:var(--high)}.donut-metric-card--medium{color:var(--medium)}.donut-metric-card--low{color:var(--low)}.donut-metric-card--info{color:var(--info)}.sidebar-severity-rack{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--segment-gap);flex:1 1 auto;min-height:0;margin:0 var(--space-3) var(--space-2);padding:var(--segment-inset);overflow-y:auto;border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface);box-shadow:none;scrollbar-color:var(--border-strong) var(--segment-surface);scrollbar-width:thin}.sidebar-severity-card{min-height:calc(var(--donut-ring-size) + var(--space-2));padding:var(--space-3) var(--space-2) var(--space-2);cursor:pointer}.sidebar-severity-card .donut-metric-card__title{font-size:var(--fs-sm)}.sidebar-severity-card .donut-metric-card__plot{width:calc(var(--donut-ring-size) - var(--space-8))}.sidebar-severity-card .donut-metric-card__primary strong{font-size:var(--donut-compact-value-size)}.sidebar-severity-card .donut-metric-card__primary span{left:calc(100% + var(--donut-compact-unit-gap));font-size:var(--donut-compact-percent-size)}.sidebar-severity-card:hover{border-color:transparent}.sidebar-severity-card[aria-pressed=true]{border-color:currentColor;outline:var(--bw-emphasis) solid currentColor;outline-offset:calc(-1 * var(--bw-emphasis))}@media(prefers-reduced-motion:reduce){.donut-metric-card__progress{animation:none}}@media(max-width:1100px){.donut-metric-rack{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:760px){.donut-metric-rack{grid-template-columns:repeat(2,minmax(0,1fr))}}.backend-connection-dialog__content{display:grid;grid-template-columns:32px minmax(0,1fr);gap:var(--space-4);align-items:start}.backend-connection-dialog__icon{display:grid;place-items:center;width:32px;height:32px;color:var(--state-active-text);background:var(--warning);font-size:var(--type-detail-title-size);font-weight:var(--fw-bold)}.backend-connection-dialog__content p{margin:0;color:var(--text);font-size:var(--type-body-size);line-height:1.5}.backend-connection-dialog__content .backend-connection-dialog__hint{margin-top:var(--space-3);color:var(--muted);font-size:var(--type-meta-size)}.primary-filter-group{display:flex;align-items:center;flex:0 1 auto;flex-wrap:nowrap;gap:6px;min-width:0;padding:0;border:0;border-radius:0;background:transparent}.primary-filter-group .select.dynamic-facet-select{height:28px;border:var(--border-hair) solid var(--line-strong);border-radius:var(--radius-sm);color:var(--text);background-color:var(--surface-input);font-size:var(--ui-label-size);font-weight:var(--fw-medium)}.primary-filter-group .select.dynamic-facet-select option{color:var(--text);background:var(--panel-raised);font-weight:400}.dynamic-facet-select{flex:1 1 0;width:auto;min-width:92px;max-width:200px;height:28px;border-color:var(--line-strong);font-size:var(--ui-label-size)}.search-tools>.dynamic-facet-select.is-source-scan{margin-left:auto}.dynamic-facet-select.is-gpo-backup{flex:0 1 340px;min-width:min(100%,340px);max-width:100%}.primary-filter-group .select.dynamic-facet-select.is-filtered,.select.dynamic-facet-select.is-filtered,.dynamic-range-filter.is-filtered{border-color:var(--state-progress);color:var(--accent-on);background-color:var(--state-progress);font-weight:var(--ui-strong-weight)}.dynamic-range-filter.is-filtered .input{color:var(--text);background:var(--surface-inset)}.search-input.is-filtered{border-color:var(--state-progress);color:var(--accent-on);background:var(--state-progress);font-weight:var(--ui-strong-weight)}.search-input.is-filtered+.search-clear-btn{border-left-color:color-mix(in srgb,var(--accent-on) 45%,transparent);color:var(--accent-on)}.search-input.is-filtered+.search-clear-btn:hover:not(:disabled){color:var(--accent-on);background:color-mix(in srgb,var(--accent-on) 14%,transparent)}.search-tools .btn.standard-filter-btn,.search-tools .btn.standard-filter-btn:hover{height:24px;padding:2px 8px;border:1px solid var(--button-border);border-radius:0;color:var(--button-marked-text);background:var(--button-marked-bg);font-weight:600}.dynamic-range-filter{display:grid;grid-template-columns:auto 108px 108px;align-items:center;gap:var(--legacy-space-1);flex:0 0 auto;min-height:var(--control-height);padding:2px var(--legacy-space-2);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);color:var(--muted);background:var(--panel);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);white-space:nowrap}.dynamic-range-filter input{width:108px;min-width:0;height:22px;padding:2px var(--legacy-space-1);font-size:var(--ui-label-size)}.import-quality{font-weight:var(--ui-label-weight)}.import-quality-success{color:var(--success)}.import-quality-warning{color:var(--warning)}.import-quality-error{color:var(--danger)}.import-quality-neutral{color:var(--muted)}.view-bookmark-bar{display:flex;align-items:center;gap:var(--space-2);flex:1 1 auto;min-width:0}.view-bookmark-create{flex:0 0 auto;height:var(--btn-h);font-size:var(--ui-label-size)}.view-bookmark-list{display:flex;align-items:center;gap:var(--space-2);flex:1 1 auto;min-width:0;overflow:visible}.view-bookmark-item{display:inline-flex;align-items:stretch;flex:0 0 auto;width:auto;height:var(--btn-h);min-width:0}.view-bookmark-entry{display:block;flex:0 0 auto;width:auto;min-width:0;height:var(--btn-h);border-color:var(--band-border);border-right:0;font-size:var(--ui-label-size);white-space:nowrap}.view-bookmark-item.is-path{outline:2px solid var(--graph-alert);outline-offset:-2px}.view-bookmark-remove{flex:0 0 22px;width:22px;height:var(--btn-h);padding:0;border:1px solid var(--band-border);border-radius:0;color:var(--button-text);background:var(--button-bg);cursor:pointer}.view-bookmark-remove:hover{background:var(--button-bg-hover)}.view-bookmark-dialog-backdrop{position:fixed;inset:0;z-index:1000;display:grid;place-items:center;padding:var(--space-4);background:var(--surface-scrim)}.view-bookmark-dialog{display:grid;gap:var(--space-3);width:min(340px,100%);padding:var(--space-4);border:var(--bw-hairline) solid var(--border-strong);border-radius:var(--radius-md);color:var(--text-primary);background:var(--surface-overlay);box-shadow:var(--shadow-popover)}.view-bookmark-dialog label{color:var(--text-secondary);font-size:var(--ui-label-size)}.view-bookmark-dialog small{color:var(--danger)}.view-bookmark-dialog footer{display:flex;justify-content:flex-end;gap:var(--space-2)}.datahub-page{width:100%;min-height:100%;padding:var(--panel-inset);color:var(--text);background:var(--surface-app)}.datahub-page>*{width:min(1180px,100%);margin-inline:auto}.datahub-hero{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--legacy-space-6);padding:0 0 var(--legacy-space-5);border-bottom:var(--border-hair) solid var(--line)}.datahub-hero h2{margin:var(--legacy-space-1) 0 var(--legacy-space-2);color:var(--heading);font-size:clamp(17px,2vw,22px);line-height:1.15;letter-spacing:-.01em}.datahub-hero p{max-width:690px;margin:0;color:var(--muted);font-size:var(--ui-body-size);line-height:1.5}.datahub-eyebrow,.datahub-section-heading span{color:var(--muted);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.datahub-hero-actions,.datahub-form-actions{display:flex;gap:var(--legacy-space-2);flex:0 0 auto}.datahub-projects,.datahub-create{margin-top:var(--legacy-space-6)}.datahub-section-heading{display:flex;align-items:end;justify-content:space-between;gap:var(--legacy-space-5);margin-bottom:var(--legacy-space-3)}.datahub-section-heading h3{margin:0;color:var(--heading);font-size:var(--ui-body-size)}.datahub-section-heading>strong{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:22px;padding:1px 6px;border:1px solid var(--border-default);border-radius:0;color:var(--text-primary);background:var(--surface-input);font-size:var(--ui-value-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.datahub-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(0,var(--tile-content-width)));justify-content:start;gap:var(--segment-gap);padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface)}.datahub-card{display:grid;grid-template-columns:40px minmax(0,1fr) auto;align-items:center;gap:var(--legacy-space-3);min-width:0;min-height:96px;padding:var(--legacy-space-4);overflow:hidden;border:var(--border-hair) solid var(--tile-border);border-radius:var(--tile-radius);color:var(--text);background:var(--tile-surface);box-shadow:var(--tile-card-shadow);text-align:left;transition:border-color .12s ease,background .12s ease}.datahub-card:hover{border-color:transparent;background:var(--tile-surface-hover)}.datahub-card-mark{display:grid;place-items:center;width:40px;height:40px;border-radius:var(--legacy-radius-sm);color:var(--text-on-accent);background:var(--legacy-accent);font-size:var(--ui-control-size);font-weight:var(--ui-strong-weight);letter-spacing:.05em}.datahub-card-body{display:grid;gap:var(--legacy-space-1);min-width:0}.datahub-card-body strong{color:var(--heading);font-size:var(--ui-body-size);overflow:hidden;text-overflow:ellipsis}.datahub-card-body>span{color:var(--muted);font-size:var(--ui-control-size);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.datahub-card-body small{color:var(--muted);font-size:var(--ui-small-size)}.datahub-card-arrow{color:var(--muted);font-size:var(--ui-body-size)}.datahub-create{display:grid;grid-template-columns:1fr 1fr auto;align-items:end;gap:var(--legacy-space-3);padding:var(--legacy-space-5);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);background:var(--panel)}.datahub-create .datahub-section-heading{grid-column:1 / -1}.datahub-create label{display:grid;gap:var(--legacy-space-2);color:var(--heading);font-size:var(--ui-control-size);font-weight:var(--ui-label-weight)}.datahub-create label small{color:var(--muted);font-weight:400}.datahub-alert,.datahub-empty,.datahub-loading{margin-top:var(--legacy-space-6);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);background:var(--panel)}.datahub-empty h3{margin:0 0 var(--legacy-space-2);color:var(--heading)}.datahub-empty p{max-width:650px;color:var(--muted);line-height:1.5}.datahub-alert{display:flex;align-items:center;justify-content:space-between;gap:var(--legacy-space-3);padding:var(--legacy-space-3);border-color:var(--danger);color:var(--danger-text);background:var(--danger-surface)}.datahub-empty{padding:var(--space-7) var(--legacy-space-6);text-align:center}.datahub-empty p{margin-inline:auto}.datahub-loading{display:flex;justify-content:center;gap:var(--legacy-space-3);padding:var(--space-7);color:var(--muted)}.datahub-loading i{width:14px;height:14px;border:2px solid var(--line-strong);border-top-color:var(--legacy-accent);border-radius:50%;animation:datahub-spin .8s linear infinite}@keyframes datahub-spin{to{transform:rotate(360deg)}}@media(max-width:800px){.datahub-page{padding:var(--panel-inset)}.datahub-hero{align-items:flex-start;flex-direction:column}.datahub-create{grid-template-columns:1fr}.datahub-create .datahub-section-heading{grid-column:1}}.btn.danger{border:1px solid var(--button-border);border-radius:var(--btn-radius);color:var(--button-text);background:var(--button-bg)}.btn.danger:hover{border-color:var(--button-border);color:var(--sev-on);background:var(--sev-critical)}.datahub-card{display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;min-height:132px;padding:var(--legacy-space-4)}.datahub-card-main{display:grid;grid-template-columns:40px minmax(0,1fr);align-items:center;gap:var(--legacy-space-3)}.datahub-card-actions{display:flex;justify-content:flex-end;gap:var(--legacy-space-2);margin-top:var(--legacy-space-4);padding-top:var(--legacy-space-3);border-top:var(--border-hair) solid var(--line)}.datahub-card-actions .btn{min-width:60px}.tenant-header{display:grid;grid-template-columns:1fr auto;gap:var(--legacy-space-6);padding-bottom:var(--legacy-space-6);border-bottom:var(--border-hair) solid var(--line)}.tenant-back{grid-column:1 / -1;justify-self:start;padding:0;border:0;color:var(--muted);background:transparent;font-size:var(--ui-control-size);font-weight:var(--ui-label-weight)}.tenant-back:hover{color:var(--heading)}.tenant-title{display:flex;align-items:center;gap:var(--legacy-space-4);min-width:0}.tenant-title .datahub-card-mark{width:46px;height:46px;flex:0 0 46px}.tenant-title h2{margin:0 0 var(--legacy-space-1);color:var(--heading);font-size:clamp(17px,2vw,22px);line-height:1.15}.tenant-title p{margin:0;color:var(--muted)}.tenant-actions{display:flex;align-items:center;gap:var(--legacy-space-2)}.tenant-files{margin-top:var(--legacy-space-6)}.tenant-file-table{overflow:hidden;border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);background:var(--panel)}.tenant-file-row{display:grid;grid-template-columns:150px minmax(145px,.9fr) minmax(150px,1.2fr) 72px 85px 145px 78px;align-items:center;gap:var(--legacy-space-3);min-height:48px;padding:var(--legacy-space-2) var(--legacy-space-3);border-top:var(--border-hair) solid var(--line);font-size:var(--ui-control-size)}.tenant-file-row:first-child{border-top:0}.tenant-file-row:not(.tenant-file-head):hover{background:var(--panel-hover)}.tenant-file-head{min-height:var(--row-height);color:var(--muted);background:var(--panel-soft);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.tenant-file-row>span{min-width:0;overflow:hidden;text-overflow:ellipsis}.tenant-file-row b{display:block;color:var(--heading)}.tenant-file-row small{display:block;margin-top:2px;color:var(--muted)}.tenant-file-possible-duplicate{border-left:0}.tenant-duplicate-badge{width:fit-content;padding:1px var(--legacy-space-1);border:var(--border-hair) solid var(--warning);border-radius:var(--legacy-radius-sm);color:var(--warning)!important;background:transparent;font-size:var(--ui-small-size);font-weight:var(--ui-label-weight);letter-spacing:.03em;text-transform:uppercase}.tenant-scan-delete{min-width:64px;padding-inline:8px}.datahub-dialog-form{display:grid;gap:16px}.datahub-dialog-form label{display:grid;gap:7px;color:var(--heading);font-size:var(--ui-label-size);font-weight:var(--fw-semibold)}.datahub-dialog-form label small{color:var(--muted);font-weight:400}.datahub-dialog-form textarea{min-height:100px;resize:vertical}.datahub-dialog-form footer,.datahub-delete-warning footer{display:flex;justify-content:flex-end;gap:8px;margin-top:4px;padding-top:16px;border-top:1px solid var(--line)}.datahub-delete-warning{display:grid;gap:10px}.datahub-delete-warning>strong{color:var(--heading);font-size:var(--ui-heading-size)}.datahub-delete-warning p{color:var(--muted);line-height:1.6}@media(max-width:1050px){.tenant-file-head{display:none}.tenant-file-row{grid-template-columns:1fr 1fr;gap:8px 18px;padding:16px}.tenant-file-row>span:before{content:attr(data-label);display:block;margin-bottom:3px;color:var(--muted);font-size:var(--ui-label-size);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);text-transform:uppercase}}@media(max-width:800px){.tenant-header{grid-template-columns:1fr}.tenant-actions{flex-wrap:wrap}.tenant-file-row{grid-template-columns:1fr}.datahub-card-actions{flex-wrap:wrap}}.datahub-card.active{border-color:var(--tile-selected-border);outline:var(--bw-emphasis) solid var(--tile-selected-border);outline-offset:calc(-1 * var(--bw-emphasis));background:var(--tile-surface-hover)}.tenant-editor-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--legacy-space-5);padding-bottom:var(--legacy-space-6);border-bottom:var(--border-hair) solid var(--line)}.tenant-editor-header .tenant-back{grid-column:1 / -1}.tenant-editor-header h2{margin:var(--legacy-space-1) 0;color:var(--heading);font-size:clamp(17px,2vw,22px);line-height:1.15;letter-spacing:-.01em}.tenant-editor-header p{max-width:680px;margin:0;color:var(--muted);line-height:1.5}.tenant-editor{margin-top:var(--legacy-space-6);padding:var(--legacy-space-5);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);background:var(--panel)}.tenant-editor-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--legacy-space-4)}.tenant-editor-form label{display:grid;grid-template-columns:auto 1fr;gap:var(--legacy-space-2);color:var(--heading);font-size:var(--ui-control-size);font-weight:var(--ui-label-weight)}.tenant-editor-form label>span{justify-self:end;color:var(--muted);font-size:var(--ui-small-size);font-weight:var(--fw-semibold)}.tenant-editor-form .input,.tenant-editor-description{grid-column:1 / -1}.tenant-editor-description textarea{min-height:118px;resize:vertical}.tenant-editor-form footer{display:flex;grid-column:1 / -1;justify-content:flex-end;gap:var(--legacy-space-2);padding-top:var(--legacy-space-4);border-top:var(--border-hair) solid var(--line)}.tenant-import-pending{margin-top:var(--legacy-space-5);padding:var(--legacy-space-5);border:var(--border-hair) dashed var(--line-strong);border-radius:var(--legacy-radius-sm);background:var(--panel)}.tenant-import-pending>span{color:var(--muted);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.tenant-import-pending h3{margin:6px 0;color:var(--heading)}.tenant-import-pending p{margin:0;color:var(--muted);line-height:1.55}.tenant-files-empty{padding-block:36px}@media(max-width:800px){.tenant-editor-header{grid-template-columns:1fr;align-items:start}.tenant-editor-form{grid-template-columns:1fr}.tenant-editor-description,.tenant-editor-form footer{grid-column:1}}.viewer.app-area-data-hub,.viewer.app-area-dashboard,.viewer.app-area-db-structure{overflow-x:hidden;overflow-y:auto;background:var(--surface-app);scrollbar-color:var(--line-strong) var(--surface-app);scrollbar-width:thin}.viewer.app-area-data-hub{scrollbar-gutter:stable}.datahub-page{box-sizing:border-box;min-height:100%;background:var(--surface-app)}.datahub-card{border-radius:var(--tile-radius);box-shadow:var(--tile-card-shadow)}.tenant-editor,.tenant-file-table,.tenant-import-pending{border-radius:var(--legacy-radius-sm);box-shadow:var(--shadow)}.tenant-editor-header{align-items:center}.tenant-editor-header h2{font-weight:var(--ui-strong-weight);letter-spacing:-.01em}.tenant-editor{padding:var(--legacy-space-5)}.tenant-file-table{overflow-x:auto;overflow-y:visible}.tenant-file-row{min-width:860px;min-height:54px}.tenant-save-feedback{display:flex;align-items:center;gap:var(--legacy-space-3);margin-top:var(--legacy-space-3);padding:var(--legacy-space-2) var(--legacy-space-3);border:var(--border-hair) solid var(--line);border-left-width:3px;border-radius:var(--legacy-radius-sm);background:var(--panel);font-size:var(--ui-body-size)}.tenant-save-feedback>span{display:grid;place-items:center;width:18px;height:18px;color:var(--text-on-accent);border-radius:50%;font-weight:var(--ui-strong-weight)}.tenant-save-feedback.success{border-left-color:var(--success);color:var(--heading)}.tenant-save-feedback.success>span{background:var(--success)}.tenant-save-feedback.error{border-left-color:var(--danger);color:var(--heading)}.tenant-save-feedback.error>span{background:var(--danger)}@media(max-width:1050px){.tenant-file-row{min-width:0}}.tenant-actions{flex-wrap:wrap}.gpo-folder-import{display:contents}.gpo-folder-actions{position:relative;display:flex;align-items:center;gap:8px}.gpo-folder-feedback{position:absolute;z-index:5;top:calc(100% + var(--legacy-space-2));right:0;width:min(420px,75vw);padding:var(--legacy-space-2) var(--legacy-space-3);border:var(--border-hair) solid var(--line-strong);border-left-width:3px;border-radius:var(--legacy-radius-sm);color:var(--heading);background:var(--panel-raised);font-size:var(--ui-control-size);line-height:1.45;box-shadow:var(--shadow)}.gpo-folder-feedback.success{border-left-color:var(--success)}.gpo-folder-feedback.error{border-left-color:var(--danger)}.gpo-status-panel{order:10;flex:1 0 100%;min-width:0;margin-top:var(--legacy-space-3);padding:var(--legacy-space-3);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);background:var(--panel)}.gpo-status-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--legacy-space-3);margin-bottom:var(--legacy-space-2);color:var(--heading)}.gpo-status-empty{margin:0;color:var(--muted);font-size:var(--ui-body-size)}.gpo-status-list{display:grid;gap:var(--legacy-space-2)}.gpo-status-item{display:grid;grid-template-columns:minmax(220px,1fr) minmax(260px,auto);gap:var(--legacy-space-4);padding:var(--legacy-space-2) var(--legacy-space-3);border:var(--border-hair) solid var(--line);border-left:3px solid var(--legacy-accent);background:var(--panel-raised)}.gpo-status-item>div{display:grid;gap:var(--legacy-space-1);min-width:0}.gpo-status-item strong{color:var(--heading);overflow-wrap:anywhere}.gpo-status-item span{color:var(--muted);font-size:var(--ui-control-size)}.gpo-status-result{justify-items:end;text-align:right}.gpo-status-item.state-succeeded{border-left-color:var(--success)}.gpo-status-item.state-partial,.gpo-status-item.state-recovery-required,.gpo-status-item.state-upload-required,.gpo-status-item.state-storage-unavailable{border-left-color:var(--warning)}.gpo-status-item.state-dead-letter{border-left-color:var(--danger)}.gpo-status-item code{color:var(--danger-text);font-size:var(--ui-control-size)}.gpo-status-actions{display:flex;justify-content:flex-end;gap:var(--legacy-space-2);margin-top:var(--legacy-space-1)}@media(max-width:760px){.gpo-status-item{grid-template-columns:1fr}.gpo-status-result{justify-items:start;text-align:left}}.gpo-status-error{color:var(--warning);display:flex;flex-wrap:wrap;gap:.35rem;justify-content:flex-end}.gpo-status-error code{color:inherit}.db-structure-page>*,.results-browser-page>*{width:100%!important;max-width:none!important;margin-inline:0!important}.dashboard-page{box-sizing:border-box;display:grid;align-content:start;gap:var(--space-4);width:100%;min-height:100%;padding:var(--panel-inset);color:var(--text);background:var(--surface-app);container-type:inline-size}.dashboard-page.panel-is-loading{grid-template-rows:auto minmax(0,1fr);align-content:stretch}.dashboard-page.panel-is-loading .panel-loading-state{min-height:0}.dashboard-context{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2) var(--space-5);margin:0;padding:0 var(--space-2);color:var(--muted);font-size:var(--ui-label-size)}.dashboard-context strong{color:var(--heading);font-size:var(--ui-body-size)}.dashboard-context .work-timeslot-select{margin-left:auto}.dashboard-status-rack{display:grid;grid-template-columns:290px repeat(3,210px) 250px;justify-content:start;gap:var(--segment-gap);padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface)}.dashboard-status-metric{display:grid;grid-template-columns:98px minmax(0,1fr);align-items:center;gap:var(--space-3);min-width:0;min-height:190px;padding:var(--space-3);overflow:hidden;border:var(--border-hair) solid var(--tile-border);border-radius:var(--tile-radius);color:var(--text);background:var(--tile-surface);box-shadow:var(--tile-card-shadow);text-align:left}button.dashboard-status-metric{cursor:pointer}button.dashboard-status-metric:hover{border-color:transparent;background:var(--tile-surface-hover)}button.dashboard-status-metric:focus-visible{outline:var(--border-hair) solid var(--focus-ring);outline-offset:-1px}button.dashboard-status-metric[aria-pressed=true]{border-color:var(--tile-selected-border);outline:var(--bw-emphasis) solid var(--tile-selected-border);outline-offset:calc(-1 * var(--bw-emphasis))}.dashboard-status-metric-large{grid-template-columns:154px minmax(0,1fr)}.dashboard-status-ring{position:relative;width:98px;height:98px;color:var(--donut-all)}.dashboard-status-metric-large .dashboard-status-ring{width:154px;height:154px}.dashboard-status-ring svg{display:block;width:100%;height:100%;transform:rotate(-90deg)}.dashboard-status-ring circle{fill:none;stroke-width:var(--donut-ring-stroke)}.dashboard-status-ring-track{stroke:var(--donut-track)}.dashboard-status-ring-progress{stroke:currentColor}.dashboard-status-ring>span{position:absolute;inset:0;display:flex;align-items:flex-start;justify-content:center;padding-top:36px;color:var(--heading);font-variant-numeric:tabular-nums}.dashboard-status-metric-large .dashboard-status-ring>span{padding-top:57px}.dashboard-donut-primary{position:relative;display:block;line-height:1}.dashboard-status-ring>span strong{display:block;font:var(--fw-semibold) var(--donut-value-size) / 1 var(--font-donut-display)}.dashboard-status-metric-large .dashboard-status-ring>span strong{font-size:calc(var(--donut-value-size) * 1.45)}.dashboard-status-ring>span small{position:absolute;left:calc(100% + var(--space-1));bottom:0;color:var(--heading);font-size:var(--donut-percent-size);font-weight:var(--fw-semibold)}.dashboard-status-ring .dashboard-donut-primary.is-compact strong,.dashboard-risk-donut .dashboard-donut-primary.is-compact strong{font-size:calc(var(--donut-value-size) * .85)}.dashboard-status-ring .dashboard-donut-primary.is-compact small,.dashboard-risk-donut .dashboard-donut-primary.is-compact small{font-size:var(--type-meta-size)}.dashboard-status-ring-deviation{color:var(--donut-error)}.dashboard-status-ring-passed{color:var(--donut-passed)}.dashboard-status-ring-not-run{color:var(--donut-deviation)}.dashboard-status-copy{display:grid;gap:var(--space-3);min-width:0;max-width:100%;overflow:hidden}.dashboard-status-copy>span{min-width:0;color:var(--heading);font-size:var(--ui-body-size);overflow-wrap:normal;word-break:normal;-webkit-hyphens:manual;hyphens:manual}.dashboard-status-copy>strong{display:grid;gap:var(--space-1);min-width:0;color:var(--heading);font-size:calc(var(--ui-heading-size) * 1.35);font-variant-numeric:tabular-nums;white-space:normal}.dashboard-status-copy>small{display:block;color:var(--muted);font-size:var(--ui-body-size);font-weight:var(--fw-regular);line-height:1.35;overflow-wrap:normal;word-break:normal;-webkit-hyphens:manual;hyphens:manual}.dashboard-status-summary{display:grid;grid-template-columns:minmax(0,1fr) minmax(100px,.8fr);align-items:stretch;min-width:0;min-height:190px;padding:var(--space-4);overflow:hidden;border:var(--border-hair) solid var(--tile-border);border-radius:var(--tile-radius);background:var(--tile-surface);box-shadow:var(--tile-card-shadow)}.dashboard-status-summary-stack{display:grid;align-content:center;padding-right:var(--space-4);border-right:var(--border-hair) solid var(--line-strong)}.dashboard-status-summary-stack button{display:grid;gap:var(--space-2);min-height:64px;padding:var(--space-2);border:0;border-radius:0;color:var(--text);background:transparent;text-align:left;cursor:pointer}.dashboard-status-summary-stack button+button{border-top:var(--border-hair) solid var(--line)}.dashboard-status-summary-stack button:hover{background:var(--panel-hover)}.dashboard-status-summary-stack button:focus-visible{outline:var(--border-hair) solid var(--focus-ring);outline-offset:-1px}.dashboard-status-summary-stack span,.dashboard-ioe-summary span{color:var(--heading);font-size:var(--ui-body-size)}.dashboard-status-summary-stack strong{color:var(--heading);font-size:var(--ui-body-size);font-variant-numeric:tabular-nums}.dashboard-ioe-summary{display:grid;align-content:center;gap:var(--space-4);min-width:0;padding:0 0 0 var(--space-5);border:0;color:inherit;background:transparent;text-align:left;cursor:pointer}.dashboard-ioe-summary:focus-visible{outline:var(--border-hair) solid var(--focus-ring);outline-offset:-1px}.dashboard-ioe-summary:disabled{cursor:default}.dashboard-ioe-summary strong{color:var(--accent);font:var(--fw-semibold) calc(var(--donut-value-size) * 1.45) / 1 var(--font-donut-display);font-variant-numeric:tabular-nums}.dashboard-distribution-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--segment-gap);padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface)}.dashboard-lower-grid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(420px,1fr);align-items:stretch;gap:var(--segment-gap);padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface)}.dashboard-environment{min-width:0;margin:0;padding:var(--space-4);overflow:hidden;border:var(--border-hair) solid var(--tile-border);border-radius:var(--tile-radius);background:var(--tile-surface);box-shadow:var(--tile-card-shadow)}.dashboard-environment .datahub-section-heading h2,.dashboard-block h2{margin:0;color:var(--heading);font-size:var(--ui-body-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.dashboard-coverage-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin-bottom:var(--space-4);padding-bottom:var(--space-4);border-bottom:var(--border-hair) solid var(--line)}.dashboard-coverage-summary>span{display:grid;gap:var(--space-1);min-width:0;padding:0 var(--space-3);text-align:center}.dashboard-coverage-summary>span+span{border-left:var(--border-hair) solid var(--line-strong)}.dashboard-coverage-summary strong{color:var(--heading);font-size:var(--ui-heading-size);font-variant-numeric:tabular-nums}.dashboard-coverage-summary small{color:var(--muted);font-size:var(--ui-label-size)}.dashboard-facts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-3) var(--space-5);margin:0}.dashboard-facts div{min-width:0}.dashboard-facts dt{margin-bottom:var(--legacy-space-1);color:var(--muted);font-size:var(--ui-label-size)}.dashboard-facts dd{margin:0;color:var(--heading);font-size:var(--ui-body-size);overflow-wrap:anywhere}.dashboard-block{min-width:0;padding:var(--space-4);overflow:hidden;border:var(--border-hair) solid var(--tile-border);border-radius:var(--tile-radius);background:var(--tile-surface);box-shadow:var(--tile-card-shadow)}.dashboard-distribution{display:grid;align-content:start;gap:var(--space-4)}.dashboard-segmented-bar{display:flex;width:100%;height:28px;overflow:hidden;border-radius:var(--tile-radius);background:var(--surface-active)}.dashboard-segment{--share: 0%;flex:0 0 var(--share);min-width:2px;height:100%;background:var(--severity, var(--viz-1))}.dashboard-segment+.dashboard-segment{border-left:var(--border-hair) solid var(--surface-panel)}.dashboard-distribution-legend{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:var(--space-2);margin:0;padding:0;list-style:none}.dashboard-legend-button{display:flex;align-items:flex-start;gap:var(--space-2);width:100%;min-height:52px;padding:var(--space-2);border:var(--border-hair) solid transparent;border-radius:var(--btn-radius);color:var(--text);background:transparent;text-align:left;cursor:pointer}.dashboard-legend-button:hover{border-color:var(--line);background:var(--panel-hover)}.dashboard-legend-button:focus-visible{outline:var(--border-hair) solid var(--focus-ring);outline-offset:-1px}.dashboard-legend-swatch{flex:0 0 10px;width:10px;height:10px;margin-top:3px;background:var(--severity, var(--viz-1))}.dashboard-legend-copy{display:grid;gap:var(--space-1);min-width:0;color:var(--muted);font-size:var(--ui-control-size)}.dashboard-legend-copy>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-legend-copy strong{color:var(--heading);font-size:var(--ui-body-size);font-variant-numeric:tabular-nums}.dashboard-legend-copy small{color:var(--muted);font-size:var(--ui-control-size);font-weight:var(--fw-regular)}.dashboard-viz-1{--severity: var(--viz-1)}.dashboard-viz-2{--severity: var(--viz-2)}.dashboard-viz-3{--severity: var(--viz-3)}.dashboard-viz-4{--severity: var(--viz-4)}.dashboard-viz-5{--severity: var(--viz-5)}.dashboard-viz-6{--severity: var(--viz-6)}.severity-dashboard-cis-cat-without-severity{--severity: var(--donut-not-run)}.dashboard-empty{margin:0;color:var(--muted);font-size:var(--ui-control-size)}.dashboard-risk-profile{display:grid;align-content:start}.dashboard-risk-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);min-height:32px}.dashboard-risk-tool{min-height:30px;max-width:min(100%,320px);padding:var(--space-1) var(--space-2);border:var(--border-hair) solid transparent;border-radius:0;color:var(--heading);background-color:transparent;font-size:var(--ui-body-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase;cursor:pointer}.dashboard-risk-tool:hover{border-color:var(--line-strong);background-color:var(--panel-hover)}.dashboard-risk-tool:focus-visible{border-color:var(--focus-ring);outline:var(--border-hair) solid var(--focus-ring);outline-offset:-1px}.dashboard-risk-tool option{color:var(--text);background-color:var(--surface-input);text-transform:none}.dashboard-marked-summary{display:flex;align-items:center;justify-content:space-between;gap:var(--space-5);min-width:240px;padding:var(--space-2) var(--space-3);border:var(--border-hair) solid var(--line);color:var(--muted);font-size:var(--ui-label-size)}.dashboard-marked-summary strong{color:var(--heading);font-size:var(--ui-body-size);font-variant-numeric:tabular-nums}.dashboard-risk-body{display:grid;grid-template-columns:minmax(180px,.8fr) minmax(280px,1.2fr);min-height:190px;margin-top:var(--space-4)}.dashboard-risk-categories,.dashboard-risk-legend{margin:0;padding:0;list-style:none}.dashboard-risk-categories{display:grid;align-content:center;padding-right:var(--space-5);border-right:var(--border-hair) solid var(--line-strong)}.dashboard-risk-categories li+li{border-top:var(--border-hair) solid var(--line)}.dashboard-risk-categories button,.dashboard-risk-legend button{display:grid;align-items:center;width:100%;min-height:42px;padding:var(--space-2);border:0;border-radius:0;color:var(--text);background:transparent;text-align:left;cursor:pointer}.dashboard-risk-categories button{grid-template-columns:minmax(0,1fr) auto;gap:var(--space-3)}.dashboard-risk-categories button:hover,.dashboard-risk-legend button:hover{background:var(--panel-hover)}.dashboard-risk-categories button:focus-visible,.dashboard-risk-legend button:focus-visible{outline:var(--border-hair) solid var(--focus-ring);outline-offset:-1px}.dashboard-risk-categories span,.dashboard-risk-legend span{min-width:0;overflow:hidden;font-size:var(--ui-body-size);text-overflow:ellipsis;white-space:nowrap}.dashboard-risk-categories strong,.dashboard-risk-legend strong{color:var(--heading);font-size:var(--ui-body-size);font-variant-numeric:tabular-nums}.dashboard-risk-severity{display:flex;align-items:center;justify-content:center;gap:var(--space-5);min-width:0;padding-left:var(--space-5)}.dashboard-risk-donut{position:relative;flex:0 0 150px;width:150px;height:150px;overflow:visible}.dashboard-risk-donut svg{display:block;width:100%;height:100%;overflow:visible;transform:rotate(-90deg)}.dashboard-risk-donut circle{fill:none;stroke-width:var(--donut-ring-stroke)}.dashboard-risk-donut-track{stroke:var(--donut-track)}.dashboard-risk-donut-segment{stroke:var(--severity, var(--info))}.dashboard-risk-donut>span{position:absolute;inset:0;display:flex;align-items:flex-start;justify-content:center;padding-top:57px;color:var(--heading);font-variant-numeric:tabular-nums}.dashboard-risk-donut>span strong{display:block;font:var(--fw-semibold) calc(var(--donut-value-size) * 1.45) / 1 var(--font-donut-display)}.dashboard-risk-donut>span small{position:absolute;left:calc(100% + var(--space-1));bottom:0;font-size:var(--donut-percent-size);font-weight:var(--fw-semibold)}.dashboard-risk-legend{flex:1 1 auto;min-width:120px}.dashboard-risk-legend button{grid-template-columns:12px minmax(0,1fr) auto;gap:var(--space-3)}.dashboard-risk-legend i{width:12px;height:12px;background:var(--severity, var(--info))}@media(max-width:1400px){.dashboard-status-rack{grid-template-columns:repeat(2,minmax(0,290px))}.dashboard-status-summary{grid-column:1 / -1}.dashboard-distribution-grid,.dashboard-lower-grid{grid-template-columns:1fr}}@media(max-width:760px){.dashboard-status-rack{grid-template-columns:minmax(0,290px)}.dashboard-status-summary{grid-column:auto}.dashboard-coverage-summary,.dashboard-facts{grid-template-columns:repeat(2,minmax(0,1fr))}.dashboard-risk-body{grid-template-columns:1fr}.dashboard-risk-categories{padding-right:0;padding-bottom:var(--space-4);border-right:0;border-bottom:var(--border-hair) solid var(--line-strong)}.dashboard-risk-severity{padding:var(--space-4) 0 0}}.client-info-tile-grid{display:grid;gap:var(--segment-gap)}.client-info-metric-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--segment-gap)}.client-info-top-row{display:grid;grid-template-columns:minmax(0,3fr) minmax(320px,1fr);align-items:stretch;gap:var(--segment-gap);min-width:0}.client-info-metric{display:grid;align-content:space-between;align-self:start;gap:var(--space-2);width:100%;min-width:0;aspect-ratio:1;min-height:0;padding:var(--space-3);border:0;border-radius:var(--radius-sm);color:var(--text);background:var(--tile-surface);box-shadow:none;text-align:left}button.client-info-metric{cursor:pointer}button.client-info-metric:hover{border-color:transparent;background:var(--tile-surface-hover)}button.client-info-metric:focus-visible{outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:calc(-1 * var(--bw-emphasis))}button.client-info-metric[aria-pressed=true]{border-color:var(--tile-selected-border);outline:var(--bw-emphasis) solid var(--tile-selected-border);outline-offset:calc(-1 * var(--bw-emphasis))}.client-info-metric>span{color:var(--heading);font-size:var(--type-label-size);font-weight:var(--fw-semibold);line-height:1.25}.client-info-top-row>.client-info-metric-grid .client-info-metric{align-self:stretch;height:100%;min-height:220px;aspect-ratio:auto}.client-info-metric>strong{color:var(--chart-color, var(--heading));font-size:calc(var(--type-h1-size) * .84);font-weight:var(--fw-regular);line-height:1;font-variant-numeric:tabular-nums}.client-info-metric.is-emphasis>strong{font-size:var(--type-h1-size);font-weight:var(--fw-semibold)}.client-info-card-column{display:flex;flex-direction:column;align-self:start;gap:var(--segment-gap);min-width:0}.client-info-panels-layout{display:grid;grid-template-columns:minmax(0,3fr) minmax(320px,1fr);align-items:start;gap:var(--segment-gap);min-width:0}.client-info-donut-rail{display:grid;align-content:start;gap:var(--segment-gap);min-width:0}.client-info-card{display:flex;flex-direction:column;gap:0;min-width:0;min-height:min-content;align-self:stretch;padding:0;border:0;border-radius:var(--radius-sm);color:var(--text);background:var(--tile-surface);box-shadow:none}.client-info-card.is-collapsed{align-self:start;width:100%}.client-info-card>header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-5);min-height:60px;padding:var(--space-3) var(--space-5);border-bottom:var(--border-hair) solid var(--line);cursor:pointer}.client-info-card>header:hover{background:var(--tile-surface-hover)}.client-info-card.is-collapsed>header{flex:1 1 auto;border-bottom:0}.client-info-card-heading{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-2);min-width:0}.client-info-card-heading h2{margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-semibold);line-height:1.35}.client-info-card-heading>span{color:var(--muted);font-size:var(--type-h4-size);font-variant-numeric:tabular-nums;line-height:1.35}.client-info-card-heading .client-info-card-meta{font-size:var(--type-meta-size)}.client-info-card-toggle{flex:0 0 auto;display:grid;place-items:center;width:36px;height:36px;padding:0;border:0;border-radius:0;color:var(--heading);background:transparent;cursor:pointer}.client-info-card-toggle .triangle-icon{width:16px;height:16px}.client-info-card-toggle:hover{border-color:var(--line-strong)}.client-info-card-toggle:focus-visible{outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:1px}.client-info-card-content{display:grid;align-content:start;min-width:0}.client-info-card-details{display:grid;align-content:start;gap:0;min-width:0;padding:0 var(--space-5) var(--space-3)}.client-info-card-extra{display:grid;align-content:start;min-width:0;padding:0 var(--space-5) var(--space-4);border-top:var(--border-hair) solid var(--line)}.client-env-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,var(--tile-content-width)),1fr));align-items:start;gap:var(--segment-gap);min-width:0;margin-block:var(--space-4) var(--space-5)}.client-env-group{min-width:0}.client-env-group-title{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-3);margin:0 0 var(--space-2);color:var(--client-info-muted);font-size:var(--type-h4-size);font-weight:var(--fw-semibold);line-height:1.35}.client-env-group-title>span:first-child{order:0;flex:0 0 auto;color:var(--client-info-text)}.client-env-group-title:after{content:"";order:1;flex:1 1 auto;height:var(--border-hair);background:var(--client-info-line)}.client-env-group-note{order:2;flex:0 0 auto;font-weight:var(--fw-regular)}.client-env-group-toggle{order:3;flex:0 0 auto;display:grid;place-items:center;width:var(--control-h);height:var(--control-h);padding:0;border:0;border-radius:0;color:var(--client-info-text);background:transparent;cursor:pointer}.client-env-group-toggle .triangle-icon{width:var(--space-3);height:var(--space-3)}.client-env-group-toggle:focus-visible{outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:1px}.client-env-facts{display:grid;grid-template-columns:1fr;align-content:start;min-width:0;margin:0}.client-env-facts>div{display:grid;align-content:center;gap:0;min-width:0;min-height:calc(var(--row-h) + var(--space-3));padding:var(--space-1) 0;border-bottom:var(--border-hair) solid var(--client-info-line)}.client-env-facts dt{color:var(--client-info-muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold);line-height:1.35;overflow-wrap:break-word}.client-env-facts dd{margin:0;color:var(--client-info-text);font-size:var(--type-table-body-size);font-variant-numeric:tabular-nums;line-height:1.35;overflow-wrap:break-word}.client-command-center .client-gpo-readiness{grid-column:1 / -1;min-width:0;margin-block:var(--space-3)}.client-command-center .client-gpo-readiness p{font-size:var(--type-body-size)}.client-command-center .client-os-inventory{min-width:0}.client-command-center .client-os-inventory>header{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-3);margin-bottom:var(--space-2)}.client-command-center .client-os-inventory>header h3{margin:0;color:var(--client-info-text);font-size:var(--type-label-size);font-weight:var(--fw-semibold);line-height:1.35}.client-command-center .client-os-inventory header p{margin:0;font-size:var(--type-meta-size);color:var(--client-info-muted)}.client-command-center .client-os-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),1fr));align-items:start;gap:var(--space-5)}.client-command-center .client-os-group{min-width:0}.client-command-center .client-os-group h4{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:var(--space-3);margin:0 0 var(--space-1);color:var(--client-info-text);font-size:var(--type-label-size);font-weight:var(--fw-semibold);line-height:1.35}.client-command-center .client-os-group h4>span:last-child{font-variant-numeric:tabular-nums}.client-command-center .client-os-group table{width:100%;border-collapse:collapse;table-layout:auto}.client-command-center .client-os-group th{padding:var(--space-1) 0;color:var(--client-info-muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold);text-align:left}.client-command-center .client-os-group th:last-child{width:1%;white-space:nowrap;text-align:right}.client-command-center .client-os-group td{height:var(--row-h);padding:var(--space-1) 0;border-bottom:var(--border-hair) solid var(--client-info-line);font-size:var(--type-table-body-size);white-space:normal;word-break:normal;overflow-wrap:break-word}.client-command-center .client-os-group td:last-child{padding-inline-start:var(--space-2);white-space:nowrap;text-align:right;font-variant-numeric:tabular-nums}.client-command-center .client-os-group .client-os-source{width:1%;padding-inline-start:var(--space-3);color:var(--client-info-muted);font-size:var(--type-meta-size);white-space:nowrap}.client-command-center .client-os-empty{color:var(--client-info-muted);font-size:var(--type-body-size)}.client-info-bars{display:grid;align-content:start;gap:0;margin:0;padding:0;list-style:none}.client-info-bars li{min-width:0;border-bottom:var(--border-hair) solid var(--line)}.client-info-bars li:last-child{border-bottom:0}.client-info-bar-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(48px,auto) minmax(120px,1.15fr);grid-template-rows:auto auto;align-items:center;column-gap:var(--space-4);row-gap:var(--space-1);width:100%;min-height:64px;padding:var(--space-2) 0;border:0;border-radius:0;color:inherit;background:transparent;text-align:left}button.client-info-bar-row{cursor:pointer}button.client-info-bar-row:hover{background:var(--tile-surface-hover)}button.client-info-bar-row:focus-visible{outline:var(--border-hair) solid var(--focus-ring);outline-offset:-1px}.client-info-bar-label{grid-column:1;grid-row:1 / -1;align-self:center;color:var(--text);font-size:var(--type-body-size);line-height:1.4;overflow-wrap:normal;word-break:normal}.client-info-bar-track{grid-column:3;grid-row:1 / -1;width:100%;height:30px;background:var(--surface-active)}.client-info-bar-track i{--share: 0%;display:block;width:var(--share);min-width:2px;height:100%;background:var(--chart-color, var(--accent))}.client-info-bars strong{grid-column:2;grid-row:1;display:flex;align-items:baseline;justify-content:flex-end;gap:var(--space-1);min-width:0;color:var(--heading);font-size:var(--type-body-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}.client-info-bars .client-info-bar-detail{color:var(--heading);font-size:var(--type-meta-size);font-weight:var(--fw-semibold)}.client-info-bars .client-info-bar-status{grid-column:2;grid-row:2;min-height:12px;color:var(--warning);font-size:var(--type-meta-size);line-height:1;text-align:right}.client-info-bars .client-info-bar-status.is-empty{visibility:hidden}.client-info-card-caption{margin:0;padding:var(--space-4) 0 0;border-top:var(--border-hair) solid var(--line);color:var(--muted);font-size:var(--type-meta-size)}.client-info-card-extra .client-info-card-caption{border-top:0}.client-info-donut-card .client-info-card-details{padding:var(--space-5)}.client-info-donut-layout{display:grid;grid-template-columns:minmax(130px,.9fr) minmax(145px,1.1fr);align-items:center;gap:var(--space-4);min-width:0}.client-info-donut{position:relative;width:min(172px,100%);aspect-ratio:1;justify-self:center}.client-info-donut svg{display:block;width:100%;height:100%;overflow:visible;transform:rotate(-90deg)}.client-info-donut circle{fill:none;stroke-width:var(--donut-ring-stroke)}.client-info-donut-track{stroke:var(--donut-track)}.client-info-donut-segment{stroke:var(--chart-color, var(--info))}.client-info-donut>span{position:absolute;inset:0;display:grid;place-content:center;justify-items:center;color:var(--heading);text-align:center}.client-info-donut>span strong{font-size:calc(var(--type-h2-size) * 1.08);font-weight:var(--fw-regular);line-height:1;font-variant-numeric:tabular-nums}.client-info-donut>span small{margin-top:var(--space-1);color:var(--muted);font-size:var(--type-meta-size)}.client-info-legend{display:grid;align-content:center;gap:var(--space-1);margin:0;padding:0;list-style:none}.client-info-legend button,.client-info-legend-row{display:grid;grid-template-columns:11px minmax(0,1fr) auto;align-items:center;gap:var(--space-2);width:100%;min-height:36px;padding:var(--space-1) var(--space-2);border:0;border-radius:0;color:var(--text);background:transparent;text-align:left}.client-info-legend button{cursor:pointer}.client-info-legend button:hover{background:var(--tile-surface-hover)}.client-info-legend button:focus-visible{outline:var(--border-hair) solid var(--focus-ring);outline-offset:-1px}.client-info-legend i{width:11px;height:11px;background:var(--chart-color, var(--muted))}.client-info-legend span{min-width:0;font-size:var(--type-table-body-size);line-height:1.25;overflow-wrap:normal;word-break:normal}.client-info-legend strong{color:var(--heading);font-size:var(--type-table-body-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.dashboard-page.client-command-center{--client-info-text: var(--heading);--client-info-muted: var(--muted);--client-info-line: var(--line);--client-info-line-strong: var(--border-strong);--client-info-surface: var(--surface-input);--client-info-surface-raised: var(--tile-surface);--client-info-surface-hover: var(--tile-surface-hover);color:var(--client-info-text);background:var(--surface-app)}.client-command-center .tone-critical{--chart-color: var(--client-info-red)}.client-command-center .tone-high{--chart-color: var(--high)}.client-command-center .tone-medium{--chart-color: var(--client-info-amber)}.client-command-center .tone-passed{--chart-color: var(--client-info-green)}.client-command-center .tone-unknown{--chart-color: var(--client-info-neutral)}.client-glyph{display:block;width:var(--space-8);height:var(--space-8);fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}.client-overview-header{display:grid;grid-template-columns:auto auto minmax(240px,1fr);align-items:center;gap:var(--space-8);min-width:0;color:var(--client-info-muted)}.client-overview-identity,.client-overview-assessment,.client-overview-source{display:flex;align-items:center;gap:var(--space-3);min-width:0;font-size:var(--type-table-body-size)}.client-overview-identity strong{color:var(--client-info-text);font-weight:var(--fw-regular)}.client-overview-assessment .work-timeslot-select{margin:0}.client-overview-assessment .work-timeslot-select>span{display:none}.client-overview-source{justify-self:end}.client-overview-source select,.client-overview-assessment select{min-width:132px;min-height:var(--control-h);padding-inline:var(--space-3);border:var(--border-hair) solid var(--client-info-line);border-radius:var(--btn-radius);color:var(--client-info-text);background:var(--client-info-surface);font:inherit}.client-overview-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,var(--tile-compact-width)));justify-content:start;gap:var(--segment-gap);min-width:0}.client-overview-fact{display:grid;grid-template-columns:auto minmax(0,1fr);place-content:center;align-items:center;gap:var(--space-3);min-height:88px;padding:var(--tile-inset);border:0;border-radius:var(--tile-radius);color:var(--client-info-muted);background:var(--tile-surface);text-align:left}.client-overview-fact>span{display:grid;gap:var(--space-1)}.client-overview-fact strong{color:var(--client-info-text);font-size:var(--type-h2-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;line-height:1}.client-overview-fact small{color:var(--client-info-muted);font-size:var(--type-label-size);line-height:1.3}.client-overview-main{display:grid;grid-template-columns:minmax(720px,2.18fr) minmax(300px,.82fr);align-items:stretch;gap:var(--segment-gap);min-width:0}.client-posture{position:relative;display:grid;grid-template-columns:minmax(300px,.82fr) minmax(430px,1.18fr);gap:var(--segment-gap);min-width:0;border-radius:var(--tile-radius);background:var(--tile-surface)}.client-overall,.client-domains,.client-priority>section{min-width:0;border:0;border-radius:var(--tile-radius);color:var(--client-info-text);background:var(--tile-surface);box-shadow:var(--tile-card-shadow)}.client-posture-connectors{position:absolute;z-index:2;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}.client-posture-connectors path{fill:none;stroke:var(--text-muted);stroke-width:1.2;vector-effect:non-scaling-stroke}.client-overall,.client-domains{position:relative;z-index:1}.client-overall{display:grid;align-content:start;justify-items:center;gap:var(--space-2);min-width:0;padding:var(--tile-inset)}.client-overall>h2,.client-domains h2,.client-priority h2,.client-source-overview h2{margin:0;color:var(--client-info-text);font-size:var(--type-h4-size);font-weight:var(--fw-semibold);line-height:1.3}.client-overall>h2{justify-self:start;color:var(--client-info-text)}.client-overall-ring{position:relative;width:min(290px,90%);aspect-ratio:1;margin:var(--space-3) 0 var(--space-2);color:var(--chart-color, var(--client-info-neutral))}.client-overall-ring svg{display:block;width:100%;height:100%;overflow:visible;transform:rotate(-90deg)}.client-overall-ring circle{fill:none;stroke-width:var(--donut-ring-stroke)}.client-overall-ring-track{stroke:var(--donut-track)}.client-overall-ring-value{stroke:var(--chart-color, var(--accent));stroke-linecap:butt}.client-overall-ring>span{position:absolute;inset:0;display:grid;place-items:center;color:var(--donut-value)}.client-overall-ring-number{position:relative}.client-overall-ring-number strong{font-size:var(--type-h1-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;line-height:1}.client-overall-ring-number small{position:absolute;left:calc(100% + var(--space-1));bottom:0;color:var(--client-info-text);font-size:var(--donut-percent-size);white-space:nowrap}.client-overall-ring em{position:absolute;top:calc(50% + var(--type-h1-size) / 2 + var(--space-2));color:var(--client-info-muted);font-size:var(--type-label-size);font-style:normal;font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps)}.client-overall-status{color:var(--chart-color, var(--muted));font-size:var(--type-h3-size);font-weight:var(--fw-semibold)}.client-overall-critical{display:flex;align-items:baseline;justify-content:center;gap:var(--space-2);min-height:40px;padding:var(--space-1) var(--space-3);border:0;border-radius:0;color:var(--critical);background:transparent;cursor:pointer}.client-overall-critical:hover:not(:disabled){background:var(--client-info-surface-hover)}.client-overall-critical:disabled{cursor:default;opacity:.65}.client-overall-critical b{font-size:var(--type-h3-size);font-variant-numeric:tabular-nums}.client-overall-critical span{font-size:var(--type-table-body-size);font-weight:var(--fw-semibold)}.client-overall-coverage{display:grid;gap:var(--space-2);width:100%;margin-top:var(--space-3)}.client-overall-coverage>span{display:flex;justify-content:space-between;gap:var(--space-3);color:var(--client-info-text);font-size:var(--type-label-size)}.client-overall-coverage>span strong,.client-overall-coverage>span b{font-weight:var(--fw-semibold)}.client-overall-coverage>i{display:block;height:7px;background:var(--client-info-line)}.client-overall-coverage>i u{--share: 0%;display:block;width:var(--share);height:100%;background:var(--client-info-green);text-decoration:none}.client-overall-coverage small{color:var(--client-info-muted);font-size:var(--type-meta-size);line-height:1.3}.client-overall-secondary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));width:100%;margin:var(--space-2) 0 0;border-top:var(--border-hair) solid var(--client-info-line)}.client-overall-secondary>div{display:grid;justify-items:center;gap:var(--space-1);padding:var(--space-4) var(--space-2) 0}.client-overall-secondary>div+div{border-left:var(--border-hair) solid var(--client-info-line)}.client-overall-secondary dt{color:var(--client-info-muted);font-size:var(--type-meta-size)}.client-overall-secondary dd{grid-row:1;margin:0;color:var(--client-info-text);font-size:var(--type-h3-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.client-domains{position:relative;min-width:0;padding:var(--tile-inset)}.client-domains>header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3)}.client-domains>header>span{color:var(--client-info-muted);font-size:var(--type-meta-size)}.client-domains ul{position:relative;display:grid;gap:var(--space-1);margin:var(--space-3) 0 0;padding:0;list-style:none}.client-domains li{position:relative;min-width:0}.client-domains li>button,.client-domains li>div{position:relative;z-index:3;display:grid;grid-template-columns:52px minmax(0,1fr) auto;grid-template-rows:auto;align-items:center;column-gap:var(--space-3);row-gap:var(--space-1);width:100%;min-height:64px;padding:var(--space-1) 0;border:0;border-radius:0;color:inherit;background:transparent;text-align:left}.client-domains li>button{cursor:pointer}.client-domains li>button:hover{background:var(--client-info-surface-hover)}.client-domain-score{z-index:1;grid-column:1;grid-row:1 / 3;display:grid;place-items:center;width:46px;height:46px;border:var(--border-hair) solid var(--chart-color, var(--client-info-line-strong));border-radius:50%;color:var(--client-info-text);background:var(--client-info-surface)}.client-domain-score .client-glyph{width:var(--space-6);height:var(--space-6)}.client-domain-score em{color:var(--chart-color, var(--client-info-text));font-size:var(--type-h4-size);font-style:normal;font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;line-height:1}.client-domain-copy{grid-column:2;grid-row:1;display:grid;gap:var(--space-1);min-width:0}.client-domain-copy strong{color:var(--client-info-text);font-size:var(--type-body-size);font-weight:var(--fw-semibold);line-height:1.25}.client-domain-copy small{color:var(--client-info-muted);font-size:var(--type-meta-size);line-height:1.3}.client-domains li>button>b,.client-domains li>div>b{grid-column:3;grid-row:1;color:var(--client-info-text);font-size:var(--type-h2-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.client-domains li b small{display:block;color:var(--client-info-muted);font-size:var(--type-meta-size);font-weight:var(--fw-regular);text-align:right}.client-priority{display:grid;grid-template-rows:auto auto;align-content:start;gap:var(--segment-gap);min-width:0}.client-priority>section{padding:var(--tile-inset)}.client-priority-findings>header{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));align-items:end;gap:var(--space-3)}.client-priority-findings>header h2{grid-column:1 / -1;align-self:start}.client-priority-findings>header>div{display:grid;justify-items:center;color:var(--client-info-text)}.client-priority-findings>header>div strong{color:var(--chart-color, var(--client-info-text));font-size:var(--type-h2-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.client-priority-findings>header>div span{color:var(--client-info-muted);font-size:var(--type-meta-size)}.client-priority-context{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-1);margin-top:var(--space-3);border-top:var(--border-hair) solid var(--client-info-line);border-bottom:var(--border-hair) solid var(--client-info-line)}.client-priority-context button{display:grid;justify-items:center;gap:var(--space-1);min-width:0;padding:var(--space-2) var(--space-1);border:0;border-radius:0;color:var(--client-info-text);background:transparent;cursor:pointer}.client-priority-context button+button{border-left:var(--border-hair) solid var(--client-info-line)}.client-priority-context button:hover:not(:disabled){background:var(--client-info-surface-hover)}.client-priority-context button:disabled{cursor:default;opacity:.65}.client-priority-context strong{font-size:var(--type-h4-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.client-priority-context span{color:var(--client-info-muted);font-size:var(--type-meta-size);line-height:1.2;text-align:center}.client-priority-findings ol{display:grid;gap:var(--space-2);margin:var(--space-4) 0 var(--space-3);padding:0;list-style:none}.client-priority-findings li{border-left:var(--marker-width) solid var(--chart-color, var(--client-info-neutral));border-bottom:var(--border-hair) solid var(--line);background:transparent}.client-priority-findings li button{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:var(--space-1) var(--space-2);width:100%;min-height:70px;padding:var(--space-3);border:0;border-radius:0;color:inherit;background:transparent;text-align:left;cursor:pointer}.client-priority-findings li button:hover{background:var(--client-info-surface-hover)}.client-priority-findings li small{padding:var(--space-1) var(--space-2);color:var(--sev-on);background:var(--chart-color, var(--client-info-neutral));font-size:var(--type-badge-size);font-weight:var(--fw-semibold);text-transform:uppercase}.client-priority-findings li strong{min-width:0;color:var(--client-info-text);font-size:var(--type-table-body-size);font-weight:var(--fw-semibold);line-height:1.3;overflow-wrap:normal;word-break:normal}.client-priority-findings li span{grid-column:2;justify-self:end;padding:var(--space-1) var(--space-2);color:var(--client-info-muted);background:var(--client-info-surface-hover);font-size:var(--type-meta-size)}.client-priority-findings .client-priority-empty{padding:var(--space-4);border-left-color:var(--client-info-green);color:var(--client-info-muted);font-size:var(--type-table-body-size)}.client-overview-action{justify-self:end;margin-left:auto}.client-assessment-gaps{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:baseline;gap:var(--space-1) var(--space-3)}.client-assessment-gaps h2{grid-column:1 / -1;margin-bottom:var(--space-2)}.client-assessment-gaps>strong{color:var(--client-info-text);font-size:var(--type-h2-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.client-assessment-gaps>span{color:var(--client-info-muted);font-size:var(--type-table-body-size)}.client-assessment-gaps dl{grid-column:1 / -1;display:grid;margin:var(--space-3) 0 0;border-top:var(--border-hair) solid var(--client-info-line)}.client-assessment-gaps dl div{display:flex;justify-content:space-between;gap:var(--space-3);padding:var(--space-3) 0;border-bottom:var(--border-hair) solid var(--client-info-line);font-size:var(--type-table-body-size)}.client-assessment-gaps dt{display:flex;align-items:center;gap:var(--space-2);color:var(--client-info-muted)}.client-assessment-gaps dt .client-glyph{width:var(--space-5);height:var(--space-5)}.client-assessment-gaps dd{margin:0;color:var(--client-info-text);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.client-assessment-gaps .client-overview-action{grid-column:1 / -1}.client-source-overview{min-width:0;padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface)}.client-environment-detail{min-width:0;padding:var(--tile-inset);border:0;border-radius:var(--tile-radius);color:var(--client-info-text);background:var(--tile-surface)}.client-environment-detail>summary,.risk-register-detail-group>summary,.risk-register-history>summary{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-3);min-height:var(--control-h);list-style:none;cursor:pointer}.client-environment-detail>summary::-webkit-details-marker,.risk-register-detail-group>summary::-webkit-details-marker,.risk-register-history>summary::-webkit-details-marker{display:none}.client-environment-detail>summary:focus-visible,.risk-register-detail-group>summary:focus-visible,.risk-register-history>summary:focus-visible{outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:var(--border-hair)}.client-environment-detail[open]>summary>.triangle-icon,.risk-register-detail-group[open]>summary>.triangle-icon,.risk-register-history[open]>summary>.triangle-icon{transform:rotate(90deg)}.client-environment-detail>summary h2{margin:0;color:var(--client-info-text);font-size:var(--type-h4-size);font-weight:var(--fw-semibold);line-height:1.3}.client-environment-detail>summary span{color:var(--client-info-muted);font-size:var(--type-meta-size)}.client-environment-detail>summary>.client-env-meta{margin-left:auto}.client-env-meta{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2) var(--space-3)}.client-env-restricted-toggle{gap:var(--space-2);margin-top:var(--space-3)}.client-env-restricted-toggle .triangle-icon{width:var(--space-3);height:var(--space-3)}.client-environment-restricted{margin:0 0 var(--space-3);color:var(--client-info-muted);font-size:var(--type-meta-size);line-height:1.35}.client-source-overview>header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);margin-bottom:var(--space-3)}.client-source-overview>header span{color:var(--client-info-muted);font-size:var(--type-meta-size)}.client-source-overview>div{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--tile-content-width)),var(--tile-content-width)));justify-content:start;gap:var(--segment-gap);min-width:0}.client-source-overview>div>article,.client-source-overview>div>button{--source-color: var(--client-info-neutral);display:grid;grid-template-columns:var(--space-8) minmax(0,1fr);grid-template-rows:auto auto auto;align-items:center;gap:var(--space-1) var(--space-3);min-width:0;min-height:104px;padding:var(--tile-inset);border:0;border-radius:var(--tile-radius);color:inherit;background:var(--tile-surface);text-align:left}.client-source-overview .client-source-pingcastle{--source-color: var(--client-info-green)}.client-source-overview .client-source-purple{--source-color: var(--client-info-purple)}.client-source-overview .client-source-maester{--source-color: var(--client-info-green)}.client-source-overview .client-source-cis{--source-color: var(--client-info-blue)}.client-source-overview .client-source-gpo{--source-color: var(--client-info-lime)}.client-source-overview button{cursor:pointer}.client-source-overview button:hover{background:var(--client-info-surface-hover)}.client-source-overview article>.client-glyph,.client-source-overview button>.client-glyph{grid-column:1;grid-row:1 / -1;width:var(--space-8);height:var(--space-8);color:var(--client-info-muted)}.client-source-overview article>span,.client-source-overview button>span{grid-column:2;color:var(--client-info-text);font-size:var(--type-table-body-size);font-weight:var(--fw-semibold)}.client-source-overview article>strong,.client-source-overview button>strong{grid-column:2;color:var(--client-info-text);font-size:var(--type-h2-size);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.client-source-overview article>strong small,.client-source-overview button>strong small{margin-left:var(--space-1);color:var(--client-info-muted);font-size:var(--type-table-body-size);font-weight:var(--fw-regular)}.client-source-overview article>em,.client-source-overview button>em{grid-column:2;color:var(--client-info-muted);font-size:var(--type-meta-size);font-style:normal;line-height:1.3}.client-risk-register{min-width:0;padding:var(--tile-inset);border:0;border-radius:var(--tile-radius);color:var(--client-info-text);background:var(--tile-surface);box-shadow:var(--tile-card-shadow)}.client-risk-register>header{display:flex;align-items:end;justify-content:space-between;gap:var(--space-4);margin-bottom:var(--space-4)}.client-risk-register>header>div{display:grid;gap:var(--space-1)}.client-risk-register>header h2{margin:0;color:var(--client-info-text);font-size:var(--type-h4-size);font-weight:var(--fw-semibold);line-height:1.3}.client-risk-register>header span,.client-risk-register>header strong{color:var(--client-info-muted);font-size:var(--type-meta-size);font-weight:var(--fw-regular)}.client-risk-register-empty{margin:0;padding:var(--space-6) 0;border-top:var(--border-hair) solid var(--client-info-line);color:var(--client-info-muted);font-size:var(--type-body-size)}.client-risk-register-layout{display:grid;grid-template-columns:minmax(260px,.72fr) minmax(0,1.78fr);min-width:0;border-top:var(--border-hair) solid var(--client-info-line)}.client-risk-register-list{display:grid;align-content:start;min-width:0;padding:var(--space-4) var(--space-4) var(--space-4) 0;border-right:var(--border-hair) solid var(--client-info-line)}.client-risk-register-list button{--risk-register-tone: var(--client-info-neutral);position:relative;display:grid;grid-template-columns:var(--marker-width) minmax(0,1fr) auto;gap:var(--space-1) var(--space-3);align-items:start;width:100%;min-width:0;padding:var(--space-3);border:0;border-bottom:var(--border-hair) solid var(--client-info-line);border-radius:0;color:inherit;background:transparent;text-align:left;cursor:pointer}.client-risk-register-list button:first-child{border-top:var(--border-hair) solid var(--client-info-line)}.client-risk-register-list button:hover{background:var(--client-info-surface-hover)}.client-risk-register-list button[aria-pressed=true]{z-index:1;outline:var(--bw-emphasis) solid var(--marking-color);outline-offset:calc(-1 * var(--bw-emphasis));background:var(--client-info-surface-hover)}.client-risk-register-list button:focus-visible{z-index:2;outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:calc(-1 * var(--bw-emphasis))}.client-risk-register-list button.is-current,.client-risk-register-detail>header>strong.is-current{--risk-register-tone: var(--client-info-green)}.client-risk-register-list button.is-attention,.client-risk-register-detail>header>strong.is-attention{--risk-register-tone: var(--client-info-amber)}.client-risk-register-list button.is-critical,.client-risk-register-detail>header>strong.is-critical{--risk-register-tone: var(--client-info-red)}.client-risk-register-list button>i{grid-column:1;grid-row:1 / 4;width:var(--marker-width);height:100%;min-height:54px;background:var(--risk-register-tone)}.client-risk-register-list button>span{grid-column:2 / -1;display:grid;gap:var(--space-1);min-width:0}.client-risk-register-list button>span strong{color:var(--client-info-text);font-size:var(--type-table-body-size);font-weight:var(--fw-semibold);line-height:1.35;overflow-wrap:break-word}.client-risk-register-list button>span small{color:var(--client-info-muted);font-size:var(--type-meta-size);line-height:1.3;overflow-wrap:break-word}.client-risk-register-list button>em{grid-column:2;color:var(--risk-register-tone);font-size:var(--type-badge-size);font-style:normal;font-weight:var(--fw-semibold);text-transform:uppercase}.client-risk-register-list button>time{grid-column:3;color:var(--client-info-muted);font-size:var(--type-meta-size);font-variant-numeric:tabular-nums;white-space:nowrap}.client-risk-register-detail{min-width:0;padding:var(--space-5) 0 var(--space-4) var(--space-5)}.client-risk-register-detail>header{display:flex;align-items:start;justify-content:space-between;gap:var(--space-5);padding-bottom:var(--space-4)}.client-risk-register-detail>header>div{display:grid;gap:var(--space-1);min-width:0}.client-risk-register-detail>header span{color:var(--client-info-muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.client-risk-register-detail>header h2{margin:0;color:var(--client-info-text);font-size:var(--type-detail-title-size);font-weight:var(--fw-semibold);line-height:1.35;overflow-wrap:break-word}.client-risk-register-detail>header>strong{--risk-register-tone: var(--client-info-neutral);flex:0 0 auto;padding:var(--space-1) var(--space-2);border-left:var(--marker-width) solid var(--risk-register-tone);color:var(--risk-register-tone);background:var(--client-info-surface);font-size:var(--type-badge-size);font-weight:var(--fw-semibold);text-transform:uppercase}.risk-register-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:0;border-top:var(--border-hair) solid var(--client-info-line);border-bottom:var(--border-hair) solid var(--client-info-line)}.risk-register-summary>div{display:grid;align-content:start;gap:var(--space-1);min-width:0;padding:var(--space-3);border-right:var(--border-hair) solid var(--client-info-line);border-bottom:var(--border-hair) solid var(--client-info-line)}.risk-register-summary>div:nth-child(3n){border-right:0}.risk-register-summary>div:nth-last-child(-n+3){border-bottom:0}.risk-register-summary dt,.risk-register-detail-group dt{color:var(--client-info-muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.risk-register-summary dd{margin:0;color:var(--client-info-text);font-size:var(--type-table-body-size);line-height:1.4;overflow-wrap:break-word}.risk-register-detail-groups{display:grid;grid-template-columns:1fr;padding-top:var(--space-4)}.risk-register-detail-group{min-width:0;padding-block:var(--space-2);border-bottom:var(--border-hair) solid var(--client-info-line)}.risk-register-detail-group h3,.risk-register-history h3{margin:0;color:var(--client-info-text);font-size:var(--type-h4-size);font-weight:var(--fw-semibold)}.risk-register-detail-group dl{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,var(--tile-content-width)),1fr));gap:var(--space-4);margin:var(--space-3) 0}.risk-register-detail-group dl>div{display:grid;gap:var(--space-1);min-width:0}.risk-register-detail-group dd{margin:0;color:var(--client-info-text);font-size:var(--type-body-size);line-height:1.5;white-space:pre-wrap;overflow-wrap:break-word}.risk-register-history{padding-top:var(--space-2)}.risk-register-history>summary>span{margin-left:auto;color:var(--client-info-muted);font-size:var(--type-meta-size)}.risk-register-history ol{display:grid;gap:0;margin:0;padding:0;border-top:var(--border-hair) solid var(--client-info-line);list-style:none}.risk-register-history li{display:grid;gap:var(--space-2);padding:var(--space-3) 0;border-bottom:var(--border-hair) solid var(--client-info-line)}.risk-register-history li>span{display:flex;justify-content:space-between;gap:var(--space-3)}.risk-register-history li strong{font-size:var(--type-table-body-size);font-weight:var(--fw-semibold)}.risk-register-history li time,.risk-register-history li small{color:var(--client-info-muted);font-size:var(--type-meta-size)}.risk-register-history li p{margin:0;color:var(--client-info-text);font-size:var(--type-body-size);line-height:1.5;white-space:pre-wrap;overflow-wrap:break-word}@container (max-width: 1300px){.client-overview-main{grid-template-columns:1fr}.client-priority{grid-template-columns:repeat(2,minmax(0,1fr))}.client-risk-register-layout{grid-template-columns:minmax(230px,.8fr) minmax(0,1.2fr)}.risk-register-detail-groups{grid-template-columns:1fr}}@container (max-width: 760px){.client-overview-header{grid-template-columns:1fr;gap:var(--space-3)}.client-overview-source{justify-self:start}.client-overview-facts{grid-template-columns:repeat(2,minmax(0,1fr))}.client-posture{grid-template-columns:1fr}.client-posture-connectors{display:none}.client-priority,.client-risk-register-layout{grid-template-columns:1fr}.client-risk-register-list{padding-right:0;border-right:0;border-bottom:var(--border-hair) solid var(--client-info-line)}.client-risk-register-detail{padding-left:0}}@container (max-width: 480px){.client-overview-facts,.client-source-overview>div{grid-template-columns:1fr}.client-priority-findings>header{grid-template-columns:repeat(3,minmax(0,1fr))}.client-priority-findings>header h2{grid-column:1 / -1}.client-priority-context{grid-template-columns:repeat(2,minmax(0,1fr))}.client-priority-context button:nth-child(3){border-left:0;border-top:var(--border-hair) solid var(--client-info-line)}.client-priority-context button:nth-child(4){border-top:var(--border-hair) solid var(--client-info-line)}.client-risk-register>header,.client-risk-register-detail>header{align-items:start;flex-direction:column}.risk-register-summary{grid-template-columns:1fr}.risk-register-summary>div,.risk-register-summary>div:nth-child(3n),.risk-register-summary>div:nth-last-child(-n+3){border-right:0;border-bottom:var(--border-hair) solid var(--client-info-line)}.risk-register-summary>div:last-child{border-bottom:0}.client-risk-register-list button>time{grid-column:2;white-space:normal}}.tone-deviation,.tone-error,.tone-critical{--chart-color: var(--critical)}.tone-passed,.tone-low,.tone-coverage{--chart-color: var(--success)}.tone-high{--chart-color: var(--high)}.tone-medium{--chart-color: var(--medium)}.tone-info{--chart-color: var(--info)}.tone-not-run,.tone-neutral,.tone-dashboard-cis-cat-without-severity{--chart-color: var(--donut-not-run)}.tone-accent,.tone-pki{--chart-color: var(--accent)}.tone-gpo{--chart-color: var(--high)}.tone-risk{--chart-color: var(--warning)}@media(max-width:1100px){.client-info-top-row{grid-template-columns:minmax(0,1fr);align-items:start}.client-info-metric-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.client-info-top-row>.client-info-metric-grid .client-info-metric{height:auto;min-height:0;aspect-ratio:1}.client-info-panels-layout{grid-template-columns:minmax(0,1fr)}.client-info-donut-rail{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:800px){.client-info-metric-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.client-info-donut-rail{grid-template-columns:minmax(0,1fr)}}@media(max-width:560px){.client-info-card>header{align-items:flex-start;min-height:68px;padding:var(--space-3)}.client-info-card-heading{display:grid;gap:var(--space-1)}.client-info-card-details,.client-info-card-extra{padding-left:var(--space-3);padding-right:var(--space-3)}.client-info-bar-row{grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto auto;min-height:132px;column-gap:var(--space-3)}.client-info-bar-label{grid-column:1;grid-row:1}.client-info-bars strong{grid-column:2;grid-row:1}.client-info-bars .client-info-bar-status{grid-column:1 / -1;grid-row:2;text-align:left}.client-info-bar-track{grid-column:1 / -1;grid-row:3;height:44px}.client-info-donut-layout{grid-template-columns:minmax(0,1fr)}}.db-structure-page{width:100%;max-width:none}.db-structure-meta{margin:0;color:var(--muted);font-size:var(--ui-body-size)}.page-actions-row{display:flex;align-items:center;justify-content:space-between;gap:var(--legacy-space-4);margin-top:var(--legacy-space-4)}.page-action-buttons{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--legacy-space-2)}.db-structure-intro{display:flex;align-items:end;justify-content:space-between;gap:var(--space-7);padding-bottom:var(--space-5);border-bottom:var(--border-hair) solid var(--line)}.db-structure-intro-copy{display:grid;gap:var(--space-2);max-width:780px}.db-structure-eyebrow{color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.db-structure-intro h2{margin:0;color:var(--heading);font-size:var(--type-h2-size);font-weight:var(--fw-semibold);line-height:1.15}.db-structure-intro p{margin:0;color:var(--muted);font-size:var(--type-body-size);line-height:1.55}.db-structure-intro-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:var(--space-3);flex:0 0 auto}.db-structure-persistence{display:inline-flex;align-items:center;gap:var(--space-2);color:var(--muted);font-size:var(--type-meta-size)}.db-structure-persistence i{width:8px;height:8px;background:var(--muted)}.db-structure-persistence.is-postgresql i{background:var(--success)}.db-structure-summary{display:grid;grid-template-columns:repeat(auto-fill,var(--tile-compact-width));justify-content:start;gap:var(--segment-gap);margin-top:var(--space-5);padding:var(--segment-inset);border:0;border-radius:var(--segment-radius);background:var(--segment-surface);box-shadow:none}.db-structure-summary article{display:grid;align-content:space-between;gap:var(--space-2);min-height:148px;padding:var(--space-4);border:0;border-radius:0;background:var(--tile-surface);box-shadow:none}.db-structure-summary article>span{color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.db-structure-summary article>strong{color:var(--heading);font-size:var(--type-h2-size);font-weight:var(--fw-semibold);line-height:1;font-variant-numeric:tabular-nums}.db-structure-summary article>small{color:var(--muted);font-size:var(--type-meta-size);line-height:1.4}.db-structure-toolbar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);margin-top:var(--space-5);padding:0 var(--segment-inset)}.db-structure-meta{font-size:var(--type-meta-size)}.db-structure-meta time{color:var(--text);font-variant-numeric:tabular-nums}.db-structure-layers{display:grid;gap:var(--space-7);margin-top:var(--space-5);width:100%}.db-structure-layer{padding:var(--segment-inset);border:0;border-radius:var(--segment-radius);background:var(--segment-surface);box-shadow:none}.db-structure-layer-header{display:flex;align-items:end;justify-content:space-between;gap:var(--space-5);margin-bottom:var(--space-4);padding:0 var(--space-1)}.db-structure-layer-header>div{display:grid;gap:var(--space-1);max-width:760px}.db-structure-layer-header span{color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.db-structure-layer-header h3{margin:0;color:var(--heading);font-size:var(--type-h3-size);font-weight:var(--fw-semibold);line-height:1.35}.db-structure-layer-header p{margin:0;color:var(--muted);font-size:var(--type-body-size);line-height:1.5}.db-structure-layer-header>strong{flex:0 0 auto;color:var(--muted);font-size:var(--type-label-size);font-weight:var(--fw-semibold)}.db-structure-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--tile-content-width)),var(--tile-content-width)));justify-content:start;align-items:start;gap:var(--segment-gap)}.db-structure-card{min-width:0;border:0;border-radius:0;background:var(--tile-surface);box-shadow:none}.db-structure-card.is-expanded{grid-column:1 / -1;width:100%}.db-structure-card-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);width:100%;min-height:112px;padding:var(--space-4);border:0;color:inherit;background:transparent;text-align:left;cursor:pointer}.db-structure-card-header:hover{background:var(--tile-surface-hover)}.db-structure-card-header:focus-visible{outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:calc(-1 * var(--bw-emphasis))}.db-structure-card-copy{display:grid;gap:var(--space-2);min-width:0}.db-structure-table-kind{color:var(--muted);font-size:var(--type-badge-size);font-weight:var(--fw-semibold);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.db-structure-card-copy>strong{color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-semibold);overflow-wrap:break-word}.db-structure-card-facts{display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-3);color:var(--muted);font-size:var(--type-meta-size);font-variant-numeric:tabular-nums}.db-structure-card-toggle{flex:0 0 auto;color:var(--muted)}.db-structure-card-body{display:grid;grid-template-columns:minmax(0,2fr) minmax(280px,1fr);gap:var(--space-6);padding:var(--space-5);border-top:var(--border-hair) solid var(--line)}.db-structure-card-section{min-width:0}.db-structure-detail-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);margin-bottom:var(--space-3)}.db-structure-detail-heading h4{margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-semibold)}.db-structure-detail-heading span{color:var(--muted);font-size:var(--type-meta-size);font-variant-numeric:tabular-nums}.db-structure-column-head,.db-structure-columns li{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(100px,.8fr) minmax(76px,auto);align-items:center;gap:var(--space-4)}.db-structure-column-head{min-height:32px;padding:0 var(--space-3);border-bottom:var(--border-hair) solid var(--line);color:var(--muted);font-size:var(--type-table-head-size);font-weight:var(--fw-semibold);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.db-structure-columns{display:grid;gap:0;margin:0;padding:0;list-style:none}.db-structure-columns li{min-height:48px;padding:var(--space-2) var(--space-3);border-bottom:var(--border-hair) solid var(--line);font-size:var(--type-table-body-size)}.db-structure-columns li:last-child{border-bottom:0}.db-structure-columns strong{color:var(--heading);font-weight:var(--fw-regular);overflow-wrap:break-word}.db-structure-columns span{color:var(--muted);overflow-wrap:break-word}.db-structure-columns small{color:var(--muted);font-size:var(--type-meta-size);text-align:right}.db-structure-relations{padding-left:var(--space-5);border-left:var(--border-hair) solid var(--line)}.db-structure-relations>p{margin:0;color:var(--muted);font-size:var(--type-body-size);line-height:1.5}.db-structure-fks{display:grid;gap:0;margin:0;padding:0;list-style:none}.db-structure-fks li{display:grid;grid-template-columns:minmax(0,.8fr) auto minmax(0,1.2fr);align-items:start;gap:var(--space-2);min-height:48px;padding:var(--space-3) 0;border-bottom:var(--border-hair) solid var(--line);color:var(--muted);font-size:var(--type-table-body-size)}.db-structure-fks li:last-child{border-bottom:0}.db-structure-fks strong{color:var(--heading);font-weight:var(--fw-regular);overflow-wrap:break-word}.db-structure-fks span:last-child{overflow-wrap:break-word}@media(max-width:900px){.db-structure-intro{align-items:start;flex-direction:column}.db-structure-intro-actions{justify-content:flex-start}.db-structure-card-body{grid-template-columns:minmax(0,1fr)}.db-structure-relations{padding-top:var(--space-5);padding-left:0;border-top:var(--border-hair) solid var(--line);border-left:0}}@media(max-width:560px){.db-structure-summary{grid-template-columns:minmax(0,1fr)}.db-structure-summary article{min-height:128px}.db-structure-toolbar,.db-structure-layer-header{align-items:start;flex-direction:column}.db-structure-grid{grid-template-columns:minmax(0,1fr)}.db-structure-column-head{display:none}.db-structure-columns li{grid-template-columns:minmax(0,1fr) auto}.db-structure-columns small{grid-column:1 / -1;text-align:left}}.viewer.app-area-results{overflow-x:hidden;overflow-y:auto;background:var(--surface-app);scrollbar-color:var(--line-strong) var(--surface-app);scrollbar-width:thin}.results-browser-page{width:100%;max-width:none}.results-browser-layout{display:grid;grid-template-columns:minmax(220px,300px) minmax(0,1fr);gap:var(--legacy-space-5);margin-top:var(--legacy-space-5);align-items:start;width:100%}.results-filter-panel{display:grid;gap:var(--legacy-space-5);padding:var(--legacy-space-4);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);background:var(--panel);position:sticky;top:0;max-height:calc(100vh - 200px);overflow-y:auto}.results-filter-group h3{margin:0 0 var(--legacy-space-2);color:var(--muted);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.results-filter-options{display:grid;gap:var(--legacy-space-1);margin:0;padding:0;list-style:none;max-height:220px;overflow-y:auto}.results-filter-options label{display:flex;align-items:center;gap:var(--legacy-space-2);font-size:var(--ui-control-size);color:var(--text);cursor:pointer}.results-filter-options label span{flex:1;min-width:0;overflow-wrap:anywhere}.results-filter-options label b{color:var(--muted);font-weight:600;flex:0 0 auto}.results-filter-empty{margin:0;color:var(--muted);font-size:var(--ui-control-size)}.results-filter-segmented{display:flex;gap:var(--legacy-space-1)}.results-filter-segmented button{flex:1;min-height:var(--control-height);padding:var(--legacy-space-1) var(--legacy-space-2);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);color:var(--text);background:var(--panel-raised);font-size:var(--ui-control-size);cursor:pointer}.results-filter-segmented button.active{border-color:var(--line-strong);color:var(--state-selected-text);background:var(--state-selected)}.results-filter-readonly{opacity:.8}.results-filter-readonly ul li{display:flex;justify-content:space-between;gap:var(--legacy-space-2);font-size:var(--ui-control-size);color:var(--muted);padding:2px 0}.results-filter-reset{justify-self:start}.results-browser-table-wrap{min-width:0;width:100%}.results-browser-table{border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);background:var(--panel);width:100%;overflow-x:auto}.results-browser-row{display:grid;grid-template-columns:minmax(280px,1fr) 80px 120px 140px 50px 90px 110px 150px 110px;gap:var(--legacy-space-3);align-items:center;padding:var(--legacy-space-2) var(--legacy-space-3);border-top:var(--border-hair) solid var(--line);font-size:var(--ui-control-size);min-width:fit-content}.results-browser-row:first-child{border-top:0}.results-browser-row-toggle{display:contents}.results-browser-row.expanded{background:var(--panel-raised)}.results-browser-head{color:var(--muted);background:var(--panel-soft);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase;padding:var(--legacy-space-2) var(--legacy-space-3)}.results-browser-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.results-browser-row span[data-label=Titel]{overflow:visible;white-space:normal;text-overflow:clip;line-height:1.35;overflow-wrap:anywhere}.results-browser-row-detail{grid-column:1 / -1;padding:var(--legacy-space-3);border-top:var(--border-hair) dashed var(--line);color:var(--muted);font-size:var(--ui-control-size);line-height:1.55}.results-browser-row-detail ul{margin:var(--legacy-space-2) 0 0;padding:0;list-style:none;display:grid;gap:var(--legacy-space-1)}.results-environment-value{color:var(--text);font-size:var(--fs-lg);line-height:var(--lh-prose)}.results-environment-value strong{color:var(--heading)}.results-environment-value p{margin:var(--legacy-space-1) 0 var(--legacy-space-3);overflow-wrap:anywhere;white-space:pre-wrap}.results-processing-alert{margin-bottom:var(--legacy-space-3)}@media(max-width:1150px){.results-browser-layout{grid-template-columns:1fr}.results-filter-panel{position:static;max-height:none}.results-browser-row{grid-template-columns:1fr 1fr;gap:var(--legacy-space-2) var(--legacy-space-4)}.results-browser-row span:before{content:attr(data-label);display:block;margin-bottom:2px;color:var(--muted);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.results-browser-head{display:none}}.datahub-mitre-management{margin-top:var(--legacy-space-6);padding-top:var(--legacy-space-5);border-top:var(--border-hair) solid var(--line)}.datahub-mitre-card{display:flex;align-items:center;justify-content:space-between;gap:var(--legacy-space-4);padding:var(--legacy-space-4);border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-md);background:var(--panel-raised)}.datahub-mitre-info strong{display:block;color:var(--heading);font-size:var(--ui-heading-size)}.datahub-mitre-info p{margin:4px 0 0;color:var(--muted);font-size:var(--ui-control-size)}.datahub-mitre-actions{display:flex;align-items:center;gap:var(--legacy-space-3)}.datahub-mitre-upload-btn{cursor:pointer}.datahub-mitre-file-input{display:none}.baseline-table .tenant-file-row{grid-template-columns:minmax(260px,1fr) 90px 160px 150px 92px;min-width:760px}.baseline-table .tenant-file-row>span{white-space:nowrap}.baseline-cell-num{font:inherit;font-variant-numeric:tabular-nums}.baseline-table .baseline-status{display:inline-flex;align-items:center;gap:var(--legacy-space-2);color:var(--text);font-weight:var(--ui-body-weight)}.baseline-table .baseline-status:before{content:"";flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--success)}.baseline-table .baseline-status[data-status=metadata-required]:before{background:var(--warning)}@media(max-width:1050px){.baseline-table .tenant-file-row{grid-template-columns:1fr 1fr;min-width:0}}.tenant-detail-page .tenant-editor-header{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:var(--space-5);padding-bottom:var(--space-5);border-bottom:0}.tenant-detail-page .tenant-back{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);min-width:0;min-height:var(--control-h);font-size:var(--fs-md)}.tenant-identity{align-self:center;min-width:0;padding:var(--space-3) 0}.tenant-detail-page .tenant-identity h2{margin:0;padding-bottom:var(--space-1);overflow:hidden;font-size:calc(var(--fs-xl) * 3);font-weight:var(--fw-semibold);line-height:1.15;letter-spacing:-.04em;text-overflow:ellipsis;white-space:nowrap}.tenant-detail-page .tenant-identity p{margin:var(--space-5) 0 0;color:var(--text-secondary);font-size:var(--fs-xl);font-variant-numeric:tabular-nums}.tenant-rack{display:flex;justify-content:flex-end}.tenant-detail-page .tenant-navigation-open{min-width:calc(var(--space-8) * 2.5)}.tenant-detail-page>.tenant-actions{justify-content:flex-end;flex-wrap:nowrap;gap:var(--space-3);padding:var(--space-4) 0;border-bottom:0}.tenant-detail-page>.tenant-actions .btn{min-width:calc(var(--space-8) * 3)}.tenant-detail-page>.tenant-actions .btn.primary{min-width:calc(var(--space-8) * 4.25)}.tenant-detail-page>.tenant-actions .gpo-folder-actions .btn{min-width:calc(var(--space-8) * 5.25)}.tenant-detail-page .tenant-editor{margin-top:var(--space-4);padding:0;overflow:hidden;border-radius:var(--radius-nav-item);background:linear-gradient(135deg,var(--surface-panel-raised),var(--surface-panel))}.tenant-section-bar{display:flex;align-items:center;justify-content:space-between;min-height:calc(var(--row-h) + var(--space-3));padding:0 var(--space-5);border-bottom:var(--bw-hairline) solid var(--border-subtle);color:var(--text-secondary);font-size:var(--fs-md);letter-spacing:var(--ls-caps);text-transform:uppercase}.tenant-section-bar>span{display:inline-flex;align-items:center;gap:var(--space-2)}.tenant-section-bar strong{color:var(--text-secondary);font-size:inherit;font-weight:var(--fw-semibold)}.tenant-section-bar i{color:var(--text-muted);font-style:normal}.tenant-detail-page .tenant-editor-form{gap:var(--space-5) var(--space-8);padding:var(--space-4) var(--space-5) var(--space-5)}.tenant-detail-page .tenant-editor-form label{color:var(--text-primary);font-size:var(--fs-lg);font-weight:var(--fw-regular)}.tenant-detail-page .tenant-editor-form label>span{color:var(--text-primary);font-size:var(--fs-md)}.tenant-detail-page .tenant-editor-form .input{min-height:calc(var(--control-h) + var(--space-4));border-radius:var(--radius-nav-item);font-size:var(--fs-md)}.tenant-detail-page .tenant-editor-form .input[readonly]{border-color:var(--border-subtle);color:var(--text-secondary);background:var(--surface-panel);cursor:default}.tenant-detail-page .tenant-editor-description textarea{min-height:calc(var(--space-8) * 4);padding-top:var(--space-3)}.tenant-detail-page .tenant-files{margin-top:var(--space-3)}.tenant-scan-history{overflow:hidden;border:var(--bw-hairline) solid var(--border-default);border-radius:var(--radius-nav-item);background:linear-gradient(135deg,var(--surface-panel-raised),var(--surface-panel))}.tenant-scan-history>summary{cursor:pointer;list-style:none}.tenant-scan-history>summary::-webkit-details-marker{display:none}.tenant-section-bar .tenant-history-meta{gap:var(--space-5)}.tenant-history-meta b{display:inline-grid;place-items:center;min-width:var(--control-h);min-height:var(--control-h-sm);padding:0 var(--space-2);border:var(--bw-hairline) solid var(--border-default);border-radius:var(--radius-nav-item);color:var(--text-secondary);background:var(--surface-input);font-size:var(--fs-md);font-weight:var(--fw-regular);font-variant-numeric:tabular-nums}.tenant-history-meta .triangle-icon{transition:transform var(--dur-base) var(--ease)}.tenant-scan-history[open] .tenant-history-meta .triangle-icon-right{transform:rotate(-90deg)}.tenant-scan-history>.tenant-file-table{border:0;border-radius:0;background:transparent}.tenant-scan-history .tenant-file-row{min-height:calc(var(--row-h) + var(--space-4));padding-inline:var(--space-5);font-size:var(--fs-md)}.tenant-detail-page .tenant-file-row{grid-template-columns:minmax(calc(var(--space-8) * 5),1.1fr) minmax(calc(var(--space-8) * 5),1.15fr) .62fr .55fr .72fr minmax(calc(var(--space-8) * 5),1.2fr) .55fr;min-width:calc(var(--space-8) * 29)}.tenant-timeslots{display:grid;gap:var(--space-3);margin-top:var(--space-8)}.tenant-timeslots-heading{margin:0;color:var(--text);font-size:calc(var(--fs-xl) * 1.25);font-weight:var(--fw-semibold)}.tenant-timeslots .tenant-files{margin-top:0}.tenant-timeslot.is-selected{border-color:var(--state-active);outline:var(--bw-hairline) solid var(--state-active);outline-offset:calc(-1 * var(--bw-hairline))}.tenant-timeslot-title{display:inline-flex;align-items:center;gap:var(--space-3)}.tenant-timeslot-title input[type=checkbox]{width:16px;height:16px;margin:0;accent-color:var(--state-active);cursor:pointer}.tenant-timeslot-actions{display:inline-flex;align-items:center;justify-content:flex-end;gap:var(--space-2);margin-left:auto;margin-right:var(--space-5);letter-spacing:normal;text-transform:none}.tenant-timeslot-actions .btn{min-width:calc(var(--space-8) * 3);white-space:nowrap}.tenant-timeslot-actions .btn.primary{min-width:calc(var(--space-8) * 4)}.tenant-timeslot-actions .gpo-folder-actions .btn{min-width:calc(var(--space-8) * 7)}.tenant-timeslot-create-row{display:grid;place-items:center;width:100%;min-height:calc(var(--control-h) + var(--space-3));padding:0;border:var(--bw-hairline) solid var(--border-default);border-radius:var(--radius-nav-item);color:var(--text-secondary);background:var(--surface-panel);cursor:pointer}.tenant-timeslot-create-row span{font-size:calc(var(--fs-xl) * 1.6);font-weight:var(--fw-regular);line-height:1}.tenant-timeslot-create-row:hover{color:var(--text-primary);background:var(--surface-panel-raised)}.tenant-timeslot-create-row:focus-visible{outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:var(--bw-hairline)}.tenant-timeslot-selection{display:flex;align-items:center;gap:var(--space-3);min-height:var(--control-h);padding:0;border:0;border-radius:0;color:var(--text-secondary);font-size:var(--fs-lg)}.tenant-timeslot-selection strong{color:var(--text-primary)}.tenant-timeslot-report-actions{display:flex;align-items:center;gap:var(--space-1)}.tenant-timeslot-report-actions .tenant-scan-delete{min-width:var(--control-h-sm);width:var(--control-h-sm);height:var(--control-h-sm);padding:0}.timeslot-dialog-form{display:grid;gap:var(--space-4);min-width:min(360px,72vw)}.timeslot-dialog-form label{display:grid;gap:var(--space-2);color:var(--text-primary);font-weight:var(--fw-semibold)}.timeslot-dialog-form p{margin:0;color:var(--text-secondary);line-height:1.5}.timeslot-dialog-form footer{display:flex;justify-content:flex-end;gap:var(--space-2);padding-top:var(--space-3);border-top:var(--bw-hairline) solid var(--border-subtle)}.tenant-scan-history .tenant-file-head{min-height:calc(var(--row-h) + var(--space-2));background:color-mix(in srgb,var(--surface-input) 36%,transparent);font-size:var(--fs-sm)}.tenant-scan-history .tenant-file-row b{color:var(--text-primary);font-weight:var(--fw-semibold)}.tenant-scan-history .tenant-scan-delete{min-width:calc(var(--space-8) * 2.75)}@media(max-width:1050px){.tenant-detail-page .tenant-editor-header{grid-template-columns:1fr}.tenant-detail-page .tenant-file-row{min-width:0}}@media(max-width:800px){.tenant-detail-page>.tenant-actions{flex-wrap:wrap}.tenant-timeslot-actions{flex-wrap:wrap;justify-content:flex-start;margin:var(--space-2) 0}.tenant-timeslot>summary{align-items:flex-start;flex-wrap:wrap;padding-block:var(--space-2)}}.datahub-page.tenant-detail-page{height:100%;min-height:0;padding:var(--panel-inset);overflow:hidden}.tenant-detail-page>.tenant-detail-layout{display:grid;grid-template-columns:clamp(420px,27vw,520px) minmax(0,1fr);width:100%;max-width:none;height:100%;min-height:0;margin:0}.tenant-detail-navigation,.tenant-detail-information{min-width:0;min-height:0;background:var(--surface-app)}.tenant-detail-navigation{display:flex;flex-direction:column;overflow:hidden;border-right:var(--bw-hairline) solid var(--border-default)}.tenant-detail-information{display:block;padding:var(--space-5) var(--space-6);overflow-y:auto;scrollbar-color:var(--border-strong) var(--surface-panel);scrollbar-width:thin}.tenant-information-sheet{width:min(794px,100%);background:transparent}.tenant-policy-information{width:100%}.tenant-detail-page .tenant-editor-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:var(--space-3);flex:0 0 auto;padding:var(--space-5) var(--space-5) var(--space-4);border-bottom:0}.tenant-detail-page .tenant-back{grid-column:1;justify-self:start;min-height:var(--control-h);margin-bottom:0;color:var(--text-secondary)}.tenant-detail-page .tenant-navigation-open{grid-column:2;justify-self:end}.tenant-detail-page .tenant-identity{grid-column:1 / -1;padding:0;margin-top:var(--space-4)}.tenant-detail-page .tenant-identity h2{padding:0;font-size:var(--type-h2-size);font-weight:var(--fw-semibold);line-height:1.15;letter-spacing:-.03em}.tenant-detail-page .tenant-identity p{margin:var(--space-2) 0 0;font-size:var(--fs-lg)}.tenant-timeslots{display:flex;flex:1 1 auto;flex-direction:column;gap:0;min-height:0;margin:0;overflow:hidden}.tenant-timeslots-header{display:flex;flex:0 0 auto;align-items:center;justify-content:space-between;gap:var(--space-3);padding:0 var(--space-5) var(--space-3);border-bottom:var(--bw-hairline) solid var(--border-default)}.tenant-timeslots-heading{margin:0;color:var(--text-primary);font-size:var(--type-h3-size);font-weight:var(--fw-semibold);letter-spacing:0;text-transform:none}.tenant-timeslot-add{flex:0 0 auto}.tenant-timeslot-add>span{margin-right:var(--space-1);font-size:var(--fs-lg);line-height:1}.tenant-timeslot-list{display:grid;grid-auto-rows:max-content;align-content:start;flex:1 1 auto;gap:var(--space-3);min-height:0;padding:var(--space-2) var(--space-2) var(--space-5);overflow-y:auto;scrollbar-color:var(--border-strong) var(--surface-inset);scrollbar-gutter:stable;scrollbar-width:thin}.tenant-detail-page .tenant-files{margin:0}.tenant-scan-history{position:relative;overflow:hidden;border:var(--bw-hairline) solid var(--border-default);border-radius:var(--radius-nav-item);background:var(--surface-panel-raised)}.tenant-scan-history:after{content:none}.tenant-timeslot.is-selected{border-color:var(--state-active);outline:var(--bw-hairline) solid var(--state-active);outline-offset:calc(-1 * var(--bw-hairline));box-shadow:inset var(--marker-width) 0 0 var(--state-active)}.tenant-timeslot.is-selected:after{display:none}.tenant-timeslot>.tenant-section-bar{min-height:calc(var(--row-h) + var(--space-4));padding:0 var(--space-4) 0 var(--space-5);border-bottom:0;background:transparent;letter-spacing:normal;text-transform:none}.tenant-timeslot.is-selected>.tenant-section-bar{background:var(--surface-hover)}.tenant-timeslot>.tenant-section-bar:hover{background:var(--surface-hover)}.tenant-timeslot-title{align-self:stretch;flex:0 0 calc(var(--space-8) * 4.25);padding-left:var(--space-1);gap:var(--space-3);cursor:pointer}.tenant-timeslot>.tenant-section-bar>.tenant-history-meta{align-self:stretch;flex:1 1 auto;justify-content:flex-end;cursor:pointer}.tenant-timeslot-title input[type=checkbox],.tenant-report-row input[type=checkbox]{flex:0 0 auto;width:var(--space-4);height:var(--space-4);margin:0;accent-color:var(--state-active);cursor:pointer}.tenant-timeslot-title strong{color:var(--text-primary);font-size:var(--fs-lg);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}.tenant-section-bar .tenant-history-meta{gap:var(--space-4)}.tenant-history-meta b{min-width:var(--control-h);min-height:var(--control-h);border-color:var(--border-default);background:var(--surface-panel-raised);font-size:var(--fs-md)}.tenant-report-list{border-top:var(--bw-hairline) solid var(--border-subtle);container:timeslot-sources / inline-size}.tenant-report-row{display:grid;grid-template-columns:var(--space-5) minmax(calc(var(--space-8) * 3.75),1fr) calc(var(--space-8) * 4.25) calc(var(--space-8) * 3) calc(var(--space-8) * 2);align-items:center;gap:var(--space-2);min-height:calc(var(--row-h) + var(--space-5));padding:var(--space-2) var(--space-3);border-bottom:var(--bw-hairline) solid var(--border-subtle);background:var(--surface-panel-raised)}.tenant-report-row:last-child{border-bottom:0}.tenant-report-row:not(.tenant-report-head):hover{background:var(--surface-hover)}.tenant-report-head{min-height:calc(var(--row-h) + var(--space-2));color:var(--text-secondary);background:var(--surface-panel);font-size:var(--type-table-head-size);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);text-transform:uppercase}.tenant-report-copy{display:grid;gap:var(--space-1);min-width:0}.tenant-report-row>*{min-width:0}.tenant-report-copy>*{min-width:0}.tenant-report-copy b{overflow:hidden;color:var(--text-primary);font-size:var(--fs-lg);font-weight:var(--fw-regular);text-overflow:ellipsis;white-space:nowrap}.tenant-report-copy small{overflow:hidden;color:var(--text-secondary);font-size:var(--type-meta-size);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap}.tenant-report-imported{overflow:hidden;color:var(--text-primary);font-size:var(--type-body-size);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap}.tenant-report-status{display:inline-flex;align-items:center;gap:var(--space-2);min-width:0;color:var(--text-primary);font-size:var(--type-body-size);font-weight:var(--fw-regular);white-space:nowrap}.tenant-report-status:before{flex:0 0 auto;width:var(--space-2);height:var(--space-2);border-radius:50%;background:var(--text-secondary);content:""}.tenant-report-status[data-status=recognized]:before{background:var(--state-done)}.tenant-report-status[data-status=succeeded]:before{background:var(--state-done)}.tenant-report-status[data-status=generic]:before{background:var(--outcome-warning)}.tenant-report-status[data-status=queued]:before,.tenant-report-status[data-status=running]:before{background:var(--info)}.tenant-report-status[data-status=partial]:before,.tenant-report-status[data-status=upload-required]:before,.tenant-report-status[data-status=storage-unavailable]:before,.tenant-report-status[data-status=recovery-required]:before{background:var(--warning)}.tenant-report-status[data-status=not-viewable]:before,.tenant-report-status[data-status=unavailable]:before,.tenant-report-status[data-status=processing-error]:before,.tenant-report-status[data-status=dead-letter]:before{background:var(--state-offline)}.tenant-report-status[data-status=processing-error],.tenant-report-status[data-status=dead-letter]{color:var(--state-offline)}.tenant-report-status[data-status=reimport-recommended]:before,.tenant-report-status[data-status=re-evaluation-required]:before,.tenant-report-status[data-status=review-required]:before{background:var(--warning)}.tenant-report-status[data-status=reimport-recommended],.tenant-report-status[data-status=re-evaluation-required],.tenant-report-status[data-status=review-required]{color:var(--warning)}.tenant-processing-alert{display:grid;gap:var(--space-3);margin:var(--space-4) var(--space-5);padding:var(--space-4);border:var(--bw-hairline) solid var(--warning);color:var(--text-primary);background:color-mix(in srgb,var(--warning) 8%,var(--surface-panel))}.tenant-processing-alert>header{display:grid;gap:var(--space-1)}.tenant-processing-alert>header>strong{color:var(--warning);font-size:var(--fs-lg)}.tenant-processing-alert[data-status=error]{border-color:var(--state-offline);background:color-mix(in srgb,var(--state-offline) 8%,var(--surface-panel))}.tenant-processing-alert[data-status=error]>header>strong{color:var(--state-offline)}.tenant-processing-alert>header>span{color:var(--text-secondary);font-size:var(--fs-md)}.tenant-processing-alert-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--space-4);padding-top:var(--space-3);border-top:var(--bw-hairline) solid var(--border-subtle)}.tenant-processing-alert-row p{margin:var(--space-1) 0 0;color:var(--text-secondary);font-size:var(--fs-md);line-height:var(--lh-prose)}.tenant-processing-alert-row .btn{white-space:nowrap}.tenant-report-row input[type=checkbox]:disabled{cursor:not-allowed;opacity:.42}.tenant-report-row .tenant-scan-delete{min-width:calc(var(--space-8) * 2);width:100%}.tenant-report-gpo .tenant-report-copy b,.tenant-report-gpo .tenant-report-copy small{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:normal}.tenant-report-gpo{grid-template-columns:var(--space-5) minmax(0,1fr) minmax(0,8rem) minmax(0,11rem) minmax(0,7rem)}.tenant-report-gpo .tenant-report-status{display:block;white-space:normal;overflow:visible}.tenant-report-gpo .tenant-report-status:before{display:inline-block;margin-inline-end:var(--space-1)}.tenant-report-gpo .tenant-gpo-row-actions .btn{white-space:normal;word-break:normal}@container timeslot-sources (max-width: 620px){.tenant-report-row:not(.tenant-report-head){grid-template-columns:var(--space-5) minmax(0,1fr) calc(var(--space-8) * 2.5);align-items:start}.tenant-report-head{display:none}.tenant-report-row>:first-child{grid-column:1;grid-row:1}.tenant-report-row>:not(:first-child){grid-column:2}.tenant-report-row>:last-child{grid-column:3;grid-row:1 / span 3;align-self:start}.tenant-report-copy b,.tenant-report-copy small,.tenant-report-imported{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}.tenant-report-imported{font-size:var(--type-meta-size)}.tenant-report-imported:before{content:"Imported: ";color:var(--text-secondary)}.tenant-report-status{flex-wrap:wrap;font-size:var(--type-table-body-size)}}.tenant-gpo-source-marker{display:grid;place-items:center;width:var(--space-5);height:var(--space-5);color:var(--surface-app);background:var(--marking-color);font-size:var(--type-badge-size);font-weight:var(--fw-semibold)}.tenant-report-row .tenant-gpo-view{min-width:calc(var(--space-8) * 2);width:100%}.tenant-gpo-row-actions{display:grid;gap:var(--space-1)}.gpo-source-recovery{flex-wrap:wrap;min-width:0}.gpo-source-recovery .gpo-folder-feedback{position:static;width:100%;overflow-wrap:normal}.tenant-gpo-row-actions .btn{width:100%;min-width:0;padding-inline:var(--space-1)}.tenant-report-row .btn:not(.danger):not(.primary):hover:not(:disabled){background:var(--button-bg);color:var(--button-text);border-color:var(--border-strong)}.tenant-report-no-action{color:var(--text-secondary);text-align:center}.tenant-timeslot-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-2);margin:0;padding:var(--space-3) var(--space-4) var(--space-3) var(--space-8);border-top:var(--bw-hairline) solid var(--border-subtle);background:var(--surface-panel-raised)}.tenant-timeslot-actions .btn,.tenant-timeslot-actions .gpo-folder-actions,.tenant-timeslot-actions .gpo-folder-actions .btn{width:100%;min-width:0;white-space:nowrap}.tenant-timeslot-actions .gpo-folder-actions{display:contents}.tenant-timeslot-add-heading{grid-column:1 / -1;display:grid;gap:var(--space-1);margin-bottom:var(--space-1)}.tenant-timeslot-add-heading h4{margin:0;font-size:var(--type-body-size);font-weight:var(--fw-semibold)}.tenant-timeslot-add-heading span,.tenant-timeslot-delete-action>span{color:var(--text-secondary);font-size:var(--type-meta-size)}.tenant-timeslot-delete-action{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-2);padding-top:var(--space-3);border-top:var(--bw-hairline) solid var(--border-subtle)}.tenant-timeslot-delete-action .btn{width:auto}.tenant-timeslot-actions .gpo-folder-feedback{position:static;grid-column:1 / -1;width:auto}.tenant-files-empty{margin:0;border:0;border-top:var(--bw-hairline) solid var(--border-subtle);border-radius:0;background:var(--surface-panel-raised)}.tenant-information-header{display:flex;flex:0 0 auto;align-items:center;justify-content:space-between;gap:var(--space-4);min-height:calc(var(--row-h) + var(--space-3));padding:0 0 var(--space-3);border-bottom:var(--bw-hairline) solid var(--border-default);background:transparent}.tenant-information-title,.tenant-information-actions{display:inline-flex;align-items:center;gap:var(--space-2)}.tenant-information-actions{flex-wrap:wrap;justify-content:flex-end}.tenant-information-title>strong{color:var(--text-primary);font-size:var(--type-h3-size);font-weight:var(--fw-semibold);letter-spacing:0;text-transform:none}.tenant-edit-client,.tenant-save-client{min-width:calc(var(--space-8) * 3)}.tenant-detail-page .tenant-editor-form{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:0}.tenant-detail-page .tenant-editor-form label{display:block;min-height:0;padding:var(--space-5) 0;border-bottom:var(--bw-hairline) solid var(--border-subtle)}.tenant-detail-page .tenant-editor-form .tenant-field-label{display:flex;align-items:baseline;justify-content:space-between;justify-self:stretch;gap:var(--space-2);margin-bottom:var(--space-3);padding:0;color:var(--text-primary);background:transparent;font-size:var(--type-label-size);font-weight:var(--fw-semibold);letter-spacing:0;text-transform:none}.tenant-detail-page .tenant-editor-form .tenant-field-label i{color:var(--text-secondary);font-size:var(--fs-md);font-style:normal;font-weight:var(--fw-regular)}.tenant-detail-page .tenant-editor-form .tenant-field-value{display:block;justify-self:start;color:var(--text-primary);font-size:var(--type-body-size);font-weight:var(--fw-regular);letter-spacing:normal;line-height:var(--lh-prose);text-align:left;text-transform:none}.tenant-field-prose{white-space:pre-wrap}.tenant-detail-page .tenant-editor-form .input{min-height:var(--control-h);width:auto;min-width:0;padding:0;border:0;border-radius:0;color:var(--text-primary);background:transparent;font-size:var(--fs-lg)}.tenant-detail-page .tenant-editor-form textarea.input{display:block;width:100%;min-height:calc(var(--space-8) * 2);line-height:var(--lh-prose);resize:none}.tenant-detail-page .tenant-editor-form.is-editing .input{min-height:calc(var(--control-h) + var(--space-3));margin:0;padding:0 var(--space-3);border:var(--bw-hairline) solid var(--border-default);border-radius:var(--btn-radius);background:var(--surface-input)}.tenant-detail-page .tenant-editor-form.is-editing textarea.input{min-height:calc(var(--space-8) * 8);padding-top:var(--space-3);resize:vertical}.tenant-detail-page .tenant-editor-form .input[readonly]{border:0;color:var(--text-primary);background:transparent}.tenant-information-sheet>.datahub-alert,.tenant-information-sheet>.tenant-save-feedback{width:auto;margin:var(--space-3) 0}.tenant-delete-client{display:inline-flex;align-items:center;justify-content:center;min-width:calc(var(--space-8) * 3);margin:0;cursor:pointer}.tenant-delete-client:focus-visible{outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:var(--space-1)}@media(max-width:1050px){.datahub-page.tenant-detail-page{height:auto;min-height:100%;overflow:visible}.tenant-detail-page>.tenant-detail-layout{grid-template-columns:1fr;height:auto}.tenant-detail-navigation{max-height:calc(var(--space-8) * 20);border-right:0;border-bottom:var(--bw-hairline) solid var(--border-default)}.tenant-detail-information{min-height:calc(var(--space-8) * 15);overflow:visible}.tenant-information-sheet{width:100%}}@media(max-width:700px){.tenant-timeslot-actions{grid-template-columns:1fr}.tenant-detail-page .tenant-editor-form label{grid-template-columns:1fr;gap:var(--space-2)}}.datahub-page>.datahub-rack-module{width:min(1180px,100%);margin-inline:auto}.datahub-rack-module{box-sizing:border-box;margin:0 0 var(--legacy-space-4);border:var(--border-hair) solid var(--line);color:var(--text);background:var(--panel)}.datahub-history-module{overflow:hidden}.datahub-history-scroll{overflow-x:auto;scrollbar-color:var(--line-strong) var(--surface-app);scrollbar-width:thin}.datahub-history-grid{display:flex;width:100%;min-width:1180px;background:var(--surface-app)}.datahub-history-column{display:grid;flex:1 0 145px;grid-template-rows:var(--row-height) minmax(160px,auto) 40px;min-width:145px;border-right:var(--border-hair) solid var(--line);background:var(--panel)}.datahub-history-column>header{display:grid;grid-template-columns:minmax(0,1fr);align-items:center;border-bottom:var(--border-hair) solid var(--line);background:var(--panel-raised)}.datahub-history-column.placeholder>header{display:grid;grid-template-columns:1fr;place-items:center;color:var(--muted);font-size:var(--ui-body-size)}.datahub-history-column.active>header{color:var(--state-selected-text);background:var(--state-selected)}.datahub-client-name{height:100%;min-width:0;padding:0 var(--legacy-space-3);overflow:hidden;border:0;color:inherit;background:transparent;cursor:pointer;font-size:var(--ui-body-size);font-weight:var(--ui-strong-weight);text-align:left;text-overflow:ellipsis;white-space:nowrap}.datahub-history-rows{display:grid;align-content:start;background:var(--panel)}.datahub-history-row{display:grid;grid-template-columns:28px minmax(0,1fr) 40px;align-items:center;min-height:40px;padding:0 var(--legacy-space-2);border-bottom:var(--border-hair) solid var(--line);background:var(--panel)}.datahub-history-row:hover{background:var(--panel-hover)}.datahub-history-row.selected{outline:var(--border-hair) solid var(--legacy-accent);outline-offset:-1px}.datahub-history-row.current,.datahub-history-row.selected{color:var(--state-selected-text);background:var(--state-selected)}.datahub-history-row.empty{grid-template-columns:1fr}.datahub-history-row.empty i{width:12px;height:12px;background:var(--surface-input)}.datahub-history-select,.datahub-history-date{color:inherit;cursor:pointer}.datahub-history-select{display:grid;place-items:center;width:24px;height:24px;padding:0;border:var(--border-hair) solid var(--line-strong);background:var(--surface-input);font-size:var(--ui-small-size)}.datahub-history-select[aria-pressed=true]{border-color:var(--state-selected-text)}.datahub-history-date{min-width:0;padding:0 var(--legacy-space-1);overflow:hidden;border:0;background:transparent;font-size:var(--ui-body-size);font-variant-numeric:tabular-nums;font-weight:var(--ui-strong-weight);text-align:left;text-overflow:ellipsis;white-space:nowrap}.datahub-history-source{color:inherit;font-family:var(--font-mono);font-size:var(--ui-small-size);text-align:right;opacity:.8}.datahub-history-column>footer{display:grid;place-items:center;padding:var(--legacy-space-1);border-top:var(--border-hair) solid var(--line);background:var(--panel-raised)}.datahub-history-column>footer strong{font-family:var(--font-mono);font-size:var(--ui-body-size);font-weight:var(--ui-strong-weight)}.datahub-history-column.placeholder>footer i{width:calc(100% - var(--legacy-space-2));height:30px;border:var(--border-hair) solid var(--line-strong);background:var(--surface-input)}.datahub-add-client{display:grid;flex:0 0 66px;grid-template-rows:var(--row-height) minmax(160px,auto) 40px;width:66px;min-width:66px;padding:0;border:0;border-left:var(--border-hair) solid var(--line);color:var(--muted);background:var(--panel);cursor:pointer}.datahub-add-client:hover{color:var(--heading);background:var(--panel-hover)}.datahub-add-client strong{display:grid;place-items:center;width:100%;height:var(--row-height);border-bottom:var(--border-hair) solid var(--line);background:var(--panel-raised);font-size:var(--ui-heading-size);font-weight:400}.datahub-add-client>span{border-bottom:var(--border-hair) solid var(--line)}.datahub-add-client footer{display:grid;place-items:center;padding:var(--legacy-space-1);border-top:var(--border-hair) solid var(--line);background:var(--panel-raised)}.datahub-add-client footer i{width:calc(100% - var(--legacy-space-2));height:30px;border:var(--border-hair) solid var(--line-strong);background:var(--surface-input)}.datahub-status-module{min-height:0;padding:0;border:0;background:transparent}.datahub-reference-controls{width:100%}.datahub-reference-knob{font-style:normal}.datahub-comparison-error{display:block;margin:0 var(--legacy-space-3) var(--legacy-space-2);color:var(--danger-text);font-size:var(--ui-control-size);font-style:normal}.datahub-tenants-module{min-height:0;padding:0;border:0;background:transparent}.datahub-tenant-card-rack{display:grid;grid-template-columns:repeat(auto-fill,var(--tile-compact-width));justify-content:start;gap:var(--segment-gap);padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface);box-shadow:none}.datahub-tenant-card{position:relative;min-height:var(--donut-card-min-h);padding:0;transition:background .12s ease,border-color .12s ease}.datahub-tenant-card:before{content:none}.datahub-tenant-card:hover,.datahub-tenant-card:focus-within{border-color:transparent;background:var(--tile-surface-hover);box-shadow:var(--tile-card-shadow)}.datahub-tenant-card.is-selected{border-color:var(--tile-selected-border);outline:var(--bw-emphasis) solid var(--tile-selected-border);outline-offset:calc(-1 * var(--bw-emphasis))}.datahub-tenant-processing-dot{position:absolute;z-index:3;top:var(--datahub-readiness-dot-inset);left:var(--datahub-readiness-dot-inset);width:var(--datahub-readiness-dot-size);height:var(--datahub-readiness-dot-size);border:var(--border-hair) solid var(--surface-app);border-radius:50%;background:var(--state-online);pointer-events:none}.datahub-tenant-processing-dot[data-status=update],.datahub-tenant-processing-dot[data-status=review]{background:var(--warning)}.datahub-tenant-processing-dot[data-status=processing],.datahub-tenant-processing-dot[data-status=error]{background:var(--state-offline)}.datahub-tenant-select{position:absolute;inset:0;display:grid;grid-template-rows:minmax(0,1fr) auto auto;align-items:start;width:100%;min-width:0;padding:var(--space-5) var(--space-3) var(--space-3);border:0;color:inherit;background:transparent;text-align:left;cursor:pointer}.datahub-tenant-select:focus-visible,.datahub-tenant-add:focus-visible{outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:calc(-1 * var(--bw-emphasis))}.datahub-tenant-name{display:-webkit-box;align-self:center;justify-self:center;min-width:0;max-width:100%;overflow:hidden;color:var(--donut-value);font:var(--fw-semibold) calc(var(--donut-title-size) * 1.35) / 1.15 var(--font-donut-display);overflow-wrap:anywhere;text-align:center;text-overflow:ellipsis;white-space:normal;-webkit-box-orient:vertical;-webkit-line-clamp:3}.datahub-tenant-summary{align-self:end;justify-self:start;display:flex;align-items:baseline;gap:var(--space-1);margin-bottom:var(--space-1);color:var(--muted);font-family:var(--font-donut-display);font-variant-numeric:tabular-nums}.datahub-tenant-summary strong{color:inherit;font-size:var(--ui-body-size);font-weight:var(--fw-semibold);line-height:1}.datahub-tenant-summary small,.datahub-tenant-latest{color:var(--muted);font-size:var(--ui-small-size);font-weight:var(--fw-regular)}.datahub-tenant-latest{min-width:0;max-width:calc(100% - 68px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.72}.datahub-tenant-show,.datahub-tenant-show:hover,.datahub-tenant-show:active{position:absolute;z-index:2;top:var(--space-3);right:var(--space-3);min-width:52px;border-color:var(--button-border);color:var(--button-marked-text);background:var(--button-marked-bg)}.datahub-tenant-show[data-status=update],.datahub-tenant-show[data-status=update]:hover,.datahub-tenant-show[data-status=update]:active,.datahub-tenant-show[data-status=review],.datahub-tenant-show[data-status=review]:hover,.datahub-tenant-show[data-status=review]:active{border-color:var(--warning);color:var(--warning);background:color-mix(in srgb,var(--warning) 8%,var(--donut-card-surface))}.datahub-tenant-show[data-status=error],.datahub-tenant-show[data-status=error]:hover,.datahub-tenant-show[data-status=error]:active{border-color:var(--state-offline);color:var(--state-offline);background:color-mix(in srgb,var(--state-offline) 8%,var(--donut-card-surface))}.datahub-tenant-open,.datahub-tenant-open:hover,.datahub-tenant-open:active{position:absolute;z-index:2;right:var(--space-3);bottom:var(--space-3);min-width:52px}.datahub-tenant-add{display:grid;place-items:center;color:var(--muted);cursor:pointer}.datahub-tenant-add:hover{color:var(--donut-all)}.datahub-tenant-add>span{font-family:var(--font-donut-display);font-size:calc(var(--donut-value-size) * 1.7);font-weight:var(--fw-regular);line-height:1;opacity:.48}.datahub-tenant-add:hover>span{opacity:.78}@media(prefers-reduced-motion:reduce){.datahub-tenant-card{transition:none}}@media(max-width:1100px){.datahub-tenant-card-rack{grid-template-columns:repeat(auto-fill,var(--tile-compact-width))}}@media(max-width:760px){.datahub-tenant-card-rack{grid-template-columns:minmax(0,var(--tile-compact-width))}}.datahub-reference-module{overflow:hidden}.datahub-rack-header{display:grid;grid-template-columns:24px 12px minmax(0,1fr) auto;align-items:center;gap:var(--legacy-space-2);min-height:46px;padding:0 var(--legacy-space-3);border-bottom:var(--border-hair) solid var(--line);background:var(--panel-raised)}.datahub-rack-header>strong{overflow:hidden;color:var(--text);font-size:var(--ui-body-size);font-weight:var(--ui-label-weight);letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap}.datahub-grip{color:var(--muted);font-size:var(--ui-heading-size)}.datahub-led{width:10px;height:10px;border-radius:50%;background:var(--success)}.datahub-rack-badge{min-height:24px;padding:2px var(--legacy-space-2);border:var(--border-hair) solid var(--line-strong);color:var(--text);background:var(--surface-input);font-size:var(--ui-small-size);line-height:20px;font-variant-numeric:tabular-nums;white-space:nowrap}.datahub-rack-body{display:flex;align-items:center;justify-content:flex-end;gap:var(--legacy-space-2);min-height:62px;padding:var(--legacy-space-2) var(--legacy-space-3)}.datahub-rack-actions{display:flex;align-items:center;gap:var(--legacy-space-2)}.datahub-maintenance-action{border:var(--bw-hairline) solid var(--button-border);color:var(--button-marked-text);background:var(--button-marked-bg);font-weight:var(--ui-strong-weight);cursor:pointer}.datahub-maintenance-action:hover{background:var(--button-marked-bg-hover)}.datahub-maintenance-action:disabled{color:var(--muted);background:var(--surface-active);cursor:default}.datahub-reference-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;gap:var(--legacy-space-4)}.datahub-reference-row>.mitre-library{grid-area:1 / 1 / 2 / -1}.datahub-reference-row>.baseline-catalog{grid-area:2 / 1 / 3 / -1;margin-top:0}.datahub-reference-row.is-mitre-hidden>.baseline-catalog{grid-area:1 / 1 / 2 / -1}.datahub-reference-row>.datahub-rack-module{margin-bottom:0}.baseline-upload-action{flex:0 0 auto;text-transform:none;letter-spacing:normal}.tenant-section-bar .baseline-title{gap:var(--space-3)}.tenant-timeslot-toolbar{display:grid;grid-template-columns:minmax(220px,.8fr) minmax(340px,1fr);align-items:end;gap:var(--legacy-space-3) var(--legacy-space-5);margin-bottom:var(--legacy-space-4);padding:var(--legacy-space-3);border:var(--border-hair) solid var(--line);background:var(--panel-raised)}.tenant-timeslot-toolbar label{display:grid;gap:var(--legacy-space-2);color:var(--heading);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight)}.tenant-timeslot-toolbar p{grid-column:1 / -1;margin:0;color:var(--muted)}.tenant-timeslot-create{display:grid;grid-template-columns:minmax(180px,1fr) auto;align-items:end;gap:var(--legacy-space-2)}.tenant-file-row.is-active-timeslot{background:var(--state-selected-flat)}.tenant-file-row.is-active-timeslot>span:first-child{border-left:var(--marker-width) solid var(--state-selected);padding-left:var(--legacy-space-2)}@media(max-width:760px){.datahub-reference-row{grid-template-columns:minmax(0,1fr)}.datahub-reference-row>.mitre-library{grid-area:1 / 1}.datahub-reference-row>.baseline-catalog{grid-area:2 / 1}.datahub-reference-row.is-mitre-hidden>.baseline-catalog{grid-area:1 / 1}.tenant-timeslot-toolbar,.tenant-timeslot-create{grid-template-columns:1fr}.datahub-rack-header{grid-template-columns:20px 10px minmax(0,1fr) auto}.datahub-rack-actions{justify-content:stretch}.datahub-rack-actions>*{flex:1}}.policy-analysis-panel{margin-top:var(--legacy-space-6);padding-top:var(--legacy-space-5);border-top:var(--border-hair) solid var(--line)}.policy-analysis-boundary{margin:0 0 var(--legacy-space-4);padding:var(--legacy-space-3);border-left:3px solid var(--warning);color:var(--heading);background:var(--panel-soft);font-size:var(--ui-control-size);line-height:1.5}.policy-analysis-empty{padding-block:28px}.policy-analysis-result-groups{display:grid;gap:var(--legacy-space-5)}.policy-analysis-result-group{display:grid;gap:var(--legacy-space-2)}.policy-analysis-result-group>h4{margin:0;color:var(--heading);font-size:var(--type-h4-size)}.policy-analysis-summary{display:grid;grid-template-columns:repeat(auto-fill,var(--tile-compact-width));justify-content:start;gap:var(--segment-gap);padding:var(--segment-inset);border-radius:var(--segment-radius);background:var(--segment-surface)}.policy-analysis-summary article{display:grid;gap:var(--legacy-space-1);min-width:0;padding:var(--legacy-space-3);overflow:hidden;border:0;border-left:3px solid var(--line-strong);border-radius:var(--tile-radius);background:var(--tile-surface);box-shadow:none}.policy-analysis-summary article[data-result=pass]{border-left-color:var(--success)}.policy-analysis-summary article[data-result=fail]{border-left-color:var(--critical)}.policy-analysis-summary span{color:var(--muted);font-size:var(--ui-control-size)}.policy-analysis-summary strong{color:var(--heading);font-family:inherit;font-size:var(--ui-heading-size)}.policy-analysis-summary small{color:var(--muted);font-size:var(--ui-small-size);line-height:1.4}.policy-analysis-problems article{min-height:116px}.policy-analysis-technical,.policy-analysis-controls{margin-top:var(--legacy-space-5);border-top:var(--border-hair) solid var(--line)}.policy-analysis-technical>summary,.policy-analysis-controls>summary{width:fit-content;padding:var(--legacy-space-3) 0;cursor:pointer;color:var(--heading);font-size:var(--ui-control-size);font-weight:var(--ui-strong-weight)}.policy-analysis-technical[open]>summary,.policy-analysis-controls[open]>summary{margin-bottom:var(--legacy-space-3)}.policy-analysis-columns{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);gap:var(--legacy-space-4);align-items:start}.policy-analysis-columns>section{min-width:0;padding:var(--legacy-space-3);border:var(--border-hair) solid var(--line);background:var(--panel)}.policy-analysis-subheading{display:flex;align-items:center;justify-content:space-between;gap:var(--legacy-space-2);margin-bottom:var(--legacy-space-2)}.policy-analysis-subheading h4{margin:0;color:var(--heading);font-size:var(--ui-body-size)}.policy-analysis-subheading span{color:var(--muted);font-family:var(--font-mono);font-size:var(--ui-control-size)}.policy-analysis-muted{margin:0;color:var(--muted);font-size:var(--ui-control-size);line-height:1.5}.policy-evaluation-list,.policy-review-list{display:grid;gap:var(--legacy-space-2)}.policy-evaluation-list article{padding:var(--legacy-space-3);border:var(--border-hair) solid var(--line);border-left:3px solid var(--legacy-accent);background:var(--panel-raised)}.policy-evaluation-list header,.policy-evaluation-list footer{display:flex;justify-content:space-between;gap:var(--legacy-space-2);color:var(--muted);font-size:var(--ui-control-size)}.policy-evaluation-list header strong,.policy-evaluation-list footer strong{color:var(--heading)}.policy-evaluation-list article>div{display:flex;flex-wrap:wrap;gap:var(--legacy-space-1) var(--legacy-space-3);margin:var(--legacy-space-2) 0;color:var(--muted);font-size:var(--ui-control-size)}.policy-review-item{border:var(--border-hair) solid var(--line);border-left:3px solid var(--warning);background:var(--panel-raised)}.policy-review-item summary{display:flex;justify-content:space-between;gap:var(--legacy-space-3);padding:var(--legacy-space-2) var(--legacy-space-3);cursor:pointer}.policy-review-item summary strong{color:var(--heading);font-size:var(--ui-control-size)}.policy-review-item summary span{color:var(--muted);font-size:var(--ui-small-size);text-align:right}.policy-review-detail{display:grid;gap:var(--legacy-space-1);padding:var(--legacy-space-2) var(--legacy-space-3) var(--legacy-space-3);border-top:var(--border-hair) dashed var(--line);color:var(--muted);font-size:var(--ui-small-size);overflow-wrap:anywhere}.policy-review-detail code{display:inline-block;margin:0 var(--legacy-space-1) var(--legacy-space-1) 0;color:var(--heading)}@media(max-width:900px){.policy-analysis-columns{grid-template-columns:1fr}}.policy-orchestration{margin-top:var(--legacy-space-6);padding-top:var(--legacy-space-5);border-top:var(--border-hair) solid var(--line)}.policy-profile-editor{margin-top:var(--legacy-space-3);border:var(--border-hair) solid var(--line);background:var(--panel)}.policy-profile-editor>summary{padding:var(--legacy-space-3);color:var(--heading);font-weight:var(--ui-strong-weight);cursor:pointer}.policy-profile-editor form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--legacy-space-3);padding:var(--legacy-space-3);border-top:var(--border-hair) solid var(--line)}.policy-profile-editor label{display:grid;gap:var(--legacy-space-1);color:var(--heading);font-size:var(--ui-control-size)}.policy-profile-editor label>span{color:var(--muted);font-size:var(--ui-small-size)}.policy-profile-editor fieldset{display:grid;grid-column:1 / -1;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--legacy-space-3);margin:0;padding:var(--legacy-space-3);border:var(--border-hair) solid var(--line)}.policy-profile-editor legend{padding-inline:var(--legacy-space-1);color:var(--muted);font-size:var(--ui-label-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.policy-profile-editor .policy-profile-product-toggle{display:flex;grid-column:1 / -1;grid-template-columns:auto 1fr;align-items:center}.policy-profile-editor footer{display:flex;grid-column:1 / -1;justify-content:flex-end}.policy-action-stages{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--segment-gap);margin-top:var(--legacy-space-4);padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface)}.policy-action-stages>section{min-width:0;padding:var(--legacy-space-3);overflow:hidden;border:var(--border-hair) solid var(--tile-border);border-radius:var(--tile-radius);background:var(--tile-surface);box-shadow:var(--tile-card-shadow)}.policy-action-stages h4{margin:0 0 var(--legacy-space-2);color:var(--heading);font-size:var(--ui-body-size)}.policy-action-stages section>p{margin:0;color:var(--muted);font-size:var(--ui-control-size)}.policy-action-stages article{display:flex;align-items:center;justify-content:space-between;gap:var(--legacy-space-3);padding:var(--legacy-space-2) 0;border-top:var(--border-hair) solid var(--line)}.policy-action-stages article>div{display:grid;gap:var(--legacy-space-1);min-width:0;color:var(--muted);font-size:var(--ui-small-size)}.policy-action-stages article strong{color:var(--heading);font-size:var(--ui-control-size)}.policy-action-stages article code{overflow:hidden;color:var(--muted);text-overflow:ellipsis;white-space:nowrap}.policy-action-reasons{display:flex;flex-wrap:wrap;gap:var(--legacy-space-1)}.policy-action-reasons code{color:var(--warning);white-space:normal;overflow-wrap:anywhere}@media(max-width:1000px){.policy-action-stages{grid-template-columns:1fr}.policy-profile-editor fieldset{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:620px){.policy-profile-editor form,.policy-profile-editor fieldset{grid-template-columns:1fr}}.dialog-backdrop{position:fixed;inset:0;z-index:1000;display:grid;place-items:center;padding:24px;background:var(--surface-scrim);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.dialog-window{width:min(500px,100%);max-height:calc(100vh - 48px);display:flex;flex-direction:column;border:1px solid var(--line-strong);border-radius:14px;background:var(--panel);box-shadow:var(--shadow)}.dialog-window>header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px 20px;border-bottom:1px solid var(--line)}.dialog-window>header h2{margin:0;font-size:var(--ui-heading-size)}.dialog-window>header button{width:24px;height:24px;border:1px solid var(--button-border);border-radius:0;color:var(--button-text);background:var(--button-bg);font-size:var(--ui-heading-size);cursor:pointer;display:grid;place-items:center}.dialog-window>header button:hover{color:var(--button-text);background:var(--button-bg-hover);border-color:var(--button-border)}.dialog-body{min-height:0;overflow:auto;padding:20px}.import-dialog-intro{margin:0 0 16px;color:var(--muted)}.import-progress{min-height:180px;display:flex;align-items:center;justify-content:center;gap:12px;color:var(--muted)}.import-spinner{position:relative;flex:0 0 24px;width:24px;height:24px}.import-spinner i{position:absolute;width:5px;height:5px;background:var(--line-strong);opacity:.55;animation:import-square-progress .8s steps(1,end) infinite}.import-spinner i:nth-child(1){top:0;left:9.5px;animation-delay:0s}.import-spinner i:nth-child(2){top:9.5px;right:0;animation-delay:-.6s}.import-spinner i:nth-child(3){bottom:0;left:9.5px;animation-delay:-.4s}.import-spinner i:nth-child(4){top:9.5px;left:0;animation-delay:-.2s}@keyframes import-square-progress{0%,24.999%{background:var(--critical);opacity:1;transform:scale(1.18)}25%,to{background:var(--line-strong);opacity:.55;transform:scale(.82)}}@media(prefers-reduced-motion:reduce){.import-spinner i{animation:none;transform:scale(.82)}.import-spinner i:first-child{background:var(--critical);opacity:1;transform:scale(1.18)}}.import-workflow-error{padding:10px 12px;border:1px solid var(--critical);border-radius:8px;color:var(--critical);background:color-mix(in srgb,var(--critical) 10%,transparent)}.import-preview-list{display:grid;max-height:min(58vh,660px);overflow-x:hidden;overflow-y:auto}.import-preview-entry{display:grid;grid-template-columns:28px minmax(0,1fr);gap:12px;min-width:0;padding:14px 0;border-bottom:1px solid var(--line)}.import-preview-entry:first-child{padding-top:0}.import-preview-entry:last-child{padding-bottom:0;border-bottom:0}.import-preview-selection{padding-top:2px}.import-preview-heading{display:flex;align-items:center;gap:9px;min-width:0}.import-preview-main{min-width:0}.import-preview-heading strong{min-width:0;overflow-wrap:anywhere}.import-status{flex:0 0 auto;font-size:var(--ui-label-size);font-weight:var(--fw-semibold)}.import-status-ready,.import-status-replacement{color:var(--low)}.import-status-warning,.import-status-duplicate{color:var(--medium)}.import-status-error{color:var(--critical)}.import-preview-meta{display:flex;flex-wrap:wrap;gap:5px 12px;margin-top:7px;color:var(--muted);font-size:var(--ui-value-size)}.import-hash{display:block;margin-top:7px;color:var(--muted);font-size:var(--ui-label-size);overflow-wrap:anywhere;white-space:normal}.import-message{margin:7px 0 0;color:var(--muted);font-size:var(--ui-reading-size);line-height:1.45;overflow-wrap:anywhere}.import-duplicate-notice{margin-top:12px;color:var(--muted);overflow-wrap:anywhere}.import-duplicate-notice h3{margin:0 0 4px;color:var(--text);font-size:var(--ui-value-size)}.import-duplicate-notice p{margin:0;font-size:var(--ui-reading-size);line-height:1.45}.import-replacement-notice{margin-top:12px;color:var(--muted);overflow-wrap:anywhere}.import-replacement-notice h3{margin:0 0 4px;color:var(--low);font-size:var(--ui-value-size)}.import-replacement-notice p{margin:0;font-size:var(--ui-reading-size);line-height:1.45}.import-preview-action{display:flex;align-items:center}.import-dialog-footer{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:16px;padding-top:14px;border-top:1px solid var(--line)}.import-dialog-footer>div{display:flex;gap:8px}.import-report-summary{display:grid;gap:5px;padding:16px;border-radius:10px;background:var(--panel-raised)}.import-report-summary span{color:var(--muted)}.import-report-list{display:grid;gap:8px;margin-top:12px;max-height:55vh;overflow:auto}.import-report-entry{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 12px;padding:11px 12px;border:1px solid var(--line);border-radius:8px}.import-report-entry small{grid-column:1 / -1;color:var(--muted)}.import-report-imported>span{color:var(--low)}.import-report-failed>span{color:var(--critical)}@media(max-width:760px){.import-preview-entry{grid-template-columns:26px minmax(0,1fr)}.import-preview-action{grid-column:2}.import-dialog-footer{align-items:stretch;flex-direction:column}.import-dialog-footer>div{justify-content:flex-end}}body{font-family:var(--font);font-size:var(--ui-body-size);line-height:1.45;font-weight:var(--ui-body-weight)}button,input,select,textarea{font-family:inherit}.btn,.icon-btn,.select,.input,.tab-btn,.bookmark-btn,.results-btn{font-size:var(--ui-control-size);line-height:1.35}.viewer{overflow:hidden;background:var(--bg)}.viewer-scroll,.table-scroll{height:100%;min-height:0;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--line-strong) var(--panel-soft)}.viewer-scroll::-webkit-scrollbar,.table-scroll::-webkit-scrollbar{width:10px;height:10px}.viewer-scroll::-webkit-scrollbar-track,.table-scroll::-webkit-scrollbar-track{background:var(--panel-soft)}.viewer-scroll::-webkit-scrollbar-thumb,.table-scroll::-webkit-scrollbar-thumb{border:2px solid var(--panel-soft);border-radius:var(--radius-pill);background:var(--line-strong)}.records-layout{display:grid;grid-template-columns:clamp(380px,24vw,470px) minmax(0,1fr);height:100%;min-height:0;padding:var(--panel-inset);background:var(--bg)}.record-list{min-width:0;min-height:0;padding:0;border:0;border-right:var(--border-hair) solid var(--border-strong);background:transparent;overflow-y:auto;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}.record-list::-webkit-scrollbar{width:6px}.record-list::-webkit-scrollbar-track{background:transparent;margin:4px 2px 4px 0}.record-list::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--radius-pill);min-height:36px}.record-list::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.record-card{position:relative;display:grid;grid-template-columns:28px minmax(0,1fr);grid-template-rows:auto auto;column-gap:var(--space-2);row-gap:var(--legacy-space-2);width:100%;min-height:74px;margin:0;padding:11px 14px;border:0;border-left:var(--marker-width) solid transparent;border-bottom:var(--border-hair) solid var(--line);border-radius:0;color:var(--text);background:var(--panel-raised);box-shadow:none;font:inherit;text-align:left;cursor:pointer;transition:background .12s ease,border-color .12s ease}.record-card:first-child{border-top-left-radius:var(--radius-sm);border-top-right-radius:var(--radius-sm)}.record-card:last-child{border-bottom-left-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm);border-bottom:0}.record-card:before{content:"";grid-column:1;grid-row:1 / 3;align-self:center;justify-self:center;width:24px;height:27px;clip-path:polygon(50% 0,94% 24%,94% 76%,50% 100%,6% 76%,6% 24%);background:var(--muted)}.record-card:after{content:"";grid-column:1;grid-row:1 / 3;align-self:center;justify-self:center;width:7px;height:4px;border-left:2px solid var(--sev-on);border-bottom:2px solid var(--sev-on);transform:translate(-6.5px,.5px) rotate(-45deg);pointer-events:none}.record-card:hover{border-color:var(--line);background:var(--panel-hover);box-shadow:none;transform:none}.record-card.active,.record-card.active:hover{z-index:1;border-color:var(--line);border-left-color:var(--state-selected-flat-border);color:var(--state-selected-flat-text);background:var(--state-selected-flat);box-shadow:none;transform:none}.record-card.severity-critical:before{background:var(--critical)}.record-card.severity-high:before{background:var(--high)}.record-card.severity-medium:before{background:var(--medium)}.record-card.severity-low:before{background:var(--low)}.record-card.severity-info:before{background:var(--info)}.record-card.is-workspace{outline:2px solid var(--state-active);outline-offset:-2px}.record-title{grid-column:2;grid-row:1;align-self:end;min-width:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--fw-regular);line-height:1.28;overflow-wrap:anywhere}.record-meta{min-width:0;color:var(--muted);font-size:var(--ui-control-size);font-weight:400;line-height:1.3}.record-meta-line{grid-column:2;grid-row:2;display:flex;flex-wrap:wrap;align-items:center;gap:var(--legacy-space-2);min-width:0}.record-diagnostic-badge{display:inline-flex;align-items:center;min-height:20px;padding:2px var(--legacy-space-2);border:var(--border-hair) solid var(--line-strong);border-radius:var(--legacy-radius-sm);color:var(--text);background:transparent;font-size:var(--ui-badge-size);font-weight:var(--ui-label-weight);line-height:1.18;letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.record-card.active .record-title{color:var(--state-selected-flat-text)}.record-card.active .record-meta{color:var(--state-selected-flat-muted)}.record-card.active .record-diagnostic-badge{border-color:var(--state-selected-flat-muted);color:var(--state-selected-flat-text)}.action-pill{display:inline-flex;width:fit-content;margin-left:var(--legacy-space-1);padding:1px var(--legacy-space-1);border:var(--border-hair) solid var(--success);border-radius:var(--legacy-radius-sm);color:var(--text-on-accent);background:var(--success);font-size:var(--ui-small-size);line-height:1.4;vertical-align:middle}.finding-reader{min-width:0;min-height:0;padding:var(--legacy-space-6) 0 var(--space-7);color:var(--text);background:var(--bg);overflow-y:auto}.finding-reader>*{width:min(834px,calc(100% - var(--reader-inset) - var(--legacy-space-6)));margin-left:var(--reader-inset);margin-right:auto}.reader-nav{margin-bottom:var(--legacy-space-6);color:var(--muted);font-size:var(--ui-control-size)}.reader-nav button{color:var(--text)}.reader-heading{padding-bottom:var(--legacy-space-5);border-color:var(--line)}.reader-heading h2{min-width:0;color:var(--heading);font-size:var(--type-detail-title-size);font-weight:var(--ui-strong-weight);line-height:1.3;letter-spacing:0}.reader-heading h2 .technical-path,.reader-summary h3 .technical-path{display:block;box-sizing:border-box;width:100%;margin-top:var(--space-1)}.reader-title-hex{width:26px;height:30px}.finding-badges,.mitre-line{gap:var(--legacy-space-2);margin-top:var(--legacy-space-3);font-size:var(--ui-badge-size)}.status-badge,.severity-badge,.mitre-badge,.reader-severity{display:inline-flex;align-items:center;min-height:22px;height:auto;padding:3px var(--legacy-space-2);border:var(--border-hair) solid var(--line-strong);border-radius:var(--legacy-radius-sm);color:var(--text);background:transparent;font-size:var(--ui-badge-size);font-weight:var(--ui-label-weight);line-height:1.18;letter-spacing:var(--ui-label-tracking);text-transform:uppercase;white-space:normal}.severity-badge.severity-critical,.reader-severity.severity-critical{border-color:var(--critical-badge);color:var(--severity-ink);background:var(--critical-badge)}.severity-badge.severity-high,.reader-severity.severity-high{border-color:var(--high-badge);color:var(--severity-ink);background:var(--high-badge)}.severity-badge.severity-medium,.reader-severity.severity-medium{border-color:var(--medium-badge);color:var(--severity-ink);background:var(--medium-badge)}.severity-badge.severity-low,.reader-severity.severity-low{border-color:var(--low-badge);color:var(--severity-ink);background:var(--low-badge)}.severity-badge.severity-info,.reader-severity.severity-info{border-color:var(--info-badge);color:var(--severity-ink);background:var(--info-badge)}.reader-summary,.review-grid,.all-fields{border-color:var(--line)}.reader-summary h3{color:var(--heading);font-size:var(--type-h3-size);font-weight:var(--ui-strong-weight);line-height:1.3;letter-spacing:0}.reader-summary h4{color:var(--heading);font-size:var(--ui-reading-size);font-weight:var(--ui-label-weight);line-height:1.25;letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.reader-summary p,.reader-summary .rich-text-value{color:var(--text);font-size:var(--ui-reading-size);font-weight:400;line-height:1.55}.dashboard-grid label,.review-grid>label{color:var(--heading);font-size:var(--ui-control-size);font-weight:var(--ui-label-weight);letter-spacing:var(--ui-label-tracking)}.dashboard-grid input,.dashboard-grid select,.review-grid textarea{border-color:var(--line);background-color:var(--surface-inset);color:var(--text)}.tile-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(0,var(--tile-content-width)));align-items:stretch;align-content:start;justify-content:start;gap:var(--segment-gap);min-height:100%;padding:var(--segment-inset);border:var(--border-hair) solid var(--segment-border);border-radius:var(--segment-radius);background:var(--segment-surface)}.data-tile{position:relative;display:grid;grid-template-columns:32px minmax(0,1fr) 30px;align-items:start;gap:var(--legacy-space-3);min-width:0;min-height:var(--tile-content-min-height);padding:var(--legacy-space-4);border:var(--border-hair) solid var(--tile-border);border-radius:var(--tile-radius);color:var(--text);background:var(--tile-surface);box-shadow:var(--tile-card-shadow);cursor:pointer;overflow:hidden;text-align:left;transition:background .12s ease,border-color .12s ease}.data-tile:hover{border-color:transparent;border-radius:var(--tile-radius);background:var(--tile-surface-hover);box-shadow:var(--tile-card-shadow);outline:0}.data-tile:focus-visible{border-color:transparent;border-radius:var(--tile-radius);background:var(--tile-surface-hover);box-shadow:var(--tile-card-shadow);outline:var(--bw-emphasis) solid var(--focus-ring);outline-offset:calc(-1 * var(--bw-emphasis))}.data-tile-hex{position:relative;width:26px;height:30px;margin-top:1px;clip-path:polygon(50% 0,94% 24%,94% 76%,50% 100%,6% 76%,6% 24%);background:var(--muted)}.data-tile-hex:after{content:"";position:absolute;left:2px;top:12px;width:7px;height:4px;border-left:2px solid var(--sev-on);border-bottom:2px solid var(--sev-on);transform:rotate(-45deg);pointer-events:none}.data-tile.severity-critical .data-tile-hex{background:var(--critical)}.data-tile.severity-high .data-tile-hex{background:var(--high)}.data-tile.severity-medium .data-tile-hex{background:var(--medium)}.data-tile.severity-low .data-tile-hex{background:var(--low)}.data-tile.severity-info .data-tile-hex{background:var(--info)}.data-tile-content{min-width:0}.data-tile-content h3{margin:0;color:var(--heading);font-size:var(--type-h4-size);font-weight:var(--ui-strong-weight);line-height:1.35;overflow-wrap:normal;word-break:normal;-webkit-hyphens:manual;hyphens:manual}.data-tile[data-tool=group-policy] .data-tile-content h3{max-width:100%;white-space:normal;overflow-wrap:anywhere;word-break:normal}.data-tile-badges{display:flex;flex-wrap:wrap;gap:var(--legacy-space-2);margin-top:var(--legacy-space-4);font-size:var(--ui-control-size)}.tile-grid>.data-tile .data-tile-badges{display:grid;grid-template-columns:max-content max-content;align-items:start;justify-content:start}.tile-grid>.data-tile .data-tile-badges>*{max-width:100%;overflow-wrap:normal;word-break:normal}.tile-grid>.data-tile [data-badge-role=status],.tile-grid>.data-tile [data-badge-role=category],.tile-grid>.data-tile [data-badge-role=score]{grid-column:1 / -1;justify-self:start}.data-tile-actions{display:grid;gap:var(--legacy-space-2);align-content:start}.tile-bookmark-btn,.tile-results-btn{display:grid;place-items:center;width:28px;height:28px;padding:0;border:var(--border-hair) solid var(--line);border-radius:var(--legacy-radius-sm);color:var(--text);background:var(--panel-raised);font-size:var(--ui-control-size);font-weight:var(--ui-label-weight);cursor:pointer}.tile-bookmark-btn[aria-pressed=true]{border-color:var(--state-active);color:var(--state-active-text);background:var(--state-active)}.tile-results-btn,.tile-results-btn:hover{border-color:var(--border-results-action);color:var(--text-results-action);background:var(--surface-results-action)}.tile-results-btn.is-open,.tile-results-btn.is-open:hover{border-color:var(--result-color);color:var(--text-on-accent);background:var(--result-color)}.data-tile.is-bookmarked{outline:2px solid var(--state-active);outline-offset:-2px}.table-scroll{padding:var(--panel-inset)}.view-table table{width:max-content;min-width:100%;border-color:var(--line);background:var(--panel);color:var(--text);font-size:var(--type-table-body-size)}.view-table th,.view-table td{min-width:var(--table-col-min-w);max-width:min(440px,46vw);padding:var(--legacy-space-1) var(--legacy-space-2);border-color:var(--line);white-space:normal;overflow-wrap:break-word}.view-table th{color:var(--muted);background:var(--panel-soft);font-size:var(--type-table-head-size);font-weight:var(--ui-label-weight);line-height:1.2;letter-spacing:var(--ui-label-tracking);text-transform:uppercase}.view-table td{color:var(--text);background:var(--panel);font-size:var(--type-table-body-size);font-weight:400;line-height:1.35}.view-table tbody tr:nth-child(2n) td{background:var(--panel-soft)}.view-table tbody tr:hover td{color:var(--heading);background:var(--panel-hover)}.view-table .row-index{width:54px;min-width:54px;font-variant-numeric:tabular-nums}.raw-view{min-height:100%;margin:0;padding:var(--panel-inset);color:var(--text);background:var(--panel);font-family:var(--font-ui);font-size:var(--type-table-body-size);font-weight:var(--fw-regular);line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}@media(max-width:1050px){:root{--reader-inset: var(--legacy-space-6)}.records-layout{grid-template-columns:minmax(300px,42%) minmax(0,1fr)}}@media(max-width:760px){:root{--reader-inset: var(--legacy-space-4)}.records-layout{grid-template-columns:1fr}.record-list{max-height:320px;border-right:0;border-bottom:var(--border-hair) solid var(--line)}.tile-grid{grid-template-columns:1fr;padding:var(--panel-inset)}}@media(prefers-reduced-motion:reduce){.data-tile,.record-card{transition:none}.record-card:hover{transform:none}}.app-area-graph{overflow:hidden}.obsidian-graph{box-sizing:border-box;position:relative;width:100%;height:100%;min-width:0;min-height:0;padding:var(--panel-inset);color:var(--text-primary);background:transparent;overflow:hidden}.obsidian-graph-surface{display:block;width:100%;height:100%;min-height:0;touch-action:none;cursor:grab;-webkit-user-select:none;user-select:none}.obsidian-graph-surface:active{cursor:grabbing}.obsidian-graph-edges line{stroke:var(--graph-edge);stroke-width:1;vector-effect:non-scaling-stroke;transition:stroke .12s ease,stroke-width .12s ease}.obsidian-node{color:var(--graph-technique);cursor:pointer;outline:none}.obsidian-node-selection-ring{fill:none;stroke:var(--graph-selected);stroke-width:3;opacity:1;vector-effect:non-scaling-stroke;pointer-events:none;filter:none}.obsidian-node-branch-ring{fill:none;stroke:var(--graph-selected);stroke-width:2;opacity:.82;vector-effect:non-scaling-stroke;pointer-events:none}.obsidian-node.is-branch-muted{opacity:.42}.obsidian-graph-edges line.is-branch-path{stroke:var(--graph-selected);stroke-width:2;opacity:1}.obsidian-graph-edges line.is-branch-muted{opacity:.2}.obsidian-node.is-selection-muted{opacity:.48;transition:opacity .14s ease}.obsidian-node.is-selection-muted:hover,.obsidian-node.is-selection-muted:focus-visible{opacity:1}.obsidian-graph-edges line.is-selection-muted{opacity:.24}.obsidian-node-role-ring{fill:none;stroke:currentColor;stroke-width:1.5;opacity:.72;vector-effect:non-scaling-stroke;pointer-events:none}.obsidian-node-core{fill:currentColor;stroke:var(--surface-app);stroke-width:1.5;vector-effect:non-scaling-stroke;transition:filter .12s ease,stroke .12s ease}.obsidian-node-finding{color:var(--graph-finding)}.obsidian-node-finding.severity-critical{color:var(--critical)}.obsidian-node-finding.severity-high{color:var(--high)}.obsidian-node-finding.severity-medium{color:var(--medium)}.obsidian-node-finding.severity-low{color:var(--low)}.obsidian-node-finding.severity-info{color:var(--info)}.obsidian-node-finding.severity-unknown{color:var(--graph-unknown)}.obsidian-node-category,.obsidian-node-defense,.obsidian-node-target,.obsidian-node-technique,.obsidian-node-tactic{color:var(--graph-relation)}.obsidian-node:hover .obsidian-node-core,.obsidian-node:focus-visible .obsidian-node-core{filter:brightness(1.25);stroke:var(--graph-selected)}.obsidian-node:hover .obsidian-node-role-ring,.obsidian-node:focus-visible .obsidian-node-role-ring{opacity:1;stroke-width:2}.obsidian-node.is-selected .obsidian-node-core{stroke:var(--graph-selected);stroke-width:2.5}.obsidian-node.is-selected .obsidian-node-role-ring{opacity:1;stroke:var(--graph-selected);stroke-width:2}.obsidian-graph-card-connectors{pointer-events:none}.obsidian-graph-card-connectors line{vector-effect:non-scaling-stroke}.obsidian-card-connector-backdrop{stroke:color-mix(in srgb,var(--surface-app) 88%,var(--pathfinder-micro-connector-backdrop-mix));stroke-width:5;opacity:.9}.obsidian-card-connector{stroke:var(--graph-selected);stroke-width:2}.obsidian-card-connector-anchor{fill:var(--graph-selected);stroke:color-mix(in srgb,var(--surface-app) 88%,var(--pathfinder-micro-connector-backdrop-mix));stroke-width:1.5;vector-effect:non-scaling-stroke}.obsidian-node-inline-label{fill:var(--text-secondary);stroke:var(--surface-app);stroke-width:3px;paint-order:stroke fill;font-size:var(--fs-lg);font-weight:var(--fw-medium);letter-spacing:.01em;pointer-events:none}.obsidian-node-category .obsidian-node-inline-label,.obsidian-node-defense .obsidian-node-inline-label,.obsidian-node-target .obsidian-node-inline-label,.obsidian-node-tactic .obsidian-node-inline-label{fill:var(--text-primary);font-weight:var(--fw-semibold)}.obsidian-node-card-wrap{overflow:visible;pointer-events:auto;cursor:grab;touch-action:none}.obsidian-node-card-wrap:active{cursor:grabbing}.obsidian-node-matrix-card-wrap{overflow:visible}.obsidian-node-matrix-card{width:100%;height:100%}.obsidian-node-matrix-card .data-tile-content{display:grid;grid-template-rows:auto minmax(0,1fr);min-height:0;overflow:hidden}.obsidian-node-matrix-card .data-tile{box-sizing:border-box;width:100%;height:100%;min-height:0;grid-template-columns:18px minmax(0,1fr) 18px;gap:var(--space-2);padding:var(--space-3);overflow:hidden}.obsidian-node-matrix-card .data-tile-hex{width:18px;height:20px}.obsidian-node-matrix-card .data-tile-content h3{display:-webkit-box;overflow:hidden;font-size:var(--pathfinder-micro-title-size);line-height:1.2;-webkit-box-orient:vertical;-webkit-line-clamp:5}.obsidian-node-matrix-card .data-tile-badges{flex-wrap:wrap;gap:var(--space-1);margin-top:var(--space-1);min-height:0;max-height:none;align-content:start;overflow:hidden}.obsidian-node-matrix-card .data-tile-badges>*{flex:0 1 auto;min-width:0;max-width:100%;height:auto;min-height:20px;padding:0 3px;overflow:visible;font-size:var(--pathfinder-micro-badge-size);line-height:1.1;overflow-wrap:anywhere;white-space:normal}.obsidian-node-matrix-card .tile-badge-overflow{justify-content:center}.obsidian-node-matrix-card .data-tile-actions{align-self:start;gap:2px}.obsidian-node-matrix-card .tile-bookmark-btn,.obsidian-node-matrix-card .tile-results-btn{width:18px;height:18px}.obsidian-node-card.data-tile{box-sizing:border-box;width:100%;height:100%;min-height:0;grid-template-columns:26px minmax(0,1fr);gap:var(--legacy-space-3);padding:var(--legacy-space-3);overflow:hidden;cursor:pointer}.obsidian-node-card-technique .data-tile-hex,.obsidian-node-card-category .data-tile-hex,.obsidian-node-card-defense .data-tile-hex,.obsidian-node-card-target .data-tile-hex,.obsidian-node-card-tactic .data-tile-hex{background:var(--graph-relation)}.obsidian-node-card .data-tile-content h3{display:-webkit-box;overflow:hidden;font-size:var(--pathfinder-micro-title-size);line-height:1.3;overflow-wrap:normal;word-break:normal;-webkit-box-orient:vertical;-webkit-line-clamp:2}.obsidian-node-card-technique .data-tile-content h3,.obsidian-node-card-tactic .data-tile-content h3{-webkit-line-clamp:3}.obsidian-node-card .data-tile-badges{gap:var(--legacy-space-1) var(--legacy-space-2);margin-top:var(--legacy-space-2)}.obsidian-node-card .reader-severity{min-height:20px;padding:2px var(--legacy-space-1);font-size:var(--pathfinder-micro-relation-badge-size)}.obsidian-node-card .outcome-mark{flex-basis:100%}.obsidian-node.is-selected .obsidian-node-card{border-color:var(--graph-selected);outline:var(--bw-emphasis) solid var(--graph-selected);outline-offset:-2px}.obsidian-graph-card.is-selected .obsidian-node-card,.obsidian-graph-card.is-selected .obsidian-node-matrix-card .data-tile{border-color:var(--graph-selected);outline:3px solid var(--graph-selected);outline-offset:-3px}.obsidian-graph-toolbar,.obsidian-graph-filters,.obsidian-graph-inspector,.obsidian-graph-zoom{position:absolute;z-index:5;border:var(--bw-hairline) solid var(--border-default);border-radius:var(--radius-md);color:var(--text-primary);background:color-mix(in srgb,var(--surface-panel-raised) 94%,transparent);-webkit-backdrop-filter:blur(var(--space-2));backdrop-filter:blur(var(--space-2))}.obsidian-graph-toolbar{top:var(--space-4);left:50%;display:flex;align-items:end;gap:var(--space-2);max-width:calc(100% - var(--space-8) * 2);padding:var(--space-2);transform:translate(-50%)}.obsidian-graph-search{display:grid;gap:var(--space-1);min-width:calc(var(--space-8) * 8);color:var(--text-secondary);font-size:var(--fs-sm)}.obsidian-graph-search input{min-height:var(--control-h);padding:0 var(--space-2);border:var(--bw-hairline) solid var(--border-strong);border-radius:var(--radius-sm);color:var(--text-primary);background:var(--surface-input);font-size:var(--fs-base)}.obsidian-graph-count{align-self:center;min-width:max-content;padding-inline:var(--space-2);color:var(--text-secondary);font-size:var(--fs-sm);font-variant-numeric:tabular-nums}.obsidian-graph-branch-actions{display:flex;align-items:center;gap:var(--space-2);min-width:min(360px,32vw);padding-left:var(--space-3);border-left:var(--bw-hairline) solid var(--border-default)}.obsidian-graph-branch-actions>span{color:var(--text-secondary);font-size:var(--fs-sm);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);text-transform:uppercase}.obsidian-graph-branch-actions .btn{min-width:84px}.obsidian-graph-reset-view{position:relative;display:inline-flex;align-items:center;gap:6px;border-color:var(--border-strong);border-radius:999px;color:var(--text-primary);background:var(--surface-input);overflow:hidden}.obsidian-graph-reset-view:hover,.obsidian-graph-reset-view:focus-visible{border-color:var(--text-secondary);color:var(--text-primary);background:var(--surface-hover)}.obsidian-graph-reset-view span{font-size:11px;line-height:1}.obsidian-graph-filters{top:calc(var(--space-8) * 2.7);left:50%;display:grid;grid-template-columns:repeat(3,minmax(calc(var(--space-8) * 5),1fr));gap:var(--space-3);width:min(calc(var(--space-8) * 20),calc(100% - var(--space-8) * 2));padding:var(--space-3);transform:translate(-50%)}.obsidian-graph-filters label{display:grid;gap:var(--space-1);color:var(--text-secondary);font-size:var(--fs-sm)}.obsidian-graph-filters select{min-height:var(--control-h);padding-inline:var(--space-2);border:var(--bw-hairline) solid var(--border-strong);border-radius:var(--radius-sm);color:var(--text-primary);background:var(--surface-input);font-size:var(--fs-base)}.obsidian-graph-zoom{top:var(--space-4);right:var(--space-4);display:grid;overflow:hidden}.obsidian-graph-zoom button{display:grid;place-items:center;width:var(--space-8);height:var(--space-8);padding:0;border:0;border-bottom:var(--bw-hairline) solid var(--border-default);color:var(--text-primary);background:transparent;font-size:var(--fs-lg);cursor:pointer}.obsidian-graph-zoom button:last-child{border-bottom:0}.obsidian-graph-zoom button:hover{background:var(--surface-hover)}.obsidian-graph-inspector{right:var(--space-4);bottom:var(--space-4);display:grid;gap:var(--space-2);width:min(calc(var(--space-8) * 12),calc(100% - var(--space-8)));padding:var(--space-4)}.obsidian-graph-inspector>small{color:var(--text-secondary);font-size:var(--fs-sm);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);text-transform:uppercase}.obsidian-graph-inspector>strong{padding-right:var(--space-6);color:var(--text-primary);font-size:var(--fs-lg);line-height:var(--lh-prose);overflow-wrap:anywhere}.obsidian-graph-inspector>span{color:var(--text-secondary);font-size:var(--fs-lg)}.obsidian-graph-inspector dl{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-2);margin:var(--space-2) 0 0}.obsidian-graph-inspector dl div{display:grid;gap:var(--space-1);padding:var(--space-2);border:var(--bw-hairline) solid var(--border-subtle);background:var(--surface-panel)}.obsidian-graph-inspector dt{color:var(--text-secondary);font-size:var(--fs-sm)}.obsidian-graph-inspector dd{margin:0;color:var(--text-primary);font-size:var(--fs-lg);font-weight:var(--fw-semibold)}.obsidian-graph-inspector-actions{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-2)}.obsidian-inspector-close{position:absolute;top:var(--space-2);right:var(--space-2);display:grid;place-items:center;width:var(--control-h);height:var(--control-h);padding:0;border:0;color:var(--text-secondary);background:transparent;font-size:var(--fs-lg);cursor:pointer}.obsidian-graph-empty{position:absolute;inset:0;display:grid;place-content:center;gap:var(--space-2);color:var(--text-secondary);text-align:center;pointer-events:none}.obsidian-graph-empty strong,.obsidian-graph-empty span{font-size:var(--fs-lg)}.obsidian-graph-card-zoom-hint{position:absolute;left:50%;bottom:var(--space-4);z-index:7;min-height:var(--control-h);padding:0 var(--space-4);border:var(--bw-hairline) solid var(--border-strong);border-radius:var(--radius-sm);color:var(--text-primary);background:color-mix(in srgb,var(--surface-panel-raised) 94%,transparent);font-size:var(--fs-sm);cursor:pointer;transform:translate(-50%)}.obsidian-graph-card-zoom-hint:hover,.obsidian-graph-card-zoom-hint:focus-visible{background:var(--surface-hover);outline:none}@media(max-width:900px){.obsidian-graph-toolbar{left:var(--space-3);right:calc(var(--space-8) + var(--space-5));flex-wrap:wrap;max-width:none;transform:none}.obsidian-graph-branch-actions{flex:1 1 100%;min-width:0;padding-top:var(--space-2);padding-left:0;border-top:var(--bw-hairline) solid var(--border-default);border-left:0}.obsidian-graph-search{flex:1 1 100%;min-width:0}.obsidian-graph-filters{top:calc(var(--space-8) * 3.5);grid-template-columns:1fr}.obsidian-graph-inspector{left:var(--space-3);right:var(--space-3);width:auto}}@media(prefers-reduced-motion:reduce){.obsidian-node circle{transition:none}}.obsidian-graph{background:var(--surface-app)}.obsidian-graph-layout{display:grid;grid-template-columns:clamp(220px,17vw,280px) minmax(0,1fr) clamp(270px,21vw,340px);width:100%;height:100%;min-width:0;min-height:0}.obsidian-graph-filter-panel,.obsidian-graph-inspector{position:static;display:flex;flex-direction:column;width:auto;min-width:0;min-height:0;padding:0;border-radius:0;background:color-mix(in srgb,var(--surface-panel) 96%,var(--surface-app));-webkit-backdrop-filter:none;backdrop-filter:none}.obsidian-graph-filter-panel{border:0;border-right:var(--bw-hairline) solid var(--border-default)}.obsidian-graph-inspector{border:0;border-left:var(--bw-hairline) solid var(--border-default)}.obsidian-graph-filter-panel>header,.obsidian-graph-inspector>header{display:flex;flex:0 0 auto;align-items:center;justify-content:space-between;gap:var(--space-3);min-height:calc(var(--row-h) + var(--space-3));padding:0 var(--space-4);border-bottom:var(--bw-hairline) solid var(--border-default)}.obsidian-graph-filter-panel>header strong,.obsidian-graph-inspector>header strong{color:var(--text-primary);font-size:var(--fs-md);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);text-transform:uppercase}.obsidian-graph-filter-panel>header span{color:var(--text-secondary);font-size:var(--fs-sm);font-variant-numeric:tabular-nums}.obsidian-graph-filter-scroll{display:grid;align-content:start;gap:var(--space-4);min-height:0;padding:var(--space-4);overflow-y:auto;scrollbar-color:var(--border-strong) var(--surface-panel);scrollbar-width:thin}.obsidian-graph-filter-section{display:grid;gap:var(--space-2)}.obsidian-panel-label{color:var(--text-secondary);font-size:var(--fs-sm);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);text-transform:uppercase}.obsidian-graph-filter-panel .search-text-group,.obsidian-graph-filter-panel .search-input-wrap,.obsidian-graph-filter-panel .search-input,.obsidian-graph-filter-panel .sheet-select{width:100%;min-width:0}.obsidian-graph-filter-panel .search-tools,.obsidian-graph-filter-panel .primary-filter-group{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-2);min-width:0;margin:0;padding:0}.obsidian-graph-filter-panel .primary-filter-group{display:contents}.obsidian-graph-filter-panel .standard-filter-btn,.obsidian-graph-filter-panel .dynamic-facet-select,.obsidian-graph-filter-panel .dynamic-range-filter{width:100%;min-width:0;margin:0}.obsidian-graph-filter-panel .standard-filter-btn{order:-1}.obsidian-graph-filter-panel .dynamic-range-filter{grid-template-columns:minmax(0,1fr) minmax(0,.8fr) minmax(0,.8fr)}.obsidian-graph-workspace-tools{display:grid;gap:var(--space-3);min-width:0;padding-top:var(--space-4);border-top:var(--bw-hairline) solid var(--border-default)}.obsidian-graph-workspace-check{display:flex;align-items:center;gap:var(--space-2);min-height:var(--control-h);color:var(--text-primary);font-size:var(--ui-label-size);cursor:pointer}.obsidian-graph-workspace-check input{width:14px;height:14px;margin:0;accent-color:var(--accent)}.obsidian-graph-workspace-check:has(input:disabled){color:var(--text-muted);cursor:not-allowed}.obsidian-graph-workspace-tools .view-bookmark-bar,.obsidian-graph-workspace-tools .view-bookmark-list{align-items:stretch;flex-direction:column;width:100%}.obsidian-graph-workspace-tools .view-bookmark-create,.obsidian-graph-workspace-tools .view-bookmark-item,.obsidian-graph-workspace-tools .view-bookmark-entry{width:100%}.obsidian-graph-workspace-tools .view-bookmark-item{display:flex}.obsidian-graph-workspace-tools .view-bookmark-entry{flex:1 1 auto}.obsidian-graph-stage{position:relative;min-width:0;min-height:0;overflow:hidden;background:color-mix(in srgb,var(--surface-app) 95%,var(--surface-panel))}.obsidian-graph-stage .obsidian-graph-surface{width:100%;height:100%}.obsidian-graph-edges line{stroke:var(--graph-edge);stroke-width:1}.obsidian-graph-edges .obsidian-edge-category{stroke:color-mix(in srgb,var(--graph-edge) 58%,var(--text-muted));stroke-width:.8}.obsidian-graph-edges .obsidian-edge-defense{stroke:color-mix(in srgb,var(--graph-edge) 68%,var(--graph-defense));stroke-width:.9}.obsidian-graph-edges .obsidian-edge-technique{stroke-width:1.15}.obsidian-graph-edges line.is-direct-path{stroke:var(--graph-alert);stroke-width:2}.obsidian-node-core{fill:color-mix(in srgb,currentColor 88%,var(--surface-app))}.obsidian-node-card.data-tile{grid-template-columns:18px minmax(0,1fr);gap:var(--space-1);padding:var(--space-1)}.obsidian-node-card .data-tile-hex{width:18px;height:20px}.obsidian-node-card .data-tile-content h3{font-size:16px;line-height:1.25}.obsidian-node-card .data-tile-badges{flex-wrap:nowrap;gap:var(--space-1);max-height:18px;margin-top:var(--space-1);overflow:hidden}.obsidian-node-card .reader-severity,.obsidian-node-card .outcome-mark{min-height:18px;padding:1px var(--space-1);font-size:var(--fs-sm);white-space:nowrap}.obsidian-node.is-selected .obsidian-node-card{outline-width:var(--bw-hairline);outline-offset:-1px}.obsidian-graph-stage .obsidian-graph-toolbar{top:var(--space-3);left:var(--space-3);align-items:center;max-width:none;padding:var(--space-1);transform:none}.obsidian-graph-stage .obsidian-graph-zoom{top:var(--space-3);right:var(--space-3)}.obsidian-graph-inspector-content,.obsidian-graph-inspector-empty{display:grid;align-content:start;gap:var(--space-3);min-height:0;padding:var(--space-4);overflow-y:auto}.obsidian-graph-inspector-content>small{color:var(--text-secondary);font-size:var(--fs-sm);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);text-transform:uppercase}.obsidian-graph-inspector-content>strong{padding-right:var(--space-6);color:var(--text-primary);font-size:var(--fs-lg);line-height:var(--lh-prose);overflow-wrap:anywhere}.obsidian-graph-inspector-content>span,.obsidian-graph-inspector-empty span{color:var(--text-secondary);font-size:var(--fs-lg);line-height:var(--lh-prose)}.obsidian-graph-inspector-empty strong{color:var(--text-primary);font-size:var(--fs-lg)}.obsidian-graph-inspector dl{display:grid;grid-template-columns:1fr;gap:0;margin:var(--space-2) 0 0}.obsidian-graph-inspector dl div{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-3);padding:var(--space-3) 0;border:0;border-bottom:var(--bw-hairline) solid var(--border-subtle);background:transparent}.obsidian-graph-inspector dt{font-size:var(--fs-md)}.obsidian-graph-inspector-actions{display:grid;gap:var(--space-2);margin-top:var(--space-3)}.obsidian-graph-inspector-actions .btn{width:100%}.obsidian-inspector-close{position:static;flex:0 0 auto}@media(max-width:1100px){.obsidian-graph-layout{grid-template-columns:220px minmax(0,1fr) 270px}}@media(max-width:850px){.obsidian-graph-layout{grid-template-columns:210px minmax(0,1fr);grid-template-rows:minmax(0,1fr) 210px}.obsidian-graph-inspector{grid-column:1 / -1;border-top:var(--bw-hairline) solid var(--border-default);border-left:0}.obsidian-graph-inspector-content{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}@media(max-width:650px){.obsidian-graph-layout{grid-template-columns:1fr;grid-template-rows:220px minmax(360px,1fr) 220px;overflow-y:auto}.obsidian-graph-filter-panel{border-right:0;border-bottom:var(--bw-hairline) solid var(--border-default)}.obsidian-graph-inspector{grid-column:1}}.triangle-icon{display:block;flex:0 0 auto;width:12px;height:12px;fill:currentColor;transform-origin:center}.triangle-icon-right{transform:rotate(180deg)}.triangle-icon-up{transform:rotate(90deg)}.triangle-icon-down{transform:rotate(-90deg)}.reader-nav button,.sidebar-toggle-inline,.sidebar-toggle,.icon-btn,.tenant-back,.db-structure-card-toggle,summary,.results-browser-title{color:var(--muted)}.reader-nav button,.sidebar-toggle-inline,.sidebar-toggle,.icon-btn{align-items:center;justify-content:center}.reader-nav button .triangle-icon{width:18px;height:18px}.sidebar-toggle-inline .triangle-icon,.sidebar-toggle .triangle-icon{width:16px;height:16px}.tenant-back{display:inline-flex;align-items:center;gap:7px}.tenant-back .triangle-icon{width:28px;height:28px;fill:var(--band-surface)}.db-structure-card-toggle{display:grid;place-items:center;width:18px;height:18px}.results-browser-title{display:flex;align-items:center;gap:7px}summary{display:flex;align-items:center;gap:7px;list-style:none}summary::-webkit-details-marker{display:none}details[open]>summary>.triangle-icon-right{transform:rotate(-90deg)}select:not([multiple]){appearance:none;padding-right:30px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath fill='%23888a92' d='M1.5 2.5 6 9.5l4.5-7z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 9px center;background-size:12px 12px}.results-parking-anchor{position:absolute;inset:0 auto auto 0;width:0;height:0;pointer-events:none}.donut-metric-rack{grid-template-columns:repeat(auto-fill,var(--tile-compact-width));justify-content:start}@media(min-width:1101px){.datahub-reference-controls{grid-template-columns:repeat(6,minmax(0,1fr))}} diff --git a/outputs/client-info-design-check/client-build/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 b/outputs/client-info-design-check/client-build/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..de83a9c7418a1121c8a59bbc7002c69c43cbe76a GIT binary patch literal 25960 zcmV( zfvZ>nHUcCAhX4d11%@sMkTeVj8)T+6Y?~In+Xg_ESPSNQ*H-Dl^V<+i7@4( zVA=owJ-Hz=@DEh?t*SuItY(vK)*Ts`HIzdus(G+!C1r{_VLHfTGCesMLA0W>@vbM! zc+hY{i8igEX}{i>x;c{#g{vHGS;0&u&!my0gQbn?st@UqFAQ|?!N|=f-?N+g@RyPe zMN-%#@|C*&`;;L1~2JcrvGp|JZ0TO~03u=KN777WX+ofl}o~VDiXog^$of#8kGsdK>#NHGXFu(we1gyqN zR0MnGoUtj>jRk9QHoE-H#c$e+3b)pe&+EUcZr2Gqe?Tn(CVpt)3(38k&NhELvjkW2 z&TNdZ`_V6bu*F?(M{{Q?f?$Y700nOQ8vz(o4JpCH|DP&+g##e}g!0m9OH0K)L5dNm z)rS_nK=q&IN}D-APKku;$x2c__aL?{0sE^h`|2vuDpobB&K3Tf zTixdc^SIE89%mRI>0&4rOIXgvIHOX{zS97ygCqx%@@eTz=W(Xi<$uWE^!Z$VLI8OL z7_=a@I)kJGmzyAI14ypc5V^WC>8RaHIe?^mijW->l5p&RUPL^a!bUP7vIs&j zOhLdrBUmJlsA<(Qm@tl8u(GuX5V6FHEm+tCgcyV~2)6|8c=07Lh z;MY(8hWP*ls3_M}_u4$ZU?djL6pGYvm1e}`P%K%_5n3bz0e&6Q0FZ?N0T9BUDAazf z$%*9$H_Ca;KD^B4F#DJoU&L(ifHUZ0y$Jyy&6bOpvD?TkIoCDW-o!(O1RNeAT^|NG z|71T7t3mLn;q5RJ2D;zqR^U;D-1h+k|G8U&qCCCfSLek9ZR#diIWD!If7HD*F+bP) z`22M)PNa-&B5#ZUX}3_Tp1J!=819@nKbu>Tm+xo5blg)?vh&?F;x}hmB!|i6vstvy zJ8spcc};b95`Q~-&bJ%b+bi90@rM&Ez6X&zM*fRH%<3uE$N&CFlaTZ)Zu`v`z)hu= z_;v!A&p#f%eCFLU=)8zzX_qnmzq@pv__kLa?O&j-xp0{N9k+x}@WTC`wS%hU4t~6b z%T7(fIo~=y!=fxxs!El+OnF>>o-+yteePMm5u$o0%z%seYLw2C8gc2OS$GVr;&fy)nz>_JFz2z!{bV z!?_>8?c$gZ6YihLd2?Pe_!_-j?K}f$+raXgj&+{qbbpwW_7l!mj_q4+S4CgtJN^9L zYmIK5l)SnR->x(~Q~t!I%RS$swDy%!4bw&OSm`1Q?Ihinor1^yoZa!efPYyijkNN0R zV=({{<-Y3V3szm-Xdo!%t^jXjMi)TlZXZD!p9HI?hcwu&Ws!9*AlppfQ|~i{bu&w% z2$jSbn2`(wEwaEMC^yrkN~QR$VNh)sfJIv}%?TL39^jlBA2!NCm&&YD1+m+dSE}z) z(B=xzwue+HodJKJ!S7rqGusy)Awhx_tno`QjdfMN#8^t5Sa6wcS`GwCHHB{KK}Y2xcO;&XtJS>)d_qwuApexzU@j9vbe8~R0oh!{pU8dA zW|BZIgyMVxXtqAHd^MZSPI(y5u*$nRqtccbCd4fGq0i0Oc?x4r8#83jzxw5J@A&bE ztxGI6A>6fR?Mw|3^4hU%D%dVvyYm4LbA@%DX=TN7T&|O2OsK6aA&RJ@Q_E9_!McLl zsoc$*!y*|{CMG-m;Sq3|Cb@#8Y6!Va)}cySw$r9%(J`4Ok=^F7StE`2_C&K3A%tLM zQw@5kZUYu-+wl4kMe=bL(mFczzQ*Crt#(8Qb@}VxX{(LEU~1K2FnDmeL{Z_{<{5HK z1ZZ17e$f(N!T~@4azblj6$%HH!)y4{CSDzqzD!&-p&O`g#r0_%9{vRe!+jpCFB1)ZptiF=29e#o~&6GyWulUPkoayTKGxU}G-?u$0avJgrWSxaJ#qX-h zVjy530N)r0y$a(C8N3jBFNN$i5PciScVX8JFn%Mk_o3}3$ld{h&w%_4#9xE#JBa@b zLr*}*lOXy70)NBt7a{Ws*#Ci%H=*=ju>TLLLoggd=#UQ+Tpi%sWcUG40OaDL1Alzj z}bHOXhPCbD1|BZus4_y;V4$v5Z}DU$tBf zTur}?yAysFcGvsfmdAQe@UL=TTfbL-|MdsI59J?GpHjbQs0Hhp2w8u|k^l&X(mO07 zwrNS?(Nv>sp62G~(hz`v$5$+uMRupI6#$(2bb^D3ZuX3)QhZFL$7;_@d*Djm@}2Me zx~b>m*7hvf3p9Y;t-k)c80Q7!C!vLh90s%n+2cR4ZfHA1=tw@6mta6SOy(ay+UzwO zJ%tnuHaK8l$z5hH1~S%%aQEyWXgrU@fdkn9;ZDIpr&pJtpQ}OGV}XRi8d{qi_0o z`tYg#7i;R!3+txFHHin=d#$+NN_*YWcv0L^Z%r)XE}Nz+bJ?=(Y`wI>W^Y`}yyCNa zth&$YS2pEm zGMUsWDNGJFaG&p8J@|BkUMF8%cgRZoPr5={M-08}8^H$CqU6uy{Q$z$w+j-nE@sN@ zyT%GqO^AWh5X$s>By*13Lxfw(%%N;f6^-ZA>*KY7Qnvea++Y~YwW3gNy(#uW@l8;1 zq2|jYsORuaE<(JV*C$a#{SG3PL#K6s)0Zi62@4I*Ee_;D46<=lS2I#e*2~@+uh&vt zd!e=4<^+%e!qMGWRkERthYh{9ySCLM0tJIs___du3(8g)EZZ7jF1Mi>dFt_usiQoihruLL~EowU@lOsT{Gxglem6~)pSpaMb=}ID6=pbiNTyPOHnS((^qwV85%L*D zQtJ6La?Vlaotlbz5hsRv!J8hUXvuDDgYz zzDnLcO*=SlGH{2fHjlcOwDL|h*xV&+g6oV-^D&4<(a@w2Eva55Z|-P8f|MJ|@T0zZ zHC`Lf+|;+Ldt?yzWF{lE(kbQy=PdGHv%hD~xlJxE^(&EY9W`Nj31RdlVUCr zZD)ApgpZb3>^Sr6lI{uN<)WB~p(|zwtpFFwBy*)UtBA%F7!OjDYL3pLi3TJ>VFhK0 zYM7BHN-UFtgBpYvg+t-JrHiF9qZ@*mJB6qEp#jD`5nunevBZsn^FBp%DQsdpw~?w4 z37}RW{a=hfJT-tcHhdb|k3BGKn(8Sg_6*~E&D0tL$VeacA7pl?>Kz<>^?)Kop7SZo?!`Z1 zMnUovgTzZA>V2E6koTU`Y)%XEg*og{xsTaYf###10@QYJ-X-vo`53hBoX1cB=^O!N z_t~i^Wat#`Kv+fzT-{YvN)m7Aj~OcLb!63~iP;nb9E)I7aN7>0BxUJ$3dbXmXI&!v zu!`{2yil@5%Kgq`q%Ns6QG*7Wav~!x06sNcQ{X$RPjn7Si7m~H7$pGRquHdCn**i8 zjhxsGsT(0DFY1%UNfmB7Va(YsQ zrUs@KRxI;L@X*#8xn!XlQlHzqbnO_BTk`@l;v6ci;Xx1?z0~z%IWfe5d&DY%&r&Y(}U9)XAq`Oznhsja+@m zno!QoXSzVcaDO)yvyR%9LgtFEksf9THVb?sZFL6UWYzs=g7t@t&2KCED++Cjo#*;T z8%kHEKSX;0s4qj_=3|gH8O%Lq;c0|<>SS!#-0f_mEx}zEP`h|&tpU(M#VE{R23AO% z{8=*?t>UN{nYHgD;lh3H_tpgHl22-css8`7S4}ixHYpmV!MO^PL^p9bAf<3Rl$aBCj%Z8Z zecMx#vX?jYbl7pbp(Nd)bCyv?RpTW?Cvx>=&dNT?znG`Oo9NJR^afMU-XZhkG$pw( z-03Q|ITVK}mpVR7E1!GbW|vQhjpG2(&Uf!|-u=FEZ0uYeO6o4A)bxANXB~8Ua{||R4U>)mjmrqYr zQHc`AJ2NU@B?Pe!V|2YNHQdaRAJ^{p#I2t0i`kmdsiP}Z8<}mkDOfnTF?YO1>OUjJ z_4w-m#>~oc1wLA?u5bVj+-GJhXE$arSh_#+S)Fy~XyzeKurc+{3Vw&N3~($Q$Nk|e zDVX6@$yQct{Hw!e0W4x^{w|U@e;INM)JApYi{pLx$Mp5eI~Sg`m*<;(Y9( zYj67x^}k;^)C_3zqK%$~@&@{k_k;UCGG|Q3j)c5@cO=Agd?x!cexM>%49SsbP$;>X z0X!og{z`4R{7kY!enrgl;TdQ8Q}Q&(60Pji;Q`KN4sj4%(_0=JKck1%_D9)xF6>M3tU)X~7m+h-dJn-y=OGf#!iJ7&w68CX zbW4zrR-wFHO(?-~r+JN0#sYMKen1;VpU0${S6j7i@z&ZbU4_&jB{p;rd_S0>8Ot^@ zCn=dIQaSU8Pgw-weBk5lWZNyJxQso_U_C>cUmGDe9`j`UA#ejKgoqL8XH3SAguHtj z%uL24CwR;J3VBId_%y)duhdp3Qj){NEO?>SNdO!Mo)jVdLqiga|9QdTGBA)y26EN6 zk3XzPU*hr7R~~SVryOJzv;^Xs!oqM3tpSA&Ku!$gZA}j)9$EkdM~T=2&gfixGcpc- zciGj7xSeSmxiQB%#f|mjvbpWLf~3Qm&=BuCvc-Fy!)(IdncTJwbBU117lW|PNKf`% z!-qD3ly>7RigC7IrzHjR@J{0n5DS)TQjZ2C^klNgg%yMzgr8EJYPs6kJLE}rtRy@C zz-$|mFYKt3X+m4h39AsNow_vvA$z!wPIapq(rG+L_x|{LKd&-E-%%eZLnBPN9aCT% zdivsAT>X-az)DT(v0yEOIgP#t4QN4hH??&9vE~H+65ST-*B_Zs7A)!sPw-5`_*1-( zo9hIXR*rh-mCRC0+n`K17ER47?8n82i(DG3X-j?N$pF4FjgAYg4vUYk^COiJm_*x{ z#27Y*-;JzJ-Ij_x2vw)ja^31tAikjcX$wc@Xow@5Zn)jl7Lx-1;2fCuQR@jCFA_FV z-;v#tN1SG75~o^n*-p`0y&Y`GQzC0^-;lgQTAL}zEf{>=QXzHJUn=)l+Z}$?rKy^} z)JKl*mZ3Xl5{}fe5)xWs$yxCo?F~!xAbw*Wv(llLa?W@GRD1#N)3l~k{*kt4d*#8R zp0FfuP-(?zidx=pAZMK9ZnN#3s^VlHiDFFbyfiXe#c#_GCrs8Nu<&Xj*J6 zl0FqFlvz|XrB-cpi8NML<~7}v3h?#SphOTq->_;= z_ir=tWSDxA+8pT3t2YMIdE)$AL%*<8N|P~;X^bN_*;5bv0y{b_`p_BSs$OK>fNfE_ z;`od2x-dz0SM`}5`b_LKbmE7u3-A#+L>MEd+#$f4s0QfATuR(g9inTIqTj2IRUM}O z8WMh`4eAd{0gY)VE{}Z2d1|IrWErKXbbiUy1 zGA!Tqd}0nRqwu4mBfYg_R?$lp&F{3^*Rv1X^Z$*hH!7&-e(m$Y*Gp;DDO}JruzzJr ztx+v|#-IQFPGOJK0UfA#s4z{RK5}LF!2qCDH`gEhQ}@o~iS3uOV6)el6y#{NN2QDU z<#l&VZW>|>S(LGI&AsP>%Nw>Q0qJX>`-WSF=y@7k;M_bvi7g~wb(=xN+gtJyO?<{q zOWoWXs zt@I9+MVw%|KK4~IbIvK(4k5Yime4iP+P+VLEYfkCe%ZXM_hDMerMl+g>kqT~4E{Y= zonqS#4b%lwiW@y*c7d+4+$){~70F@ZnS<=^gZX>Gg5D}UQ3 z$dNhU_M=AKlY5^uaVq$Y-~BstlE1>Qke`iLDtz8~qze*r`$Wad+H~@s+MviNez?z2 zb}sEs_vvJ;7gsmZmJRjLckIE1ZB5h!+gqVCM&k!V-=1RXoV@fkW!G7a<7L>np-kcX zhAzgdDPD8^T5W}#Bvr1kB(4tRnkG}p*)XpQkhIj(g34uFw7!&4x?B;f|sq^^?+qFz1ZUDE*n%D7E)X@4R1_~soJemY)y z=)pN8W`0hOa8C=oDEk@Cv5skp*lRq_gNu6DoRiH*#797;?8Mhbj{3RjV(qS=3;S6G z;=&fIs;V(1x1cp$0jAQ_O+Gzs4lyy7&j`&V!#_g4Hw8UvG z=Wg&l@x9=@yI?G5?HDPuN;+iBsm3onzC6*7#!txe;rlSlnE~WvMo3TiXGm68P8+`R4YMyjG`lLGB+Zrnpi^@8Sbm&bG2mQ_<2a?XTf$&O}BJBqcD0Mp!j#b-gi694DC` z%1MvIXUwS3&TL~JVQ*?Zw0}k-8T;esBYBfG-%M*WEu;nK!F)y5Q#NF8hv=mLD{0 zDvC)P$PaKTjQ1dT#Ctdv2Brn|)g@4LH^(U(yCmpbu&cXQrA&xDB;1W{;fRkllRv)2=(a@OAjGhbt#(TBq8QQQSSkgnxDn3vgTI1%E?dOZjDBMn^)HnnsNPCaU`5%&YF-o{I&oV*rH2$OL#*>O==M;QG5*zG-BHMNZ6-Na6 z)(+8YOLiBXQLXZpHZJLJ8`ON0Q8`y$$-VTP4IqmjJMu7>_hLE^Vy*zO_~T*B<q#I~IL;c_KVpM`|BrNPGyjMF!HyV{#@;gO~G2-nEvXNY= zd=)4x%%sI`CpzqlSO2;fI@E5bX)7#ji?sBKQiY)Cac@vF&ED6(FLN63$L6nG2Ly4| zRr`J$PJ*l8m4+r(msY$sDJf+zn$CE0_T)@dVPZeY*2}^BFfplcJSt@pyxi(7{3&Ew zk4;I}Vw6A6*oU_=C_kGjm+MY-Ll~x}q@mNA<(Kf;Gp1vQL*BkSTpxXjtV_6ovUG98 zCuZ&WId=Q(Vl`o9ZQ190(|dz|2fI!Bwe%sYaVwkS9na?PJd5ExU9$gAM+tdgO|u4r zz?RvXc6mOz`&G}aqB((q&#^Q5!V#w(6Cwa zT6C!>Kd5i0`js)sh z1t)O2Jt;1}IY~QWL@gmlFck&5wT2;yzI*j*7|Gv=t|X##A2-hq;g9sswZr!jq<0X! zz9s9$Gx}0|wQ?bV9tNyWL?+GFRDDd2_6wO}S(|hy#(8nRLrL4$*Ur|Ce zHWjjEyUaUu@#xy%@Y-E!fB7<}wp8O=M$PxI_+0IPA>Kh zXL-1}#d}0s3KT=fT8=j#A69z97M)gBf<4C1;kzK#J0{CiEc`h9(Oa;$yrwUgd#dR! zl7trHG;tv9+<3XgR9kW!u#+*qk%Sa^al*MW;(p>`vw?`nF%WLkbLTx~oI0TgPdtAxg4pzm zTpaQ3qL>+@)k*yFy(8Bh_!po_iG(-2!irP-eTGsT8{yeR6}5S}<1d=TF@f4*17yX? zkErw$;89|~DV2jtw@5*`W^s};4C^)RPg>T zWvZuZj!bhJnDY7s{1bNmC_jrBl(%JwrK4t@VQgn^bwDPHYUzap=riD(XvXF>W4`fQ z$Nbja6;L|9w1D8}kYwyZb1!lpHnG^POSXpuxP^K;e0D4XVMLDZhuHO4U?-<-LnPV+ zLSP6liMZ@qfGt74snx!Il>s$`u#h&d_e4TX0EJUc2EF@I3LKAOFd|3V)@MxXkQkW= z3N9+LdRwyZDr4(+HWC(UvAoA+{$19h`$pl0)Ba8Bvy|HjyrX^Tx@v zzB9+Wc8?DC?irchAAX$qcBXJ=@0&{g)2?0oNAJq}K)n3nbs1^BS(6fyj-J=%ZaPQS6iIGYwBJwlfzF)2; z15@va>a`=IQKkgz&qAsBPu zgN$hwQN*0Guo~a*|^tSD^I0MJ4g_f42NTEBBpCN6m%poH%Ai(5c7;9@$iSA z+@8e<0%=l!`O>k@wFW?BBSUMsSR)r1WuT#5eDc$G``o9Wa!}L0V?Qken&lg&)EW!` zJpg;>;a}}2nM=9H4h;ht*ITzV@+d8;f}mFugVjX2ZIa+^0ejByy2!5-nSDn4bN;q2 zT0kE_`wr<*<3wA!)&0$4^S0lbKaWl^n}MseO1KK2&tK+0E$uYW4I_f$WKdMGMKO8N z=tj$qLdwobMYdkihM{e%--YgY1|9(Yl_b=eQn(%Ry>Ax1Rf20p@*z~BWGgvQx|kDx zEFkAWU1?hb$s28%zs)Qo%ll^GE7JGC9gT~3f!Nj+c8J+>UWxqJD`1ao8*xsJT?d-L zjpb<^6mrUfjkX*W75y!fEori5`JaI0U`DH5>mz})n82NdE^S7iu$&@IgHVbh_EsUaRZb$0a_*@DI58TkeJDQPR`&3(vB=byDg`m61`3ytycCCtBAM}sXAtpRV9mApvdD5$8Q)!u?YE`)=C zeEali{3w|J?y{cuo^Ln>gCm|2B>6z%L!Kh2U1%yhx2Jc}tTwX?kgPYl<`{Hz{t~vZ-a$=%!1XzM4?9qO>}-{)fmzpb!+q z7J`SwLJmO0Pz@*?8Vrqx=0HzqD{9AR-+&px*qh;-DVvuzKiZLJR-2=Kay7RgZb>HhT^s@B+3Gn(m^}h>q;7V|9I2vvT_kdI3On4f+1kQ(d z!4JTP;b-Bu;1A&M;J?k)wiRxBvF(S2yn(hsqrqQGPlO1GK%PeVqC!yds9aPvsvXsj zI*yW{uA|maFHqlY8Qn7a zYwu+IpYf{kX9pD%gh{wbr^#KDcP1PBI#ekQUH}y-5Hdg{)@Vu>-wLEg4Uy`gOrb`- zD=T115ifEj!sGbYKq3()LeEoXeADyQC!$@EM-FXv%kTG`hIG^@A@HfIGJ_@{AsHCE zjEI{zc&Ea~Sj;C^k=9~`x4cE*PvcoLp{fRlRw8wcd&GlIhimOw}K;RG!9_%^dL z_R@Q^*ap`Qou%~8k_7}p$i;}Kh&UFV8$uLTX)ViZ6h5sfV)*zz~c^zUVG0;i55AVgStsrTfzz5y-%(y-5h>r*8|_Ke^6sL`%Z@|$JubR_;{%@zaNgkbJsO?S)me;I znQW_}3rLAth4{}XoH6>|z1$tQ%Rx5h&$a2__WQYE_YAHO$@uE9bzIjq{y#kP8+Os-d8$L(K`k+WA=~ygwuB zO5*aHQZ@viT-L1L75zT8XNoY#p{c1;QvmyJSD^=JG!hCdN@XF4;(L{OU{5@45n9h2 znfCI!>^b$|GcikD_IOvmK*5wavZ36Uaw7)gMkdcLq;ab1@xcHWAz=i5prF}VQt|O7 zuV7%1i64jAN116mMEX&kC`%8Si@cy9o7^BpNy`w5$iZfio*tQ)ydGzn&3usuo7Rw& zjFP+08rIRSmLgONh1DMkzPJ0R-dI_ih(*JpfY^ZZM!@%uWbJeYp;U^Bq>qj2bfHgH z$2{SnLWepsniTYg1TSe3n&8&0ghT@-TBgAnVKz4xDfVMAH|#!Hp}*8ETUk3uy%Zv? zH0emUowjtYkT0w03R(OFiuqU~f|^;ab+nKYhm@RZp{W61XJK{hMqVRvIEO0I>J&6C zOOhnru&LtbJ8qb_wGh#6^9bKE`^nETcK73f?_)hkGT>vFN^*I9Ka4Vt`JLXZLL7-Z z2v#bK8a21hM=0P7S!!0?3 z=9LsWB6encEX$l-wIRNjye`S1mQm>!0JTX~c~p2-Vp)d+mgU6`-cBxp!jN*T$|5>? z{bHO_BykZjU^?Qp^s+57pA@PtrJQQYnJVo#pGuvZ^sjxOnw-50_8Njp3Nf}pX^+>S z%|)(kmrDOBm@!8UQ;}of_rsX(I0Ds2)|HBID7z=TXrGP#ew$|;hotp%yX5Q%_+4t| zCSWVvLP~^@5-29u5z^vIS-Tr{2(wiUV!()`I~;AR%5GA!C9GMkWZQn^kn%Qj4JYW4&5>iYU8Jf>vD->~My zX7^0ViL5++Tuy6y1Kvs&=fpC+mKO7L3G=Yc4)WkaX194<*hqoV2`Vw^wYA!woNm0= zbVq3~B?Es#zWv`abn)ty8BzQc;SRHqbQxR0fAfq?=WWkyU2~#cZPbh`DJ(0)tY6J} zrN?40PsXG14w;z+kvLL%>osO}BwOv#sKX%17wi_hR|r;0)NMKSi*Q7$Hbl0U zaS5{JYp&ElBysp4-2s@^r+!dJV(`I>3X+Wq{^u&)lAI72g}6dNFFV+g$LJU(ET)3rd-SGhGUE&T6O`&^RirGmkfztj6X?0|Z&W0|t_;6iCc{^# z>loo4mz}m4$vJ2|JggSxzt>wmvSsspT`J*sHV{A2?Q;wP8GUbD^bYU$QaPoBr)C$P zCYpnlwReup->Wq$vMuq}G7wxQa#fz)Y%5+3hExm})$ zpVapV+CQFDhd+E0%8>nqcPFXgGI^ia`t+j^FPH*&TP<0H3s_$_93C`ccO=muQK1tp z(Hln(?H85iPSmDhG1nB~H=zyd=PFT(={}CMnhnKnW?T;H=v>hSIj3URM;7kK@*29Z ziJA&qkIyF(zmEC+VK`=%l1Tn&X-mLvh1Zk%Tuj%GPx-oVMwjL+`}4_ByydU&V|IMq zo~d$fuP;D#%3zE&CsG~vq8;7cdVezCK2|z5Rv=kYfx={Nv>d}MEY>prBg|T}WaIkDxc z-YU|geyeVL`7Eg*-|TM~mnnr?W{MTvX5o#GwkJ9)_n}~uKzp{+adT+b>NVFF*P7`I zAWsLcZ8xs?N~ho2FBeM$d|L>x!wg=g^Y)^k8mk1cWVWiIJrvz zfR0CTqmwXwdTi8xJm2*2yRRe9@24~n^WiwclYvQ%ZM5p0B^WCKoz#d(}5f_moYo7jqO$U0)LO zneG?bC^J*L?YQo{N9A&uT<)1Ha-{c~7~=#kFF2mxQ$gBmiA;N~XdNrSZDd$eCT7d9 zNVNu>t?=8R^}`n~{9~XnR2}VeM5{WwL5c{i`cCIc`=F0`lF78zq~xoXBO`%nCtNbT zum;SV@UZxKUG|3Vy+c*U+WR>?Zc9;a{5;m$RV+%l_ymO_rB_20Id4BeM5Y6NOLi8~ zAq1J9U2nN}3nlvr zQYW;5Z@#1uP8H~flEw*6=7v$^IuUfd&a;Ul!g%12hk|8Ly^E#HL*YnD*#-#0xp6bJ z#ZMsv*Ld$J-+8fcUsXj4dQ7SB(7+w##g36(=wQk2dZ>Ld#LrYi43ySm*33l0W-ZP- zG}dg$ygF#3c_3r*>fX_q%||Jt6`>e|3HOB6Ix-A5jg@!wrq3!lhxFSKSSC@bKv$@c z4>=v3gW|2~y`1HAa~{~n^zmVZkXCl#xZdUZ3?!0IK(hu8!j{~Gl@1aXaY;cw5vLuu zS~+?ZhK4ULwo_0J-eweK2ABq2@cut!$hMRLvYk=LVb{Z|dOPygQXLfJYP`6uTmT(6 z@hqexQ@;!DI$4Esq9X|5e^abYbgd>c{Q4?b=IxO^VVCKikkJGqG?c zj(oiBnsK7>Sal>hZy^xB?=VKPeU45~4+=L{z22}P!*eXjWjC+dI@@-Ag0P4P|FM?S zoAwStw(esWkV#e6Fk}8uvwIxcis&u48f^PG;jo|Vr@*=FjlE?NGrvmPVHk5*+YgVC)Utf@At{1 zVE`!}B53sVTx5@*=p2j0|9$WdiVVSd?AB@YsG`xi;{>aC=Rr#5Ow8 zj2W3h-{j&E@zIMCf4jT!c@85FHV@(r@&&m9hOi|&&^#7aLIimR@tKkj1qL~8R=~lY zS}HyPHci)S^++QuAPzfL36m4|KOM8!%11l$n}Q()j8hD;!_|*~_Z2ibLozk;G*|U?!IwAYcd)``w;`Bqr(M% ztI*?$7dCzHVbnUzlx2UVErcFz>In=iGlZ&M>GTsaKw?O$aiddf(QJbRQ4iZ^l4ey~ z)}e;BQ_;6P{L8glJh7nHNbBni<8FglzuO-Q$MaO7ZSILPXvG^^s=>VY7XYv`8C9|GZf??PA)Q{mguZhTm*2kL}#oJ zil_;zgiDHLWz;#clvu&WM?))*KJ7xk>c!#5M3U%MDR4rimy9Uu+neg|%c3pkeR>`$ zzY`Bk|IT7hE@I+@et?@+xw5fqmE>p>6}xMu6K0(8hZMJhaM)1&XZYGu^I4STt77Iz z{d(8=7Mh+386~B_hE}KL#9H@&zwYE4rtdCb&SBrDHG7O!g@cTKM8soy^V(wzxQ9lC zdnY^_8h?Z=RQl0KW-$T-3g#Fb78eC%J=KhLj$~tz>ed;X!LXjQ7z?qlRBP~6RrPkI zYA*ca(Kcj+EdjHUBE=4t&Zw{K!*T51XiU{&zmPu9iLN44?H;n(g5+t`dm_LMzPjqS zI)~S%(Az^}e(7@Se&e|3p^y96Vocdbofl{BOCg-O+aic#7LRnKih%XDQ9gAYwUY?i0m{4;M|yPpKr`L2CR(rYOWN9 zG|&iY$n^Tl^L8koF4<{IM^cnv(jy>%$Dmc=ZSr+&IlQ5@6`P}UT_$KWcg_oFN-7d$ zYy;MbL)zR?(0yO)8b0@vhnhl9Oa0wrqxKKva+SbFiTvh&46Di_I+-1s8x)|H)Ty7- z*1>HzS86_&Jd6h00Izin!F+Z{L z!CITxP)BA?dR5)a@ur!wXK{+l!{jxd706skjhZtxbzSr*EG9uiTnxB+!9iUA;KhGB zJ-k9wp?%jM0Y4tH8s~7+V5sk9D%nJ5sg~pcQ_;Apmo^$0OQwu>2@yTN22J*G4LLzH zYtl%Eh<2$$(tZ)k0?_W`7rkTC)l}muKN#mrNHdgQM>)_s#kMFpXEARBn7TH!K~32`nrTrC+p#iT?bhUWP#XopDL@0YfFc z+C7q}h9OCnL`m*doTVo;Z9?tUmOfDW{f8?X;P)--?FNeLqV$Tq-3^Ufy77IVH#AmC{W{t7-&PNPA_H)^RHBRC0U# zay%-|PhTFsBJ|ipBOG_~e^Y5;W&#e*rEVjDiu*V<6gZu*Y~nj4!~=DM5$`iwMQ0;| z&?cb+?PRQ+T504&-XGJ4Jj>w51q%yLEhe*V+=Nj$^ZaJW6-w*e*JD-R{+Va7a4u%vb9$6#n) z*9oMWX|RDTde3f;JKGMyh|5 zn>8@3$2gB3a$@GKAlWblk*d6@o^-i~tu}|5v{A3^h_wmh_@^Jl*G$CbZgVMxc zh*8ASM45l2#7Dy& zntBWFeH_4qhG&UgqF=sxyX*5xvUZyncxSmmj^Qu(fw}C;IzL^%7$5gjp`qwG9RIW> ztF~ai*04BIA)S9%Ns0!BFENXsD)$)d;nPHUiB9pG8t6v#*L@GToh(xZ`W-NAaQarB z9*x5v6jIabzs^*P3|*7)IBn}@Id1Nl{A9mP1f0`!nLXcTQXNc2ocZVZRGsq_fc$e9i&Fn7! z;!87JFl=&AbM!r{*{vPG=#|N~mk)csEaiAM4Y^$LCUu06l!6#8)iRcBWBhD&SpK&~ zZ6IJvhK9>^B&%7om1dZ0XTkFDr+=(``VCnbV%`q20Tg?{&^$N z)P}OF?|U&5euLL$jhpw>XSBPm9_rwVRuxw@0yfzlXTo(*Z*DRasylKM~; zSGaS}l5I+riSbjG_?AvY&Hf1N#gyW3zSr;=WF^xv+MKDIAkX=en}ft!@ZOXAQP^WB zt`pEfEHr4DVV$PdJGY%&w@?>LmgKM}H93*Q$_)SBcw$d+ROOYLsK%`1R4iH;lospK%OKBr9G;%Me_Kd|F;M5A>o+Yt0EH^pI`I#Nxjs3o^%T)O!v?ZK7ah zLN3qSTHQa!CnR94W&8V!twDr&xm2hObXuD>W<6mw4k`uGvgvS}dZBZo!Xml~a;99Y zIcuNE!@Pq;O0{dJZfaQ@(}SwsBXK)W@b_FOlBPQcb7-@}EeSmqm@=hQtD-r$t!ArV zj+Ef+TF;r2UUyw=wR28qb8}r4gr^(KdY{B$OSULkR`>LrrZK6q2UceQuPeIat3tJ{ zhJYkqszr_=gCq8nF$7YDQts+6DOnDkIm=4h9*_#5NYJ-Tp9FJeN6|{bf%|j={;I0h zNGu%>$UusL8$HTR2S!aJ`3R`mT^ZhN8@)vsqDnEsMj(-)KwFTs7oH49y0-+nv^2`u zDU(R31qEYWNsnS$5=0eorv<_~bt_Cyb7L(x!e1Hvs4!{+>30vA=*S@~hf$F%q3KI8 zcAKA@19M2g%L+IUH22QPXS5E3Uc+rvV|_F>S3e{^C=~X#_f1WCcKYZgN<%kZ`DbHo^sy%@PN8&C zDeA@9UgAdBGqiO#*S4#BeCo!PJCma`v#&IepWlJHaN(?ES~9Tq8v-Vnfe6&4mw#$L z!(8@#+^MX)UuB30&NKgDgw&tf%iTTQzAgc{dEKwI^42#goF%4~g{HP@4Vz*3c3DPz z(4&KU;=4(QYUiF=1tkN|X8mL%Y9OJ44Nj-T7@MYxpc;178hE+5UEmM~lH=ibBlVL} zCoCaoAz|Z#ViP=;0(0D1*cypGCqL&HJizVf<-fQslW8q|JpIW8MYQCPg}YjaDHTV0 zCGBOLo~7UR!=RC&Izuf}M}VN6gD=p(U>SAhPsLb(8h_AMFM0A&5$m?)w1#vm#sZkC z6gPJ$t!KAv|O`Fy&Uhfr6DlphHa+q6m ze7A2xxZ&f%I0rre>YT>v2a+(vQ%Syu9!Zm5S<~C~o2FV{*SK8X0_Mn^t^Axd#elOM zGbmVdYPzFArB*s=Nsil*sZyd?e^?KK-+3{KesJLro|Yax;u!^@jTXX`1H+iPEq)$5 z?qFxjV_Cd3Zky^Y7evGOA>k4pG&M+#rez2WFcdvBu54Q}{qA;a*n_W}u-m z{f_&^S0ckSe28f_lH|tFb*5b=QcJ7sYn^b>F_hemtosN3yKvG+>bIY+pM#H>>5XpH zJSDW_C|BaS6kD+qS{@56!8IipZOc=qNpjz~lC7qtT2^Wk=m}iGOwFO_Ej$0)cR!lX zVkWJe%)2D~$*~)KN{jhCQ$T7@ti~>jNxxNTqLzJfM>f_JY|tNVx7@PxCADkMim&o7 zJ1w?lR!9%AI^Y$`Ad@NdL$Rwr^NyBVxP$E?9Y~9A_Ja>LALlo(a>%ijS+YEE zkMGD9UoqFuk&5?`%JYCAK}-SiJ9>8!{tS7ojxr9t2$){+f5=?6>I(mN#U-AQg57qd zqeCV}{&bs(NHkVa*D7iMzdk-vNPF&5H&;u{(Kq}Z>3x;8@y05z+f^y{VTTd$^A9i7 zLNzSGU^(9=G}Cpns$Q-Upt@~5H#eV7LavMJrkCrOQMBn&?7oDA!)~rIANFOjG`uPn z42QjXwbrOTRft{fVpkZ|GaXBoo0@PD{dO~|=Wkx(W+kVkqEtrL^pAn87+0+tr-$0%kno(%z#PYV?^>KUE8L~3lrLNZnGBL(G~M$z ztEBXJCs=g-C;XJs13Xn)!rD6uYlWLhq`v7dRKY*Vqh3K2=OI>Zl6!EdI?g~|d9lN9 zCl?Tl)JSOOf5w^U_cQ%Tji`&!355u$HTe~q;>``xxRjJ=D+0~Cx9X768WQ5A;o^?TT z7RtVfmA4H57KH`_&$Zy>WDxjsr!s;aYs4=oQASNdiCFJTSfB*WVtvpRsxl026)h_d zzWIzjR*Ebf6!@&El`R&-OxIYg5*ik-wStb7OwwgrB@XScjBUwHQ@WE{Ok$-g!gJtK ziY?_b%u;zgg&tsQGV8y*`|CiFOiyj?+J5iq@9T4Ma#q&~M*w$GT0r@FWcsTrh5`{`%i%2gGDyLMPw%eDwlAjLY6*4E z3?-v7lXW6JS_`t23$rgHcp|h432_ZMezosV&E$ecy-ilw!exjqw&-aY|K3CR?`vGx-3};5{%D-vQ(fKBk!uy z3vE(_S83V zn(}z0RLO_0H5&LE-x*dftgc?UcY{4;I`m;vAb((&u zmW5-UDa8f7>z0)P8{A&8F>95GuWB#NR=Msz z)uEJ^2Yqoy$Q^z*hrGP!*xK65v@FfEhb%ZIs-aHx(i{V1x$y?HFyjW+aFD)F>J9PC{QU|a}> zB*m65fW%0=-Tj(gfl!c7y_Sga;^xtSw(~B$0zw246A=}o!&L&06E6{kOeN`<5!_p8 zy8#u9n`~$eYejaKM46@TFF-$nUO1JDJ$%US=fJMyC5JmL?hbXFEDy$D;xTQjl_wq| zgZt72OFTmm>+FO%pfaeStqL^_>yF7OG5=lHBTX@4u<8Tm{#SV45t{UIrCWbsI*IV4 zuz07vaW1kMrt}F#|9)ulJA^7B4k-&pjUW*d$FYr^F6*-W__T9*Qihe3f@tE5D-xDD zh@EW{JzucFn5oe)E#TH~mKpdZiMSB&WE)ywPGfy}4cAhWtJ?DvD+!O& z3niZ=SPXdmwq-OeO5Hk;EiT7O&qii+I?rnfQ&!ehsolqqt!uHtfVpO}j-{yzDEL*=?-(6rzVG^~H7;O=x*SHBOrP1(?>^@>qyDevdq*kweOgm^(A$+%%z2lbh!z_F3@^b{BoY@5L^Ylg_!b^ zg0xQZ5?ln23PcSgO=RQ&-2yzy&_P3#}{PDLIWD{08c-Q25$ zLfRvHp!Qx*EXJ*7?sxh8RNVR>6UYR`Ip|+26XmPD!jU#pyt0rxx~L0^B^IzGrR=`b zvPb6O5WTsDDy>6_gnObu(PR3|gra6|LtAU~Su&N}O)i!Gc)9Wa=L}~!9U%z{gpdQA zW}g@Hs1tt3Q-`y zq3ru%>0z4injvE15;c7VIRfz>U>ftr|sbN^Ta--22amZhQq?FgO-@ zMPva-z(BXyWf+$6n_xco8)7xn-_gxQpUrZWIrVbtD2+}S<{-h$ZLlDD!mNI5k(Ufx z2RxfFHLtnV{>6szal}~M(79JeohmT2HKMWHsM>F$%f!y_!9{=8u`d{lwbSt3+M2_$ zrqgZ8vK)0#{?&j@e$gUS?tBbg*k$7LFvN4Ltp{uO;noz^0z300r{7Wp%$$W7>vAVV zk}>txQ{$DNkdCX!0)+y88L|3HMm{~5U!GRNZ@ej4cDe_vuu-@Gn!At)`VMrAanL&7 zP(r~sb7WL!SF3V4pR(LK&#rM*vVL7q?y1&vxnwffNa@crdT zbVXrBw6M(BndKvPr(W~RYMW@0PkdGl1rn8I7`67(*$@R>y-}b94du`?CGqf88rA8^ zv}>4)ZtNjbX_dO?4dGL)S&&zW;Nd;DF|Px4P(|o5cP4nJSH{MnhJEPZKkMPrOvFX zQmMdpa-Z|;QJ;FD#bnZ{shWQ@eauO3Y3_vdiVom-fira=>=#E4D|ZMLEkH83t$iyj z;dfMUu|NPpr4%-Ke|P@CQ|{w-3KKU%B{VKm(;_^?7-m_O-?ucu6_aPHy;BuNy?zSa zyBwyZuSuoo?1^#_zqtG3%} z%;Tw9?OC5)Vw#6fo7lM+k;Fp%tf}+D3AEX^Y|qqvBY~u3-E`>TAw!?F^8bB1JPI?~ zX3l2N@b0At>OaQh4c(CAqGPO~i09f;(u zp!eZ@?Xts|x1@J?B^@Fj5*FM_Iv<*uF6mfJRhcO49;hlj1s9n#KEPP14CRat6!aab z&Fpdwl{t<3E46^ZZ+v@#n^{#x!8TzD5KS`S!Q9 zZIOg-eN5@D-{Q9*eCrEN`igSw>|tCVCpt-~0HIt^Aj;TuyJMNHO3JIH6^o#bnpd@7 z*tTN$%TL2 zyI%LAmfLGg<7&*)*6DL#291+Ji^kx^gF~$;7m@>QhY~^E5za8X;Z!`YB2TWqH(RK; zruY6^69wt3{=?u)7LoP;yeRRlQh=H-PQh$fB~{Yv^%5@BA0J3@ceHdix7^|5;7X=N z1Tvxk4jQU<^XU;k@c53%EIgTId z6&1Jhb#<}DSmkDixLasy1_pY%yIO6>flAd6@3HptnHh$0*i9EU0?((dXtDI(o={D* zQJa^*i^z;#&UJFqY8P`UkL|ty8`5BH2M0ne#m4BqGBIZIr!UM|FML~f{`%Ox%__Sc zM{)Q~Ube{+fe3ce4iVAGp>KDjeP8*{(f4mz3zrraEY~*qqTRM7sJ3BgBni@M>c6Rml4-N_j`g(VDG}iJOn!|%_ z%}q^(eIzq-=ORt;G1;__BN9i=;*4 znGTCqXT%*cAbFblCw1Vq0HBfFD!fequ))1Y=1rsFF$jBMC&#&>8#;gy)wCR*i$Bx5AH)H%6bd7YMBdkx0^-N;N#UXMGjrU=r~bj* zGz)tmWjQP=-ce;4RjjP6UG1&62W6MFRIc_ST(@rCpx?nvP0jmQ!fafay`yCT$oEW> zrFC0Y;jRt~sm^-bmD<~kA61^TODrJe#{ z8bd+r2_h_V=aKobu8{lxiX=2UE|V0Mc6L?~)i1j->*dLku6 z@9?B~Zdf2epqOltolPaldcALbKfUx_wOG$V19q4bs);b-b<-)aF+7%7TIIG}uEb$~ zE}!Wm2eh9nHAo@dER+M4*<;UqI#VQi%1p*hZ6wuC?W$y1jJCw&fEF zyqrV}79hm35E$PqCRNI0vwnVrAg-JYeCZDD*hrOHPJS!FEinLpgky8L1?174)YID&}qeqIHCB5UXF$dbE1 zkYY{LiYeP=??9>uoW0NK>a9<0at2}?M9AK$d zWe3-I(iYv4+e@={8i&FpS_79<{HV^Wc9fCb>07^ZCl`uPybc>0S!>#VRU*Dq^BL-L zK9|j=x1RBCYZ?rHD;}HPS!>-fNy zlFvh~=oSXNxR>-=fFfBmB*z{k5_!{O3|4}O*pw@t z@l|=eT55NHtR%h>!NhrFryQ-i5pZDKBsk=KKoq8gdFHWhNfHFtNyi>S#t4wDQW52d zgCH=9%QQS~9!WFm#W&U)14*azDaS2frkWtEihM5P#PjGGUlrS}6(hpnaLUr+P0o|7 z_evvx1X$h2*xz@|Jb(l@xS2&i^H)LRFPq*I;J{)t&)|HqJEZ5D^b;4UJ!hDp zZkL(6xq|5A348!=lEBWen3+rpI%yV-l*61(y@shVf4*`BCF{kzMtP$vnm3<-ce7QO zw=E5r^adi|5-trg=|ZUxFwYp^h?#B)>u}}VE}uWlB95F`Vze#bL->loHFI&Pc?H+& zHk$ow#vpBZ8RdH5W<_sP@HcSn<~}1+;y^pMHWJOr=}R#IFyy8swWV>8F&omdtvb&?FByxAHcxkJmKtdGob=+#11F8H3Q! zKEvnX<4Y19te=$tZu=KSs=+4W!ONG>A=(SbcW=R?Zaqe_lR);lEXC2m&&vcY?9Rqw zGuZkQOFdppcIl!<_`a{w=&?2~-u&khhkSbsdfO=cw>zOQ-&&3@r)#zzk>#8X?o!!b zufmVZ=U|cS9?Ow#kJa%o^>OJ**l}pF8e=8$+rwrt@+KyGrk8+aX>Kp%W5WILaeEcE zP0|pHAIth$sR7$@hyE6ee>g?${h?FvXAZOwq=vlU2Q34>!7um(UvM>= z`8~f`8zbHt&TaTJkIvtsQ(#-xn?+B;@gsI4DnmNuJyZN{X*5XILJZ z&!uN&dB88fTXtC=QptAbQ1;Pj3Zy?Kf8(AzEI%I%a)nsYz{m2LxO~6FTX*3h7@u|I z#Z8u6DArh<)6~0E);P&&Fk#6t(o@K|%*+xb7@6#@RGLps^yAKSURm_8!1m^Rsd6gw z#2K;uc#?}YUot$ZC~Y^Wd`cL?#OC;xJ-I2NXvKs(;8rrJ@!9=x+VP9!XDK6oSR5*) zS$q^H1_^z&GwV%NEbcIegFVabbrLB;T~$w`T(vv9+oyXt%L=i{Qv%U3&SeV`C%S~d zmEdYS|LiJnDkwd&l-Z7pFJwe21Vg6ZUVA=X8!*#)E;;=l4&ixb6Jx+=FEy-HEHN@I zI|<#%758|3{&v|ME|1?)X98j8QAWkRVs_fXOvo~t>Kj>2XE&pytWuyj3u@{bnp)aA zx_bHshDOFFre@|AmR8m_ws!Uoj!p<9HHwCoj-J6KBNH0zPTDg$+a2I$NnUCFG>Cj|9E=*Jj~H_Fa@Lz)FkjD*-r)@i1oBb6E>A(~pK zXd5L9f0%qyu|gp>SSnqZ{R*W9GZYK&PC-hGM*-uBU`^=M0iE`OHJ>?=cC% zY4PbwEiCcT7Bc z@cBPqW^K#h zVjzv-S>WJU+Jx2#76+%xd<+&w?=f)dNTM^y6h7+6_K3ri)0R1)>5O7*mpbjkk?)Ef zKQU)x?i-ORTiCsR`~UMPmdW3vK4jt#&&@|Z=jPo9^?91(at|yVB>(u>eKEr1x%<9g bX8aVHA=YmlRlob!7u&+mJ0~xUw*UYD-|trf literal 0 HcmV?d00001 diff --git a/outputs/client-info-design-check/client-build/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 b/outputs/client-info-design-check/client-build/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d750914763177b95070fba3dc83c3d4466919c01 GIT binary patch literal 18748 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 literal 0 HcmV?d00001 diff --git a/outputs/client-info-design-check/client-build/assets/inter-greek-wght-normal-CkhJZR-_.woff2 b/outputs/client-info-design-check/client-build/assets/inter-greek-wght-normal-CkhJZR-_.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..024f0770326a416e2e8da7ea541959bc049c29d1 GIT binary patch literal 18996 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 literal 0 HcmV?d00001 diff --git a/outputs/client-info-design-check/client-build/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 b/outputs/client-info-design-check/client-build/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..479d010d2902fa3a5b48e84a973db1978b2e9949 GIT binary patch literal 85068 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 literal 0 HcmV?d00001 diff --git a/outputs/client-info-design-check/client-build/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 b/outputs/client-info-design-check/client-build/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d15208de03cd1ad7c5199f0a0ce915fe841e4722 GIT binary patch literal 48256 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∾Na#*TBTU(!jF?9zmR-!C*+RdvGrd0&{`| z!nipr`K70{m0;mZfs++H&xu<;V;(1SE|+r!TRFhJOmm?gm8-v%s6s7Dh*U=6WlK&) zC>hc(wUUwchV19Gxwd(0Le0hY-uAsswcmCJy3hWX{bWBq)Wa7MBv?Wsi2sRLiZDai zARG`L2q+>PfkV&{v54&U=V}XL9C01-f7ubpIAjTO8u=7ug~Fk9sH^B8v-K?tH+E$tA{R|y7rfMm>)3O>5hn|XxGC5boX2=_Pot%TcGfy9LC3I_y~ z6ETjn6|x|L=TPnCWcZZJ9w9&w8g3s%v=2fS00<@u6cWy^Py{RrY?t5w!Jjm;{u0CO z6R%@5R>eQqFP3f8xPWJG`dtlPnnvc`7$0s2{&Vf>blg)Vp4wlw{Tt9EuaE_v@R0~k zANvIoOQL%88Y}la@W2bbGVuK-)=GTz%F5$oL1$nN+)6vc;bHG;{pA?4!)>uR^owM} z|98H-NSX}X&`959c2sEz=NJ7s0461Kr5c%rzYt6JF?6aopPF+&a{PxbPZV{?Y=^SG z9dJBntAABsR@l$4-454=YibT_2oQ1hErC2EO_IE*0CDf_wEk6rdR7gW_otm;Ns7!R zyK1XeWN@8VR*LKteIGU{r>@Yrw6De=4*kcQxBz|>XA3!u{c?Dhy+kv;I~GzPvgOCh z1#oCbKrm)zxMtuw7u}XC5Fy)i$*RDRv^mYBSVc&tAIu8c$0HU zdnPxrA&RngA6s*U-?`_k*u~9^*52^PMFyB*EvU72jV{f;)el$~rUXsyKh|ECWnU4< z^LC%vQ?gpf`!prC`kM|l0g34KLZsVFLp}7@K-a)o{QvN#U+lXdhqgYZ33Pu?RGw++ z6z&IpG*(IN3xN~OPlE+kKDH?SiN_S*!l>eJc!6R$p1=BKR<(#HPb_$Ifwc+_xOQ4o zOax7V1S!`c0(DkZ4(%Q|J@88lYtzl2?c9ass3^Ywhzo8u%gm{E4vXOy)7ewRwXv6E zIWoyZ*6(NHnxSFahjLh!j>NXoM(4&MkA<}XzS|%~82|kc-54u_ls!xC(QpP_J!7q& z-&}6@*U?P|eD;bHEP(G)nv1GciUVe8g{iZ~M9YCOYTUa%kAmlT-fkS;|qOb}^wqOIFnEBb~&*M3fbZE~b?e8n!TSNsx_il^~8#Xs=4B8w{( zS72S^Rjbm(EnQ7NZvzKJ427^$9JEy$X^X5x|7RD#CGqSr%IBljMX)lHO6Y8{jqSXw zBRY_nvuR;s!JHr>Hf6gJyHhxaa^&Z8jT9=A{?Ry@f?P_xKm;nCA;)aq5XBuR6T>v9 zt$V`nGVa^+!Rves5om~1ac=p)L$5U|AqsU^-D}e+sN!#rau)||N3r@}3gQr^imm=) zlh97Q&OZMB8!3U{w?q;xgfFJ*%E*cV^htt1l8O2!7rG+y8|}A=td4AqgP#?ChLMKo zD0Eop0O@AfYC(q}ngj@5j)OqP0X}ayJ@o!Wxdl+ws?xBv-KICSj51r;4X_I1UYI-+kute1`I!B2{wVdPt+Egjky9)Uxur5=7Jq#pSuxTQJ|riiE=$D0RmQyRzX>KUEdA zM18QdlJ{u0WwHp*_GnBAh-_29lfUM_dGPx)Prq`}%_$uOcoM_twG>3yppV}iL}R2D)F zFv(AGTZx9x&DaQajukV)cOSC)+#VZauI!3H-2bUlKAkM zrten5b+Fhp_U1&|5LhU3kcNObaa-{$;z-_W{YXANYZsUhXQKv;{&G0u1rP}#d6v3N z_^*L^bIxDx#$kj|eKsZuTMbLG6)i`mJ8W0K!8gPVjXB_MYsry4t>`IaOxj3}o_KI%r(_Vp=D7ik{ zf+Q7P_%PVE-;-dM0g2shO+W8~Tj4<)+lf5wa6P9oB`%a`YZC$Em>k_;BU#4G!&<{S z2X@PSSqlr%KJc1uF{XJNJGue1x(mi6f*{t5Vyas^NWR?@D^5tQN@S#%%Glm}or9Q^ zF$k{PHM6v%iHQ~AG~0_`Sa0tK`Pmllx}EnU2}G#hCE}W?Jr$;8Wij_T@69n^X_N>t z_Sm5F5q%O?Wow<)y>bvr!69IBM>o>OlAKrwcK%M_3 zpo-s~xB!ln6$J6!roCT=5UQYn`a(@c1+@{*ezs_vhJIq7Isw`x>e zyKBK?eby?N3i<)u$p6IyKs3=48|$}HKn*WDtJXY%=r*7)LeSFEZOqi#S^?D%>x1_| z75<{vVpRKCm+xUHl7&`d6bsekyp4uKXYuJ!55dJB@!98RbBeXqo3KWgwyuu)5F z9$2x}Tg!_!ixu&E9G1SZcHws8u|!R*Ri{}?&L-))vUkq&cl^G^x^RpF>LLWTFbTP* zTx}*-;9j3~{hig(*p&1g+Zq~oNLk+l`u2|(|4=EzpEPo2(4NU0f3B3K^V0EWt9W*M zYBW~5i=@Z1@pZ>-3^G6yC~3{@5`nQ5B<&J{@`z*$_@i{bEIyw?V|buP4^q2hv`zfi zk7=`6pfi~Jv4pDfjeYlbnHAV2xSP*N_Tc%OvOyU+Sdwxm5lvc6^C_u{9Zm4?`0XlM;J&ifbu zm&s3iXc`z$d=dp@YyK_8Qb{1bm_|`?kJH}ps9J4fpk-!B${LJM42OUmmr{$k?GWm3 zpkNa`WX5_bI2HeHv!`vK+Oo}fG}$>WelDrQ=?0i!;{}B!Mb@7R1f2HX==3O~a?xzg@35~^pTQg429Qm%jk>G|W0q|9!S^ot@EN?J!Zjy$A;)O}Iy^TLEs+!q6E24_PtEzQc1Wql%&C&b zQ(afeI-WnK>elgw>&>m;_HvjF{~s!2&%T4XfN)*K${w-jdg*0j?CEPsWI6iVCm})M z69DZcH%!BWth2Bi@mO4Lwy9i{V@FB&u$|6FmznzZN6ZrxDoOCR-lDv`=@%*eV5G%j zO!QJDUE6|dT2jGv;o|VB2V*5#VjUX@Xim$?*ppN+7zY1$4a&?{N`D(!lB#Ih z2ID54hzDFqq5Pnap$_hH}9goO(b8V-saSg27||S54H7^J+M<4Cm;Ha`Is0d?IKTp3yHlOy}ULZedp~ zNcGl+bOCbbx(gRY!0Pd4INr$6i;GkqAkNAMGb_$%@ z353$29tNB5BsRw0%tu`Phwx=_MM?kA(R31)@HYrRJ-VI(_8u9fjXeb|mxeCP*w%XU z?4sq!as|^)TuHRsLtg7!(UJ5Rd|PW#ZrfT>?JPw^=gb5plYxqC2rrMQt9InH=AGJU z8;1@Gbd%xC8HH=Qk~Km*|J7g{(`8)5z#?8av)mRYRwe}hw#PhDk@mFflFq>@F!UX*LjLobnk-nGU4hUN`ns;E zlU)-zY@~a|w_QFs3)&|&l@6E1a{R$3OfI`pzisOGgA8x3`<64XNwW{Y+LoeNE@mVd zWK^v%X$&P5TWor{Q+Llhm%zWa`WfUhMqQbm}b3g~d7Nuw1V+EexvRlqb~| z>z6F@?+OBTL1|9S(VNi}C5fNJ`$TYEe2vIfWt|8wJpkpYTH3_hOPd9G+k7k`eMPch zZfs%Ldz9Oe#tV6|@Ap=)pm^C7Tt%6Oi^H%R` zgd0RdF_c9nzKrGf{5bT5X%~e`jLV0VqADr`3U&<u{bOcD;@0cD5#KT|BLTf%w(! z%Auh_iVeC_O>G-&Jf*ftt;*@KT2D&kspZ_}fYDgdKO; zYlkwI>FNnDMa#6R6()?Kq|B~9(11;I-mz=YtKI1JO~YtjJ*SN{pBDV~L`FbWYBoP; z1B75kiarz2HLgsiQD+YNyzS61wm^fQ1dk-X!N5lXWRD}ojnvk+#I46@FQ0t`rm41v zkp#mlD3s{)KxJBdvvwfiNhSDFFqBvWssCPJ4Tw!C=vTR~Yd;MM4q4*C0pZNwDtKnN zpPtAN*x=*9j$54sABDa-Nm#D+pc~TA(d_H_sAx`H_Y)Zhx1{>{icw4{?#75>79UkS zj*AsHV|fq)VosdxoZcBYSd(6Ee=-a{8jnx13s&!F_${ztpElwD(Bt-YCSf=z?)8Ix z;;hfQ#0%^x)7~Hny8858lkRFIyMr^jX$kG~xcgyn zcJH0IrZ7QVZ9t*12M?_Ag-4;h)!J;nRI-zys1Oa3g-3^!i&(Fw&FzfF(R0 zzUpyXL})FjXhLSUYQ;LmOwnU){f_n%I)HibK-_)j-~$)K1nT0+emH=5+%CkW3wlJ} zLSokpx>cr!{j)R!d@C_)FrCVrd^E*~#aI$}d7lUExWf#$Pu;uwZau4Rsjm&{FntMP zc9pbDXl@LvIu3pbjU=?vPIIA`pRXauN|w=3@PR&0Ib>_7h6ct3%tRtBV&*OzUC5Xp ze=Rsxij#~y2Ux#T#GBF;HAQex{>|0;?90mZct3nv&<&DtrEa*mzZ-Rfv;tu*_{gK{ zEs4Qu{`|Nq##AVTRR&h?uvN?4U~>Y8t&n2*iZJ%@2P=>uKiKehsDwrBMq4-I*Q|zU zK@u5##kv~?N4)I#6c`d;Dl%DGMs3m(6YKEU|IRVFXGx7o0!#c$7t6`nOm2K@)|sM) zphFz{%&9j8+H8dDE*+T1z&O%XUh&8i${>*sNjY0e&4EJOq5lO zZy0nwkyBt#D#H)r8ZqeWfnXeT9~3TEz%IYNyckibxCl{-p`Ba)r$NgG7=j>uV&s<@pk6eHsRi%OQuxiu3 zhBMliOG{;~Vf!>kBdy8HlyjLtfRYfS=H^^Ry~)U(55x9zuvLkpU{1u5CH+=+fTvN( zwL18GFnOK6VlD%P_dwB%hfiPc6oN<}nj-bW$Wd$FZ3|mEKxl_)W+5>XUNiA~k*gbxBYJjKCx{omVe0kNzZVtcQa9TF&uZm>Nh?O8 zI;jY*$k#;<RxxvR!#M`BUr{MzUo~Z zT{lUrRkI*z1PZ(Iwg|^8;ImFBVMx~7$*y7?vTE0RP^sQJXN2H~h|lzc7~9fH^rxLnrjoxi=e)7g`G*K&qeGSBw57V;zx|E!nf)#@#x+ zQx>Q*K<{+so#aOI_grRmQAPjm3XY!1sc)O{Zs-;#Xp6QNHBb;|C!R=5g|T|FSto}V zlWCqz(&EE^A1>U4XkO>7^M79G)?(^}_I-g!x>2PJULc;VbmF7}1?%z8i@DU1sT_tP z4bqt4QWHL(9)x?|c=(%gzcyeRox1WrM6A2MP1Ow_I~152L2G(~K4r?8DVf(@>jdDgb0IG7ai|`$11P!RH@g^pn7xFq9y)BQ` zl(E^){%U?$Bby}!1F~~<972@5?bA|dV<1ezXUOl=fOF7cHkmrz*{F4gW@#8wQ#dj+ zTjw!XC=E7_gh)ENJ2&*!1hgmV=zlmE^a%P=w%Dpz)fe%iZs*Tv8L7Y zrWyafukI?c=z1|M`AuUm>6lu?Y4LKLwuZ}(ol+^Nq10zMtW<` zcggh*UzOe!O%qTgI4prgI@c$&*+LIm{Ykhx`8e*0!CSuteeNG(Qs|!dJsx-AK`u4+ z_1Z*lzZh$PE)3dnbBgy$^8eZ4=@lamMgLXunynLry}rJ70(TmWa6eqfWe%%h-s-cS zIfJl>2>ju!5Z$9OHoBBy4@>XjCkG?KI z1HXZQLNw<~0bnvAFI^E62Ys&$IbnC3&{TTgG&$zPgs;TaUX*183gysCVVI#G!zJV708N?(n?R0+fjLDZz6 zP3fSKvqEZoi)$_i1QRECxS>Lho37n0c*Pi={uwXqPA6y+gFifZw>5y5-XszUvrwRg zNC+aKu=j7$O0~{A?o3Dk1Gl{q`6p3DZlmBHN=6btcXPjk$Y>SyZ#Mn2Ex3Y|G55(Y z>NZ_@$TZ=KQGJ@`7qU2fg2$t}Rs_n5oV)Wv+vx8Tj4kvjk-l8^-CU7Z(Q^zE_jBlg z@zY{MvOFFz-@2U~(|yfgmzG-}>s)NWX34pc!ooaG95JMUKZ?eDyW(4`ku@5I8(~u^ zDcMuEA?|Wo>oWR_ie_X9U|(*`sN{_!k+3>b$wXo3>belxtFcV`nuE>;Xs5RMueFOFze2c$6Bd(=>`l~A8+cS-*hX<&=`et@73g~( zck154O4cJiH~Pc&!sM>Yp@2?F33Xj1b?Ca@@x{8@^sa>jC`n-hJo%b&Nh-hAMijo< z_i?9*BT2_aFyLw0l0VtSG zBA0J=oFJg_vcqKB?EbEHj-os}phFD4d^NZ%{(>dp8L=-SMsk4{fNP-|9zjwC!8W@yvJGKLJzLz-nGDS6= zwV68&9b^u($G*w6Nmy-$W|zKhuzqaG{#0ej}Xa z&Q$iP)6{+ID~-SXwXQ(}zhRoFyBhRdDvA`2`z|$Pp$=PIf#L5Cm`-`oFy67s=Sk;X zvaZ@;Ycgo%4`8&nZ?xH%8T<+6-!kN^I>&8G+B^;%5X?_;)!@P#u)M7phdzDq5DwMN z8(2hUU_-@~Y%6;#FIB_=d1>HdYbiibSMYWvaY{TyHa}JsVQ(0Tb?Eb=1;lU>lCvEI z9kK-)WdAvHC#!%6;K9G#7s2YLhBNR?fs=<~vOob5f{YMKs6R=+&6sWPvDyAjq235} z>z+;iVqAVF1Dg@Ne^yNLU@W1`2np!Eaedzth){^n-MCTlpaD%LnL7ukGoKp=LKg6O z5zuCVfDx|^O*Q(VYhaW!3@nyF+3iv?-}egBU=gjeSY*CxY|7+r+;v8Q4*G6054g=Mn zW`b<>cvqaQEUGnT7|2))ntG#gk2<;0Xjea7uVYeJbQDgIURdJs-h?V=FhodAe6`Y2 z6LbZxwEs2fKP>fd}gmst3ExDm-;EV(Rsf&j=Qr~2T~xZhlORnPNwA_3-3C# zk*Qm4{J`x~DhzbUp{ammj{~1JCj^nXI3Nn)8p&zPoh*gNl*--E_?^aue zyI65#tx*A`vg=)zBd*^|&8%aZzDNL%y;CSYj@lPjt7$bP0=!%tz0lOMwj3XdbL9E8 z#z2cgX+a;?Np+KkfgYkn2ofx`Co}gm4q?0f)OwReEwsMjUU-(mI}Bm4$g_}fFE&&w zP-PO!&$5#nRXUYQh7cTAnUzKQR2hAU0-b0&=N!zN7hF!|hX3$f;(vf&WKX9C^E=+Y>i9^nSORRG{Xp}hY z3%aGau80{*_*3%tYq^4D2Yb?h72v4Sx0^O(L+fToMuxx~-}MAasT@?m%uZyUWf*0D zPL_dDG1it=Yk&lQa66wA5BYvlJ2aT!_7ou7(5)iK zocHTDhyYFdYvV-20AI0J6U*>CJX}tM#`uQk7qKwO`^U=W);lNz2gPT=MRu6TW(1Qo zFm$%^%mzV4IdrA$B!Y+j_KpfQQw$r^q!1XDwCb2%F0`;tHQy#jOzBj!;#?2su^f-* z#qQXl_|pHxsKQ2;#>OTK5!+-4tvD}|Q71MtoZ25>$-pGdX!^WbX1sF={uLpEPzGW50 z099fr!vxd~cfdmqncblV`{HF;buXP86S9gYsjRBCzu>w?KOqyeLc3efWrqAwxk6Gf zcD;UfXOB$gXn&%2LNNL7_m4N3+OVmew~|g|L7SRi0BC?o67i}Tu>Br-W8|;swyZyL zWW{cpRqQx@&JHQSFur%EjJu-KnLKXIN-WdE2yTmQmcT&Y@=7aj>n&T%fNRaZ@gDEY z?&R#@`xXlh$<0<*#LDRe4S!Km_GQHdd?Ipn!lPLt4?|3eDcBb&Wb@}lbaRuu>z%Pd z|J0sIbR{CT8dN}&X`I{{j2GdjCOOjz(ZSS6UpcW#7IDj5Pj?*rIn=JGA`iDpa8IHm zb9NSX$}OIOl3qM6$QFhPOeNM-2?T~D^kMmN^CURA zB@h}Js*7ON%>-y|0SnxzNwnIpB5L(2lVzq}4#vcw$7ST1wD=6t^>y}55a6OBJQ(1{3nX*yzmnGJJNV@hzwiF*$*%+(6Lg(bdX)9DU;Odr_U z{hC=VXaCG!CWf&V6$fMo4w%N*v$*<1u5W7qbStx{=ZrMJ=gYCvJhU&5O`$6AlRUCx zoe^(YnSag^IrwA1@1LW{F)rw{{59CuqksDNv2T)cUZ#Am>!;8lK z_1+wc)05#qVQQ%Di%!!d*ClabHanNgWF(N@jn@4%n#tV6e49Uywde;%1#8xPyMrrE zRm|~B9k*O4a zHMHj*wkL^??clvTjQ?{nb%kPUAQ)eI$w7nn2_8RwtUXx3w_7+MZp^8y=?4BS+)QhL zH8>4PrN8ajdSm9mQ$hWJwxQfka5JqZ0$bBnc!O)3CFMz_VP2(loLB!=IFVfGll!{_ z$<&H_x{PW#1A@41aMilSMXoT+BUU9`8(e#`KJPv>qS4y+MkRECJ30OjTUud}jXzom zJ?I~J0zNdAXB+DKAtyo%-DB3veO}G`Lb^x~fe*e=FLeKRr^OQL2;H!22&+Lfd|5sh zff1>husg0#?3qi!G%SJp3ZIwF4P8t1>4r-ktf9Jsqrkq!>akHNG)m%cR?DqgT*ano zFgkr^YSs!Ch9)bRN~NhRqs9+1*cMOQf?TR^q;;dVxePq5+~+J^)nr!7WdiDVj?aw< z5s0$J7prym4+Pyt8X`BS>S2p!PJ>azJ5V{jk9PQs50ELa+PrL)2(?5cob{<;XtJzG zGI7vNYi*0&gDU489npu=JyLreR)m}m?Lw?>a<_9@hlL(aMW<3ptgjQ0%z5wn>{K=F z?L~QEUvBs=B=ztEC2t01CjRl>1<)_+p!_LBL4Qqu)XExu%^u$Lr~ zh62AhV<;Ea3l`Mta^79phzbZ_NuhK)@QD@uvubnpDrdGI#%>?`l@SJ-?v~VBu?#J9 zNqK1rJkkV*3b9{9&Diku1=hI@&1zVccV3L?iC)d4Vcy9Xw)D}4!+@<|?i+Ic ze`YGK4i|bwbU>cYC0Wv5BskNOXJ(j!lvj9Wa#o}^rG-TkOS*3V%!LHOSPM7t-toXf z1|@tD4%oeyy2_S0)G{enyXu<2PV4t;HB4>#NTXGZsY9Bh;~9}dc5EXu!)j>L1EO-FMKs^xne zl`AnMKrzD0{;``0`Ru735J%%$3#uli^$cV? zxql&UoH(8odyVJW_X-n_42>#)+nz+}IO^<&#rJh^TJe{S8s4|~=w+Drx9_(XWLkfY zVY-(XTK8F&SEE3IKeguayz!DGH0VSvD6Mq4MQxnVx1b{^dRw86(LM6Al$=+M?JX}x z8(pDx?n3G{lt}2Z_h1QZDe%5G*seE-ztU{ZTBkg^-MMJWzuuc3{qIF5U08j(`d&Ki z{9E^+#Wx5^)phwrm)tTE3k1RkSF@m*!KgZY*RX#s2zM@5qKev_uib6+$fi9dEUpwR_6LJ67{m@1!B3{tGZ8-Uly`^d4q<4Z=9Cfc`dYJGK>YsdZCg^9emp1^F@o-oWWm1^REAt1)>1-V@u9@ttiAxX8iOP3n zC%%b9PhAh2x#WuFqLR!pDaUXdlR}Xl(OMar)+7lf`wO)jXNjPWHH zUnm@=kpN2e;mtmq%K(SNpYZ#lS!Z#NMo})W^iioLEVWmI;8yOVe?JAf$HA9$*t{+nxCOWu$Cy_CnM#IVgEP z$yXKD4VP0mY~hDctM;2-_Ug;4re#H5>MOn!SP*Xo0yD)}!e_L7&C_ThuM6Bv>q>j? ze##@z6h_k(7Xk=*R9i9f(r^{51HWfr1Y;FhB!8E!d$PduBfEV(#{iTf;k@1UTPC~w zoz~mZvyS+G%stuMaP+T*u}2$oK7!b$^yA&bpT>W#)}K=-tbyeed&q~8YywEk=kYjA zTHWM)ubnZ*ii?edo&~8uxj42%THA91`&zbT*JZJL$!22U4l!OZl@b>Wz2*Z(R+_Q{Wi6rzP&UxlC+m~G z>08M;gf%Jx5#UY)Z`ukd@J)%(lqu^cL*Tu&%v_86d8BkY1NYtUc{J=FfO=mk^>4pZ z%=36ztHFK%`KjVuVqNkQQxplvFg_NjmD49gv%GEr)t%6*5AKthTWsq{ZQoJk!aRpg z&3F!E?B7=8sX3RqHBRlf)<0n$i{Rns538Q$AT=(6VLO+DNEJC8yVpVvxmE8L55TSM zzavDq;>~#=2u4>i+)<^_jmLY4_jW7C&+3+5nUgp`IQH@n9BEYw0SLw$A3l=}051Cc z1d-p!ED&47c2R(YAm3v{sCT&^-~ia$W$@A|TA(d@SBQuN_@35Gb-5rTHFgMr!2MV* z_eL1p&KY+5veNr9=B@)A_-x;F5B$p?7yFPRS}b{@@H&1QR5S!V>8aSV%@RS!M^l3^ z>-=hH@VOq}MiuDqL6t~Zbi7$F;AU}r4Vh9F45UF5{$rPxCsQ(QrL0&mEmCG zlOc=wlEBPt=x!}=`Ln{znR%I6o})@M-H~~GP0b=&p&bR0H3x!tBRysV?FmYbi#FV# zxoAR0Yc?R#hw!+Fge^alQ3^kW&1=b%!hno^Q{k zC?FKU{(sD*T{WhnivMoJAJ6(g6)_+xIlg2YhY1oxM+3rkiDy+y4khH1p6%;w!R=y6 z-hxzQ{m1{2B`ul!lS;e)vh64u1|`r7yGI6Els|U*xqAIWki;_u4)+|~O z=<&YP`5w4kkmNsU$()71{w+n8;OUmL;F+7l4u^+t`{(d;11kUhzW)x9tJPn;umcnp zM-lcgnw{y&BS#khlz+PR$QQug@z?3Ckp$#@;J(*@o??5OY|}@pKmMci*S*{BxUCNS z?uoCH=R9=p5B>&7k@$YW?xvDIUcc+_RGjMi5rRI`msEcmPv=X12zuqY90!oAyPzx6 zEW!70rMGO+_niB|6QJ_Gn7()YiyimAsYeK-iZn?Gk2EHHI;&H(zh8hJE4=iE_DXxG zv)$eq|MR~ql50J+eG4rIK!1JwPV^{zAySjEWOY_<V{|DNav){&#NPf&tN<_PF%GY#cc*Q|CE(jMoxOt3e=%1jNF zKO3HN%(4z8tX8{noLs486z=rW?kJYnC8?7|+P{H#zvAJ{O98j9xYp#$!Ym?j zaV8}PNG=w)pkR&-H*+8BEGN0FFfM1N*`7bl)Zq3L{uq#Am1 z&#ZoG2|bh3C(#1Xw}vR#ZdgUm4p+QaC|7U;fkvSKW%IqM^u!i z5qws)y`u!`nqM*Mse3-Q3;)UhwVImrjL%SAP1Y^5703C#&C$@+PHgV_D9`K1`G?(5(+%~N>>#Mp*#yN zUUx84Q+GwL#Rx*nOR6*}6dP}6_5QW6=464eFZ`qSmU{U2^fxW)ynw>LVQh*?= zy2@rn8ObEuz5@#e%UPJArVv7zt&t!|(x2gyLR>Re7Ik)ldAd#>kUGYsa1{k;j;{6; zF0jS_whpQmsnya9-zLZ^ho@u_d6aueIWGt;&4(s5bE{6vBalQE1z}Qfo;rk`2i>7> z(sRUjRH|5>eNN_Cg02!E0hR!JJxf>N_vhMe@6^d5ic-;Za!LucY)LOrf5eEu+ab*% zS+P39COQ`Sd)e-vjpUG!E{ZYrb$q! z?(^MR96;st04}HTu>>f59GnxJ(pK3Pfa;PPj8#$C~ug<<@!eoiBLJTJPK4w=q)P0mrxAdjCNLFN)lR4?)Tq>MAl#{ z9j-h>w!dvSi!zyPFoild=BkcfG8zLncHte?!8$WME+&w*p`qhFa?e@Pxh=qbAsbQt3gT{fPbTOh zY~psMz0uhgu%&k4mWs60TQZ_Sk@m6)f{7ET)PCZLSfNpFnrU}}SitEmE+L9iQRzxh z8&shx3K)CA99lvFxtLi?m@%&UD z_+ZjQR!FihhKjssd; zURv|Djn>6eIlS_?o0xC>TI1oK8JrzXX~DThc6)D-MKI z`y5w%5vD9XuSWA&q99c)q0*`>y*Gq|`JU-`>yN0~Z=jN95?2guVB;Asza zp`jG9Cl+(H+47`K%wanG=irMCe(aRlU=D`Qy$D+WtN>r3eQZFE_i3fr`yAJEbW<2f z=FNWSK3le=g$R@#6z0oW;}QRAWSKcfYhHz=@Qx@%DaG6G#2}sON|mq6M+EuH7q{Bd zqMt7}Xxu9L!?4x6cQxXSc;R@NUAT10S$Fnoyf1#fjikmpIwK{bu}XigJg&H+H+`b! zp(6di<$1$Wx&JDbMI;JhRx826BdB+vVlt&`B+HG$EbgBzBMYgi|1G57K6yZTYDh2P z%3Sc+2qY4VEXY{(SGUZNwwjYuJ;ji2drW2UhDk3+>k`r22kBfJ-_pHdb@@{*s|ChN zuT{%ZhiNX1O>e9$b#rLlce@T55q?;Ls?$(HS*(K{0~**Ba}UTZod*k?Txj$2}Bp{L*zmmxh(bCN|#D9n|xAg*kac)_Q6c?xsqy=g`prVh{rjyAo-LU zX^f{)!>Q_iLCfZA4Y>yVTA*LH(-}PstFo$9ZvI)nkTMrRYmxu14^nE-!?E%>o+Ovs@QW!O(&_SkaCo(#&oTU8}oasrn@ zGq8$Tm7;dpf_Z&}!3A{hIi<7^5bqU~GGr`>kSjc1jU|;33_Nz-9<}yh87yJ?jzuaW z{A2pmcu6gJ32I0Gl~c0^yz`7Z7mGsh=5zqf>%muLw}E7BnG%s9UK~Q|WhxZ8O|K!7 zLMM?81`)5vd5Gr)A)4U0cy21~FkZQBbDz*7Qm{e#bG>5jQi#oG2iuyxR)|TBw_V6G z7&|Ve6sS}9Mq$_QFDgX}*%cYIPLfZ(#1ah8m*woiba)Dc65Cv<5y=5ou%2_7q_XP_ z+3``8*~}3je%uQDm1o)k!w-~hv)PUT(HR(iH0wM=U+WPbjZ`TI9F#vqgJr3_%ZFKZ zzx!rf2GdPrR3yxVnM}(eBF__i)L1hhb;rS6(6Eun=6~52qHW=5)a#%r3blj!S`}O| zqUe9)N`r|m>rje6gyE}Qd!4uII0;2#sSHW4anqxma9>ft#foKZDRletGu(OAunBoa zjgMGu^oO7{wF<_XEg19!kxW|IDC^4Vl|$^Mh+56=MwK^*TwrqsS~f9@>?S;jqxoG8;4mUN0>s%UqJmDsrzmfs#|k@e>~%sq~kW z5%h?0{4Uo)_`0^NOEw$F?bYOgDOH?)K{&*AYY5guvsrYdLa3ThYZyjP5n{ok#&x2; zrY4b2$!!SV@JNDr=b$ve%N)|w6P{6L{h-hNQ(~4~<|9#_<+%ufcv*{5e_}@>d?Gth zetEi|%_?LJv+z`lmdznn7)Z!!Rk!MtQ_nyYa(NB|M5%aSDVjz|W3gzNcGH1H$LrPg zV2zSgC&?v4=P!2T1(6iKS7;gBu*`~4r<58NhK8c#Sj9ATZKFg3tJRuCwJoQ4M~A7Jg8tN<>W>sAvQn&|R#O$ppN7M(Nfk3O9*Q@Mq3?-LHx9E0 zcnjY=F2!P&Pav9dN~KEfkYITnfjnN_%DIA01KMxGi3axqLo6uWjUxqb$S3YEw2SCc zAb_RzY4m79l8>b^dwwA^&ny@C933u7xO_4eV6`M$tr+cg-z*86Q5N^B9a0j_sA-K> zJ%OZ-=QoF}N`-WQSE$PMp|m&Y2Wh9H?*J+Pecu1K0)F>3LnmqeropRw65=mgPc+eg z5%$5ouzO`iLHgDo57cG(XE%$R)X(3l>YYzb9y$d!WMcpsVJk`QeOe}S;xKD|0|fZ0 z@x>i`6MygSqm41l(efVB(Ot3D6O2)LfcyvW3zHaIjU$NkaR{sppCS9 z04oKLr2TNf9?rbQvHQ!1ckI*d@SUJIY()=@J;}#u#Z~wZ#XOu;oR9sA%W%D7A@(Y+ z#XX8Qao<(CUmX5QaRI)dxbTWzu7V?1=C5>@vGB~p7Y#dl|1q*P)qg?wshMPr@N}r6 zaOnp=`h(bhfYU9aPvq^`vr}N}*PXt#JAr@~m|WYZfk4{}8qo>1B(4IF;e6(Cl!T*H zRG3?RN00)(gLm`VuX+ed{KD30t&nUf(M96l4_Js)y`jM#{OimFtRzTf<5-G|N4OBO zX1NAk3aXHhWgFK<4V;%j{cbgifNDsKD+~R8D{F!|ii84d18emkMe`9>TB5Ln=!QppeM2f*b9m(_?HVBoT7`4!)4(D-PRV=2>Th;9uuLm=2zw*c zV^)0g1%1)h@tPYJ3pj#?BOEUCB-B0By~idK#C2~bi>PY1C!CRZUtpW}fPJ@kya0Z_ z9&k87&d(k@vM={z!|x49?un6IkAe`M;{UTga=oVVA>cs%P~cIEf+2z2 zmkA!*LyxKUxeI^IQd3ZPE_^mj(98_IwEKy=o0%2-mG15OQGZ12Pi^ zFe<>*uY7L1Ll<#EHD9B#1dAi*F$^;A2}35+Ls2Eorej211`9_MKW1bsF<$o_Lop%agnwS9}aQ#o<-w5!;WOu1>{kyB#6F#dh z=-w|XVY?A)hL?~K(+g}!#Cb3hUz1S7sFXJDsZ;R#F+l3M0MO6YSl>}XOGd{hC1EmM zPqslK{>aBKqY`zyBITl=&tnG+mtkI+R{qs+6nx5T){m@i&=q{ji%qT;1zIptybQ=3 zAycB%iF~;65y(vaUVBgM8xjeT0tgdKi|QQzF@(^NVACNiH6jA64IZX|pRX`lh6TfS zx!|ANd=k|D`h)()*az0QCLi18oe$foI!VwsIRPaC**7l9P&lUd#oUuXV6BVpD=Bs7humwD@aR2 z*Q$2GyQ$YqTk)4&(A(#t2p*f(^zIQszFoejXkqz)ztWOpHr5V;59FJ6 z9`xPIVFw@B6^CZzbz%MX5hJ8Dn*Vuui4YOFC&_rcT^FTz3TPFSc~A-k9#oU5JD}rU6g{$ za7MLyO-!G&9AxtOSP;@z6T9M>N(lvs3X@zls5a%od>CY)Myh|FFA$9lTsN}Pm_fSt z?1OiMP?1dxq^gTuI*^EuKJdwV3{u{y87?p{nLjWLu_597*S~y>_AI(QR&j0|)^6Dv z<(tyRdP?fYaKR9Ot?Drp6JB{DagF{R2v-09>8|$^YB#h9AuWOYD+s$}$&@mKb~e#8 zt^ZWhE2w(a&QMF0Vi&axHJf>T?}BRiPvyC4r|gp=t53h7Q09XHJ76IGfGF#uAC<_G zM&qy=)t*0jUSi1o5r|Lj@4G&aZV!rq1_?pf$-8j)-(&hLFA82>5EigQ@iLv@q!{Q) zFggZNv_9j21A`21R2X@iLbHz@99drT@G@`OLrcrb(0VtbLNPTSQx_&6?WEhc{QT~! z|5CD(BadhgpT|C4Ba3KsBT7zpyuE+fG&T#6LZsfJfsYWLo3!$s4fqr;f23ZA1{N#&kV+V&oTcZNAID}y`=C6H*g`BAjZP) zdA6v+D4~~*3O^&zAV9 zoUpdqK*HW{l1oI}Bbl{us}RvJ4e{A zE0rQXbF3K8_(gjz;xFQ!5O6^Wr8rAD{22rPZwy6eV@9Qs@bs#%ng5sQG%!{@M}r?e zUCr?BdpsJq)XhL0ir~)Lbzo^qt)5Uyq)*1Rku-9#F+vm}TgOwS{z2QOUhw22>HRRq zD?~qy&f9lmV4rNNBm?#y$A>mGqM^-R70-JRzD@>XUAf>!fejKI8<8l8HmikPX1V8$ z#6&kr!h*uPMcYaQqIlsBHHRn8c?b~KJz)2LW%xbT0>HqE9BwfdWgF1A+uF2uurp5! zzP&^ADTL?~x3;<#HeMw5^Spf)K;xf7%L+fKe^y2Un*yV}IBdgbt*7jaDgD@6Z`4Mc zU+)k@jN6WVCw^B?muq&sP>vGyZy$zaA?SXmh$}VHFBZ1`>vA`)Je!RIQFmPNF1hQ} zbNGvVwIgEf#86RI|vh8c~)PC~U}~{0j7zLYBzuhgE2~ zz!^gH2$952KyvMos<5hYu=>HpZA~wk%Z7EOG-seC%@U{Y<$nQO zl#FM>hi_jtIk$>5PkTDcqCn7s>=`7CnlYRq_tBh55RZY#bmv?XEJ55V4xxmBki#{3mVD@B*aZA2jN-KI-89 zPca5ud=KJmmehPz1>{bgua|5aa>rFMHA|k7=xd3@b8co)To3ulEiSyC}NuJS@jg} zHErc#oU?GpRWr9f>9??FF$#&#b|`sn$-IoaMmxnzvRUhDU(Mr`^|PEWTMQOnq}Z<} ztdknGyO&AuwWf4fM9g{&I}~di-bGG2kP%Q4XJ*E+H-yPJnVnpe(#}xypT9u27cd+jnt{=twju8qPvF|D@Udu@;#Z-)A z79M{Qj?Q*C%jR=L<`VX-a7gr-yb^CH99;@?JPA>cYV=dZE>=Yk)kAkWl6k`$xD2_l z1*#zrYPEcb=HqA$wnVr!3`C^@lxU`1GHp&rt3@~UPzMj8rt$h3b0V*D0U$**Gzoyq zBfBlNR^7QeExg{>1ux{_C`=+aM6O?SAd!wJM-<=Y)c-_T*qT zfwvRX!|}uHhqYHg6F>;~-txamDsjLAVbPTq5Qg#w9j28Y`wDi(}FR_%QRnz%BeZ**M-%2`Q#)|QA*DrPK zB2VgDayp7$m6$10Ded~zkY7ksrQdRxVIj+S~L72yn*_zZ@8v4>-N=Jf|t=pEmeb36f}iO zV)%XQA3nam_w;Jrey!Pse#s=Ni_d-3odyco=^IH&)XTCBiFYH*HX&I$cH%KrNfz6L z#=W#fVR$nZX32hX<(Syt@s(nMH{HLbP+h#Rt+!A+sj&u-F;=K_N~2r;XhlyNH1t8i z*ievI<(F}Zz}8NyY3b@jy+-@=fE`z}ebTw<2zl&jM|(B9-OlFv)X2-1hBkjAe$oZx zrh;y0$_!V1+t8^vK%$TlLdX zk^72^{wk$ZqUj}b_n(UiprB!3`@L%TW?N^2h$34b0kKFMmGl5|UQz1cZIdBBQSQnKWd`josKlvFhVC|w|JNI^nDuccrYd}-oO zx)3_$zWRhCRj!>;nV=}CsQVp}izH-K{nrLY0 zs&y70OO5}#=|*~n3>f)@W&dR5Z*}S&bKFQq9Ktu9&e><>DdqZ8ppBh_ldCeGX43C| z=`yILIH0&baJ!{7z{}UAh9Lq_K^R;}7||3VcJjRbJ|}s6fw52|ChFCvAJ?B|$@J7S z&%N}jl2j&FL^Y%&K>C{@E2^d&re!;>=ks%U`V`F3AP+$$`VwO$l%CpC|RzkC6M?s1e;;VpC5-Z zc9KwTCQ8Uc*_HjDgMjCp?y4F-|NE*gB_Tq1zGIypfmb~%IX*(fa<|AEv*A!^xkrL; z2VO%6n{JXefDoDQSs^q(Np6tHZ--qzG|gYYbHN91e+)jBd?W@F@Og-xpO1j+2{~|L zQ3^tY@Oa9_LfLtU5Xg+j za)YzLwdD;ucXk!yVAnUE9?CA@I-osM$AAv*MN)KIO0cNDJXPZ{tBq)Ma*M*NLvr|ggzT(k8&Diziw%}5!U%gf=bl;q6_Zs zSX-$O)h;HSDdB8Sqbp@anTQG(B@Z6!Ydum5O*5tvkz%ObZfpK$x;N#{v_fsKp4IAu z<+Qdi1ECN$uQgy>ghT!on{(I9ifOh+7Enu$Nn?_FA!Sa`=%d81yWRLK>}hLlWEH#@ z=h~bGADN%zNSgek=0iy@70JAx9r0SEx}&8SW|6k*F4_BT-+au1pb)VmkFzx&qYvuvf>RH45Rn z{T#+_5L&EKVz?A9Zuu}+k_Afu6vCx=kz>Q;5eBexV3$c4FidQqd!_+2mKSdT@tb^` zpal00K(GDaumnIMOs}y45U^9g003+NfbIck0B->CD{vLm$UQd6j|%Z-jLrS|$+2AV zcoKRRD#n#xY4Ac2Gegc0CecSM=6zow9U$}+WS-^`Wq21j)({W0zIbZCPvGa@T?O4MgT03=&6St#>snIr7UzT-&}k z>v>pU6xG@og7{IenU-t)AK{BTuc|ejZA%x*LUR&K(0^EM7~AFrThcz7;mW#-?oTFLTj(bCRieu&P`s;A7 ov+5Z$hJGB_FISZ`lH5O4PBqq<6^F{d-($z`vHZ{4l`jAQ04qYF04J9K0RR9100000000000000000000 z0000Qg9#g+avXztKS)+VQi3i&O;$ltUIt)4Q&d4zflenT0D}xKY!L_wuLP-U3xYBL zFu_m(HUcCAgkS_91%@sMi&6{+8*o_#-0|Q%5D3Nk(;_NX7bpAwkif|h3-yL<}9~nlnjvEE4#6JR`v8~Tl+?!GQ>PQfA7w1Ou$kL za4&ud=Nl!Xe^HRlHM}c5QgOAWNg+r^{=u`nJ(#JgLiGp%)~@F7_!qcl(nyMKx1X#U zoEP$h3z(SK5c|5Q^FyJu|NnK_+rFzSjip(`z!Hpo&YYe3gzacN0iLX@U>ELlMo*ff zk)LE()@TW2dqHb|Ff2*q{CtEEz}Opbczy`5BcP(@(&=(irE62+>C?68+VB8>xVZ7G z08{IP?kd01}8d ze4uD~v3Ys;o2Vjxmw(7Vlo~#*{XGAR`Ioid1wfWz1g;; zZE2f*M_0$sjzyi^PR*{qA3i_3e&Rp1f13WZ?9S~bdgt_N_G{Cik!c+TkPD7Vb=v9U4EgvY;@O)j5Y`Fptnn_N>dGq?u>aj@Py^;-4DKp6<= zz*A4%Z1{EG7*1hwPA!fE1pA~ifXm^701oDBFVdB+;u#3G-Q#(!JBVZ-S^)eACR3HQd zjUo}ySb>R*&w>ecOn62v7&*L4;7KMAB03kcqySX>9A8IFhr%OwQAczVgt7<9xD8RD zev5(pG>?)1p}kncxznM3k14qk)!uE_hOOEdKGad`jn!K6o_jT<3hGh~)d}=v*S1PJ z?MbM>5&<0?i!wn%r_YCqFJw^RbXbiV;J{H~3^*1drhR;;956@JG$?+&kn5AXpcG zN`4uo@;4XRVn<1bY4Hnb@ubpW2Ea&QX4p$P!}Fl|Rns}-nHaY8UyP{2X3$TS6B$ZA6sxsL&BW!+VH+EP{do~I0XT>vXWEm<&A zl!lP>vjs%5HqSR;wt>glOo^YMf`GXI96fAYS_eQa@WrYAoONdMqDV^OcCjfgt+VCe zuG}_ej}Sa_Tb6C1ppz5xio=Z1JFp&}M?r&?6I!jPP@98>jEaY4b&1^KCX<|2Q?5eW zx<#m4_XOE>)0}owsc_~^p~lT`$}DuMdj-_nQBrD7wJp&Zz0n_|acy)Xv~z(Q2?6*o zQ~}wIP6fUc4mlPOFkpo>z?HzbL|0P9(p|&B{n@p8SmQ0ve75A^JnHu2WOe^H{ksI+ zbkEiZ?n7CGZkx-C!B@aL(+zdD|}zm3Fv{?m-O7ho17_ridYh(X{D(M%EW7hB0krCIHgYvZlg@Evls)DTP9UVaP;4+a8N8?oI8UWVn>( zh%B3>!(}L2bc?Mtcqje&cMLIE?{FVA{h%!(1j?Nqgq8hs;wwU=DAAH_mMTrUqJ!*H z>H~-ENvcmQ9jP}qRvR#26h<5PHR{Ko0;7*k;1XLw6SYtqbx;@eP#+DsxklQOA_Ww4 z2kZG+%-3~@>PCofQifl$#iBZh*52ASOf$p4SZ`s=S?#eJ|BiRulmfg%QpP6Gx;$hY z=c!3=MFSj&9HHUPjv?lXMG6jOPAJ^c9(x^A&=&q76X`c~23e6K5;#ynW<(E{DyFS4 zyKRAy$$-g`4kMKYBVpkt+=v@+efD+ehz@9vcG;JrC0d|4F2+Us(kx@kf*G4J{EQF) zHJS}~_9KZ+ina=y4)>gF$bP`ati?(x(RP0b#p=U|@JqWB1CA`dwl3CbGYQ$dm=FPC zQ4iN*z@nY_PL0R9iQ2iN*oKWP2GFL`nRJdBA*nW}%FUG{f`ybgd@7Zoa)hm{Y@Bt> zVzbHY76TI#3R_e$`t5w4>AZPt;6cEBV8CU7Bhg_nAf^|O+~eLnuPPrZ&oX6M=Pa0^ zc*^k9Py-T(_ujA2wM@Ki72eA~dVY_tw5eWPuU_xaz-<+ETMS@>TZh1P8#wy^Ua6C^ zBD47w>BwmSJb0Io458W^9=2GM?o;{f6c5)N3JZOwUwx}Dn)1`{ej3M+!MI?5 z0AAdu<=5ooUk-9f`$(q)*F7zE{{U_<@(O@5aJnD0?Ek6&>(BBOh*tpmHbV}a4ikdV z;J~pMz`0=eyAd_Lns85+G{j6hK(a%_LjjPu9BwdeDO;^&ocXpmu#MITz!^1Un${n{aW zPP(8$nB2wisI|34J|Fmi1o=8R)JI9N?Z{`sLqY=Iet|sy1&-J;Ki0+Hala5w!s+ggI_!Wd5)Zd4m~`EjF>QG z2Cly(tc3RQWgvo$WX57yOCdd)A^YEh90V^6-k4k|amV68nI{!)*qo>mQ{#-o#T+7B z0W<~D5=2`t9U*ju(i28sI75-8=m@ko;)fQM|p|uuSXR-CnZD3&|OPegQ znXObyrLmLFUIqtSINEBt?N-=frJeY8LBNqP2nQXl-8Mi1sJ_}f14STnFns#w1HK62 z{2U40?Vk4$ag(O)0LZJ2o{aT=Y55}LsvI5kd z01gInb~N$eVJF;Y4wtkISaDSeelwbYqhE!wu3Qnc>xhMBQ?5R|RXEHLRLknHFvmi| zp;&?o9OG0f8@&ZBq(+%yRQ4=QyOfGrtg?xv*!pNH5v!u>Xer7sQ9N2o#hLAdo3tnn zSs_Nc4aAMPpdT)zP!cRXi)m@m%e%=asYA_KbiA1Asx8hxm->sjwL_AUF~ofA@b zU)HoXE|dnIXYr&YxsS7-)L%{gg=sbhmAhz?XqCmL5%`_|s;=x^7Zzgt|9*Q&$PPwi z!AW%Cj@I|{iVZ4g=PE|%&TvN9PGF(1inka^2X_dP?=sJ2JBJf!6(bCY;GHor#!?xT z5AI5YT)aRKDBngezbzccT(fJx$O!*i!NWxo;fyo0DrP;N_K;EZ3(9}0<5cmHo$EXQ z^3jYI9Enf(N{vR!5FKn-Db2eNwC4Nz`+)P*Y_T248L}CBI4E&!*>CpM4J6mqZYHc3mdv^W2>b?At zexe-6@{-gIkK>cix$&{{&l`V^RNVj#V`mjh;FOvb-45>UV->UF($e|Gw}Sh6rP}xG#*;XdWS(O>7QO5SXUx^^#m$Bw(vk=Hi7DXBW|>_a*Lu6Gt5d%Tm|!gx;j zrk6VO4u(!C^(M`hzMdyclRZs0d!1VBY1~}L56d{HJZXJ_PvZHc7>}))qVon`^myhU zN-yVAoULQlSbO_!wsdw^FR(L9Jf3>bJlO7t)^4BROR|;+=a?n|{(F|L%uP7p<+4k3 zvA~TJr5s9};8RmfoZR^ij$Ui#0sn+U-w$uaA3oTIeLr+)Q>qS@?{M^- zBP6aqd8-etcX_dEmvhmfHEY)AY!W|B&u}g|oC0YlT<$)ai3$pKl3P!n3oCHQ$qx8_ z(Iep;9yMhWXgsv8DF!u6vy<@H!ursUB1#)lmI0_O@IM;qO z3op2rMVe-wJKu41=DmU}{QpwVKMT=PtTvv?+|~;-TfEAEEU);s3rf#%rwK=|l^4qHW$At^Rf9KfQm*2BA@@f7tq1 zh?U@)O#sC1fkS7mcxeoC(g(_Ba_AGlyyNQ;vm;=-#~^jDHF=JuSZvu55hpr7ai#46 z<%~JjZjY{&o5;b)-xZOk0A0566+`wtSY|!*z)2X`f0g}LUU3d>Ikdu?XGin63D%^^V2}QTX~{Vxzzu8~vC5_7LuwT-)j;EM zsY~W@@xv>Txs#JmzKqp@OKS0zxO-%JOT;0G-tUrl9}1U?;JE+FxJ7n)=d_mWE#6U( zBl4uUEbF2E^y2+1w&cIe^Fay-v8P6c_%6KUd(hEM_I#Piny?|-~XTQWqxAJ9P`xcLfA>=3ICo@ka z&gx)j2kYh^3E^pvLVh~)7&~j?J|)ngBplLG#&iw&GCT5*Ym%RkpR7BjX3(G-4YDgV6 zXcd-F3GGo}9rbHQep-I)7LPkZZ5_0)^8~4t@|)19N|Ja^%tfE=XX0&|gFmaH%~^7% zq2({dHG)6-QrfwY-2|L>aNIMHpOBvnohs%gJjOM+DlYr~2*vhA&hMFxXK^5z4ah#? zV=g~7FU*N>kbm6&@)Potp;N^Kg%aG1v2jTxX~>g$t%lU0OU$H_aW}J)oWgodfc{pB zHm(*@%u*|mrK`zPtZf3kY;JQmWdfDs5`LR`$ubfkMD@YTzBv19`Z+Vx=BIy@R!zTF zj%GcK4#0)Lxc+WSFRaUU5M6XzT-S-!s`DFi*O{pz^AY!E66SY;~ zI^zztDg_gJBvDkH15#eZ-3a21+U30GiBm&v$24=~k4`ar6{xs!)++Xht8+$2<~j^n zE_*zG4E_-wPvsA}0%~#_)40yqa=8S?B|vct4nuCM{V~@G&(3OI)WuzVp~go+#I3k! z%_eiDFWehdc-Q8St{-x(uXYtEwzKMD&QP>|j9xjrc(zia)TYf!kf(C}K|KA~WtZ14 zb}Tq#^-DU6VKi+I1k0U6tvg2L9;fPdlmcpUdarR6c!Swi z!R-bO=hIQPQbTq;*~pk~IAGj$$Uo?_8saMN?u2X5&b}NU{-?FU4hNibU7`Pd(`G0T z;>6sr3PJcrd|ZqFLLSZ0A2Uf{+%!qMbjy%T%(VPmJ{4ITYJ2Ug({-i(sekKBHC10t z_wqj5SNl=F>`(1GtdZ19nj+K4j%0Uo7(qa!uc)7?jnrQ16pcyKqb;O4&^&43v#-Bo9rF;_6XnERP$ zn7Pbr%*V`X=7^G-(n_V(N+*@xvB<1-tkbMl%4Fp*gSB9p_1c(U@qi(&A zgZK|8I3U|-*M(mZ8D|OiXs2$Hq zHVNU_?C<@p`Sa(Tk0Qmc8M;`v{gBe}Ppt!{u`S(sngYnCTLlGxeX=Zs`#5TEP@m~I zDOC85*e5Aw|NDD(e*&OPxErYygmrHyip{J1iu_Lv5`4#V+r3g$;4g%19t2izr6O_sY=1wS~6FU)|!7QWA}T@qcBH$#I}lK`=ApQM=$L zs0RokyI%)uLibyreYvW{Z1a1jG|v+1Htxf0)QRp(LPb0swJ&uO3wH|P(Q{Wj7lOJ} zN*W&pCL^27V8Y1XVP87N{2BBl%VZPbCf+323Ew`TsPpVwgu^>ZHF2lYT{ zj18^vFCg+0uixrrUbodcej1f4lnq-$BCrCHtI_eB%`vh&hNS(%OsK`;Rh2^AJ~#&2!lQ}G7AriP zSny2fI#}H<;k_)uO;@;|Ej*5deh zCv$x%yTQiJ!$52NP4N}zD#Vc6{0K*c{V zYn$rY2Zzo1(W#P}vDSA!eHwdZ^t6x#QgwHC6FPSMcp=q2B*@>_+e2u8CY$aZmvLT~ zf2@}Dx6cYoiwiDaiYHwxyNv=k==7+5ab2z%D%#3NNY>SkE-rp?_sRpak!P>xIDfzX zyiSp&4Qho55CBVzk~oh@Xzv{(t+=op0HA+ovvFsXB$y zKSEoxW+i>1_>&c%+K4DciI9x(ki&d{>j7~}o5gE}U9dgsn@ zxhC4fjo&&bI+8+a`&M!D_$%Q?Ih1Wu2B8GQf5$KkeLH6am6 zg&54%-#jei{ZmmXwbgyNf9B+sYq`0*c3rx3?e7!k7c2g~CL>?XE{+vJo)?Q3>#vLk z(MBPN$ze=KJsVdhe*Kb>7>vPDLa=WQ@3aL_^*o_s6TE$~3FdC#JHdsF@uBS2RD-Az zv-s6e20gQ?M?oYwK_EoB^G8S=ElcH6hi69Hzl~K?q!STgOCIicazb7yS3V4D+6(wa z#qxgW-lRr!7G-u8!?5n^PR6oja`_m?J6%$}u?kam#gVEH{wsLZOWLhLOtw@?Y6r}5 zTon`k463UYXJ7ERUsEK8y>2aDIkH1muqQq}xDgTVY62Eg3W@alH-$>d*6ppWA8c+m zGFnV3+>6wrDRw0-F!NDP_OdqDXOd(!4=?Jz62%rVL+HLW?O@T^s#D!X>! zKC`+PK{puPsi(zY@j5!EbSP8P%a`HpqXus-57#8^!zwlaZ`*KyBvaK06o2S>JY9G@ zx3LM5f(snhecRZS1Y(FN8}y;p@o-RI)vM>0@^5wDu&yXYXQ;31>G2n?xDzTjsV<#C znwr8eY-*Ckpu^#(U9BZ8jLML4A{UTquO61E>dd}@=xLhOu@8#EupoP#rgK8Yj>Q4$ zT$4_S2rep~^7rTn@jRAlVlxB4l%k$gDXDzKVl zdcdl`zqhaJ>f;*8z3U!+_|hHwH?aB*_s2jXTNhMUYcFzeT<$rQ!E{|+2BAzHV6iNO z6N~%Z@gfxsjR}tFAcdmGgSwPyGF8M=XtI^+7M@pm0WWQij+hQq#(TlW@8%mO>$91^ z1?RQTgUb1@UV@EZ8dHJ#cq=&giPvlO5wDZc3uocp*}JkCs`qsMnwtD6zjJHqH#W3< z42j`^F`Dth=BnELJt$4AH84eLV=U)7 zQ;^Gv+TU{=eQT?zaC2MkWe0;>&(31Q)lzE3!-L|zc;~(hZ)rJuWaI0{iZ>_=;o8Ep zq`EB_k>e#0z&-bt_WI9_L$Gy|V#@4UX*g|mf_!|G4urp%3{zHKw7Usn6d0T?gstEL z5$;@V?YZ70^%rV@5#h&A-3IRaus}-FUgGW^>pCkdbq>oy$XncoyC~P#`7wy^><0Vy zA>TLk@%sM#dH4$)wi*l%ZuRF_pQZxK{~CEr2kICpXt0Mj%i%k3ngffcps>uC8cnx#b~!^k+EI%cO~$A^QZ+^-xuIQl#(0eC3mmgkSVFDb!)mAQB*A&izOq6&^ZislTwO_PfAMcDtBUH zyt4{~yP4F}(E9o+7!%Xw45GYSa10}^Z+WRXL|oraegq8SI=x@K%Pqq~=5HfDf^`p8 zsd+)+U@9K8i)o7(jBl}Hzb_~4FBBZVSlWf(TLJL<08 z3H&VvH8%F*Y__(6m9)ow@Sa9ChOuR#IQ!?Sqi+hK+qb`TOzP`bRD5oHpl+Ez%N!%) zN-W@IOmx;%D6W6~=){dXcZ%ShcOKYnPl!YLaAogqW)JCAq6P?tgzEE~y9UR{ufFbm z^N6;#O!TR?qxt8^aNGOq`6J^qy-RI<-2<4uN$r)cwk;bxXAZ~KR!pbKYl3mWsDfU%IK(@TUgBMj0~r=UIX_@j!ugXiHr^P5eOzH z?R;XAk~eJpLj-$ed*{8Q@eZEX-af?8(lTDalJPi*G1T7QKQg62A_oVxj3NfwTrzhn z>X$(~fmtW3$tRd+bNv##R@Ff?T88n$L_LgJRJokIA}|MoBHcy3?c@Z>BLXyA{Ub0a)04Pv+y`dSoL zfbeurbsT;+@6kbf_=6yR{P6kRhccbR(O2&LJo+<7TI*kA5}WIOBUAW{PHQj2 zTQg%ot~e_t{;-c3y zjStetuW&#}9szfOJ0AH?ji2N+Lw;O=4KFEs3)T*CdHnEKZWynn+S;X*5_Kf8#_50n;TU&C#4nTHuf* zEfKby$|__xvi_W~K50Wmcyb9E|D-Kd{Nz#u+oT;XJ;NS?dXkTc0Ktn7ZXnqvv68q+ z7i*(+;#snhBAw4eI#8W9Pr&BxkVu#n9V^}jV%wxk#Yu&dZIsaOBS4}}*4f|%32uf> zJn;amu~xct|Dhdd?Y1*Xh(suz(xj(IE|3K~oHXmCHjhpHPzx3;Ia)&_{e{`C3vP6&cq0z`X=UO0q>9=Byt*^% z7}{^`&tXnkt=%p)Ylp{5)3L=X$}K12rC|6D1Cyv0; z>E-R?>qjcvxSgO0qSL#hU~w=!E(1sb0000G;d!8p1FQFO zDe5@67#u9J_s@KPYOUf(I6*{2o>&|VkISUQ1N#0I;Jf#=`ydTTk|g=7aPRLg0V{4x zQ6uH_f?5r za{)miL%nxRqWON^QGu9jE+D8h(t9%5O?U8ngbpt0=s4+PhS$pQ^7nd4{=~5QP?kH* zA4Ve`8^d^VgV7+~U%o?e=!+J6B0BAZ3oAH18{N02`F>vo;a>B18yCr65L7s5b2mp? z9WD2jd<^+PB5KRAlu + + + + + + + ASSESSOR + + + + +
+ + diff --git a/outputs/client-info-design-check/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 b/outputs/client-info-design-check/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..de83a9c7418a1121c8a59bbc7002c69c43cbe76a GIT binary patch literal 25960 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 bX8aVHA=YmlRlob!7u&+mJ0~xUw*UYD-|trf literal 0 HcmV?d00001 diff --git a/outputs/client-info-design-check/inter-cyrillic-wght-normal-JEOLYBOO.woff2 b/outputs/client-info-design-check/inter-cyrillic-wght-normal-JEOLYBOO.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d750914763177b95070fba3dc83c3d4466919c01 GIT binary patch literal 18748 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 literal 0 HcmV?d00001 diff --git a/outputs/client-info-design-check/inter-greek-wght-normal-IRE366VL.woff2 b/outputs/client-info-design-check/inter-greek-wght-normal-IRE366VL.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..024f0770326a416e2e8da7ea541959bc049c29d1 GIT binary patch literal 18996 zcmV(_K-9l?Pew8T0RR9107^6f6#xJL0Ec)0073Km;HKhAsz+2@D4tNq-gWR(Q7q___PnEkzM*90JH#5gCaHHV#0+a$NHN z_vD6%g8e~_Yuaoq2u>r()yTp^*L*POyD_LL6lyK!ej0^QkUJ?Uk=jWKVU;64zOksP zBYQBSS%yhk!nEnN1-)>K1%;y$C)vS!92CAg`5O#w+QA_q75ofeEEbFPH`c-7V=^1h zFR-k@^x1Gux;c|a`OH}bM|j$XV$gcLPenz*a3c<|9>!gc4J@^x^$v~U?GZ;fLH|*Dkz8wR?ev5 zbmG)GomjEy?wqc^i@y4-#ht6V|8DT#xAu9fx_jnx09}rcMz_lW7iHq2`|Sh(WNZ|m zibP3hN$4q_hadNK-dYKaBh*!b8sx^mR48;7;!cQL+CaP4#5IjG4+?-rd`U^IJoH`V zud43Z&CTcY7)N8*MIj7OEFd9X9)hhOep}xkuxDl~+t{kFi2AA=-Q5=z6WM0rI5J)Y z#6-ma8~<@_V{iY=OI8RKN(VgL!<#M zXs@7{xfSZR>qdn~d3|3s)1#_j1)bnCf(If=ud;iacU_qu489N(I(3PL!^H2Hz{WTM z*6WnQZGW&ZL_;Y4wC1PXm-%$Zb14uC$1Kaj0PVh+o$T!V32c6P*+0z(&S7$dyG6pJ zfaq#O>#Jmis=QX#ojrBVS7=$EvRQuGZv-Xtf;8p>l#OayUC$5bXNKvbSm_ z?Ox4sAGf5{d2ZG+5Je0jw^zR86eFgJ zj)wz;q7%!%!(1#g5N@G}UYIzc3zB9_jUNLR?AYZb^e0rbuQbBO>L4gd`c zVCF!-cb#23-XX010O8Od*+cbY*RHE53Z2>dTX6^@466a0tCMnOBP-Pc7y%&Y{13gk z_t1$m7s@@%a6yvI*M^n|fZ*@80sx4E0T2K|wJF3FoxCBK-IvuIw4YTm3+)e1&qEsl zXSdN|6@vFoYKIXepGHvvwE$*F$B|In3G;oifO-JL*~2IR0M4^#8wUUYP&A)Tl^cja zSOsNVM3f-~S(K<|2)ND5F;cWrdHeDC>V_)Kw`~o53lz4XG_r!!ttP%r4++4BUzDL+smvp)Ufj=CEG6uLGQ$|u)T@g2op!WNI&2)I8GP&go> z?o4Sxb`~V7ynRLfyO(lGB+EjvQZDV<6|eoBoOPmv>GWW`v+=bkD7S~D|9y$9=4?mQ z3E>RGvQ+MYc-1SWzDxDR&6VbBjbHM@fhp_Z(&TUZ`7DM*%_;u^Zn8bIkIweQ#XDXc zp3YjM<{vutDI@Ybu!r(%cR)F-o}xRQ_&2*)z1-?s&z?_r9~`RCH0$eE&dN{w;o0_u zin|C!-O`|(zABXpX9!R-&DA=-D&L>~jXUlohV>eynoicFATh2#wpDb z&q_F}{o=J+zLg&N&dIEd4jD`Y^{OC-BV6yt1*)SrCYI~^xIjI!-`OWuo_rw%BBF|~ z)kB4>TB>W*ibE2-r7yoJR)|nx!bOM_Ed~xAK`f#;@$2Pu6jT8=MQ2GiBmwkBh+0uYLNjzdK&L@NG(aT*RLX#aBP`$~Vjyb5BuuUtND|Q# zk$^G=f-F(~F@{7SDx#Z;Z6v;hp#(rEE@(8|PzInsClV;Kr2y9z0Z2*!o1k771JFoJ z0H5_wsepi)BjEZJ3nPw}4Fv$DTAXMC!0^Th4_IKz(28d>?AHJQHG^gY>UkA1Vu9t$ z-5l92XrmgmrveGeAy~EKuSDeK0XjREiLsDCGZ2eXHI81xDT@r0esMD4Mq6RY8V5ks zMcoV;2LPPYo;wH}GrGHL3{qKx4ofh&I-G}N@_eqp!%O(uHQ}KKnJJ|G>L8YG*STGc zoofb3^sDiQUcf%(z4_K4<2p}FqN{z{6ke2L`XN+V9l>^Uh$|2xftTeV4do1@3~<0e z7(_rM-~bNmdmL)63IpS_((}jR#C-Q3NTeP ztJ5$yG}ckps;Mfj0)giHTFA=I0fUu9u+||(fJYv_HUOs3 zQ_m8}EdJBCg|1SN#(g%~Q7x&>-mDKHDz7YUArae6#`^;N!X9eKUVm~uL zw#po0dT1xBT2J$d`GG6hwbGK|m zL6nj*ZCy7v0`TDz_*RP!HY%#Bdg@WVsBh>+EG}A?3IuS6&T7NMld|&rK?YZ79dcNT%qzXgmJ#4)fi=nj-QrShahk< z{q}2972<$H@Dis88wE?T5)O*xxJd;Wb`#OiYRci&gl70`wG5+XLaW<&g(&Bba4!Wk)4H#PzqbjwM*yBX9{pL! z<3xu(Mfgq(1QilQ7nOrf%BVq{6H?3a@QzRE&~*=BaXyd07lozJxPt;pj2c}7fHZ4! z0s_UNg@rbC$%+;Io!V#L6?ZcP38AFFeaN(;32m4l%#b88L}0}NheM+wOVPr)N7k=; zsPLP#T85Z2vH9V$Gjuv)BSB9%%PNzZ8iy@p)@e8>H`efmZK2-~{;IH$B0?0aD@0ll zWzsWDerePa7?EC}juD%UoGhA6y47fi1@PmOxti1+P?2m@fQu4p(jXkqOTfrLXfXs} zt>Cd7BwyJ&-*tcfIF{^^7qP_w45t|NRlBIt2PlNdZ4ka!Qk6O&&~JsLU_!82$IaW{ z&^Q0{Kr=KcvNQ; zQ~_q3^WOs7SCX5d^VV+dlGBc6DK>9mj<{6g|0{(2#~Kj7R~hZs9g;8vTZyF_zDTeT zx+D&TkR{m}0*?zrD=wz@KZopMc5qU=?kz`4_#FgmYxLC3ueIM%tG-(>%H%EHDoDej z;KZ!4q?(3xXw9=Nt#SBA8Yiuwfrd{syCrACTR<4%C?Dd7z=|WHUf~5TWV`~VIK5|J z21-$O56nq6yOGna@e-I~mg0h+4~Ck+Tj%P+AkBhuTu6?3ZAbYCSfo-Uz^V&Tg|HdNqX zFoHq2gqEJ0tFOn)ah8r3FU%AY>bkW#M4IC$-5nN?(^aRquA!0{ZBJH=Z6Pm>v~!vP zrXm?A;(5$|nrWU#XO1R;{Kq+_YP@a6I)%!*XBq_s_R}f~C`DFL-~v!U73}kBfc5 zxS4d}Kjh~~cUtvzcJH8^m@PuC=N@^QL`y>~<}F)t8~TF>FXv+BP`fnmA1>JlD>e@< zEP5UOsT8z=pm(y#5bA zoI&u+&-8{V$s?$W*61D@DRKN+@+eV&8)@Li`uY}B_!5%&C=BPcZ?=Cdk6Vuh>_4b3 zL8b>o-yRNzLS~l8Ywl-RsX~?PMFqc+l*|CGxi{}oX@SJjS1gG~Jgzs_A`|ULRq*{v znVdR)mc8bIphnfe?Srm?t}l-gORE-3x2bAJ0Lv$Rfs#gcE9-y#%_F1@e)mFBRBt580FdG*i3 z%Z5Z#ic$75>Q~K1OXxTz}GKZJTh*M%FH=5Ph`CFBfH5Ry!AHNf{NKrF2rsYIwV^iHEciYfb@b!=^iE3QV|QJOvHRGg>)=N z59Q+EJ3nNv<`YWI395$x{C(WS2$164QXi0E+HZtLhGW&*ZTp!LyYvQIbpJc&lj|vn z`OGZDVm+0t{9OgQLVyGyEJ;QcGfw&X(Ouz1$^F9EqrXn+b(mI`vzZByEY}(WCe_f! z#%(-C6tgTufM}K4>j_CKRrA7e+=&AE>4*rLk>SQC=Bp;=^t}L3J$fc2ER;|fooa90 zZylVW7Z7BDS#LTX`g47b(G!@gBO4A$H4KQb3SKWg;lHdi?hMp@-HhJ?Xsc@BV#eUj zb))jvSc)JJ)3|?B4uCfv=TrGANfxmkDzXU~i=Z365=+_0#G<_j@?^fbq*$~`Odka+BG$6i7 zC6*w~hi=q+4*RCMjqrPH=5vCh5vICgf45Z!zd3hqF84_jXj=DKO-XI^(q28tudNeP z{{O6ZeNyUt$Qo#Lbs7A;wdlxws>yl9VX#kDpgnm@bVtMzM@YbdhxEV~f>-4Yw?vN( zx&qA_buSw8#V)+g68&F81Gy6u$2r<83r~nwyy7re=CEp8jw$AZ;E8qd{8;_n!wskNjM&T4$-C^ajsZrP_$(wQf* z704Z|DWDmWQ*I-nP3{nz_Gfuv%FRq0H%0N-uNoMQ$UXSmEd0LCf(O zs)&h=t&H{=&Y^p^SNZ`?Dn+*g=ykESCb5y&J||9RFb_?#cMXF2H{lB~L`#>Tx1;8& zG3n)FK71=ymmLj(ctCo+1JS9r zn$B4Tn!37$xQl?imSg)ohfN-g#?96wPegEd^)w6{;mrk@8r=uu`KTTEPCn{jy!#nf z7oR_*DaIq8Lytbv&sCd&W@weL*7Ncbg~$ET$Mo*4n6%Il(twNh{p2*g00b&ju1asy zA?YnyqVt^zWTQy+@o7DOgiqKJ=Il`I-@LMI{JucX4w z#T2Dzo$*R~b2`DhJTIid=8U478d{)Se>{Q`OQID{oWzNX+cj;vb)}N~av#26QoEVW zd;A}l<|;YN5pHj!@2{2|m13>q<=F@Uw4HyYYz~3T9K}e1g<$o@Yi*o1peuBDlmU8C z+0yc&f&m(PCrA8#ZDkqBj&s}oVv`ApJz`{azd-6~=*jHxJq7ntMq*7`%DiL%ZfH3j z-clTZFI=un|9O73U0$#9n%0a$^#fv~Y0TU9p$vW7Hg{!Qic?=&E&l2}u}Z6L10Vla z8^vWbInLLrSJ%V-d4b@@+V<*LqQi90UTxbbe~eUjSxWL+sHKv|(6Tx&3j(mTcXj@7 z<{^)o$ASsj5e~2Ke@cXBf)V-k=-w#>U z?(3)FIb;4ibwiA4Qd-7f@0UwodgBH&sLbi1Cd@(3$kMu9){y_Fj^Wh3x$L|+4$?PY zIlx#68^Gki0U6Q4R+rlyE`Zed;0f1z$6W!x+%Yuzm^eeg^}MFNr>FhZ6)Dy6X(RBJ z1TbJU#o>fFhH}>TLVnGA;IXLr6X8EK@(6-)1=oRXdL2r}WE-%@no?dNd0B&N*=rtW z*(u{H5@!}jW^kZd}-)-telZvSi8?(RUx75;H^uKq8*11%P< zj4=^r*+Uzm`G3GFz|+f!;o{*h?GS3z$W)vV=lOy^z}tGJ%?7NBhYGK!kZ+!8rfffD zwsk)_n|0zJ@7I)s*EcRlHM)l8MZ!D^8Uq>da~kmw*VX_7rlxfe0&WaBjS385#smn! zTScxuQ{kw7ZJ+IXtQRp&}i1&&i3HY)#Jka&(iyjJ%I?71=B34iJjW%{$F5bWt`YJch z;w8p!W7B#l!7sX{YeoKIK@2JZ?=n#sr6WMi0iU@E_XsT}Lv|CQ{R0$CcKCF-jJ7x3 zHYCD^gN2NJ_x{~B`0*KfV|@_KLsHPc(^|uaGFUqLLSL93CWx#xaxG| zfJlVM&wmbE+B)grWW{*&WI8LWo)chSkO;thme@`s!?N6$y|Msg@rfyy5 zOq?e&Bab(QsgaJ4F_VZy@+ZbfYGEguCJZp|bL_uYd{me6wbi^e<k(X#c z5N951JDi*PzbAc0eSrHRHVhZFcy8V@PDeqhC+X`~v5J9TT)+cveU2#wI2XQ191Hs7 zdoCB3{H?C4lz-|i>Qdg`%q_jJ{yn^txS9h3;ot;XU6QTw7>kv!6J(yVkfimsR{R@3?2+4S@Rr0{{zm@R?Du#G1>O8My2B z+5)T{2yclkklTi=lEh0ThwaNmyIn1qF|QH*M_{y-n73;sS;S$vhe7Vyx0x$%Qu&bt zR8V;JAoiGFLvRFdlQ0w-KNLZ5r-6#G5Sz%tUB+EsDamT5xO%;%88_C$%Qp28t;KWL zIFbZ5jv-Z~d8NDi6KHz2?aAaF{S#^e%zsaW{kIK}fN~znZ^po)`@>Opz+6Z{>+JPm z9`Uv;v;))vxE|)mhrI)^*fod9!dG9_e{tRH zO886Q?srO#FG-l(pnN_srO+8sux4?ZXVkT31APFAc@D?*D^})c)cJ;a%X~{6)5z2P zltFqGlx<26&SR&69|?Pfw^t?@5#_LESR{S6<}Jx0Q^F2RcK}D5U|#&laB9z{7&Jnr z0o^}_txJROeExvk#GzUzNP;P>8z7cn8Ove%ei8?sUWXnTuaMF7AU3W9R0aqz04jZG z8I@N2-yzNmyu&vXn>f;yD>IS_XVMuab4$KcQN<2nNi2(fpg5>Fr)=TQNI$9w zAK>qnjmTCzh6*DY-#h1uOz}RX|!q4t_{2HnD)rD=cgS!rGEEUGb$`&_uMtJ)cWd2(fRAVV{glh;R zgcEQ)9#aq``aT%86Cgq08pDNMa};&0I?B1^GKPQfK?@e~dCJ)3;97&*TVB7{W^)-I z`1ZXgZJDJ>(0JIY*%G~Du$xd{_oENS#AYj6wN`Q}T|7rq+*v*~`DR2Kk9USD$@WNG zWo)h(E}HyC#iGJd@u;xd5*r<_>N-7)0Ao9US4ToRl{fFuU>x5z{;5uykkR(hUfmVu zAU0dUZuZ%Df#W%qRZUWA1;9;-BPL*%ksAw5hjs_l$-tFncl&6JO~4%FE5_pnmUCPX zZ7LVL^9VYNd0yTeaqT;YPYGzMdTajlVc~e}#RsebPE-&n$w5z#LGmg{NU$n6i2|dJ zn&a}|@4M2EI6+557CyVKR*5BST}SD9!5|xhw-Y9Z>TWHH^cLS z8o@?8cB16R4f|JV@cSjW5lC(TdP`IpgB{WmA_(I+FgAQ!`ggRE6Ls5h?f#=f+3sVz zKf}m!`~}!<5I~uumzb-Kyb&Hzl+7fshy~a$l<|YaFmgi+QQMdv+o^VtmM8Wwkl3t* z=Urc9R!xgDdJ^1?kVrL9QsN#*!6BZPg=VKPh_S;PZGZ4?l%YY5+3g5MN#@LCD^3xk zLt|T_@ef||@JA|<81Ki_5M};#+qi4iW2#&lf4hDug~5L+5y!N#XR4Z?P>WE5(}pW@ zcKzhPmme%!`D}h02)?S6q^K34kA^n|I}8IqVx1{PxB$M1gB<&7+BtV`BZS3&`f ziP2;oJh_ZDj>W80KnYZlq=-wYz; zepZ{1j74}3uKYFrkQ4a!(gVh!bq+oj+x*t9Tr#0nX&^1NkDOY3QezfkebW^s5lh3; zPzwBq;;J*hzNZB-C0~%sln~_x456gbOn#XTdM3-RUhRWAZ3m zpxG*ky;_ekpz+9Tu#N;a*?3v9y{)lrrCQ8C!cv4ZMFZu40VIeZu*j43 zmpv{_tJwB@@814lNDls9X@GpFyxN;$qbP~f!WTOBPK?K#C+mB-`lXT%c&doC+bg$+;i;R}m3?k)D4u%4Y!7~M zcc2J^3arXl*J{Cyq3Q5K{h2e$JSlgU-x7s3v6Iwpe<*$qiaP@F zXf6} z`iS!--;LjQ6AbtZ?B8$a!D)-H4*#*ctAjJGC-^FwG3}#F@uxG@ctYpKa(!!K?~Y}6 zYH^3vN~N^ve7VADw#}!L={|MR0Z25qdR>Z2rk1(`$z;%@&F|lVnSY67^l3BxQzmK^ zDwrW#>~^RX4IfJK9#k~+*1o(RK0JnlP_NcSr8pbfEQ6oS@6=k!10GaLpJ<3mVo=;5 z2=tgM1yKupwdlKOwrCIf>^<<)+>YhwMW+@$+i)4?!9G-D(z~m&Sf8{};qCcWn1Z%e<|K^(FX|YOm>0ulDJ={<6r+2$xH_&A zeD?!91R;UVJOrs~t6UXy`1A8F$p_mwnM)tOoUMoY?8`$bb4MF+&-mj{KNJWoB_)?j zt~L|KL)$Wbb39zbXjH6&pr%|f;r_mna;Py!Ls}q%!6%rDQ5qivllyrIL>ND|LMw9CPIMqi^G1iF;1o=JF zgBs>KGjh~OGI^ub1yyh&S6z<0l8BcL6fnM2y(R*`3*jS!IRjZ{8wILZ7+g>ym184n z0RJ6`;Z`eTo?8Y%mks^eeOX9RhI#f_!0)?mLnaz9d4Z=h$3i=6Ms@GArL6jM4qObW zxN#pm6q?J6q_>Vz(p!^?Jlu6YwnZA6VxUH3i0tY&vy&VH0c34Q#s8x8OrLb@|C>4$ zEVI^~XSOmZ4CNyVJq(oHm(70=Bom!gnq#tzrS5_p63T5SE}b{gI_uk-MM_)Vn-F zlZKNdI!mPl#bAcb40IHVs#*(jryy?;W?aHqlba?OCQii)&lRhTljOza0u8Ip7f;Fy z_``LxH73$1edH`Se5{Z(DknPi(rX(L%S@5BUOjO;DUvBV;W};k+o=-GJDbER?IDlk zbSj}SgNHz#ND0Q^3#KsF*$kW{#H%Ca$mUdxmhs>^7}`=-DOH6xRF(C zTr{y-mLq{;F)%z3_1zPPZ|I4ob*?bOgc~Vvlu%)=N7QQE9sUz7VQtK6)f(Iv;&R#H zc9MTf4#e(h1v-vPqeWIpkVpFRCVdA1w=TEmEUMqsOw@{8fu?_p)?rWjO~<6vs@8jlth z7LO_Bcq)|-#vc5?N7T`Z%%#w9vT?gGW9UY z)9tFW;WsPdJX>rk;pA?mkY?0QpPXo&$Ix0Bj0y%Vg&cOrtqDggS9GTI_Ag4Iy=446 zxxF%pBka=T8Er`lK3Z937J;Ftp_9wl(IQaEao(n65)%Hjxch< z>A0|}Cqa;-Qnu3he||V02%Y6GXAqzm7W8L3#$i6oyEWHoGuoM3@IiBr#jv-Uy7hw{ zmyM?f_RZZ&eQKCTBjH@~Mg@%NdXPxcqY+PxBk*->^O5=Z3)#^G|-ZbAEf?0g*(wij1dCmn)HfL z5XMOe;W0Bc2>+bZBsPavZ34)z1VZWKG3pEXfEo-Lb1ivXj^rzfCujSkG4k3xH>e!% z_13-K(DUJ2pi?OG4qc~cRG@lkw_dhtnQ*{cJ+Svvs9j)?f>CCpeeV7Daq}3nY8=dW z8Up=Cnh(s>rvE?l5ZsGU=2XmScd>%q8A~JC@X#6cSi1k;F>Ruu4J%#w(@ZTaJz%53 zC|=J~e(SDazR+OkH>>!fv7jc{v!Nlqdd0>7ybvub)%Nc ze9JLu)&vTymX?Sta%MHg&HmL{yB0J$)UeMg&Hls;SDv1;#HPjDKwIYk&tv^ZPpzk+ z8$3GBnV}FAAX>$Nqa`nz9W`ipl9q_^8bi2MR!p-=r2?0`Tw2eGf=e?c&7Use-8rdX zh}xrm!}rIjt-@T)e@~1!wi1e_1;#0L1$O^tZQ8QG=AxetM}RauNiva%u&BB?s7PsE zTxXb-3}}!cxS32}xy+*;mCt(FCO75vz=7V9FLB8YxGA|*5`T3$~jD|s3VhtRcI6# zGSad}%8I`%4E-Qi=_N3B6fKKpopSobg$YD4w+q|wXd$~vVo*dHKd41*R?9#yb%+}^ z1fs3!e^D{(1C|JpziKGYrb$_6S%d8&T=8UI#oX&nTNKe16pG<{?a4Xa-;>vjzNEmS zde9KswF!R0QanJ)_<)_dNZQto-gIIpH5fU{KW2C zE(Ur;T{OHEtu#ou4>FnF5zMn{j>f1$zeqWR=!BVuiZf-~8^Ico?U9(ul`xHGG>_O! z23E4RHX`v3)n+$cQ`St6XI?5XuOOL=NxDwz*%jLuVmc?quv3{#4lsW$PCD%$Ps52# zCUz5)h^8{Dy+;gFFXQ%&e!nfxGN8812hWgsV&p)pcT z{I~Xv3zQHW{3w49^mm3I8*+MlN@-z>i~`g%ER6=XOsG%4)5c}&DW;Yl zM2-!518&>deHx9V>`7P?&sdso9z><$Lr7T-HkpJ4pCC$ESccnj_bodW(nuEDO;vRCPkEp!E7ASOf^Jf-a>>UC1X$*$UF@b=m$2w$ey)sA? zM>Iq#`6W|RXU;7pP9*xTE*EoZ)A_(e1|Cw_iPxjxMIpI_*6N~0uPRwa|c;34yjWrcfl!ZyhOm0uULdNtZXbHb%-F=aD@H5 zd7XK{0$F;CVDR{!i?nZ3xyHQisj92=)_;qOo7S~O&?#oYwL+KEt|KXr z_>}{noB8PA5fLfuOPGF{U8d4<36;8NlESd7v)fG{pSj*I9<&I^mU6sp!^DtO1G3{b z?qVGO?xf`WLXtVMgLr#8Rks;X=DVYL8 z6;;kYk*7l-2)%4c6zR15zic=#V@5c&qi(-?Vcnp|8NS)I6`sRXtgs7mNFQ_SBT>Ii zF+A8S`i86)yCakg&90L8vh`?m&H-xKp%c`{OwGWa2#voExy+>9%dLHlXw3{}G*U4q zomVwfzW`pGgLaag^T%AkCaCzDQ!;aV=}MY#JH1#tt4_w{8NEKaLH@$tKZHZ+H@4eQ zN(eteb=1tL&}KJN(7(wFABe{9(LyHsHzM}u?EiP0JVCFH&q;$~GR!f=&5QGcq0$Kq z5Du8I3?DV22qPqxaQKG6tBJajwziHvtC1(AyD#I5VK`ZV7dxqei(nWAjtZp2M@O5B z#i@%_SzW=_EDv*1NWv%UiBd*Y$+gR-b}9>xBEeBo;djAMhkxXP2K-|VO<@ayCSknq zqEvMxsh!-l9e&4X%wOr-&+#^i;x8nk#<~4^qlx3Hch??Yw=1-km(R_DPA%rR>s53> zMfX4=;|I{5hVmiT$OU^ZZO3%|doS4WXXP)B8#9x|9^8Q_yehh?Mod2K5<7LN%fqJI zox_HrpzA5Tp`dJ1z;uK}Ut+$i-BMaC=MMiFE9aLd>3nzBQEk$&()REA?u>0s+PJCY zXCIM=icziN5c6Fb6%K5q1IZH*6(MncEsel17o&2VZky#2NHZi}T(jImO3)j}fdQ6( zV>r9#!~Y^gux<1O7;-5CGdy<_Mpsbb)b3G(Exj*+eNnUD?F4)MZ;$maTCn;f6}T;` z)4|a%v6h6dL^tArH6F6T!IAfoERtOjZq<&0;&f<%p!k-HMC0F`y_z)8QIY!l8bau5c=M4NG#Gei`c{eQlWCOx1ldZG zx5nmXLDe5l@;WTRI$O0us6>D|5e;VP&c82wyGj(_Z|;^xDZ+oa-4}WlrSq#Y&;!0e zfbsT5_FfR*-TiKXC`D-eiF29BJwkA!7w7v`y3!W*WOi^wn9p7?bxua5yWtNI-NH3{ zYuRt#^Bk#oytuTsMbPOa>XHO|UPK@&Ozxroem_Ug97R(AD)2wYdi4|| z$vt(gqMf5rlYfhnOEcqtZv6wJ#0k31LXXHiid-JMa7p2$5;(ONOy2ge{90cX00(QP_;)}^HnQ$m?@){F#b$qLye>TT22j*o><3##*Zq<;gBO5 z-=(;8)}QWE>AJvzD_o}t3BNbU89sFIUrdlXGlJwVB^Gq+-h}gFgfLQVMfx(U`xU?k zE3KGm2jPRH4e0Dk}=C0yfT^ZWV2S#l_`ewfNO70j8Le+L5ez9K{CsI+#5 z{(vG^H1q=MUSLI~X(EUMuz+7tSV!tC~Yq&L!-jb*t`a!{wWt6r=ho zRl}_ItftL%_xXBO1#@V9(>p=aa=DPjYSOSB*{h$p>mpg3+q_W7WxC)GflgoyuI$AKmOhW`57Tj)K?fp=V>l4C7bvrLJOfeuo;R^b{a`uJ1|Q6mU^ zkrOfrp6)QlvVbwczxjq?lro z3Y8f|OO^P>9ogGE&H0Ba`5o5(i7(seH0;e}Dw3)kRM>&CrA2bBjxu?@j-N|Sx$9WV zKg)=Ya}Stde7vKbP91^Gd@n}i(itOkR|#Erx^qO8J^Mrwel}Yk5RW^K$mSK5a<&T!di6jS(d(Vz&29GgiqGD=oDo7+-ILWv?D;N33gGb+5xxHi~_Xdi~Q!Zul1EvF) zNI7!1XB^2cHkR7#(#9+#FRm2`xkdDg@miSGDng-W=JaZ;=6s6EXRZO`P~2%3x2@MG zxLqmzLijshSchLnrq*qztmDy(ck<#uktrc@8K<5;0=5F+94apDH`8%-%mBuQR;072bZ3Y?m8N zd`j`XA!F<&!Y*q)L1jRyBY{?&HIZhcaX(JGpHavsyM_gZOCw9&3i_;QbsF zQiK=UXU56XCrs|*1j|wQUPvUy;;sTpk^6XAu1mrwN)3iNm`MBu#q24643c`$pHnAL zj!wffix{#JJ{If(eJqcA$Z$vZIrv_KklI~MzW{(XxI2W^gb)TH2@PErA5xqVllm9oDjVG+gOeOp!~u#zt%NHbD~E?5%` z%qi^fgB&os`^F4A*oGzT;Ev@8e8js{B_Zl2i9K(tP7$~Y2q=4oeYrG(YvZMf`#>C- zn|s&x=ka(mU@MwQ#93anXLUP=gGn?Z&@j1veDs)Djb>+Ku%EGRfX#CEbAx>;W(RUe zK^n+3D*0q<>z1!smhP*+l}aTIz)Eq1ec`^S9&_IM!-3Q4dy5>Z>Qkpn7-&GN)kZO3 z^PB@uga^x>Up_jq#Y?D&aWO+9eB;ouU;D<&t=)LeKh5;;V=Nbs)sSyihm(opYsV*1 zdkrI+%>w0#P>I>y|C~X3|3JJC$H&Tj!gP7z?o(2h0>4)|jU8bEZj|O?=L-^>`#!5P zK8zTWoXN=@=-)wy)waNf&*hQcI0jL?4ks!|q8W7eBOU6i>{{zKddEhv{KRRaf|R@u z4g`}1@@EyKY==m{Yoo5$t5r!1I%EBY3j^vDP%-zP(&aQZNyMn0-E(?KsWXtAWka@M z$U#VCIx_0~Db*!awz}4`Y{JP6BZeeuRsd(?s+Q3|>5a)zaEdg$~ zzjvXq%Rb}c%F?Zh=ybYgt;vLU-F6x!>uV`wnQ9_4veRte*DA&XJtdU6kM`-j8~@C;PF`fC)onbj%-gnr07DALMYoH&2A6lr-=baig=JC(V{ z0&H-K&z)Rv;ayj;q3dU;$$`Ifw7(q=Jm5ny3Wm=&Jgi*c%yK$C;a;y-ck=^331bDy zfITb-D0m|T7GR@OJS_Ma?hY;Lub*@z`8!+K9{T7aABw#)UrSW4GSTnLIl_c|c_U1v zGet2XTl+$^d29m}_@Sq_XKxqf|Hsp7x2@LWfeo`aQ!(^pn=>LPDNMv>n$?-Y(|v#) zu>s4}eNPsJ^?;Rv`bV3BA-0y_u+H0hpt{@wg@>6&<8jnaJ-}ZrdM^%wAqmw{J4gPh ze||W4vTOFy+L0z(@d$ZyE#PN;T$6ph&Ixr8jkFvzP-1BNOii`l8@C~0`IHMEjh&4q zYh))nyi~x`REnvpzb7XJW|42U%iZp(mDB72SePU8do`Ehx|>j7dQ_RCsC~N(Hx6_- zC36Uor0wlni%PpL9$ze)^S%3K*H;%GW)J80Oz@Z~xQ5GKd=dP%1S0}GG?w$*qgH(y z10{xlgQtNF+!hMMo2PHq#d4cy3{EL55_Xx6a6_{rfW4WHm`gUp6Qmtt&7 z4smo6@6wnrR-@CRA1T}{i0N5fasJo=0rM|kleG-*#BBdAj<%k#%SW{HhLf8%x2tP> z@~?3zT>9T2H5uqstjDbad&r;MkVq9S6)mbnm{ubBl(VvJs3r{@u+P!??T0Q6_1It}E9EnhG{JNh{vAX~JZXKFjFu&NRY@^_N>aZ?wW7 zh@Sxo3ikCP3ZYv+pP%$x2OE_Y^jcn5d86lsfFUhb@&#@;+%RF`c1=nM z?D}KpxWXH!HQax~5SgF|d#B(rygioad+s&$P_>%fgeWB{_~9sCnph=Cos^QpY~|jf zvWC{qmC*;&&six~f;i`hkvEP}b2%A=<{BwfZe^d*xMK%ce^pOo)a4f{tjgVnu5lgJ z`WTiyThF9PwLD*rK1C{N5yy1$CG^fSEMpoKDvzA#EXm8LN`uyxV1@&2YAA>bkVm*# z*vSHJPtlAW7rE+!lh$*QjdSL-q*M=qxstJ>uvCvCJM`GkUkC_@m_by45bRn*1$QvqFlLx{{&t2C>obnc3*Yt?w)? z=|xPRQq!@>piO{&ol#{w;p2Uq{jfyo@2!`D?vcln;4pgR3uyM{!2~l8$3-)YZ(X(3 z{yt$6a)ZjX^eoJM9DVeGfM?+vd5JMK?<5j&Hs-r=kt5@(@J#5+qmeO)wUo{9+$DvY zbL^9=XReh>jk8R$z{usJjAp`x2)T{PY3SegJOyZ-yu3kXO?78Bg2E(Lwp;x0a3&UIN4yGk8kY9pmh+KR%bG;_=-yDI zqJ6_bj3=q-=o)FC_dDf&z7o&?61wE41;nt`*%o!L_av4SDZlUVvSyF64%wDpTpOkZx0xQMsdET-cc|}Pp zZ3O{3rwtyCE+gO^vZn|}Q#chhD5(rm65ppuSr^WjP?kpavkj3b#$aKH{`vBg`{M!ze&1rmn&LHi)CFQyN)9X(4jAB7531D zp32l~P2ei_d<_TN>r?R!Pg*wB=7%!zblh%EI0kzznbhWUd;$fRAH;ag>7 z-1vo*GAw^QUr*cknp@vUg3lf&o%f^loMZTr?`Vg`Y$0!{rIsbi;x*}2a7Bs}mG+Bg zJI~j62n7Dd^2&_V(WC|0Bq$NkTJA;?`XNhl0TNM|9EBUR%m7-wRovT1o7VhP*E7OpAb4UAg~qFM8S85xehDa%?Ns^*8XI> zJ2TVizO<1juc%s!I-E{NAQ^&SnjUmJJ6)P2hZR~f+aU-X!Jh zUt752Q-hFW!DQD0;8;Y#46I!K*YNydpUz59hiB&9_01PyOjDd0mz&GuFeHVu$4qC} zn~~$9|GS_kmM%h(4-i7y7gW)?*>;xZ4P7M;h(d^v)^fSLl|Z1(HBYapIoOTRL+?fZ z9%$mG9+PJYp`s}IiQy)bILwv(P&u;f$ElW{R6y?4XHTc=$DfVqsmx`=p6(%CghZ5x4M3lqpE(dzU(c6cJRI!l0_Y@A$j3hsR|P5UbXG21Wy`ru;j zjTF9lHQ>u%A6{m@697N}Kp?sE>(=N8V^3XCQXBvP96Ea0O6M*fzqEABUy79gKmi6& z_P^P=%~m!-{}U~|X#C#aTVM!9Mgi!XK)KUf4IlJ82F4!w4hWA@UIDRuf|T9L=8&6N zkWOw;p!`JcgHK_PLV(n%+7qYONcQT(+U!0MVM)=2511F{^f zg*|cue7T2x5Rcj97Y@OGqu|eTwW?tX`5dGQ1(ZHH7??`vE(X49Z7V}Hmaw+@ZWp|y zo2#^sJs9}1LSBXL%!Yf(H*(GozJ-JeN9H`(5BSTWG<8(jMl)|`<13;RUoEKPk-Txt z(_(1KYb1}~%W9UYeh8?!YTjhp%kdmqNEYmwX23ngv+>^DiHD1mZQ+4ECXJxiU)dDC)kO0|O}*dsfI z#tx*p)w~CQCIMLM-{1%mTh*-!2*ABiWK<%|g<=Y?drct&1r6fGqfs~15ux0yV{%!o zQwn3KPS_%>(@OQ|44ZukdFFqm1R;<-33>$QLA{W{W<5%>tzI`dN~VcqJjaF9v5tH zsrB5Em72)W$wW2jN=q?^BU8~NjqGhzGYO-mEy8xoH93ASA3mK_sb5mZ(4Nxcg5(*o z+=2GEg{>j$^YeQ;hd2|JD!MpXPNI0ze#BZH6RgfP#r9leFobfZP=dmcM$MF5;Y}@N?Jx%jwDZ3pipUa22&BNO7yt}l|x?st?&9}c)MFacIp!vzKLnvx!l7| z+xFsXLwl4RI1Ae;X*t`YXuI@aU*wPt7@zR2Ir8*PocZ)_W+2ZWf?JZlkG%?7I(+*; z#dZ0QRp4Fb3wIBhp{sc>#nh@1>OP=XHm7sj?z9f~5bhUK3&kj=rCN+Di76l64$ALY z=7f<~x3Drfy4!6!wOuK+PVY|6u?$Yfvb}3&DzV@`?PT)2zUFL;m+9*beoAu3{ zuigud3!x(6U@+Rw(*PM?`COsapbl%9F%rnapLtXV^ zYti0f(#k68-KXS-ud@)hKeuon<#D1tx(h2??k`OtaTt(1Ta-hXNLfD<$Gm@MhUa2D z@)M{h-R3@yzI2_q?#2%3&gmZsZT@rMWu5f>4|df zO(*K24c*j%(OBt<5tv`bG$&U|T{RzIVt;kYqgf%|PgcR|a*lA1((BXb*1G7ZvGevE fUoQ`r+_D*vY5r_{qkq;X6Y%;x?O(Vb#!UbKj%1`X literal 0 HcmV?d00001 diff --git a/outputs/client-info-design-check/inter-latin-ext-wght-normal-HA22NDSG.woff2 b/outputs/client-info-design-check/inter-latin-ext-wght-normal-HA22NDSG.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..479d010d2902fa3a5b48e84a973db1978b2e9949 GIT binary patch literal 85068 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 literal 0 HcmV?d00001 diff --git a/outputs/client-info-design-check/inter-latin-wght-normal-NRMW37G5.woff2 b/outputs/client-info-design-check/inter-latin-wght-normal-NRMW37G5.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d15208de03cd1ad7c5199f0a0ce915fe841e4722 GIT binary patch literal 48256 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∾Na#*TBTU(!jF?9zmR-!C*+RdvGrd0&{`| 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 .btn, +.toolbar > .icon-btn, +.toolbar > .delimiter-select { + flex-shrink: 0; +} +.workspace-btn.has-items { + border-color: var(--button-border); + color: var(--text); + background: var(--button-bg); + opacity: 1; +} +.workspace-btn.has-items:hover { + border-color: var(--button-border); + background: var(--button-bg-hover); +} +.workspace-btn.active { + border-color: var(--button-border); + color: var(--button-marked-text); + background: var(--button-marked-bg); + font-weight: 600; +} +.app-shell > main { + position: relative; + display: grid; + grid-template-columns: 218px minmax(0, 1fr); + min-height: 0; + transition: grid-template-columns .18s ease; +} +.app-shell.sidebar-collapsed > main { + grid-template-columns: 0 minmax(0, 1fr); +} +aside { + position: relative; + z-index: 10; + min-width: 0; + min-height: 0; + background: var(--sidebar); + overflow: visible; +} +.app-sidebar { + display: flex; + flex-direction: column; + min-height: 100%; + padding: 0; +} +.sidebar-theme-panel { + margin-top: auto; + padding: 14px 12px; +} +.theme-switcher { + display: flex; + align-items: center; + justify-content: space-between; + gap: 4px; + padding: 4px; + border: 1px solid var(--button-border); + border-radius: 10px; + background: var(--surface-input); +} +.theme-switcher-btn { + display: grid; + place-items: center; + flex: 1 1 0; + height: 28px; + padding: 0; + border: 1px solid transparent; + border-radius: 7px; + color: var(--button-text); + background: transparent; + box-shadow: none; + font-size: var(--ui-body-size); + line-height: 1; + transition: + background-color .12s ease, + color .12s ease, + border-color .12s ease; + cursor: pointer; +} +.theme-switcher-btn:hover:not(.active) { + color: var(--button-text); + background: var(--button-bg-hover); +} +.theme-switcher-btn.active { + border-color: var(--button-border); + color: var(--button-marked-text); + background: var(--button-marked-bg); + box-shadow: none; + font-weight: var(--fw-semibold); +} +.sidebar-toggle-inline { + display: grid; + place-items: center; + width: 28px; + height: 28px; + padding: 0; + border: 1px solid transparent; + border-radius: 7px; + color: var(--button-text); + background: transparent; + font-size: 16px; + font-weight: var(--fw-bold); + cursor: pointer; +} +.sidebar-toggle-inline:hover { + background: var(--button-bg-hover); + color: var(--text-primary); +} +.sidebar-primary-actions { + display: flex; + flex-direction: column; + gap: 8px; + margin: 10px 0 0 0; + padding: 0 0 12px 10px; + border-top: 0; + border-bottom: 0; +} +.sidebar-tab-btn { + position: relative; + display: flex; + align-items: center; + gap: 13px; + width: calc(100% - 10px); + min-height: 42px; + padding: 8px 14px; + border: 1px solid transparent; + border-radius: 8px; + color: var(--text-secondary); + background: transparent; + box-shadow: none; + font-size: var(--ui-heading-size); + font-weight: var(--fw-regular); + letter-spacing: 0; + text-align: left; + text-shadow: none; + cursor: pointer; + transition: + color .15s ease, + background .15s ease, + border-color .15s ease; +} +.sidebar-tab-btn svg { + flex: 0 0 22px; + width: 22px; + height: 22px; + color: var(--text-muted); +} +.sidebar-tab-btn span { + min-width: 0; +} +.sidebar-tab-btn:hover:not(.active):not(:disabled) { + color: var(--text-primary); + background: var(--surface-hover); + border-color: transparent; + box-shadow: none; + transform: none; +} +.sidebar-tab-btn:hover:not(.active):not(:disabled) svg { + color: var(--text-primary); +} +.sidebar-tab-btn:active:not(:disabled) { + color: var(--text-primary); + background: var(--surface-hover); + box-shadow: none; + transform: none; +} +.sidebar-tab-btn:disabled { + opacity: 0.45; + cursor: not-allowed; +} +.sidebar-tab-btn.active, +.sidebar-tab-btn.active:hover { + position: relative; + z-index: 12; + width: calc(100% + 1px); + margin-right: -1px; + border: 1px solid transparent; + border-right: 1px solid var(--surface-app); + border-radius: 8px 0 0 8px; + color: var(--text-primary); + background: var(--surface-app); + box-shadow: none; + outline: 0; + font-weight: var(--fw-semibold); +} +.sidebar-tab-btn.active svg { + color: var(--band-surface); +} +.app-shell.sidebar-collapsed > main > aside { + visibility: hidden; +} +.sidebar-toggle { + position: absolute; + left: 0; + top: 10px; + z-index: 30; + display: grid; + place-items: center; + width: 28px; + height: 28px; + padding: 0; + border: 1px solid var(--button-border); + border-left: 0; + border-radius: 0; + color: var(--text-primary); + background: var(--button-bg); + transition: background-color .12s ease; +} +.sidebar-toggle:hover { + background: var(--surface-hover); +} +.sidebar-collapsed .sidebar-toggle { + left: 0; +} +.workspace { + display: grid; + grid-template-rows: minmax(0, 1fr); + min-width: 0; + min-height: 0; + background: var(--sidebar); + margin: 0; + padding: 0 12px 12px 0; + overflow: hidden; +} +.workspace.graph-workspace { + grid-template-rows: minmax(0, 1fr); +} +.workbar { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 8px; + min-width: 0; + margin: 9px 0 0; + padding: 8px 16px; + border: 0; + background: transparent; + overflow: hidden; +} +.toolbar:disabled, +.workbar:disabled { + opacity: .5; +} +.toolbar:disabled *, +.workbar:disabled * { + pointer-events: none; +} +.search-tools { + grid-column: 1 / -1; + display: flex; + align-items: center; + gap: 6px; + flex: 1 1 auto; + flex-wrap: wrap; + margin: 0; + padding: 0; +} +.standard-filter-btn { + flex: 0 0 auto; + min-width: 96px; + margin-left: 0; + font-weight: var(--fw-semibold); +} +.title-select { + flex: 0 0 215px; + width: 215px; +} +.sort-select { + flex: 0 0 345px; + width: 345px; +} +.status-select { + flex: 0 0 190px; + width: 190px; +} +.search-tail { + display: flex; + align-items: center; + gap: 6px; + flex: 0 0 100%; + min-width: 0; +} +.sheet-select { + flex: 0 1 310px; + min-width: 240px; + margin-left: 0; +} +.work-timeslot-select { + flex: 0 0 180px; + width: 180px; + min-width: 180px; + margin-left: 0; +} +.search-text-group { + display: flex; + align-items: center; + flex: 1 1 280px; + min-width: 200px; + max-width: 480px; +} +.search-text-group .search-input-wrap { + flex: 1 1 auto; + width: 100%; + min-width: 140px; +} +.search-input-wrap { + position: relative; + flex: 0 0 150px; + width: 150px; + min-width: 150px; +} +.search-input { + width: 100%; + min-width: 0; + padding-right: 34px; +} +.search-clear-btn { + position: absolute; + inset: 1px 1px 1px auto; + display: grid; + place-items: center; + width: 30px; + padding: 0; + border: 0; + border-left: 1px solid var(--line); + border-radius: 0 2px 2px 0; + color: var(--muted); + background: transparent; + font-size: var(--ui-heading-size); +} +.search-clear-btn:hover:not(:disabled) { + color: var(--heading); + background: var(--panel-hover); +} +.search-clear-btn:disabled { + opacity: .35; +} +.workbar-action { + display: flex; + grid-column: 2; + align-items: center; + gap: 12px; + white-space: nowrap; + color: var(--muted); + font-size: var(--ui-label-size); +} +.workbar-action b { + color: var(--heading); +} +.workbar-action label { + display: flex; + align-items: center; + gap: 6px; +} +.status-line { + position: relative; + display: flex; + justify-content: space-between; + align-items: center; + gap: 16px; + min-width: 0; + padding: 4px 16px; + color: var(--muted); + border: 0; + font-size: var(--ui-label-size); +} +.status-line > span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 0 1 auto; +} +.status-line-tools { + position: absolute; + left: 50%; + display: flex; + align-items: center; + gap: 8px; + width: min(520px, calc(100% - 32px)); + min-width: 0; + margin: 0; + transform: translateX(-50%); +} +.status-line .search-text-group { + flex: 1 1 auto; + min-width: 200px; + max-width: none; + margin: 0; +} +.status-line-end { + display: flex; + align-items: center; + gap: 16px; + min-width: 0; + flex: 0 1 auto; +} +.status-line-provenance { + flex: 0 1 auto; + cursor: help; +} +.viewer { + position: relative; + grid-row: 1; + min-width: 0; + min-height: 0; + margin-top: 10px; + background: var(--surface-app); + overflow: hidden; +} +.pathfinder-view-host { + min-width: 0; + min-height: 0; + height: 100%; +} +.viewer.is-joined-top { + border-top-left-radius: 0; +} +.area-landing { + display: grid; + place-items: center; + min-height: 100%; + padding: 36px; +} +.area-landing-card { + width: min(620px, 100%); + padding: 38px 42px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: var(--shadow); + text-align: center; +} +.area-kicker { + display: block; + margin-bottom: 10px; + color: var(--muted); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.area-landing-card h2 { + margin: 0 0 12px; + color: var(--heading); + font-size: var(--ui-glyph-size); +} +.area-landing-card p { + max-width: 510px; + margin: 0 auto 24px; + color: var(--muted); + line-height: 1.6; +} +.area-landing-card .hidden-input + .btn { + min-width: 170px; + font-weight: var(--fw-semibold); +} +.records-layout { + display: grid; + grid-template-columns: clamp(420px, 27vw, 520px) minmax(0, 1fr); + height: 100%; + min-height: 0; + background: var(--surface-app); +} +.record-list { + min-width: 0; + min-height: 0; + padding: 8px 6px; + background: var(--surface-app); + overflow-y: auto; + scrollbar-color: var(--line-strong) var(--surface-inset); + scrollbar-width: thin; +} +.tile-view-scroll { + padding: var(--panel-inset); +} +.tile-grid { + box-sizing: border-box; + display: grid; + grid-template-columns: repeat(auto-fill, minmax(0, var(--tile-content-width))); + align-content: start; + justify-content: start; + gap: var(--segment-gap); + min-height: 100%; + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.table-scroll { + max-width: 100%; + overflow: auto; + background: var(--surface-app); +} +.raw-view { + min-height: 100%; + padding: var(--panel-inset); + color: var(--text); + background: var(--surface-app); + font: var(--type-table-body-size)/1.55 var(--font-mono); +} +@media (max-width: 1500px) { + .topbar-kpi { + min-width: 74px; + padding-inline: 10px; + } + .topbar-kpi.kpi-format { + min-width: 190px; + } + .delimiter-select { + width: 170px; + } + .tab-btn { + min-width: 68px; + } +} +@media (max-width: 1200px) { + .status-line-tools { + position: static; + width: min(520px, 100%); + margin-left: auto; + transform: none; + } +} +@media (max-width: 1050px) { + .workbar { + grid-template-columns: minmax(0, 1fr); + } + .workbar-action { + grid-column: 1; + justify-content: flex-end; + } + .records-layout { + grid-template-columns: minmax(320px, 42%) minmax(0, 1fr); + } +} +@media (max-width: 760px) { + .app-shell > main { + grid-template-columns: 0 minmax(0, 1fr); + } + .app-shell > main > aside { + visibility: hidden; + } + .sidebar-toggle { + left: 0; + } + .records-layout { + grid-template-columns: 1fr; + } + .record-list { + max-height: 280px; + border-right: 0; + border-bottom: 1px solid var(--line); + } + .tile-grid { + grid-template-columns: minmax(0, 1fr); + } +} +.app-sidebar { + display: flex; + flex-direction: column; + min-height: 100%; + padding: 0; +} +.sidebar-primary-actions { + order: 0; +} +.sidebar-severity-rack { + order: 1; +} +.sidebar-theme-panel { + order: 2; + margin-top: auto; + padding: 14px 12px; + border-top: 1px solid var(--line); +} +.connection-indicator { + display: inline-flex; + align-items: center; + gap: 3px; + flex: 0 0 auto; +} +.connection-state-square { + display: block; + width: 9px; + height: 9px; + border-radius: 0; + opacity: .2; +} +.connection-state-square.is-offline { + background: var(--state-offline); +} +.connection-state-square.is-online { + background: var(--state-online); +} +.connection-connected .connection-state-square.is-online { + opacity: 1; +} +.connection-unavailable .connection-state-square.is-offline, +.connection-checking .connection-state-square.is-offline { + opacity: 1; +} +.area-topbar { + display: flex; + align-items: center; + gap: 14px; + flex: 1; + min-width: 0; +} +.area-topbar strong { + margin-right: auto; + color: var(--heading); + font-size: var(--type-h1-size); + font-weight: var(--fw-semibold); + line-height: 1.1; + letter-spacing: -.04em; +} +.area-topbar-heading { + display: flex; + align-items: center; + gap: 18px; + min-width: 0; + margin-right: auto; + overflow: hidden; +} +.area-topbar-heading > strong { + flex: 0 0 auto; + margin-right: 0; +} +.area-client-context-inline { + display: flex; + align-items: center; + gap: var(--space-2); + min-width: 0; +} +.area-client-marker { + flex: 0 0 auto; + color: var(--state-active); +} +.area-client-marker .triangle-icon { + width: 24px; + height: 24px; +} +.area-client-name { + min-width: 0; + overflow: hidden; + color: var(--heading); + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); + line-height: 1.2; + text-overflow: ellipsis; + white-space: nowrap; +} +.pathfinder-filter-trail { + display: flex; + align-items: center; + gap: 12px; + min-width: 0; + color: var(--heading); + font-size: calc(var(--fs-xl) * 1.5); + font-weight: var(--fw-semibold); + line-height: 1.15; + white-space: nowrap; +} +.pathfinder-filter-trail-marker, +.pathfinder-filter-trail-plus { + flex: 0 0 auto; + color: var(--state-active); +} +.pathfinder-filter-trail-marker { + display: inline-flex; +} +.pathfinder-filter-trail-marker .triangle-icon { + width: 28px; + height: 28px; +} +.pathfinder-filter-trail-item { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; +} +.workspace-data-hub, +.workspace-dashboard, +.workspace-graph, +.workspace-db-structure, +.workspace-results { + grid-template-rows: minmax(0, 1fr); +} +.viewer.app-area-graph { + background-color: var(--surface-app); + background-image: var(--app-grid-pattern); + background-size: var(--app-grid-size); +} +@media (max-width: 1500px) { + .app-shell-work .delimiter-select { + display: none; + } +} + +/* src/styles/components.css */ +mark, +.search-highlight { + background-color: var(--search-highlight-bg); + color: var(--search-highlight-text); + border-radius: 2px; + padding: 0 2px; + font-weight: 600; +} +.empty-state { + display: grid; + place-items: center; + min-height: 55vh; + padding: 40px; + color: var(--muted); + text-align: center; +} +.empty-state-brand { + min-height: 100%; +} +.work-filter-empty { + padding: var(--panel-inset); + color: var(--muted); +} +.work-filter-empty p { + font-size: var(--type-body-size); +} +.empty-state-content { + display: grid; + justify-items: center; + gap: 24px; + width: min(620px, 100%); +} +.empty-brand-mark { + display: flex; + align-items: center; + gap: 18px; + opacity: .6; +} +.empty-brand-logo { + position: relative; + display: block; + width: 82px; + height: 82px; +} +.empty-brand-logo img { + position: absolute; + inset: 0; + width: 82px; + height: 82px; + object-fit: contain; +} +.empty-brand-mark strong { + color: var(--heading); + font-size: clamp(34px, 4vw, 58px); + font-weight: var(--fw-bold); + line-height: 1; + letter-spacing: .08em; +} +.empty-open-data { + position: relative; + display: flex; + align-items: center; + gap: 13px; + width: min(310px, 100%); + min-height: 50px; + padding: 10px 20px; + border: 0; + border-radius: 0 var(--legacy-radius-md) var(--legacy-radius-md) 0; + color: var(--text); + background: var(--panel-raised); + box-shadow: none; + font-size: var(--ui-heading-size); + font-weight: var(--fw-semibold); + text-align: left; +} +.empty-open-data::before { + content: ""; + position: absolute; + inset: 0 auto 0 0; + width: 4px; + background: var(--marking-color); +} +.empty-open-data svg { + flex: 0 0 25px; + width: 25px; + height: 25px; +} +.empty-open-data:hover { + color: var(--heading); + background: var(--panel-hover); +} +.empty-open-data:active { + background: var(--panel-soft); +} +.empty-supported-formats { + color: var(--muted); + font-size: var(--ui-body-size); + font-weight: var(--fw-regular); + line-height: 1.8; + letter-spacing: .025em; +} +.about-sections { + display: grid; + gap: var(--space-5); +} +.about-brand { + display: grid; + place-items: center; + min-height: 172px; +} +.about-brand img { + display: block; + width: 160px; + height: 160px; + object-fit: contain; +} +.about-sections section { + display: grid; + gap: var(--space-3); +} +.about-sections h3 { + margin: 0; + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); +} +.about-sections dl { + display: grid; + gap: 0; + margin: 0; +} +.about-detail { + display: grid; + grid-template-columns: minmax(130px, .8fr) minmax(0, 1.2fr); + gap: var(--space-3); + padding: var(--space-2) 0; + border-bottom: 1px solid var(--line); +} +.about-detail dt { + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.about-detail dd { + min-width: 0; + margin: 0; + overflow-wrap: anywhere; + font-size: var(--type-table-body-size); + font-variant-numeric: tabular-nums; +} +.about-credits { + color: var(--muted); + font-size: var(--type-meta-size); + text-align: center; +} +.panel-loading-state { + box-sizing: border-box; + display: grid; + place-items: center; + width: 100%; + min-height: min(560px, 62vh); + color: var(--muted); +} +.panel-loading-state-content { + display: grid; + justify-items: center; + gap: var(--space-4); + text-align: center; +} +.panel-loading-state-message { + display: flex; + align-items: center; + justify-content: center; + gap: var(--space-3); + color: var(--text); + font-size: var(--type-body-size); + line-height: var(--lh-prose); +} +.panel-loading-state.is-compact { + min-height: 280px; +} +.finding-card { + position: relative; + display: grid; + grid-template-columns: 38px minmax(0, 1fr) 36px; + gap: 12px; + min-width: 0; + min-height: 238px; + padding: 22px 18px; + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-md); + color: var(--text); + background: var(--panel-raised); + box-shadow: var(--shadow-raised); + cursor: pointer; + transition: + border-color .16s ease, + background-color .16s ease, + box-shadow .16s ease, + transform .16s ease; +} +.finding-card:hover, +.finding-card:focus-visible { + border-color: var(--line-strong); + background: var(--panel-hover); + box-shadow: var(--shadow-raised-hover); + transform: translateY(-2px); +} +.finding-card.active { + border-color: var(--button-border); + color: var(--button-marked-text); + background: var(--button-marked-bg); +} +.finding-card.is-bookmarked { + outline: 2px solid var(--severity, var(--info)); + outline-offset: -2px; +} +.record-list .finding-card { + position: relative; + grid-template-columns: 32px minmax(0, 1fr); + gap: 12px; + min-height: 78px; + margin-bottom: 0; + padding: 14px 16px; + scroll-margin-block: 7px; + border: 0; + border-radius: 0; + background: var(--panel-raised); + box-shadow: none; + transform: none; +} +.record-list .finding-card::after { + content: ""; + position: absolute; + bottom: 0; + left: 14px; + right: 14px; + height: 1px; + background: var(--border-subtle); + pointer-events: none; +} +.record-list .finding-card.active::after, +.record-list .finding-card:last-child::after { + display: none; +} +.record-list .finding-card:hover, +.record-list .finding-card:focus-visible { + border-color: transparent; + background: var(--panel-hover); + box-shadow: none; + transform: none; +} +.record-list .finding-card.active, +.record-list .finding-card.active:hover, +.record-list .finding-card.active:focus-visible { + z-index: 1; + outline: 0; + border-color: transparent; + border-left: 0; + color: var(--state-selected-flat-text); + background: var(--state-selected-flat); + box-shadow: none; +} +.record-list .finding-card.active h3, +.record-list .finding-card.active .finding-card-status { + color: var(--state-selected-flat-text); +} +.record-list .finding-card-actions, +.record-list .finding-badges { + display: none; +} +.record-list .finding-card h3 { + margin-top: 1px; + font-size: var(--type-h4-size); + font-weight: var(--fw-content-medium); + line-height: 1.35; +} +.finding-card-status { + display: none; +} +.record-list .finding-card-status { + display: block; + margin: 5px 0 0; + color: var(--muted); + font-size: var(--ui-control-size); + line-height: 1.2; +} +.finding-hex { + display: grid; + place-items: center; + width: 29px; + height: 34px; + margin-top: 1px; + color: var(--sev-on); + background: var(--severity, var(--muted)); + clip-path: polygon(50% 0, 94% 24%, 94% 76%, 50% 100%, 6% 76%, 6% 24%); + font-size: var(--ui-control-size); + font-weight: var(--fw-bold); +} +.finding-hex > span { + transform: translate(-3px, 1px); +} +.reader-title-hex { + position: relative; + display: block; + width: 30px; + height: 34px; + margin-top: 1px; + background: var(--severity, var(--muted)); + clip-path: polygon(50% 0, 94% 24%, 94% 76%, 50% 100%, 6% 76%, 6% 24%); +} +.reader-title-hex::after { + content: ""; + position: absolute; + left: 2px; + top: 14px; + width: 8px; + height: 4px; + border-left: 2px solid var(--sev-on); + border-bottom: 2px solid var(--sev-on); + transform: rotate(-45deg); + pointer-events: none; +} +.finding-card h3 { + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + line-height: 1.42; + overflow-wrap: normal; + word-break: normal; + hyphens: manual; +} +.workspace-label { + display: inline-flex; + align-items: center; + justify-content: center; + margin-left: 6px; + padding: 1px 6px; + border: 1px solid var(--border-default); + border-radius: 0; + color: var(--text-primary); + background: var(--surface-input); + font-size: var(--ui-label-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; + vertical-align: middle; +} +.finding-badges, +.mitre-line { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 16px; +} +.finding-card-actions { + display: grid; + align-content: start; + gap: 8px; +} +.bookmark-btn { + color: var(--button-text); + border: 1px solid var(--button-border); + border-radius: var(--btn-radius); + background: var(--button-bg); +} +.bookmark-btn[aria-pressed=true] { + border-color: var(--button-border); + color: var(--button-marked-text); + background: var(--button-marked-bg); + font-weight: 600; +} +.results-btn, +.results-btn:hover { + border: 1px solid var(--button-border); + border-radius: var(--btn-radius); + color: var(--button-text); + background: var(--button-bg); + font-weight: var(--fw-medium); +} +.results-btn.is-open, +.results-btn.is-open:hover { + border: 1px solid var(--result-color); + color: var(--button-accent-text); + background: var(--result-color); + font-weight: 600; +} +.status-badge { + border: var(--border-hair) solid var(--line); +} +.outcome-mark { + display: inline-flex; + align-items: center; + gap: var(--legacy-space-1); + color: var(--muted); +} +.outcome-mark::before { + content: "\2013"; +} +.outcome-mark[data-outcome=fail] { + color: var(--outcome-fail); +} +.outcome-mark[data-outcome=fail]::before { + content: "\25cf"; +} +.outcome-mark[data-outcome=pass] { + color: var(--outcome-pass); +} +.outcome-mark[data-outcome=pass]::before { + content: "\25cb"; +} +.outcome-mark[data-outcome=warning] { + color: var(--outcome-warning); +} +.outcome-mark[data-outcome=warning]::before { + content: "\25d0"; +} +.outcome-mark[data-outcome=execution_error] { + color: var(--outcome-fail); +} +.outcome-mark[data-outcome=execution_error]::before { + content: "\2715"; +} +.mitre-badge { + border: var(--border-hair) solid var(--line); + color: var(--text); + background: var(--surface-inset); +} +.severity-critical { + --severity: var(--critical); +} +.severity-high { + --severity: var(--high); +} +.severity-medium { + --severity: var(--medium); +} +.severity-low { + --severity: var(--low); +} +.severity-info { + --severity: var(--info); +} +.finding-reader { + min-width: 0; + min-height: 0; + padding: 34px 0 60px; + overflow-y: auto; +} +.finding-reader > * { + width: min(834px, calc(100% - var(--reader-inset) - var(--legacy-space-6))); + margin-left: var(--reader-inset); + margin-right: auto; +} +.reader-nav { + display: flex; + align-items: center; + gap: 70px; + margin-bottom: 48px; + color: var(--muted); + font-size: var(--ui-value-size); +} +.reader-nav div { + display: flex; + gap: 20px; +} +.reader-nav button { + border: 0; + color: var(--text); + background: transparent; + font-size: var(--ui-glyph-size); +} +.reader-heading { + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto; + gap: var(--legacy-space-3) 16px; + align-items: start; + padding-bottom: 28px; + border-bottom: 1px solid var(--line); +} +.reader-heading h2 { + margin: 0; + color: var(--heading); + font-size: var(--type-detail-title-size); + font-weight: var(--ui-strong-weight); + line-height: 1.3; + letter-spacing: 0; + overflow-wrap: normal; + word-break: normal; + hyphens: manual; +} +.reader-heading-actions { + display: flex; + flex-wrap: wrap; + grid-column: 1 / -1; + align-items: center; + justify-content: flex-end; + gap: 10px; + align-self: center; +} +.policy-search-key { + display: grid; + gap: var(--space-1); + min-width: min(280px, 100%); + margin-right: auto; + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.policy-search-key > div { + display: flex; + flex-wrap: wrap; + gap: var(--space-1) var(--space-3); +} +.policy-search-key code { + width: fit-content; + max-width: 100%; + color: var(--heading); + font-family: var(--font-mono); + font-size: var(--type-table-body-size); + font-weight: var(--fw-regular); + overflow-wrap: anywhere; + user-select: text; +} +.accepted-risk-trigger { + grid-column: 3; + grid-row: 1; + display: grid; + gap: 4px; +} +.accepted-risk-trigger small { + font-size: var(--type-meta-size); + font-weight: var(--fw-regular); +} +.dialog-window.risk-acceptance-dialog { + width: min(1040px, 100%); +} +.risk-acceptance-form { + display: grid; + gap: 16px; +} +.risk-acceptance-form p { + margin: 0; + font-size: var(--type-body-size); + line-height: 1.5; +} +.risk-acceptance-context { + font-weight: var(--fw-semibold); +} +.risk-acceptance-note { + color: var(--muted); +} +.risk-acceptance-fields { + min-width: 0; + display: grid; + gap: 24px; + margin: 0; + padding: 0; + border: 0; +} +.risk-acceptance-fields h3, +.risk-acceptance-history h3 { + margin: 0 0 12px; + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); +} +.risk-acceptance-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; +} +.risk-acceptance-grid label { + min-width: 0; + display: grid; + align-content: start; + gap: 6px; +} +.risk-acceptance-grid label > span { + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); +} +.risk-acceptance-grid small { + font-size: var(--type-meta-size); + color: var(--muted); + line-height: 1.5; +} +.risk-acceptance-grid input, +.risk-acceptance-grid textarea, +.risk-acceptance-grid select { + width: 100%; + min-width: 0; + padding: 8px 11px; + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--legacy-radius-sm); + color: var(--text); + background: var(--surface-inset); + font: inherit; + font-size: var(--type-body-size); +} +.risk-acceptance-grid textarea { + min-height: 96px; + resize: vertical; +} +.risk-acceptance-confirm { + display: flex; + align-items: start; + gap: 10px; + font-size: var(--type-body-size); + line-height: 1.5; +} +.risk-acceptance-confirm input { + flex: 0 0 auto; + margin-top: 5px; +} +.risk-acceptance-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; +} +.risk-acceptance-history details { + padding: 12px 0; + border-top: var(--border-hair) solid var(--line); +} +.risk-acceptance-history summary { + cursor: pointer; + font-size: var(--type-body-size); +} +.risk-acceptance-history dl { + display: grid; + gap: 12px; +} +.risk-acceptance-history dt { + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.risk-acceptance-history dd { + margin: 4px 0 0; + white-space: pre-wrap; + font-size: var(--type-body-size); + overflow-wrap: anywhere; +} +.dialog-window.risk-acceptance-review-dialog { + width: min(720px, 100%); +} +.risk-acceptance-review { + display: grid; + gap: var(--space-5); +} +.risk-acceptance-review-intro { + padding-left: var(--space-4); + border-left: var(--bw-emphasis) solid var(--marking-color); +} +.risk-acceptance-review-intro strong { + display: block; + color: var(--heading); + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); +} +.risk-acceptance-review-intro p { + margin: var(--space-1) 0 0; + color: var(--muted); + font-size: var(--type-body-size); +} +.risk-acceptance-review-meta, +.risk-acceptance-review-group dl { + display: grid; + gap: 0; + margin: 0; +} +.risk-acceptance-review-meta > div, +.risk-acceptance-review-group dl > div { + display: grid; + grid-template-columns: minmax(150px, .35fr) minmax(0, 1fr); + gap: var(--space-4); + padding: var(--space-2) 0; + border-bottom: var(--border-hair) solid var(--line); +} +.risk-acceptance-review dt { + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.risk-acceptance-review dd { + min-width: 0; + margin: 0; + color: var(--text); + font-size: var(--type-table-body-size); + line-height: 1.5; + white-space: pre-wrap; + overflow-wrap: anywhere; +} +.risk-acceptance-review-group h3 { + margin: 0; + padding-bottom: var(--space-2); + border-bottom: var(--border-hair) solid var(--line-strong); + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); +} +.risk-acceptance-review-confirmation { + margin: 0; + padding-left: var(--space-3); + border-left: var(--bw-emphasis) solid var(--success); + color: var(--text); + font-size: var(--type-body-size); + line-height: 1.5; +} +.risk-acceptance-review-actions { + display: flex; + gap: var(--space-3); + justify-content: flex-end; +} +@media (max-width: 620px) { + .accepted-risk-trigger { + grid-column: 2; + grid-row: 2; + justify-self: start; + } + .risk-acceptance-grid { + grid-template-columns: minmax(0, 1fr); + } +} +.bookmark-label { + color: var(--text); + font-size: var(--ui-control-size); + font-weight: var(--ui-label-weight); +} +.results-detail-btn { + min-width: 136px; +} +.dashboard-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; + margin: 28px auto 24px; +} +.dashboard-grid label, +.review-grid > label { + display: grid; + gap: 7px; + color: var(--heading); + font-size: var(--ui-value-size); + font-weight: var(--fw-semibold); + letter-spacing: 0; + text-transform: none; +} +.dashboard-grid input, +.dashboard-grid select, +.review-grid textarea { + width: 100%; + min-height: 39px; + padding: 8px 11px; + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--legacy-radius-sm); + color: var(--text); + background-color: var(--surface-inset); + text-transform: none; +} +.reader-summary, +.review-grid, +.all-fields { + margin-top: 14px; + padding: 20px 0; + border: 0; + border-bottom: 1px solid var(--line); + background: transparent; +} +.reader-summary h3 { + margin-bottom: var(--legacy-space-5); + color: var(--heading); + font-size: var(--type-h3-size); + text-transform: none; +} +.reader-summary h4 { + margin: 0 0 7px; + color: var(--heading); + font-size: var(--ui-reading-size); + text-transform: uppercase; +} +.reader-summary > div { + padding: 0 0 15px; + margin: 0 0 15px; + border-bottom: 1px solid var(--line); +} +.reader-summary > div:last-child { + margin-bottom: 0; +} +.reader-summary > .policy-value-comparison { + display: grid; + gap: var(--legacy-space-2); + padding: 0; + border: 0; +} +.policy-value-block { + min-width: 0; + padding: var(--legacy-space-3) var(--legacy-space-4); + border-left: 4px solid var(--line-strong); + background: var(--panel-soft); +} +.policy-value-comparison[data-outcome=fail] .policy-value-block[data-value=configured] { + border-left-color: var(--critical); + background: color-mix(in srgb, var(--critical) 8%, transparent); +} +.policy-value-comparison[data-outcome=pass] .policy-value-block[data-value=configured], +.policy-value-block[data-value=expected], +.reader-summary > .reader-remediation { + border-left-color: var(--success); + background: color-mix(in srgb, var(--success) 8%, transparent); +} +.reader-summary > .reader-remediation { + padding: var(--legacy-space-3) var(--legacy-space-4); + border-left-width: 4px; + border-left-style: solid; + border-bottom: 0; +} +.policy-value-block h4 { + margin-bottom: var(--legacy-space-2); + text-transform: none; +} +.policy-value-comparison[data-outcome=historical] .policy-value-block { + border-left-color: var(--line-strong); + background: var(--panel-soft); +} +.policy-evaluation-warning { + border-left: var(--bw-emphasis) solid var(--warning); + padding: var(--tile-inset); +} +.policy-evaluation-warning p { + margin: 0; + font-size: var(--type-body-size); +} +.policy-evaluation-warning h4 { + text-transform: none; +} +.policy-value-block .rich-text-value { + white-space: pre-wrap; + overflow-wrap: anywhere; +} +.policy-guidance-text { + white-space: pre-wrap; + overflow-wrap: anywhere; +} +.policy-guidance-text .policy-value-emphasis { + font-weight: var(--fw-bold); +} +.policy-source-evidence { + display: grid; + gap: var(--space-3); + min-width: 0; +} +.policy-source-evidence h4 { + margin: 0; + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + text-transform: none; + overflow-wrap: anywhere; +} +.policy-source-evidence p { + margin: 0; +} +.policy-source-notice { + font-size: var(--type-body-size); + line-height: 1.5; +} +.policy-source-groups { + min-width: 0; + border-top: var(--border-hair) solid var(--line-strong); +} +.policy-source-group { + display: grid; + gap: var(--space-2); + min-width: 0; + padding: var(--space-4) var(--space-3); + border-bottom: var(--border-hair) solid var(--line-strong); + background: transparent; +} +.policy-source-group__header { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--space-2); +} +.policy-source-group h5 { + min-width: 0; + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + line-height: 1.4; + overflow-wrap: anywhere; +} +.policy-source-group__badge { + width: fit-content; + padding: 3px var(--space-2); + font-size: var(--type-badge-size); + font-weight: var(--fw-semibold); +} +.policy-source-group__badge.is-review { + border: var(--border-hair) solid color-mix(in srgb, var(--warning) 45%, var(--line)); + color: var(--text); + background: color-mix(in srgb, var(--warning) 10%, var(--tile-surface)); +} +.policy-source-group__backup { + color: var(--muted); + font-size: var(--type-meta-size); + overflow-wrap: anywhere; +} +.policy-source-observation { + display: grid; + gap: var(--space-2); + min-width: 0; +} +.policy-source-observation hr { + width: 100%; + margin: var(--space-2) 0; + border: 0; + border-top: var(--border-hair) solid var(--line-strong); +} +.policy-source-reference { + width: fit-content; + max-width: 100%; + padding: 8px var(--space-2); + border: var(--border-hair) solid var(--line); + background: var(--tile-surface); + font-size: var(--type-table-body-size); + overflow-wrap: anywhere; +} +.policy-source-sequence { + color: var(--muted); + font-size: var(--type-meta-size); +} +.policy-source-value { + font-size: var(--type-body-size); + line-height: 1.55; +} +.policy-source-deviation-value { + display: inline-block; + width: fit-content; + padding: 1px 5px; + border-left: var(--bw-emphasis) solid var(--critical); + background: color-mix(in srgb, var(--critical) 14%, transparent); +} +.rich-text-table.result-evidence-table td { + white-space: pre-wrap; + overflow-wrap: anywhere; + font-size: var(--type-table-body-size); +} +.result-evidence-table td.result-evidence-difference { + border-left: 3px solid var(--warning); + background: color-mix(in srgb, var(--warning) 8%, transparent); + font-weight: var(--ui-strong-weight); +} +.variant-comparison { + display: grid; + gap: var(--space-5); + min-width: 0; +} +.variant-comparison__header { + display: grid; + gap: var(--space-1); +} +.variant-comparison__eyebrow { + margin: 0; + color: var(--warning); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + text-transform: uppercase; +} +.variant-comparison__header h3 { + margin: 0; + color: var(--heading); + font-size: var(--type-detail-title-size); + font-weight: var(--fw-semibold); + line-height: 1.35; + overflow-wrap: anywhere; +} +.variant-comparison__scope { + margin: 0; + color: var(--muted); + font-size: var(--type-meta-size); +} +.variant-comparison__notice { + padding: var(--space-4); + border-left: 4px solid var(--warning); + background: color-mix(in srgb, var(--warning) 8%, transparent); +} +.variant-comparison__notice.is-duplicate { + border-left-color: var(--info); + background: color-mix(in srgb, var(--info) 8%, transparent); +} +.variant-comparison__notice strong { + display: block; + margin-bottom: var(--space-1); + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); +} +.variant-comparison__notice p { + margin: 0; + color: var(--text); + font-size: var(--type-body-size); + line-height: 1.55; +} +.variant-comparison__notice p + p { + margin-top: var(--space-1); + color: var(--muted); +} +.variant-comparison__setting h4, +.variant-comparison__variants h4 { + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); +} +.variant-comparison dt { + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.variant-comparison__value { + min-width: 0; +} +.variant-comparison__value > .technical-path { + font-size: var(--type-table-body-size); +} +.variant-comparison__literal { + width: fit-content; + max-width: 100%; + padding: var(--space-2); + color: var(--text); + background: var(--surface-inset); + font-family: var(--font-path); + font-size: var(--type-body-size); + white-space: pre-wrap; + overflow-wrap: anywhere; +} +.variant-comparison__value-note { + color: var(--muted); + font-size: var(--type-meta-size); +} +.variant-comparison__setting dl > div, +.variant-comparison__technical dl > div { + display: grid; + grid-template-columns: minmax(112px, .2fr) minmax(0, 1fr); + gap: var(--space-3); + align-items: start; +} +.variant-comparison dd { + min-width: 0; + margin: 0; + color: var(--text); + font-size: var(--type-table-body-size); + overflow-wrap: anywhere; +} +.variant-comparison__sources, +.variant-comparison__technical { + min-width: 0; + color: var(--text); +} +.variant-comparison__sources { + display: grid; + gap: var(--space-2); +} +.variant-comparison__sources > .technical-path { + display: block; + width: 100%; + box-sizing: border-box; +} +.variant-comparison__technical > summary { + width: fit-content; + cursor: pointer; + color: var(--heading); + font-size: var(--type-button-size); + font-weight: var(--fw-semibold); +} +.variant-comparison__setting { + display: grid; + gap: var(--space-3); + min-width: 0; +} +.variant-comparison__setting dl { + display: grid; + gap: var(--space-2); + margin: 0; +} +.variant-comparison__variants { + display: grid; + gap: var(--space-3); + min-width: 0; +} +.variant-comparison__variants > p { + margin: 0; + color: var(--muted); + font-size: var(--type-body-size); + line-height: 1.55; +} +.variant-comparison__table-wrap { + min-width: 0; + width: 100%; + overflow-x: auto; +} +.variant-comparison__table { + width: 100%; + min-width: 680px; + border-collapse: collapse; + table-layout: auto; + color: var(--text); + background: var(--tile-surface); +} +.variant-comparison__table th, +.variant-comparison__table td { + padding: var(--space-3); + border-bottom: var(--border-hair) solid var(--line); + text-align: left; + vertical-align: top; + font-size: var(--type-table-body-size); + line-height: 1.5; + white-space: normal; + overflow-wrap: anywhere; +} +.variant-comparison__table thead th { + color: var(--muted); + background: var(--surface-inset); + font-size: var(--type-table-head-size); + font-weight: var(--fw-semibold); + text-transform: uppercase; +} +.variant-comparison__table tbody th { + width: 112px; + border-left: 3px solid var(--warning); + color: var(--heading); + font-weight: var(--fw-semibold); +} +.variant-comparison.is-duplicate .variant-comparison__table tbody td:first-child { + min-width: 220px; + border-left: 3px solid var(--info); +} +.variant-comparison.is-duplicate .variant-comparison__table tbody td:nth-child(2) { + min-width: 150px; +} +.variant-comparison.is-duplicate .variant-comparison__table tbody td:nth-child(3) { + min-width: 140px; +} +.variant-comparison__table td:nth-child(2) { + min-width: 220px; +} +.variant-comparison__table td:nth-child(3) { + min-width: 150px; +} +.variant-comparison__table td:nth-child(4) { + min-width: 140px; +} +.variant-comparison__table .variant-comparison__sources { + margin-top: var(--space-2); +} +.variant-comparison__technical-list { + display: grid; + gap: var(--space-4); + margin-top: var(--space-4); +} +.variant-comparison__technical section { + min-width: 0; + padding-top: var(--space-3); + border-top: var(--border-hair) solid var(--line); +} +.variant-comparison__technical h5 { + margin: 0 0 var(--space-2); + color: var(--heading); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.variant-comparison__technical dl { + display: grid; + gap: var(--space-2); + margin: 0; +} +.finding-optional-detail { + margin-top: 2px; + padding: 12px 14px; + border: var(--border-hair) solid var(--line); + background: var(--panel); + min-width: 0; + max-width: 100%; + box-sizing: border-box; + overflow: hidden; +} +.finding-optional-detail > summary { + cursor: pointer; + color: var(--heading); + font-size: var(--ui-reading-size); + font-weight: var(--ui-strong-weight); +} +.finding-optional-detail[open] > summary { + margin-bottom: 10px; +} +.finding-optional-detail > .rich-text-value { + min-width: 0; + max-width: 100%; + overflow-wrap: anywhere; + word-break: normal; + white-space: pre-wrap; +} +.reader-summary p { + margin: 0; + color: var(--text); + font-size: var(--ui-reading-size); + line-height: 1.55; + white-space: pre-wrap; +} +.review-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; + padding: 20px; + border: 1px solid var(--line); + background: var(--panel); +} +.review-grid textarea { + min-height: 96px; + resize: vertical; +} +.review-markers { + display: flex; + flex-wrap: wrap; + gap: 10px 18px; + grid-column: 1 / -1; + margin: 0; + padding: 12px; + border: 1px solid var(--line); +} +.review-markers label { + color: var(--text); + font-size: var(--ui-control-size); +} +.all-fields { + padding-inline: 18px; + border: 1px solid var(--line); + background: var(--panel); +} +.all-fields summary { + cursor: pointer; + color: var(--heading); + font-weight: var(--ui-strong-weight); +} +.all-fields table { + margin-top: 12px; +} +.all-fields th { + position: static; + width: 220px; +} +.linked-results-inline { + margin-top: 18px; +} +.linked-results { + display: grid; + gap: 20px; + min-width: 0; +} +.linked-results-heading { + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--ui-strong-weight); + line-height: 1.35; +} +.linked-results-empty { + padding: 18px; + border-left: 3px solid var(--warning); + background: color-mix(in srgb, var(--warning) 12%, transparent); + line-height: 1.55; +} +.result-block { + min-width: 0; + padding: 0; + border: 0; + background: transparent; + line-height: 1.55; +} +.result-block__title { + margin: 0 0 10px; + color: var(--heading); + font-size: var(--ui-heading-size); + font-weight: var(--ui-strong-weight); + line-height: 1.35; +} +.result-block__subtitle { + margin: 0 0 10px; + color: var(--heading); + font-size: var(--ui-body-size); + font-weight: var(--ui-strong-weight); + line-height: 1.4; +} +.result-block__preamble { + margin: 0 0 10px; + color: var(--text); + font-size: var(--ui-reading-size); + line-height: 1.55; +} +.maester-error { + display: grid; + gap: var(--space-4); + min-width: 0; +} +.maester-error__summary { + margin: 0; + padding: var(--space-4); + border-left: var(--bw-emphasis) solid var(--critical); + color: var(--heading); + background: color-mix(in srgb, var(--critical) 8%, transparent); + font-size: var(--type-body-size); + line-height: 1.55; +} +.maester-error__facts { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0 var(--space-5); + margin: 0; +} +.maester-error__facts > div { + display: grid; + grid-template-columns: minmax(110px, .35fr) minmax(0, 1fr); + gap: var(--space-3); + padding: var(--space-2) 0; + border-bottom: var(--border-hair) solid var(--line); +} +.maester-error__facts dt { + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.maester-error__facts dd { + min-width: 0; + margin: 0; + color: var(--text); + font-size: var(--type-table-body-size); + line-height: 1.45; + overflow-wrap: anywhere; +} +.maester-error__raw { + min-width: 0; + color: var(--muted); + font-size: var(--type-button-size); +} +.maester-error__raw summary { + width: fit-content; + cursor: pointer; + color: var(--heading); + font-weight: var(--fw-semibold); +} +.maester-error__raw pre { + max-width: 100%; + margin: var(--space-3) 0 0; + padding: var(--space-3); + border: var(--border-hair) solid var(--line); + color: var(--text); + background: var(--surface-inset); + font-family: inherit; + font-size: var(--type-table-body-size); + line-height: 1.5; + white-space: pre-wrap; + overflow-wrap: anywhere; +} +.result-block > .rich-text-table-wrap:last-child { + margin-bottom: 0; +} +@media (max-width: 760px) { + .maester-error__facts { + grid-template-columns: minmax(0, 1fr); + } + .variant-comparison__setting dl > div, + .variant-comparison__technical dl > div { + grid-template-columns: minmax(0, 1fr); + gap: var(--space-1); + } +} +.results-window { + --results-action-width: 84px; + --result-edge: var(--marker-width); + --cluster-bar-h: 34px; + position: fixed; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + width: min(1040px, 78vw); + height: auto; + min-width: 440px; + max-width: 100vw; + max-height: calc(100vh - 144px); + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--legacy-radius-sm); + color: var(--text); + background: var(--bg); + overflow: visible; +} +.results-window:not(.is-minimized) { + box-shadow: var(--shadow-overlay); +} +.results-window.is-minimized { + height: auto; + border-top: 0; + border-left: var(--result-edge) solid var(--result-color); + border-radius: 0; +} +.results-window.is-minimized.is-dimmed { + filter: grayscale(1); + opacity: 0.42; +} +.results-window.is-minimized .results-window-body { + display: none; +} +.results-window.is-minimized .results-window-head { + min-height: 33px; + border-radius: 0; + border-bottom: 0; +} +.results-window.is-minimized.is-cluster-bottom, +.results-window.is-minimized.is-cluster-bottom .results-window-head { + border-radius: 0 0 var(--radius-result-cluster) var(--radius-result-cluster); +} +.results-window.is-minimized .results-window-result-summary { + align-self: stretch; + min-width: 78px; + padding-right: 10px; + border-right: var(--border-hair) solid var(--line); +} +.results-cluster-bar { + position: absolute; + top: calc(-1 * var(--cluster-bar-h)); + left: calc(-1 * var(--result-edge)); + right: -1px; + z-index: 100; + display: flex; + align-items: center; + height: var(--cluster-bar-h); + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--radius-result-cluster) var(--radius-result-cluster) 0 0; + color: var(--heading); + background: var(--panel-raised); + cursor: move; + touch-action: none; + user-select: none; +} +.results-cluster-slot { + display: grid; + place-items: center; + align-self: stretch; + flex: 0 0 auto; + width: 34px; + padding: 0; + border: 0; + border-right: var(--border-hair) solid var(--line); + border-radius: 0; + color: var(--muted); + background: transparent; +} +.results-cluster-slot:hover { + color: var(--marking-color); + background: var(--panel-hover); +} +.results-cluster-total { + display: grid; + place-items: center; + min-width: 58px; + height: 22px; + margin-left: 10px; + padding: 0 8px; + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--legacy-radius-sm); + color: var(--heading); + background: var(--surface-inset); + font-family: var(--font-mono); + font-size: var(--ui-label-size); + font-variant-numeric: tabular-nums; +} +.results-cluster-bar-actions { + display: flex; + align-items: center; + gap: 6px; + margin-left: auto; + padding-right: 8px; +} +.result-dock-slot { + display: flex; + align-items: center; + flex: 0 0 auto; +} +.result-dock { + display: flex; + align-items: center; + gap: 8px; +} +.result-dock-toggle { + display: grid; + place-items: center; + width: var(--control-height); + height: var(--control-height); + padding: 0; + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--radius-result-cluster); + color: var(--heading); + background: var(--panel-raised); +} +.result-dock-toggle:hover { + color: var(--marking-color); + border-color: var(--marking-color); + background: var(--panel-hover); +} +.result-dock-count { + display: grid; + place-items: center; + min-width: 58px; + height: var(--control-height); + padding: 0 8px; + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--legacy-radius-sm); + color: var(--heading); + background: var(--surface-inset); + font-family: var(--font-mono); + font-size: var(--ui-label-size); + font-variant-numeric: tabular-nums; +} +.result-dock-marks { + display: flex; + align-items: center; + gap: 2px; + min-width: 0; + overflow: hidden; +} +.result-dock-mark { + display: grid; + place-items: center; + width: 22px; + height: 22px; + flex: 0 0 auto; + padding: 0; + border: 0; + border-radius: var(--legacy-radius-sm); + color: var(--result-color); + background: transparent; +} +.result-dock-mark:hover { + background: var(--panel-hover); +} +.result-dock-mark .triangle-icon { + width: 14px; + height: 14px; +} +.results-cluster-bookmark, +.results-cluster-close, +.results-window-bookmark { + display: grid; + place-items: center; + width: 22px; + height: 22px; + padding: 0; + border: 0; + border-radius: var(--legacy-radius-sm); + color: var(--muted); + background: transparent; +} +.results-cluster-bookmark:hover, +.results-cluster-close:hover, +.results-window-bookmark:hover { + color: var(--heading); + background: var(--panel-hover); +} +.results-cluster-bookmark.is-bookmarked, +.results-window-bookmark.is-bookmarked { + color: var(--state-bookmark); +} +.results-window-resize { + position: absolute; + z-index: 5; +} +.results-window-resize-n, +.results-window-resize-s { + left: 10px; + right: 10px; + height: 5px; + cursor: ns-resize; +} +.results-window-resize-n { + top: 0; +} +.results-window-resize-s { + bottom: 0; +} +.results-window-resize-e, +.results-window-resize-w { + top: 10px; + bottom: 10px; + width: 5px; + cursor: ew-resize; +} +.results-window-resize-e { + right: 0; +} +.results-window-resize-w { + left: 0; +} +.results-window-resize-ne, +.results-window-resize-nw, +.results-window-resize-se, +.results-window-resize-sw { + width: 12px; + height: 12px; +} +.results-window-resize-ne { + top: 0; + right: 0; + cursor: nesw-resize; +} +.results-window-resize-nw { + top: 0; + left: 0; + cursor: nwse-resize; +} +.results-window-resize-se { + bottom: 0; + right: 0; + cursor: nwse-resize; +} +.results-window-resize-sw { + bottom: 0; + left: 0; + cursor: nesw-resize; +} +.results-window-head { + display: flex; + align-items: stretch; + justify-content: space-between; + gap: 0; + min-height: 32px; + min-width: 0; + padding: 0 8px 0 0; + color: var(--heading); + background: var(--panel-soft); + border-bottom: 1px solid var(--line); + cursor: move; + touch-action: none; + user-select: none; +} +.results-window-head h2 { + display: flex; + align-items: stretch; + gap: 10px; + min-width: 0; + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--ui-strong-weight); + line-height: 1.35; +} +.results-window-result-summary { + display: inline-flex; + align-items: center; + align-self: center; + flex: 0 0 auto; + gap: 5px; + padding-left: 8px; + color: var(--heading); + font-family: var(--font-mono); + font-variant-numeric: tabular-nums; + white-space: nowrap; +} +.results-window-toggle, +.results-window-toggle-icon { + display: grid; + place-items: center; + width: 20px; + height: 20px; + flex: 0 0 auto; + color: var(--result-color); +} +.results-window-toggle { + padding: 0; + border: 0; + border-radius: 3px; + background: transparent; +} +.results-window-toggle:hover { + color: var(--result-color); + background: var(--panel-hover); +} +.results-window-toggle .triangle-icon, +.results-window-toggle-icon .triangle-icon { + width: 16px; + height: 16px; +} +.results-window-name { + display: flex; + align-items: center; + min-width: 0; + padding: 5px 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.results-window-actions { + display: flex; + align-items: center; + flex: 0 0 auto; + gap: 6px; + padding: 0 0 0 8px; +} +.results-window-action { + align-self: center; + min-width: var(--results-action-width); +} +.results-window-close { + align-self: center; + display: grid; + place-items: center; + width: 22px; + height: 22px; + padding: 0; + border: 0; + border-radius: 3px; + color: var(--muted); + background: transparent; +} +.results-window-close:hover { + color: var(--heading); + background: var(--panel-hover); +} +.results-window-body { + min-height: 0; + padding: var(--panel-inset); + overflow: auto; + font-size: var(--ui-reading-size); + line-height: 1.45; +} +@media (max-width: 980px) { + .dashboard-grid, + .review-grid { + grid-template-columns: 1fr 1fr; + } + .finding-reader > * { + width: calc(100% - 36px); + } +} +@media (max-width: 620px) { + .dashboard-grid, + .review-grid { + grid-template-columns: 1fr; + } + .reader-heading { + grid-template-columns: auto minmax(0, 1fr); + } + .reader-heading-actions { + grid-column: 1 / -1; + } + .results-window:not(.is-maximized) { + left: 8px !important; + top: 8px !important; + width: calc(100vw - 16px); + height: auto; + max-height: min(78vh, 680px); + min-width: 0; + } +} +@media (prefers-reduced-motion: reduce) { + .finding-card { + transition: none; + } + .finding-card:hover { + transform: none; + } +} +.rich-text-value > :first-child { + margin-top: 0; +} +.rich-text-value > :last-child { + margin-bottom: 0; +} +.rich-text-value p { + margin: 0 0 14px; +} +.rich-text-value ul, +.rich-text-value ol { + margin: 8px 0 14px; + padding-left: 24px; +} +.rich-text-value a { + color: var(--heading); + text-decoration: underline; + text-underline-offset: 2px; +} +.rich-text-value li { + margin: 0 0 4px; +} +.inline-results-link { + display: inline; + padding: 0; + margin: 0; + border: none; + background: transparent; + color: var(--heading); + font-size: inherit; + font-family: inherit; + font-weight: var(--ui-strong-weight); + text-decoration: underline; + text-underline-offset: 2px; + cursor: pointer; +} +.inline-results-link:hover { + color: var(--marking-color); +} +.inline-results-link-disabled { + text-decoration: underline; + text-underline-offset: 2px; + opacity: 0.85; +} +.rich-text-value h5, +.rich-text-value h6 { + margin: 16px 0 6px; + color: var(--heading); + font-size: var(--ui-body-size); + font-weight: var(--ui-strong-weight); +} +.rich-text-value h6 { + color: var(--muted); + font-size: var(--ui-control-size); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.rich-text-value code { + padding: 1px 4px; + border-radius: var(--legacy-radius-sm); + background: var(--surface-inset); + font-family: var(--font-mono, monospace); + font-size: var(--ui-control-size); +} +.technical-path, +.rich-text-value code.technical-path { + display: inline-block; + vertical-align: top; + max-width: 100%; + min-width: 0; + padding: var(--space-1) var(--space-2); + border: var(--border-hair) solid var(--line); + border-radius: 0; + background: var(--surface-inset); + color: var(--text); + font-family: var(--font-path); + font-size: inherit; + font-weight: var(--fw-regular); + line-height: inherit; + white-space: pre-wrap; + overflow-wrap: anywhere; + word-break: normal; + text-transform: none; +} +.rich-text-code { + margin: 8px 0 14px; + padding: var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + background: var(--surface-inset); + font-family: var(--font-mono, monospace); + font-size: var(--ui-control-size); + white-space: pre-wrap; + overflow-wrap: anywhere; + word-break: normal; + word-wrap: break-word; + width: 100%; + max-width: 100%; + box-sizing: border-box; +} +.rich-text-table-wrap { + margin: 8px 0 14px; + overflow-x: auto; +} +.rich-text-table-wrap, +.results-window-body { + scrollbar-width: thin; + scrollbar-color: var(--line-strong) var(--surface-inset); +} +.rich-text-table-wrap::-webkit-scrollbar, +.results-window-body::-webkit-scrollbar { + width: 11px; + height: 11px; +} +.rich-text-table-wrap::-webkit-scrollbar-track, +.results-window-body::-webkit-scrollbar-track { + background: var(--surface-inset); +} +.rich-text-table-wrap::-webkit-scrollbar-thumb, +.results-window-body::-webkit-scrollbar-thumb { + border: var(--border-hair) solid var(--surface-inset); + border-radius: var(--legacy-radius-sm); + background: var(--line-strong); +} +.rich-text-table-wrap::-webkit-scrollbar-thumb:hover, +.results-window-body::-webkit-scrollbar-thumb:hover { + background: var(--muted); +} +.rich-text-table-wrap::-webkit-scrollbar-corner, +.results-window-body::-webkit-scrollbar-corner { + background: var(--surface-inset); +} +.rich-text-table { + border-collapse: collapse; + width: auto; + min-width: 100%; +} +.rich-text-table th, +.rich-text-table td { + padding: 4px var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + text-align: left; + vertical-align: top; + font-size: var(--ui-control-size); +} +.rich-text-table th { + position: static; + color: var(--heading); + background: var(--surface-panel-raised); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; + white-space: nowrap; +} +.rich-text-table.is-column-resizable th { + position: relative; +} +.rich-text-table.is-column-resizable.has-custom-column-widths { + min-width: 0; +} +.results-window.is-maximized .rich-text-table.is-column-resizable:not(.has-custom-column-widths) { + width: max-content; + min-width: max-content; + table-layout: auto; +} +.results-window.is-maximized .rich-text-table.is-column-resizable:not(.has-custom-column-widths) th, +.results-window.is-maximized .rich-text-table.is-column-resizable:not(.has-custom-column-widths) td { + white-space: nowrap; +} +.result-column-resizer { + position: absolute; + z-index: 2; + top: 0; + right: -5px; + bottom: 0; + width: 10px; + cursor: col-resize; + touch-action: none; + user-select: none; +} +.result-column-resizer::after { + position: absolute; + top: 0; + right: 4px; + bottom: 0; + width: var(--border-hair); + background: transparent; + content: ""; +} +.result-column-resizer:hover::after, +.result-column-resizer:focus-visible::after { + background: var(--focus-ring); +} +.result-column-instructions { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} +.rich-text-table tr.rich-text-table-row--highlight td { + background: var(--evidence-highlight-bg); + color: var(--evidence-highlight-text); + font-weight: var(--ui-strong-weight); +} +.rich-text-table tr.rich-text-table-row--criterion td { + background: var(--criterion-highlight-bg); + color: var(--criterion-highlight-text); + font-weight: var(--ui-strong-weight); +} +.rich-text-table tr.rich-text-table-row--violation td { + background: var(--violation-highlight-bg); + color: var(--violation-highlight-text); + font-weight: var(--ui-strong-weight); +} +.donut-metric-rack { + display: grid; + grid-template-columns: repeat(6, minmax(0, 1fr)); + gap: var(--segment-gap); + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); + box-shadow: none; +} +.donut-metric-card { + position: relative; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + min-width: 0; + min-height: var(--donut-card-min-h); + padding: var(--space-5) var(--space-3) var(--space-2); + overflow: hidden; + border: var(--border-hair) solid var(--tile-border); + border-radius: var(--tile-radius); + color: var(--donut-all); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); +} +.donut-metric-card__title { + min-width: 0; + margin: 0; + overflow: hidden; + color: var(--donut-label); + font: var(--fw-regular) var(--donut-title-size) / 1.15 var(--font-donut-display); + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; +} +.donut-metric-card__plot { + position: relative; + align-self: end; + justify-self: center; + width: min(100%, var(--donut-ring-size)); + aspect-ratio: 1; +} +.donut-metric-card__plot svg { + display: block; + width: 100%; + height: 100%; + overflow: visible; + transform: rotate(-90deg); +} +.donut-metric-card__plot circle { + fill: none; + stroke-width: var(--donut-ring-stroke); +} +.donut-metric-card__track { + stroke: var(--donut-track); +} +.donut-metric-card__progress { + stroke: currentColor; + animation: donut-progress-build var(--dur-data-build) var(--ease-data-build) both; +} +@keyframes donut-progress-build { + from { + stroke-dasharray: 0 100; + } + to { + stroke-dasharray: var(--donut-progress-dash); + } +} +.donut-metric-card__values { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-family: var(--font-donut-display); + font-variant-numeric: tabular-nums; + line-height: 1; +} +.donut-metric-card__primary { + position: relative; + display: block; +} +.donut-metric-card__primary strong { + color: var(--donut-value); + font-size: var(--donut-value-size); + font-weight: var(--fw-semibold); +} +.donut-metric-card__primary span { + position: absolute; + left: calc(100% + var(--space-1)); + bottom: 0; + color: var(--donut-value); + font-size: var(--donut-percent-size); + font-weight: var(--fw-semibold); +} +.donut-metric-card__primary.is-compact strong { + font-size: calc(var(--donut-value-size) * .85); +} +.donut-metric-card__primary.is-compact span { + font-size: var(--type-meta-size); +} +.donut-metric-card__values > small { + margin-top: var(--space-2); + color: var(--donut-label); + font-size: var(--type-meta-size); + font-weight: var(--fw-regular); +} +.donut-metric-card--all { + color: var(--donut-all); +} +.donut-metric-card--deviation { + color: var(--donut-deviation); +} +.donut-metric-card--passed { + color: var(--donut-passed); +} +.donut-metric-card--not-applicable { + color: var(--donut-not-applicable); +} +.donut-metric-card--not-run { + color: var(--donut-not-run); +} +.donut-metric-card--error { + color: var(--donut-error); +} +.donut-metric-card--critical { + color: var(--critical); +} +.donut-metric-card--high { + color: var(--high); +} +.donut-metric-card--medium { + color: var(--medium); +} +.donut-metric-card--low { + color: var(--low); +} +.donut-metric-card--info { + color: var(--info); +} +.sidebar-severity-rack { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: var(--segment-gap); + flex: 1 1 auto; + min-height: 0; + margin: 0 var(--space-3) var(--space-2); + padding: var(--segment-inset); + overflow-y: auto; + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); + box-shadow: none; + scrollbar-color: var(--border-strong) var(--segment-surface); + scrollbar-width: thin; +} +.sidebar-severity-card { + min-height: calc(var(--donut-ring-size) + var(--space-2)); + padding: var(--space-3) var(--space-2) var(--space-2); + cursor: pointer; +} +.sidebar-severity-card .donut-metric-card__title { + font-size: var(--fs-sm); +} +.sidebar-severity-card .donut-metric-card__plot { + width: calc(var(--donut-ring-size) - var(--space-8)); +} +.sidebar-severity-card .donut-metric-card__primary strong { + font-size: var(--donut-compact-value-size); +} +.sidebar-severity-card .donut-metric-card__primary span { + left: calc(100% + var(--donut-compact-unit-gap)); + font-size: var(--donut-compact-percent-size); +} +.sidebar-severity-card:hover { + border-color: transparent; +} +.sidebar-severity-card[aria-pressed=true] { + border-color: currentColor; + outline: var(--bw-emphasis) solid currentColor; + outline-offset: calc(-1 * var(--bw-emphasis)); +} +@media (prefers-reduced-motion: reduce) { + .donut-metric-card__progress { + animation: none; + } +} +@media (max-width: 1100px) { + .donut-metric-rack { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} +@media (max-width: 760px) { + .donut-metric-rack { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} +.backend-connection-dialog__content { + display: grid; + grid-template-columns: 32px minmax(0, 1fr); + gap: var(--space-4); + align-items: start; +} +.backend-connection-dialog__icon { + display: grid; + place-items: center; + width: 32px; + height: 32px; + color: var(--state-active-text); + background: var(--warning); + font-size: var(--type-detail-title-size); + font-weight: var(--fw-bold); +} +.backend-connection-dialog__content p { + margin: 0; + color: var(--text); + font-size: var(--type-body-size); + line-height: 1.5; +} +.backend-connection-dialog__content .backend-connection-dialog__hint { + margin-top: var(--space-3); + color: var(--muted); + font-size: var(--type-meta-size); +} + +/* src/styles/dynamic-filters.css */ +.primary-filter-group { + display: flex; + align-items: center; + flex: 0 1 auto; + flex-wrap: nowrap; + gap: 6px; + min-width: 0; + padding: 0; + border: 0; + border-radius: 0; + background: transparent; +} +.primary-filter-group .select.dynamic-facet-select { + height: 28px; + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--radius-sm); + color: var(--text); + background-color: var(--surface-input); + font-size: var(--ui-label-size); + font-weight: var(--fw-medium); +} +.primary-filter-group .select.dynamic-facet-select option { + color: var(--text); + background: var(--panel-raised); + font-weight: 400; +} +.dynamic-facet-select { + flex: 1 1 0; + width: auto; + min-width: 92px; + max-width: 200px; + height: 28px; + border-color: var(--line-strong); + font-size: var(--ui-label-size); +} +.search-tools > .dynamic-facet-select.is-source-scan { + margin-left: auto; +} +.dynamic-facet-select.is-gpo-backup { + flex: 0 1 340px; + min-width: min(100%, 340px); + max-width: 100%; +} +.primary-filter-group .select.dynamic-facet-select.is-filtered, +.select.dynamic-facet-select.is-filtered, +.dynamic-range-filter.is-filtered { + border-color: var(--state-progress); + color: var(--sev-on); + background-color: var(--state-progress); + font-weight: var(--ui-strong-weight); +} +.dynamic-range-filter.is-filtered .input { + color: var(--text); + background: var(--surface-inset); +} +.search-input.is-filtered { + border-color: var(--state-progress); + color: var(--sev-on); + background: var(--state-progress); + font-weight: var(--ui-strong-weight); +} +.search-input.is-filtered + .search-clear-btn { + border-left-color: color-mix(in srgb, var(--sev-on) 45%, transparent); + color: var(--sev-on); +} +.search-input.is-filtered + .search-clear-btn:hover:not(:disabled) { + color: var(--sev-on); + background: color-mix(in srgb, var(--sev-on) 14%, transparent); +} +.search-tools .btn.standard-filter-btn, +.search-tools .btn.standard-filter-btn:hover { + height: 24px; + padding: 2px 8px; + border: 1px solid var(--button-border); + border-radius: 0; + color: var(--button-marked-text); + background: var(--button-marked-bg); + font-weight: 600; +} +.dynamic-range-filter { + display: grid; + grid-template-columns: auto 108px 108px; + align-items: center; + gap: var(--legacy-space-1); + flex: 0 0 auto; + min-height: var(--control-height); + padding: 2px var(--legacy-space-2); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + color: var(--muted); + background: var(--panel); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + white-space: nowrap; +} +.dynamic-range-filter input { + width: 108px; + min-width: 0; + height: 22px; + padding: 2px var(--legacy-space-1); + font-size: var(--ui-label-size); +} +.import-quality { + font-weight: var(--ui-label-weight); +} +.import-quality-success { + color: var(--success); +} +.import-quality-warning { + color: var(--warning); +} +.import-quality-error { + color: var(--danger); +} +.import-quality-neutral { + color: var(--muted); +} +.view-bookmark-bar { + display: flex; + align-items: center; + gap: var(--space-2); + flex: 1 1 auto; + min-width: 0; +} +.view-bookmark-create { + flex: 0 0 auto; + height: var(--btn-h); + font-size: var(--ui-label-size); +} +.view-bookmark-list { + display: flex; + align-items: center; + gap: var(--space-2); + flex: 1 1 auto; + min-width: 0; + overflow: visible; +} +.view-bookmark-item { + display: inline-flex; + align-items: stretch; + flex: 0 0 auto; + width: auto; + height: var(--btn-h); + min-width: 0; +} +.view-bookmark-entry { + display: block; + flex: 0 0 auto; + width: auto; + min-width: 0; + height: var(--btn-h); + border-color: var(--band-border); + border-right: 0; + font-size: var(--ui-label-size); + white-space: nowrap; +} +.view-bookmark-item.is-path { + outline: 2px solid var(--graph-alert); + outline-offset: -2px; +} +.view-bookmark-remove { + flex: 0 0 22px; + width: 22px; + height: var(--btn-h); + padding: 0; + border: 1px solid var(--band-border); + border-radius: 0; + color: var(--button-text); + background: var(--button-bg); + cursor: pointer; +} +.view-bookmark-remove:hover { + background: var(--button-bg-hover); +} +.view-bookmark-dialog-backdrop { + position: fixed; + inset: 0; + z-index: 1000; + display: grid; + place-items: center; + padding: var(--space-4); + background: var(--surface-scrim); +} +.view-bookmark-dialog { + display: grid; + gap: var(--space-3); + width: min(340px, 100%); + padding: var(--space-4); + border: var(--bw-hairline) solid var(--border-strong); + border-radius: var(--radius-md); + color: var(--text-primary); + background: var(--surface-overlay); + box-shadow: var(--shadow-popover); +} +.view-bookmark-dialog label { + color: var(--text-secondary); + font-size: var(--ui-label-size); +} +.view-bookmark-dialog small { + color: var(--danger); +} +.view-bookmark-dialog footer { + display: flex; + justify-content: flex-end; + gap: var(--space-2); +} + +/* src/styles/datahub.css */ +.datahub-page { + width: 100%; + min-height: 100%; + padding: var(--panel-inset); + color: var(--text); + background: var(--surface-app); +} +.datahub-page > * { + width: min(1180px, 100%); + margin-inline: auto; +} +.datahub-hero { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: var(--legacy-space-6); + padding: 0 0 var(--legacy-space-5); + border-bottom: var(--border-hair) solid var(--line); +} +.datahub-hero h2 { + margin: var(--legacy-space-1) 0 var(--legacy-space-2); + color: var(--heading); + font-size: clamp(17px, 2vw, 22px); + line-height: 1.15; + letter-spacing: -.01em; +} +.datahub-hero p { + max-width: 690px; + margin: 0; + color: var(--muted); + font-size: var(--ui-body-size); + line-height: 1.5; +} +.datahub-eyebrow, +.datahub-section-heading span { + color: var(--muted); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.datahub-hero-actions, +.datahub-form-actions { + display: flex; + gap: var(--legacy-space-2); + flex: 0 0 auto; +} +.datahub-projects, +.datahub-create { + margin-top: var(--legacy-space-6); +} +.datahub-section-heading { + display: flex; + align-items: end; + justify-content: space-between; + gap: var(--legacy-space-5); + margin-bottom: var(--legacy-space-3); +} +.datahub-section-heading h3 { + margin: 0; + color: var(--heading); + font-size: var(--ui-body-size); +} +.datahub-section-heading > strong { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 28px; + height: 22px; + padding: 1px 6px; + border: 1px solid var(--border-default); + border-radius: 0; + color: var(--text-primary); + background: var(--surface-input); + font-size: var(--ui-value-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.datahub-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(0, var(--tile-content-width))); + justify-content: start; + gap: var(--segment-gap); + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.datahub-card { + display: grid; + grid-template-columns: 40px minmax(0, 1fr) auto; + align-items: center; + gap: var(--legacy-space-3); + min-width: 0; + min-height: 96px; + padding: var(--legacy-space-4); + overflow: hidden; + border: var(--border-hair) solid var(--tile-border); + border-radius: var(--tile-radius); + color: var(--text); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); + text-align: left; + transition: border-color .12s ease, background .12s ease; +} +.datahub-card:hover { + border-color: transparent; + background: var(--tile-surface-hover); +} +.datahub-card-mark { + display: grid; + place-items: center; + width: 40px; + height: 40px; + border-radius: var(--legacy-radius-sm); + color: var(--button-accent-text); + background: var(--marking-color); + font-size: var(--ui-control-size); + font-weight: var(--ui-strong-weight); + letter-spacing: .05em; +} +.datahub-card-body { + display: grid; + gap: var(--legacy-space-1); + min-width: 0; +} +.datahub-card-body strong { + color: var(--heading); + font-size: var(--ui-body-size); + overflow: hidden; + text-overflow: ellipsis; +} +.datahub-card-body > span { + color: var(--muted); + font-size: var(--ui-control-size); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.datahub-card-body small { + color: var(--muted); + font-size: var(--ui-small-size); +} +.datahub-card-arrow { + color: var(--muted); + font-size: var(--ui-body-size); +} +.datahub-create { + display: grid; + grid-template-columns: 1fr 1fr auto; + align-items: end; + gap: var(--legacy-space-3); + padding: var(--legacy-space-5); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + background: var(--panel); +} +.datahub-create .datahub-section-heading { + grid-column: 1 / -1; +} +.datahub-create label { + display: grid; + gap: var(--legacy-space-2); + color: var(--heading); + font-size: var(--ui-control-size); + font-weight: var(--ui-label-weight); +} +.datahub-create label small { + color: var(--muted); + font-weight: 400; +} +.datahub-alert, +.datahub-empty, +.datahub-loading { + margin-top: var(--legacy-space-6); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + background: var(--panel); +} +.datahub-empty h3 { + margin: 0 0 var(--legacy-space-2); + color: var(--heading); +} +.datahub-empty p { + max-width: 650px; + color: var(--muted); + line-height: 1.5; +} +.datahub-alert { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--legacy-space-3); + padding: var(--legacy-space-3); + border-color: var(--danger); + color: var(--danger-text); + background: var(--danger-surface); +} +.datahub-empty { + padding: var(--space-7) var(--legacy-space-6); + text-align: center; +} +.datahub-empty p { + margin-inline: auto; +} +.datahub-loading { + display: flex; + justify-content: center; + gap: var(--legacy-space-3); + padding: var(--space-7); + color: var(--muted); +} +.datahub-loading i { + width: 14px; + height: 14px; + border: 2px solid var(--line-strong); + border-top-color: var(--marking-color); + border-radius: 50%; + animation: datahub-spin .8s linear infinite; +} +@keyframes datahub-spin { + to { + transform: rotate(360deg); + } +} +@media (max-width: 800px) { + .datahub-page { + padding: var(--panel-inset); + } + .datahub-hero { + align-items: flex-start; + flex-direction: column; + } + .datahub-create { + grid-template-columns: 1fr; + } + .datahub-create .datahub-section-heading { + grid-column: 1; + } +} +.btn.danger { + border: 1px solid var(--button-border); + border-radius: var(--btn-radius); + color: var(--button-text); + background: var(--button-bg); +} +.btn.danger:hover { + border-color: var(--button-border); + color: var(--sev-on); + background: var(--sev-critical); +} +.datahub-card { + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: space-between; + min-height: 132px; + padding: var(--legacy-space-4); +} +.datahub-card-main { + display: grid; + grid-template-columns: 40px minmax(0, 1fr); + align-items: center; + gap: var(--legacy-space-3); +} +.datahub-card-actions { + display: flex; + justify-content: flex-end; + gap: var(--legacy-space-2); + margin-top: var(--legacy-space-4); + padding-top: var(--legacy-space-3); + border-top: var(--border-hair) solid var(--line); +} +.datahub-card-actions .btn { + min-width: 60px; +} +.tenant-header { + display: grid; + grid-template-columns: 1fr auto; + gap: var(--legacy-space-6); + padding-bottom: var(--legacy-space-6); + border-bottom: var(--border-hair) solid var(--line); +} +.tenant-back { + grid-column: 1 / -1; + justify-self: start; + padding: 0; + border: 0; + color: var(--muted); + background: transparent; + font-size: var(--ui-control-size); + font-weight: var(--ui-label-weight); +} +.tenant-back:hover { + color: var(--heading); +} +.tenant-title { + display: flex; + align-items: center; + gap: var(--legacy-space-4); + min-width: 0; +} +.tenant-title .datahub-card-mark { + width: 46px; + height: 46px; + flex: 0 0 46px; +} +.tenant-title h2 { + margin: 0 0 var(--legacy-space-1); + color: var(--heading); + font-size: clamp(17px, 2vw, 22px); + line-height: 1.15; +} +.tenant-title p { + margin: 0; + color: var(--muted); +} +.tenant-actions { + display: flex; + align-items: center; + gap: var(--legacy-space-2); +} +.tenant-files { + margin-top: var(--legacy-space-6); +} +.tenant-file-table { + overflow: hidden; + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + background: var(--panel); +} +.tenant-file-row { + display: grid; + grid-template-columns: 150px minmax(145px, .9fr) minmax(150px, 1.2fr) 72px 85px 145px 78px; + align-items: center; + gap: var(--legacy-space-3); + min-height: 48px; + padding: var(--legacy-space-2) var(--legacy-space-3); + border-top: var(--border-hair) solid var(--line); + font-size: var(--ui-control-size); +} +.tenant-file-row:first-child { + border-top: 0; +} +.tenant-file-row:not(.tenant-file-head):hover { + background: var(--panel-hover); +} +.tenant-file-head { + min-height: var(--row-height); + color: var(--muted); + background: var(--panel-soft); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.tenant-file-row > span { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; +} +.tenant-file-row b { + display: block; + color: var(--heading); +} +.tenant-file-row small { + display: block; + margin-top: 2px; + color: var(--muted); +} +.tenant-file-possible-duplicate { + border-left: 0; +} +.tenant-duplicate-badge { + width: fit-content; + padding: 1px var(--legacy-space-1); + border: var(--border-hair) solid var(--warning); + border-radius: var(--legacy-radius-sm); + color: var(--warning) !important; + background: transparent; + font-size: var(--ui-small-size); + font-weight: var(--ui-label-weight); + letter-spacing: .03em; + text-transform: uppercase; +} +.tenant-scan-delete { + min-width: 64px; + padding-inline: 8px; +} +.datahub-dialog-form { + display: grid; + gap: 16px; +} +.datahub-dialog-form label { + display: grid; + gap: 7px; + color: var(--heading); + font-size: var(--ui-label-size); + font-weight: var(--fw-semibold); +} +.datahub-dialog-form label small { + color: var(--muted); + font-weight: 400; +} +.datahub-dialog-form textarea { + min-height: 100px; + resize: vertical; +} +.datahub-dialog-form footer, +.datahub-delete-warning footer { + display: flex; + justify-content: flex-end; + gap: 8px; + margin-top: 4px; + padding-top: 16px; + border-top: 1px solid var(--line); +} +.datahub-delete-warning { + display: grid; + gap: 10px; +} +.datahub-delete-warning > strong { + color: var(--heading); + font-size: var(--ui-heading-size); +} +.datahub-delete-warning p { + color: var(--muted); + line-height: 1.6; +} +@media (max-width: 1050px) { + .tenant-file-head { + display: none; + } + .tenant-file-row { + grid-template-columns: 1fr 1fr; + gap: 8px 18px; + padding: 16px; + } + .tenant-file-row > span::before { + content: attr(data-label); + display: block; + margin-bottom: 3px; + color: var(--muted); + font-size: var(--ui-label-size); + font-weight: var(--fw-semibold); + letter-spacing: var(--ls-caps); + text-transform: uppercase; + } +} +@media (max-width: 800px) { + .tenant-header { + grid-template-columns: 1fr; + } + .tenant-actions { + flex-wrap: wrap; + } + .tenant-file-row { + grid-template-columns: 1fr; + } + .datahub-card-actions { + flex-wrap: wrap; + } +} +.datahub-card.active { + border-color: var(--tile-selected-border); + outline: var(--bw-emphasis) solid var(--tile-selected-border); + outline-offset: calc(-1 * var(--bw-emphasis)); + background: var(--tile-surface-hover); +} +.tenant-editor-header { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: end; + gap: var(--legacy-space-5); + padding-bottom: var(--legacy-space-6); + border-bottom: var(--border-hair) solid var(--line); +} +.tenant-editor-header .tenant-back { + grid-column: 1 / -1; +} +.tenant-editor-header h2 { + margin: var(--legacy-space-1) 0; + color: var(--heading); + font-size: clamp(17px, 2vw, 22px); + line-height: 1.15; + letter-spacing: -.01em; +} +.tenant-editor-header p { + max-width: 680px; + margin: 0; + color: var(--muted); + line-height: 1.5; +} +.tenant-editor { + margin-top: var(--legacy-space-6); + padding: var(--legacy-space-5); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + background: var(--panel); +} +.tenant-editor-form { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: var(--legacy-space-4); +} +.tenant-editor-form label { + display: grid; + grid-template-columns: auto 1fr; + gap: var(--legacy-space-2); + color: var(--heading); + font-size: var(--ui-control-size); + font-weight: var(--ui-label-weight); +} +.tenant-editor-form label > span { + justify-self: end; + color: var(--muted); + font-size: var(--ui-small-size); + font-weight: var(--fw-semibold); +} +.tenant-editor-form .input { + grid-column: 1 / -1; +} +.tenant-editor-description { + grid-column: 1 / -1; +} +.tenant-editor-description textarea { + min-height: 118px; + resize: vertical; +} +.tenant-editor-form footer { + display: flex; + grid-column: 1 / -1; + justify-content: flex-end; + gap: var(--legacy-space-2); + padding-top: var(--legacy-space-4); + border-top: var(--border-hair) solid var(--line); +} +.tenant-import-pending { + margin-top: var(--legacy-space-5); + padding: var(--legacy-space-5); + border: var(--border-hair) dashed var(--line-strong); + border-radius: var(--legacy-radius-sm); + background: var(--panel); +} +.tenant-import-pending > span { + color: var(--muted); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.tenant-import-pending h3 { + margin: 6px 0; + color: var(--heading); +} +.tenant-import-pending p { + margin: 0; + color: var(--muted); + line-height: 1.55; +} +.tenant-files-empty { + padding-block: 36px; +} +@media (max-width: 800px) { + .tenant-editor-header { + grid-template-columns: 1fr; + align-items: start; + } + .tenant-editor-form { + grid-template-columns: 1fr; + } + .tenant-editor-description, + .tenant-editor-form footer { + grid-column: 1; + } +} +.viewer.app-area-data-hub, +.viewer.app-area-dashboard, +.viewer.app-area-db-structure { + overflow-x: hidden; + overflow-y: auto; + background: var(--surface-app); + scrollbar-color: var(--line-strong) var(--surface-app); + scrollbar-width: thin; +} +.viewer.app-area-data-hub { + scrollbar-gutter: stable; +} +.datahub-page { + box-sizing: border-box; + min-height: 100%; + background: var(--surface-app); +} +.datahub-card { + border-radius: var(--tile-radius); + box-shadow: var(--tile-card-shadow); +} +.tenant-editor, +.tenant-file-table, +.tenant-import-pending { + border-radius: var(--legacy-radius-sm); + box-shadow: var(--shadow); +} +.tenant-editor-header { + align-items: center; +} +.tenant-editor-header h2 { + font-weight: var(--ui-strong-weight); + letter-spacing: -.01em; +} +.tenant-editor { + padding: var(--legacy-space-5); +} +.tenant-file-table { + overflow-x: auto; + overflow-y: visible; +} +.tenant-file-row { + min-width: 860px; + min-height: 54px; +} +.tenant-save-feedback { + display: flex; + align-items: center; + gap: var(--legacy-space-3); + margin-top: var(--legacy-space-3); + padding: var(--legacy-space-2) var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + border-left-width: 3px; + border-radius: var(--legacy-radius-sm); + background: var(--panel); + font-size: var(--ui-body-size); +} +.tenant-save-feedback > span { + display: grid; + place-items: center; + width: 18px; + height: 18px; + color: var(--sev-on); + border-radius: 50%; + font-weight: var(--ui-strong-weight); +} +.tenant-save-feedback.success { + border-left-color: var(--success); + color: var(--heading); +} +.tenant-save-feedback.success > span { + background: var(--success); +} +.tenant-save-feedback.error { + border-left-color: var(--danger); + color: var(--heading); +} +.tenant-save-feedback.error > span { + background: var(--danger); +} +@media (max-width: 1050px) { + .tenant-file-row { + min-width: 0; + } +} +.tenant-actions { + flex-wrap: wrap; +} +.gpo-folder-import { + display: contents; +} +.gpo-folder-actions { + position: relative; + display: flex; + align-items: center; + gap: 8px; +} +.gpo-folder-feedback { + position: absolute; + z-index: 5; + top: calc(100% + var(--legacy-space-2)); + right: 0; + width: min(420px, 75vw); + padding: var(--legacy-space-2) var(--legacy-space-3); + border: var(--border-hair) solid var(--line-strong); + border-left-width: 3px; + border-radius: var(--legacy-radius-sm); + color: var(--heading); + background: var(--panel-raised); + font-size: var(--ui-control-size); + line-height: 1.45; + box-shadow: var(--shadow); +} +.gpo-folder-feedback.success { + border-left-color: var(--success); +} +.gpo-folder-feedback.error { + border-left-color: var(--danger); +} +.gpo-status-panel { + order: 10; + flex: 1 0 100%; + min-width: 0; + margin-top: var(--legacy-space-3); + padding: var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + background: var(--panel); +} +.gpo-status-heading { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--legacy-space-3); + margin-bottom: var(--legacy-space-2); + color: var(--heading); +} +.gpo-status-empty { + margin: 0; + color: var(--muted); + font-size: var(--ui-body-size); +} +.gpo-status-list { + display: grid; + gap: var(--legacy-space-2); +} +.gpo-status-item { + display: grid; + grid-template-columns: minmax(220px, 1fr) minmax(260px, auto); + gap: var(--legacy-space-4); + padding: var(--legacy-space-2) var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + border-left: 3px solid var(--state-progress); + background: var(--panel-raised); +} +.gpo-status-item > div { + display: grid; + gap: var(--legacy-space-1); + min-width: 0; +} +.gpo-status-item strong { + color: var(--heading); + overflow-wrap: anywhere; +} +.gpo-status-item span { + color: var(--muted); + font-size: var(--ui-control-size); +} +.gpo-status-result { + justify-items: end; + text-align: right; +} +.gpo-status-item.state-succeeded { + border-left-color: var(--success); +} +.gpo-status-item.state-partial, +.gpo-status-item.state-recovery-required, +.gpo-status-item.state-upload-required, +.gpo-status-item.state-storage-unavailable { + border-left-color: var(--warning); +} +.gpo-status-item.state-dead-letter { + border-left-color: var(--danger); +} +.gpo-status-item code { + color: var(--danger-text); + font-size: var(--ui-control-size); +} +.gpo-status-actions { + display: flex; + justify-content: flex-end; + gap: var(--legacy-space-2); + margin-top: var(--legacy-space-1); +} +@media (max-width: 760px) { + .gpo-status-item { + grid-template-columns: 1fr; + } + .gpo-status-result { + justify-items: start; + text-align: left; + } +} +.gpo-status-error { + color: var(--warning); + display: flex; + flex-wrap: wrap; + gap: 0.35rem; + justify-content: flex-end; +} +.gpo-status-error code { + color: inherit; +} +.db-structure-page > *, +.results-browser-page > * { + width: 100% !important; + max-width: none !important; + margin-inline: 0 !important; +} +.dashboard-page { + box-sizing: border-box; + display: grid; + align-content: start; + gap: var(--space-4); + width: 100%; + min-height: 100%; + padding: var(--panel-inset); + color: var(--text); + background: var(--surface-app); + container-type: inline-size; +} +.dashboard-page.panel-is-loading { + grid-template-rows: auto minmax(0, 1fr); + align-content: stretch; +} +.dashboard-page.panel-is-loading .panel-loading-state { + min-height: 0; +} +.dashboard-context { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: var(--space-2) var(--space-5); + margin: 0; + padding: 0 var(--space-2); + color: var(--muted); + font-size: var(--ui-label-size); +} +.dashboard-context strong { + color: var(--heading); + font-size: var(--ui-body-size); +} +.dashboard-context .work-timeslot-select { + margin-left: auto; +} +.dashboard-status-rack { + display: grid; + grid-template-columns: 290px repeat(3, 210px) 250px; + justify-content: start; + gap: var(--segment-gap); + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.dashboard-status-metric { + display: grid; + grid-template-columns: 98px minmax(0, 1fr); + align-items: center; + gap: var(--space-3); + min-width: 0; + min-height: 190px; + padding: var(--space-3); + overflow: hidden; + border: var(--border-hair) solid var(--tile-border); + border-radius: var(--tile-radius); + color: var(--text); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); + text-align: left; +} +button.dashboard-status-metric { + cursor: pointer; +} +button.dashboard-status-metric:hover { + border-color: transparent; + background: var(--tile-surface-hover); +} +button.dashboard-status-metric:focus-visible { + outline: var(--border-hair) solid var(--focus-ring); + outline-offset: -1px; +} +button.dashboard-status-metric[aria-pressed=true] { + border-color: var(--tile-selected-border); + outline: var(--bw-emphasis) solid var(--tile-selected-border); + outline-offset: calc(-1 * var(--bw-emphasis)); +} +.dashboard-status-metric-large { + grid-template-columns: 154px minmax(0, 1fr); +} +.dashboard-status-ring { + position: relative; + width: 98px; + height: 98px; + color: var(--donut-all); +} +.dashboard-status-metric-large .dashboard-status-ring { + width: 154px; + height: 154px; +} +.dashboard-status-ring svg { + display: block; + width: 100%; + height: 100%; + transform: rotate(-90deg); +} +.dashboard-status-ring circle { + fill: none; + stroke-width: var(--donut-ring-stroke); +} +.dashboard-status-ring-track { + stroke: var(--donut-track); +} +.dashboard-status-ring-progress { + stroke: currentColor; +} +.dashboard-status-ring > span { + position: absolute; + inset: 0; + display: flex; + align-items: flex-start; + justify-content: center; + padding-top: 36px; + color: var(--heading); + font-variant-numeric: tabular-nums; +} +.dashboard-status-metric-large .dashboard-status-ring > span { + padding-top: 57px; +} +.dashboard-donut-primary { + position: relative; + display: block; + line-height: 1; +} +.dashboard-status-ring > span strong { + display: block; + font: var(--fw-semibold) var(--donut-value-size) / 1 var(--font-donut-display); +} +.dashboard-status-metric-large .dashboard-status-ring > span strong { + font-size: calc(var(--donut-value-size) * 1.45); +} +.dashboard-status-ring > span small { + position: absolute; + left: calc(100% + var(--space-1)); + bottom: 0; + color: var(--heading); + font-size: var(--donut-percent-size); + font-weight: var(--fw-semibold); +} +.dashboard-status-ring .dashboard-donut-primary.is-compact strong, +.dashboard-risk-donut .dashboard-donut-primary.is-compact strong { + font-size: calc(var(--donut-value-size) * .85); +} +.dashboard-status-ring .dashboard-donut-primary.is-compact small, +.dashboard-risk-donut .dashboard-donut-primary.is-compact small { + font-size: var(--type-meta-size); +} +.dashboard-status-ring-deviation { + color: var(--donut-error); +} +.dashboard-status-ring-passed { + color: var(--donut-passed); +} +.dashboard-status-ring-not-run { + color: var(--donut-deviation); +} +.dashboard-status-copy { + display: grid; + gap: var(--space-3); + min-width: 0; + max-width: 100%; + overflow: hidden; +} +.dashboard-status-copy > span { + min-width: 0; + color: var(--heading); + font-size: var(--ui-body-size); + overflow-wrap: normal; + word-break: normal; + hyphens: manual; +} +.dashboard-status-copy > strong { + display: grid; + gap: var(--space-1); + min-width: 0; + color: var(--heading); + font-size: calc(var(--ui-heading-size) * 1.35); + font-variant-numeric: tabular-nums; + white-space: normal; +} +.dashboard-status-copy > small { + display: block; + color: var(--muted); + font-size: var(--ui-body-size); + font-weight: var(--fw-regular); + line-height: 1.35; + overflow-wrap: normal; + word-break: normal; + hyphens: manual; +} +.dashboard-status-summary { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(100px, .8fr); + align-items: stretch; + min-width: 0; + min-height: 190px; + padding: var(--space-4); + overflow: hidden; + border: var(--border-hair) solid var(--tile-border); + border-radius: var(--tile-radius); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); +} +.dashboard-status-summary-stack { + display: grid; + align-content: center; + padding-right: var(--space-4); + border-right: var(--border-hair) solid var(--line-strong); +} +.dashboard-status-summary-stack button { + display: grid; + gap: var(--space-2); + min-height: 64px; + padding: var(--space-2); + border: 0; + border-radius: 0; + color: var(--text); + background: transparent; + text-align: left; + cursor: pointer; +} +.dashboard-status-summary-stack button + button { + border-top: var(--border-hair) solid var(--line); +} +.dashboard-status-summary-stack button:hover { + background: var(--panel-hover); +} +.dashboard-status-summary-stack button:focus-visible { + outline: var(--border-hair) solid var(--focus-ring); + outline-offset: -1px; +} +.dashboard-status-summary-stack span, +.dashboard-ioe-summary span { + color: var(--heading); + font-size: var(--ui-body-size); +} +.dashboard-status-summary-stack strong { + color: var(--heading); + font-size: var(--ui-body-size); + font-variant-numeric: tabular-nums; +} +.dashboard-ioe-summary { + display: grid; + align-content: center; + gap: var(--space-4); + min-width: 0; + padding: 0 0 0 var(--space-5); + border: 0; + color: inherit; + background: transparent; + text-align: left; + cursor: pointer; +} +.dashboard-ioe-summary:focus-visible { + outline: var(--border-hair) solid var(--focus-ring); + outline-offset: -1px; +} +.dashboard-ioe-summary:disabled { + cursor: default; +} +.dashboard-ioe-summary strong { + color: var(--chart-tone-emphasis); + font: var(--fw-semibold) calc(var(--donut-value-size) * 1.45) / 1 var(--font-donut-display); + font-variant-numeric: tabular-nums; +} +.dashboard-distribution-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--segment-gap); + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.dashboard-lower-grid { + display: grid; + grid-template-columns: minmax(0, 1.15fr) minmax(420px, 1fr); + align-items: stretch; + gap: var(--segment-gap); + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.dashboard-environment { + min-width: 0; + margin: 0; + padding: var(--space-4); + overflow: hidden; + border: var(--border-hair) solid var(--tile-border); + border-radius: var(--tile-radius); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); +} +.dashboard-environment .datahub-section-heading h2, +.dashboard-block h2 { + margin: 0; + color: var(--heading); + font-size: var(--ui-body-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.dashboard-coverage-summary { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin-bottom: var(--space-4); + padding-bottom: var(--space-4); + border-bottom: var(--border-hair) solid var(--line); +} +.dashboard-coverage-summary > span { + display: grid; + gap: var(--space-1); + min-width: 0; + padding: 0 var(--space-3); + text-align: center; +} +.dashboard-coverage-summary > span + span { + border-left: var(--border-hair) solid var(--line-strong); +} +.dashboard-coverage-summary strong { + color: var(--heading); + font-size: var(--ui-heading-size); + font-variant-numeric: tabular-nums; +} +.dashboard-coverage-summary small { + color: var(--muted); + font-size: var(--ui-label-size); +} +.dashboard-facts { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: var(--space-3) var(--space-5); + margin: 0; +} +.dashboard-facts div { + min-width: 0; +} +.dashboard-facts dt { + margin-bottom: var(--legacy-space-1); + color: var(--muted); + font-size: var(--ui-label-size); +} +.dashboard-facts dd { + margin: 0; + color: var(--heading); + font-size: var(--ui-body-size); + overflow-wrap: anywhere; +} +.dashboard-block { + min-width: 0; + padding: var(--space-4); + overflow: hidden; + border: var(--border-hair) solid var(--tile-border); + border-radius: var(--tile-radius); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); +} +.dashboard-distribution { + display: grid; + align-content: start; + gap: var(--space-4); +} +.dashboard-segmented-bar { + display: flex; + width: 100%; + height: 28px; + overflow: hidden; + border-radius: var(--tile-radius); + background: var(--surface-active); +} +.dashboard-segment { + --share: 0%; + flex: 0 0 var(--share); + min-width: 2px; + height: 100%; + background: var(--severity, var(--viz-1)); +} +.dashboard-segment + .dashboard-segment { + border-left: var(--border-hair) solid var(--surface-panel); +} +.dashboard-distribution-legend { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + gap: var(--space-2); + margin: 0; + padding: 0; + list-style: none; +} +.dashboard-legend-button { + display: flex; + align-items: flex-start; + gap: var(--space-2); + width: 100%; + min-height: 52px; + padding: var(--space-2); + border: var(--border-hair) solid transparent; + border-radius: var(--btn-radius); + color: var(--text); + background: transparent; + text-align: left; + cursor: pointer; +} +.dashboard-legend-button:hover { + border-color: var(--line); + background: var(--panel-hover); +} +.dashboard-legend-button:focus-visible { + outline: var(--border-hair) solid var(--focus-ring); + outline-offset: -1px; +} +.dashboard-legend-swatch { + flex: 0 0 10px; + width: 10px; + height: 10px; + margin-top: 3px; + background: var(--severity, var(--viz-1)); +} +.dashboard-legend-copy { + display: grid; + gap: var(--space-1); + min-width: 0; + color: var(--muted); + font-size: var(--ui-control-size); +} +.dashboard-legend-copy > span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dashboard-legend-copy strong { + color: var(--heading); + font-size: var(--ui-body-size); + font-variant-numeric: tabular-nums; +} +.dashboard-legend-copy small { + color: var(--muted); + font-size: var(--ui-control-size); + font-weight: var(--fw-regular); +} +.dashboard-viz-1 { + --severity: var(--viz-1); +} +.dashboard-viz-2 { + --severity: var(--viz-2); +} +.dashboard-viz-3 { + --severity: var(--viz-3); +} +.dashboard-viz-4 { + --severity: var(--viz-4); +} +.dashboard-viz-5 { + --severity: var(--viz-5); +} +.dashboard-viz-6 { + --severity: var(--viz-6); +} +.severity-dashboard-cis-cat-without-severity { + --severity: var(--donut-not-run); +} +.dashboard-empty { + margin: 0; + color: var(--muted); + font-size: var(--ui-control-size); +} +.dashboard-risk-profile { + display: grid; + align-content: start; +} +.dashboard-risk-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-4); + min-height: 32px; +} +.dashboard-risk-tool { + min-height: 30px; + max-width: min(100%, 320px); + padding: var(--space-1) var(--space-2); + border: var(--border-hair) solid transparent; + border-radius: 0; + color: var(--heading); + background-color: transparent; + font-size: var(--ui-body-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; + cursor: pointer; +} +.dashboard-risk-tool:hover { + border-color: var(--line-strong); + background-color: var(--panel-hover); +} +.dashboard-risk-tool:focus-visible { + border-color: var(--focus-ring); + outline: var(--border-hair) solid var(--focus-ring); + outline-offset: -1px; +} +.dashboard-risk-tool option { + color: var(--text); + background-color: var(--surface-input); + text-transform: none; +} +.dashboard-marked-summary { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-5); + min-width: 240px; + padding: var(--space-2) var(--space-3); + border: var(--border-hair) solid var(--line); + color: var(--muted); + font-size: var(--ui-label-size); +} +.dashboard-marked-summary strong { + color: var(--heading); + font-size: var(--ui-body-size); + font-variant-numeric: tabular-nums; +} +.dashboard-risk-body { + display: grid; + grid-template-columns: minmax(180px, .8fr) minmax(280px, 1.2fr); + min-height: 190px; + margin-top: var(--space-4); +} +.dashboard-risk-categories, +.dashboard-risk-legend { + margin: 0; + padding: 0; + list-style: none; +} +.dashboard-risk-categories { + display: grid; + align-content: center; + padding-right: var(--space-5); + border-right: var(--border-hair) solid var(--line-strong); +} +.dashboard-risk-categories li + li { + border-top: var(--border-hair) solid var(--line); +} +.dashboard-risk-categories button, +.dashboard-risk-legend button { + display: grid; + align-items: center; + width: 100%; + min-height: 42px; + padding: var(--space-2); + border: 0; + border-radius: 0; + color: var(--text); + background: transparent; + text-align: left; + cursor: pointer; +} +.dashboard-risk-categories button { + grid-template-columns: minmax(0, 1fr) auto; + gap: var(--space-3); +} +.dashboard-risk-categories button:hover, +.dashboard-risk-legend button:hover { + background: var(--panel-hover); +} +.dashboard-risk-categories button:focus-visible, +.dashboard-risk-legend button:focus-visible { + outline: var(--border-hair) solid var(--focus-ring); + outline-offset: -1px; +} +.dashboard-risk-categories span, +.dashboard-risk-legend span { + min-width: 0; + overflow: hidden; + font-size: var(--ui-body-size); + text-overflow: ellipsis; + white-space: nowrap; +} +.dashboard-risk-categories strong, +.dashboard-risk-legend strong { + color: var(--heading); + font-size: var(--ui-body-size); + font-variant-numeric: tabular-nums; +} +.dashboard-risk-severity { + display: flex; + align-items: center; + justify-content: center; + gap: var(--space-5); + min-width: 0; + padding-left: var(--space-5); +} +.dashboard-risk-donut { + position: relative; + flex: 0 0 150px; + width: 150px; + height: 150px; + overflow: visible; +} +.dashboard-risk-donut svg { + display: block; + width: 100%; + height: 100%; + overflow: visible; + transform: rotate(-90deg); +} +.dashboard-risk-donut circle { + fill: none; + stroke-width: var(--donut-ring-stroke); +} +.dashboard-risk-donut-track { + stroke: var(--donut-track); +} +.dashboard-risk-donut-segment { + stroke: var(--severity, var(--info)); +} +.dashboard-risk-donut > span { + position: absolute; + inset: 0; + display: flex; + align-items: flex-start; + justify-content: center; + padding-top: 57px; + color: var(--heading); + font-variant-numeric: tabular-nums; +} +.dashboard-risk-donut > span strong { + display: block; + font: var(--fw-semibold) calc(var(--donut-value-size) * 1.45) / 1 var(--font-donut-display); +} +.dashboard-risk-donut > span small { + position: absolute; + left: calc(100% + var(--space-1)); + bottom: 0; + font-size: var(--donut-percent-size); + font-weight: var(--fw-semibold); +} +.dashboard-risk-legend { + flex: 1 1 auto; + min-width: 120px; +} +.dashboard-risk-legend button { + grid-template-columns: 12px minmax(0, 1fr) auto; + gap: var(--space-3); +} +.dashboard-risk-legend i { + width: 12px; + height: 12px; + background: var(--severity, var(--info)); +} +@media (max-width: 1400px) { + .dashboard-status-rack { + grid-template-columns: repeat(2, minmax(0, 290px)); + } + .dashboard-status-summary { + grid-column: 1 / -1; + } + .dashboard-distribution-grid, + .dashboard-lower-grid { + grid-template-columns: 1fr; + } +} +@media (max-width: 760px) { + .dashboard-status-rack { + grid-template-columns: minmax(0, 290px); + } + .dashboard-status-summary { + grid-column: auto; + } + .dashboard-coverage-summary, + .dashboard-facts { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .dashboard-risk-body { + grid-template-columns: 1fr; + } + .dashboard-risk-categories { + padding-right: 0; + padding-bottom: var(--space-4); + border-right: 0; + border-bottom: var(--border-hair) solid var(--line-strong); + } + .dashboard-risk-severity { + padding: var(--space-4) 0 0; + } +} +.client-info-tile-grid { + display: grid; + gap: var(--segment-gap); +} +.client-info-metric-grid { + display: grid; + grid-template-columns: repeat(6, minmax(0, 1fr)); + gap: var(--segment-gap); +} +.client-info-top-row { + display: grid; + grid-template-columns: minmax(0, 3fr) minmax(320px, 1fr); + align-items: stretch; + gap: var(--segment-gap); + min-width: 0; +} +.client-info-metric { + display: grid; + align-content: space-between; + align-self: start; + gap: var(--space-2); + width: 100%; + min-width: 0; + aspect-ratio: 1; + min-height: 0; + padding: var(--space-3); + border: 0; + border-radius: var(--radius-sm); + color: var(--text); + background: var(--tile-surface); + box-shadow: none; + text-align: left; +} +button.client-info-metric { + cursor: pointer; +} +button.client-info-metric:hover { + border-color: transparent; + background: var(--tile-surface-hover); +} +button.client-info-metric:focus-visible { + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: calc(-1 * var(--bw-emphasis)); +} +button.client-info-metric[aria-pressed=true] { + border-color: var(--tile-selected-border); + outline: var(--bw-emphasis) solid var(--tile-selected-border); + outline-offset: calc(-1 * var(--bw-emphasis)); +} +.client-info-metric > span { + color: var(--heading); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + line-height: 1.25; +} +.client-info-top-row > .client-info-metric-grid .client-info-metric { + align-self: stretch; + height: 100%; + min-height: 220px; + aspect-ratio: auto; +} +.client-info-metric > strong { + color: var(--chart-color, var(--heading)); + font-size: calc(var(--type-h1-size) * .84); + font-weight: var(--fw-regular); + line-height: 1; + font-variant-numeric: tabular-nums; +} +.client-info-metric.is-emphasis > strong { + font-size: var(--type-h1-size); + font-weight: var(--fw-semibold); +} +.client-info-card-column { + display: flex; + flex-direction: column; + align-self: start; + gap: var(--segment-gap); + min-width: 0; +} +.client-info-panels-layout { + display: grid; + grid-template-columns: minmax(0, 3fr) minmax(320px, 1fr); + align-items: start; + gap: var(--segment-gap); + min-width: 0; +} +.client-info-donut-rail { + display: grid; + align-content: start; + gap: var(--segment-gap); + min-width: 0; +} +.client-info-card { + display: flex; + flex-direction: column; + gap: 0; + min-width: 0; + min-height: min-content; + align-self: stretch; + padding: 0; + border: 0; + border-radius: var(--radius-sm); + color: var(--text); + background: var(--tile-surface); + box-shadow: none; +} +.client-info-card.is-collapsed { + align-self: start; + width: 100%; +} +.client-info-card > header { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-5); + min-height: 60px; + padding: var(--space-3) var(--space-5); + border-bottom: var(--border-hair) solid var(--line); + cursor: pointer; +} +.client-info-card > header:hover { + background: var(--tile-surface-hover); +} +.client-info-card.is-collapsed > header { + flex: 1 1 auto; + border-bottom: 0; +} +.client-info-card-heading { + display: flex; + align-items: baseline; + flex-wrap: wrap; + gap: var(--space-2); + min-width: 0; +} +.client-info-card-heading h2 { + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + line-height: 1.35; +} +.client-info-card-heading > span { + color: var(--muted); + font-size: var(--type-h4-size); + font-variant-numeric: tabular-nums; + line-height: 1.35; +} +.client-info-card-heading .client-info-card-meta { + font-size: var(--type-meta-size); +} +.client-info-card-toggle { + flex: 0 0 auto; + display: grid; + place-items: center; + width: 36px; + height: 36px; + padding: 0; + border: 0; + border-radius: 0; + color: var(--heading); + background: transparent; + cursor: pointer; +} +.client-info-card-toggle .triangle-icon { + width: 16px; + height: 16px; +} +.client-info-card-toggle:hover { + border-color: var(--line-strong); +} +.client-info-card-toggle:focus-visible { + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: 1px; +} +.client-info-card-content { + display: grid; + align-content: start; + min-width: 0; +} +.client-info-card-details { + display: grid; + align-content: start; + gap: 0; + min-width: 0; + padding: 0 var(--space-5) var(--space-3); +} +.client-info-card-extra { + display: grid; + align-content: start; + min-width: 0; + padding: 0 var(--space-5) var(--space-4); + border-top: var(--border-hair) solid var(--line); +} +.client-env-groups { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--tile-content-width)), 1fr)); + align-items: start; + gap: var(--segment-gap); + min-width: 0; + margin-block: var(--space-4) var(--space-5); +} +.client-env-group { + min-width: 0; +} +.client-env-group-title { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: var(--space-3); + margin: 0 0 var(--space-2); + color: var(--client-info-muted); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + line-height: 1.35; +} +.client-env-group-title > span:first-child { + order: 0; + flex: 0 0 auto; + color: var(--client-info-text); +} +.client-env-group-title::after { + content: ""; + order: 1; + flex: 1 1 auto; + height: var(--border-hair); + background: var(--client-info-line); +} +.client-env-group-note { + order: 2; + flex: 0 0 auto; + font-weight: var(--fw-regular); +} +.client-env-group-toggle { + order: 3; + flex: 0 0 auto; + display: grid; + place-items: center; + width: var(--control-h); + height: var(--control-h); + padding: 0; + border: 0; + border-radius: 0; + color: var(--client-info-text); + background: transparent; + cursor: pointer; +} +.client-env-group-toggle .triangle-icon { + width: var(--space-3); + height: var(--space-3); +} +.client-env-group-toggle:focus-visible { + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: 1px; +} +.client-env-facts { + display: grid; + grid-template-columns: 1fr; + align-content: start; + min-width: 0; + margin: 0; +} +.client-env-facts > div { + display: grid; + align-content: center; + gap: 0; + min-width: 0; + min-height: calc(var(--row-h) + var(--space-3)); + padding: var(--space-1) 0; + border-bottom: var(--border-hair) solid var(--client-info-line); +} +.client-env-facts dt { + color: var(--client-info-muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + line-height: 1.35; + overflow-wrap: break-word; +} +.client-env-facts dd { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-table-body-size); + font-variant-numeric: tabular-nums; + line-height: 1.35; + overflow-wrap: break-word; +} +.client-command-center .client-gpo-readiness { + grid-column: 1 / -1; + min-width: 0; + margin-block: var(--space-3); +} +.client-command-center .client-gpo-readiness p { + font-size: var(--type-body-size); +} +.client-command-center .client-os-inventory { + min-width: 0; +} +.client-command-center .client-os-inventory > header { + display: flex; + align-items: baseline; + flex-wrap: wrap; + gap: var(--space-3); + margin-bottom: var(--space-2); +} +.client-command-center .client-os-inventory > header h3 { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + line-height: 1.35; +} +.client-command-center .client-os-inventory header p { + margin: 0; + font-size: var(--type-meta-size); + color: var(--client-info-muted); +} +.client-command-center .client-os-groups { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr)); + align-items: start; + gap: var(--space-5); +} +.client-command-center .client-os-group { + min-width: 0; +} +.client-command-center .client-os-group h4 { + display: flex; + align-items: baseline; + justify-content: space-between; + flex-wrap: wrap; + gap: var(--space-3); + margin: 0 0 var(--space-1); + color: var(--client-info-text); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + line-height: 1.35; +} +.client-command-center .client-os-group h4 > span:last-child { + font-variant-numeric: tabular-nums; +} +.client-command-center .client-os-group table { + width: 100%; + border-collapse: collapse; + table-layout: auto; +} +.client-command-center .client-os-group th { + padding: var(--space-1) 0; + color: var(--client-info-muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + text-align: left; +} +.client-command-center .client-os-group th:last-child { + width: 1%; + white-space: nowrap; + text-align: right; +} +.client-command-center .client-os-group td { + height: var(--row-h); + padding: var(--space-1) 0; + border-bottom: var(--border-hair) solid var(--client-info-line); + font-size: var(--type-table-body-size); + white-space: normal; + word-break: normal; + overflow-wrap: break-word; +} +.client-command-center .client-os-group td:last-child { + padding-inline-start: var(--space-2); + white-space: nowrap; + text-align: right; + font-variant-numeric: tabular-nums; +} +.client-command-center .client-os-group .client-os-source { + width: 1%; + padding-inline-start: var(--space-3); + color: var(--client-info-muted); + font-size: var(--type-meta-size); + white-space: nowrap; +} +.client-command-center .client-os-empty { + color: var(--client-info-muted); + font-size: var(--type-body-size); +} +.client-info-bars { + display: grid; + align-content: start; + gap: 0; + margin: 0; + padding: 0; + list-style: none; +} +.client-info-bars li { + min-width: 0; + border-bottom: var(--border-hair) solid var(--line); +} +.client-info-bars li:last-child { + border-bottom: 0; +} +.client-info-bar-row { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(48px, auto) minmax(120px, 1.15fr); + grid-template-rows: auto auto; + align-items: center; + column-gap: var(--space-4); + row-gap: var(--space-1); + width: 100%; + min-height: 64px; + padding: var(--space-2) 0; + border: 0; + border-radius: 0; + color: inherit; + background: transparent; + text-align: left; +} +button.client-info-bar-row { + cursor: pointer; +} +button.client-info-bar-row:hover { + background: var(--tile-surface-hover); +} +button.client-info-bar-row:focus-visible { + outline: var(--border-hair) solid var(--focus-ring); + outline-offset: -1px; +} +.client-info-bar-label { + grid-column: 1; + grid-row: 1 / -1; + align-self: center; + color: var(--text); + font-size: var(--type-body-size); + line-height: 1.4; + overflow-wrap: normal; + word-break: normal; +} +.client-info-bar-track { + grid-column: 3; + grid-row: 1 / -1; + width: 100%; + height: 30px; + background: var(--surface-active); +} +.client-info-bar-track i { + --share: 0%; + display: block; + width: var(--share); + min-width: 2px; + height: 100%; + background: var(--chart-color, var(--chart-tone-emphasis)); +} +.client-info-bars strong { + grid-column: 2; + grid-row: 1; + display: flex; + align-items: baseline; + justify-content: flex-end; + gap: var(--space-1); + min-width: 0; + color: var(--heading); + font-size: var(--type-body-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; + text-align: right; + white-space: nowrap; +} +.client-info-bars .client-info-bar-detail { + color: var(--heading); + font-size: var(--type-meta-size); + font-weight: var(--fw-semibold); +} +.client-info-bars .client-info-bar-status { + grid-column: 2; + grid-row: 2; + min-height: 12px; + color: var(--warning); + font-size: var(--type-meta-size); + line-height: 1; + text-align: right; +} +.client-info-bars .client-info-bar-status.is-empty { + visibility: hidden; +} +.client-info-card-caption { + margin: 0; + padding: var(--space-4) 0 0; + border-top: var(--border-hair) solid var(--line); + color: var(--muted); + font-size: var(--type-meta-size); +} +.client-info-card-extra .client-info-card-caption { + border-top: 0; +} +.client-info-donut-card .client-info-card-details { + padding: var(--space-5); +} +.client-info-donut-layout { + display: grid; + grid-template-columns: minmax(130px, .9fr) minmax(145px, 1.1fr); + align-items: center; + gap: var(--space-4); + min-width: 0; +} +.client-info-donut { + position: relative; + width: min(172px, 100%); + aspect-ratio: 1; + justify-self: center; +} +.client-info-donut svg { + display: block; + width: 100%; + height: 100%; + overflow: visible; + transform: rotate(-90deg); +} +.client-info-donut circle { + fill: none; + stroke-width: var(--donut-ring-stroke); +} +.client-info-donut-track { + stroke: var(--donut-track); +} +.client-info-donut-segment { + stroke: var(--chart-color, var(--info)); +} +.client-info-donut > span { + position: absolute; + inset: 0; + display: grid; + place-content: center; + justify-items: center; + color: var(--heading); + text-align: center; +} +.client-info-donut > span strong { + font-size: calc(var(--type-h2-size) * 1.08); + font-weight: var(--fw-regular); + line-height: 1; + font-variant-numeric: tabular-nums; +} +.client-info-donut > span small { + margin-top: var(--space-1); + color: var(--muted); + font-size: var(--type-meta-size); +} +.client-info-legend { + display: grid; + align-content: center; + gap: var(--space-1); + margin: 0; + padding: 0; + list-style: none; +} +.client-info-legend button, +.client-info-legend-row { + display: grid; + grid-template-columns: 11px minmax(0, 1fr) auto; + align-items: center; + gap: var(--space-2); + width: 100%; + min-height: 36px; + padding: var(--space-1) var(--space-2); + border: 0; + border-radius: 0; + color: var(--text); + background: transparent; + text-align: left; +} +.client-info-legend button { + cursor: pointer; +} +.client-info-legend button:hover { + background: var(--tile-surface-hover); +} +.client-info-legend button:focus-visible { + outline: var(--border-hair) solid var(--focus-ring); + outline-offset: -1px; +} +.client-info-legend i { + width: 11px; + height: 11px; + background: var(--chart-color, var(--muted)); +} +.client-info-legend span { + min-width: 0; + font-size: var(--type-table-body-size); + line-height: 1.25; + overflow-wrap: normal; + word-break: normal; +} +.client-info-legend strong { + color: var(--heading); + font-size: var(--type-table-body-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.dashboard-page.client-command-center { + --client-info-text: var(--heading); + --client-info-muted: var(--muted); + --client-info-line: var(--line); + --client-info-line-strong: var(--border-strong); + --client-info-surface: var(--surface-input); + --client-info-surface-raised: var(--tile-surface); + --client-info-surface-hover: var(--tile-surface-hover); + color: var(--client-info-text); + background: var(--surface-app); +} +.client-command-center .tone-critical { + --chart-color: var(--client-info-red); +} +.client-command-center .tone-high { + --chart-color: var(--high); +} +.client-command-center .tone-medium { + --chart-color: var(--client-info-amber); +} +.client-command-center .tone-passed { + --chart-color: var(--client-info-green); +} +.client-command-center .tone-unknown { + --chart-color: var(--client-info-neutral); +} +.client-glyph { + display: block; + width: var(--space-8); + height: var(--space-8); + fill: none; + stroke: currentColor; + stroke-width: 1.6; + stroke-linecap: round; + stroke-linejoin: round; +} +.client-overview-header { + display: grid; + grid-template-columns: auto auto minmax(240px, 1fr); + align-items: center; + gap: var(--space-8); + min-width: 0; + color: var(--client-info-muted); +} +.client-overview-identity, +.client-overview-assessment, +.client-overview-source { + display: flex; + align-items: center; + gap: var(--space-3); + min-width: 0; + font-size: var(--type-table-body-size); +} +.client-overview-identity strong { + color: var(--client-info-text); + font-weight: var(--fw-regular); +} +.client-overview-assessment .work-timeslot-select { + margin: 0; +} +.client-overview-assessment .work-timeslot-select > span { + display: none; +} +.client-overview-source { + justify-self: end; +} +.client-overview-source select, +.client-overview-assessment select { + min-width: 132px; + min-height: var(--control-h); + padding-inline: var(--space-3); + border: var(--border-hair) solid var(--client-info-line); + border-radius: var(--btn-radius); + color: var(--client-info-text); + background: var(--client-info-surface); + font: inherit; +} +.client-overview-facts { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(0, var(--tile-compact-width))); + justify-content: start; + gap: var(--segment-gap); + min-width: 0; +} +.client-overview-fact { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + place-content: center; + align-items: center; + gap: var(--space-3); + min-height: 88px; + padding: var(--tile-inset); + border: 0; + border-radius: var(--tile-radius); + color: var(--client-info-muted); + background: var(--tile-surface); + text-align: left; +} +.client-overview-fact > span { + display: grid; + gap: var(--space-1); +} +.client-overview-fact strong { + color: var(--client-info-text); + font-size: var(--type-h2-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; + line-height: 1; +} +.client-overview-fact small { + color: var(--client-info-muted); + font-size: var(--type-label-size); + line-height: 1.3; +} +.client-overview-main { + display: grid; + grid-template-columns: minmax(720px, 2.18fr) minmax(300px, .82fr); + align-items: stretch; + gap: var(--segment-gap); + min-width: 0; +} +.client-posture { + position: relative; + display: grid; + grid-template-columns: minmax(300px, .82fr) minmax(430px, 1.18fr); + gap: var(--segment-gap); + min-width: 0; + border-radius: var(--tile-radius); + background: var(--tile-surface); +} +.client-overall, +.client-domains, +.client-priority > section { + min-width: 0; + border: 0; + border-radius: var(--tile-radius); + color: var(--client-info-text); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); +} +.client-posture-connectors { + position: absolute; + z-index: 2; + inset: 0; + width: 100%; + height: 100%; + overflow: visible; + pointer-events: none; +} +.client-posture-connectors path { + fill: none; + stroke: var(--text-muted); + stroke-width: 1.2; + vector-effect: non-scaling-stroke; +} +.client-overall, +.client-domains { + position: relative; + z-index: 1; +} +.client-overall { + display: grid; + align-content: start; + justify-items: center; + gap: var(--space-2); + min-width: 0; + padding: var(--tile-inset); +} +.client-overall > h2, +.client-domains h2, +.client-priority h2, +.client-source-overview h2 { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + line-height: 1.3; +} +.client-overall > h2 { + justify-self: start; + color: var(--client-info-text); +} +.client-overall-ring { + position: relative; + width: min(290px, 90%); + aspect-ratio: 1; + margin: var(--space-3) 0 var(--space-2); + color: var(--chart-color, var(--client-info-neutral)); +} +.client-overall-ring svg { + display: block; + width: 100%; + height: 100%; + overflow: visible; + transform: rotate(-90deg); +} +.client-overall-ring circle { + fill: none; + stroke-width: var(--donut-ring-stroke); +} +.client-overall-ring-track { + stroke: var(--donut-track); +} +.client-overall-ring-value { + stroke: var(--chart-color, var(--chart-tone-emphasis)); + stroke-linecap: butt; +} +.client-overall-ring > span { + position: absolute; + inset: 0; + display: grid; + place-items: center; + color: var(--donut-value); +} +.client-overall-ring-number { + position: relative; +} +.client-overall-ring-number strong { + font-size: var(--type-h1-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; + line-height: 1; +} +.client-overall-ring-number small { + position: absolute; + left: calc(100% + var(--space-1)); + bottom: 0; + color: var(--client-info-text); + font-size: var(--donut-percent-size); + white-space: nowrap; +} +.client-overall-ring em { + position: absolute; + top: calc(50% + var(--type-h1-size) / 2 + var(--space-2)); + color: var(--client-info-muted); + font-size: var(--type-label-size); + font-style: normal; + font-weight: var(--fw-semibold); + letter-spacing: var(--ls-caps); +} +.client-overall-status { + color: var(--chart-color, var(--muted)); + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); +} +.client-overall-critical { + display: flex; + align-items: baseline; + justify-content: center; + gap: var(--space-2); + min-height: 40px; + padding: var(--space-1) var(--space-3); + border: 0; + border-radius: 0; + color: var(--critical); + background: transparent; + cursor: pointer; +} +.client-overall-critical:hover:not(:disabled) { + background: var(--client-info-surface-hover); +} +.client-overall-critical:disabled { + cursor: default; + opacity: .65; +} +.client-overall-critical b { + font-size: var(--type-h3-size); + font-variant-numeric: tabular-nums; +} +.client-overall-critical span { + font-size: var(--type-table-body-size); + font-weight: var(--fw-semibold); +} +.client-overall-coverage { + display: grid; + gap: var(--space-2); + width: 100%; + margin-top: var(--space-3); +} +.client-overall-coverage > span { + display: flex; + justify-content: space-between; + gap: var(--space-3); + color: var(--client-info-text); + font-size: var(--type-label-size); +} +.client-overall-coverage > span strong, +.client-overall-coverage > span b { + font-weight: var(--fw-semibold); +} +.client-overall-coverage > i { + display: block; + height: 7px; + background: var(--client-info-line); +} +.client-overall-coverage > i u { + --share: 0%; + display: block; + width: var(--share); + height: 100%; + background: var(--client-info-green); + text-decoration: none; +} +.client-overall-coverage small { + color: var(--client-info-muted); + font-size: var(--type-meta-size); + line-height: 1.3; +} +.client-overall-secondary { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + width: 100%; + margin: var(--space-2) 0 0; + border-top: var(--border-hair) solid var(--client-info-line); +} +.client-overall-secondary > div { + display: grid; + justify-items: center; + gap: var(--space-1); + padding: var(--space-4) var(--space-2) 0; +} +.client-overall-secondary > div + div { + border-left: var(--border-hair) solid var(--client-info-line); +} +.client-overall-secondary dt { + color: var(--client-info-muted); + font-size: var(--type-meta-size); +} +.client-overall-secondary dd { + grid-row: 1; + margin: 0; + color: var(--client-info-text); + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.client-domains { + position: relative; + min-width: 0; + padding: var(--tile-inset); +} +.client-domains > header { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-3); +} +.client-domains > header > span { + color: var(--client-info-muted); + font-size: var(--type-meta-size); +} +.client-domains ul { + position: relative; + display: grid; + gap: var(--space-1); + margin: var(--space-3) 0 0; + padding: 0; + list-style: none; +} +.client-domains li { + position: relative; + min-width: 0; +} +.client-domains li > button, +.client-domains li > div { + position: relative; + z-index: 3; + display: grid; + grid-template-columns: 52px minmax(0, 1fr) auto; + grid-template-rows: auto; + align-items: center; + column-gap: var(--space-3); + row-gap: var(--space-1); + width: 100%; + min-height: 64px; + padding: var(--space-1) 0; + border: 0; + border-radius: 0; + color: inherit; + background: transparent; + text-align: left; +} +.client-domains li > button { + cursor: pointer; +} +.client-domains li > button:hover { + background: var(--client-info-surface-hover); +} +.client-domain-score { + z-index: 1; + grid-column: 1; + grid-row: 1 / 3; + display: grid; + place-items: center; + width: 46px; + height: 46px; + border: var(--border-hair) solid var(--chart-color, var(--client-info-line-strong)); + border-radius: 50%; + color: var(--client-info-text); + background: var(--client-info-surface); +} +.client-domain-score .client-glyph { + width: var(--space-6); + height: var(--space-6); +} +.client-domain-score em { + color: var(--chart-color, var(--client-info-text)); + font-size: var(--type-h4-size); + font-style: normal; + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; + line-height: 1; +} +.client-domain-copy { + grid-column: 2; + grid-row: 1; + display: grid; + gap: var(--space-1); + min-width: 0; +} +.client-domain-copy strong { + color: var(--client-info-text); + font-size: var(--type-body-size); + font-weight: var(--fw-semibold); + line-height: 1.25; +} +.client-domain-copy small { + color: var(--client-info-muted); + font-size: var(--type-meta-size); + line-height: 1.3; +} +.client-domains li > button > b, +.client-domains li > div > b { + grid-column: 3; + grid-row: 1; + color: var(--client-info-text); + font-size: var(--type-h2-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.client-domains li b small { + display: block; + color: var(--client-info-muted); + font-size: var(--type-meta-size); + font-weight: var(--fw-regular); + text-align: right; +} +.client-priority { + display: grid; + grid-template-rows: auto auto; + align-content: start; + gap: var(--segment-gap); + min-width: 0; +} +.client-priority > section { + padding: var(--tile-inset); +} +.client-priority-findings > header { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + align-items: end; + gap: var(--space-3); +} +.client-priority-findings > header h2 { + grid-column: 1 / -1; + align-self: start; +} +.client-priority-findings > header > div { + display: grid; + justify-items: center; + color: var(--client-info-text); +} +.client-priority-findings > header > div strong { + color: var(--chart-color, var(--client-info-text)); + font-size: var(--type-h2-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.client-priority-findings > header > div span { + color: var(--client-info-muted); + font-size: var(--type-meta-size); +} +.client-priority-context { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: var(--space-1); + margin-top: var(--space-3); + border-top: var(--border-hair) solid var(--client-info-line); + border-bottom: var(--border-hair) solid var(--client-info-line); +} +.client-priority-context button { + display: grid; + justify-items: center; + gap: var(--space-1); + min-width: 0; + padding: var(--space-2) var(--space-1); + border: 0; + border-radius: 0; + color: var(--client-info-text); + background: transparent; + cursor: pointer; +} +.client-priority-context button + button { + border-left: var(--border-hair) solid var(--client-info-line); +} +.client-priority-context button:hover:not(:disabled) { + background: var(--client-info-surface-hover); +} +.client-priority-context button:disabled { + cursor: default; + opacity: .65; +} +.client-priority-context strong { + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.client-priority-context span { + color: var(--client-info-muted); + font-size: var(--type-meta-size); + line-height: 1.2; + text-align: center; +} +.client-priority-findings ol { + display: grid; + gap: var(--space-2); + margin: var(--space-4) 0 var(--space-3); + padding: 0; + list-style: none; +} +.client-priority-findings li { + border-left: var(--marker-width) solid var(--chart-color, var(--client-info-neutral)); + border-bottom: var(--border-hair) solid var(--line); + background: transparent; +} +.client-priority-findings li button { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + align-items: center; + gap: var(--space-1) var(--space-2); + width: 100%; + min-height: 70px; + padding: var(--space-3); + border: 0; + border-radius: 0; + color: inherit; + background: transparent; + text-align: left; + cursor: pointer; +} +.client-priority-findings li button:hover { + background: var(--client-info-surface-hover); +} +.client-priority-findings li small { + padding: var(--space-1) var(--space-2); + color: var(--sev-on); + background: var(--chart-color, var(--client-info-neutral)); + font-size: var(--type-badge-size); + font-weight: var(--fw-semibold); + text-transform: uppercase; +} +.client-priority-findings li strong { + min-width: 0; + color: var(--client-info-text); + font-size: var(--type-table-body-size); + font-weight: var(--fw-semibold); + line-height: 1.3; + overflow-wrap: normal; + word-break: normal; +} +.client-priority-findings li span { + grid-column: 2; + justify-self: end; + padding: var(--space-1) var(--space-2); + color: var(--client-info-muted); + background: var(--client-info-surface-hover); + font-size: var(--type-meta-size); +} +.client-priority-findings .client-priority-empty { + padding: var(--space-4); + border-left-color: var(--client-info-green); + color: var(--client-info-muted); + font-size: var(--type-table-body-size); +} +.client-overview-action { + justify-self: end; + margin-left: auto; +} +.client-assessment-gaps { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + align-items: baseline; + gap: var(--space-1) var(--space-3); +} +.client-assessment-gaps h2 { + grid-column: 1 / -1; + margin-bottom: var(--space-2); +} +.client-assessment-gaps > strong { + color: var(--client-info-text); + font-size: var(--type-h2-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.client-assessment-gaps > span { + color: var(--client-info-muted); + font-size: var(--type-table-body-size); +} +.client-assessment-gaps dl { + grid-column: 1 / -1; + display: grid; + margin: var(--space-3) 0 0; + border-top: var(--border-hair) solid var(--client-info-line); +} +.client-assessment-gaps dl div { + display: flex; + justify-content: space-between; + gap: var(--space-3); + padding: var(--space-3) 0; + border-bottom: var(--border-hair) solid var(--client-info-line); + font-size: var(--type-table-body-size); +} +.client-assessment-gaps dt { + display: flex; + align-items: center; + gap: var(--space-2); + color: var(--client-info-muted); +} +.client-assessment-gaps dt .client-glyph { + width: var(--space-5); + height: var(--space-5); +} +.client-assessment-gaps dd { + margin: 0; + color: var(--client-info-text); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.client-assessment-gaps .client-overview-action { + grid-column: 1 / -1; +} +.client-source-overview { + min-width: 0; + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.client-environment-detail { + min-width: 0; + padding: var(--tile-inset); + border: 0; + border-radius: var(--tile-radius); + color: var(--client-info-text); + background: var(--tile-surface); +} +.client-environment-detail > summary, +.risk-register-detail-group > summary, +.risk-register-history > summary { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: var(--space-3); + min-height: var(--control-h); + list-style: none; + cursor: pointer; +} +.client-environment-detail > summary::-webkit-details-marker, +.risk-register-detail-group > summary::-webkit-details-marker, +.risk-register-history > summary::-webkit-details-marker { + display: none; +} +.client-environment-detail > summary:focus-visible, +.risk-register-detail-group > summary:focus-visible, +.risk-register-history > summary:focus-visible { + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: var(--border-hair); +} +.client-environment-detail[open] > summary > .triangle-icon, +.risk-register-detail-group[open] > summary > .triangle-icon, +.risk-register-history[open] > summary > .triangle-icon { + transform: rotate(90deg); +} +.client-environment-detail > summary h2 { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + line-height: 1.3; +} +.client-environment-detail > summary span { + color: var(--client-info-muted); + font-size: var(--type-meta-size); +} +.client-environment-detail > summary > .client-env-meta { + margin-left: auto; +} +.client-env-meta { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: var(--space-2) var(--space-3); +} +.client-env-restricted-toggle { + gap: var(--space-2); + margin-top: var(--space-3); +} +.client-env-restricted-toggle .triangle-icon { + width: var(--space-3); + height: var(--space-3); +} +.client-environment-restricted { + margin: 0 0 var(--space-3); + color: var(--client-info-muted); + font-size: var(--type-meta-size); + line-height: 1.35; +} +.client-source-overview > header { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-3); + margin-bottom: var(--space-3); +} +.client-source-overview > header span { + color: var(--client-info-muted); + font-size: var(--type-meta-size); +} +.client-source-overview > div { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--tile-content-width)), var(--tile-content-width))); + justify-content: start; + gap: var(--segment-gap); + min-width: 0; +} +.client-source-overview > div > article, +.client-source-overview > div > button { + --source-color: var(--client-info-neutral); + display: grid; + grid-template-columns: var(--space-8) minmax(0, 1fr); + grid-template-rows: auto auto auto; + align-items: center; + gap: var(--space-1) var(--space-3); + min-width: 0; + min-height: 104px; + padding: var(--tile-inset); + border: 0; + border-radius: var(--tile-radius); + color: inherit; + background: var(--tile-surface); + text-align: left; +} +.client-source-overview .client-source-pingcastle { + --source-color: var(--client-info-green); +} +.client-source-overview .client-source-purple { + --source-color: var(--client-info-purple); +} +.client-source-overview .client-source-maester { + --source-color: var(--client-info-green); +} +.client-source-overview .client-source-cis { + --source-color: var(--client-info-blue); +} +.client-source-overview .client-source-gpo { + --source-color: var(--client-info-lime); +} +.client-source-overview button { + cursor: pointer; +} +.client-source-overview button:hover { + background: var(--client-info-surface-hover); +} +.client-source-overview article > .client-glyph, +.client-source-overview button > .client-glyph { + grid-column: 1; + grid-row: 1 / -1; + width: var(--space-8); + height: var(--space-8); + color: var(--client-info-muted); +} +.client-source-overview article > span, +.client-source-overview button > span { + grid-column: 2; + color: var(--client-info-text); + font-size: var(--type-table-body-size); + font-weight: var(--fw-semibold); +} +.client-source-overview article > strong, +.client-source-overview button > strong { + grid-column: 2; + color: var(--client-info-text); + font-size: var(--type-h2-size); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.client-source-overview article > strong small, +.client-source-overview button > strong small { + margin-left: var(--space-1); + color: var(--client-info-muted); + font-size: var(--type-table-body-size); + font-weight: var(--fw-regular); +} +.client-source-overview article > em, +.client-source-overview button > em { + grid-column: 2; + color: var(--client-info-muted); + font-size: var(--type-meta-size); + font-style: normal; + line-height: 1.3; +} +.client-risk-register { + min-width: 0; + padding: var(--tile-inset); + border: 0; + border-radius: var(--tile-radius); + color: var(--client-info-text); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); +} +.client-risk-register > header { + display: flex; + align-items: end; + justify-content: space-between; + gap: var(--space-4); + margin-bottom: var(--space-4); +} +.client-risk-register > header > div { + display: grid; + gap: var(--space-1); +} +.client-risk-register > header h2 { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + line-height: 1.3; +} +.client-risk-register > header span, +.client-risk-register > header strong { + color: var(--client-info-muted); + font-size: var(--type-meta-size); + font-weight: var(--fw-regular); +} +.client-risk-register-empty { + margin: 0; + padding: var(--space-6) 0; + border-top: var(--border-hair) solid var(--client-info-line); + color: var(--client-info-muted); + font-size: var(--type-body-size); +} +.client-risk-register-layout { + display: grid; + grid-template-columns: minmax(260px, .72fr) minmax(0, 1.78fr); + min-width: 0; + border-top: var(--border-hair) solid var(--client-info-line); +} +.client-risk-register-list { + display: grid; + align-content: start; + min-width: 0; + padding: var(--space-4) var(--space-4) var(--space-4) 0; + border-right: var(--border-hair) solid var(--client-info-line); +} +.client-risk-register-list button { + --risk-register-tone: var(--client-info-neutral); + position: relative; + display: grid; + grid-template-columns: var(--marker-width) minmax(0, 1fr) auto; + gap: var(--space-1) var(--space-3); + align-items: start; + width: 100%; + min-width: 0; + padding: var(--space-3); + border: 0; + border-bottom: var(--border-hair) solid var(--client-info-line); + border-radius: 0; + color: inherit; + background: transparent; + text-align: left; + cursor: pointer; +} +.client-risk-register-list button:first-child { + border-top: var(--border-hair) solid var(--client-info-line); +} +.client-risk-register-list button:hover { + background: var(--client-info-surface-hover); +} +.client-risk-register-list button[aria-pressed=true] { + z-index: 1; + outline: var(--bw-emphasis) solid var(--marking-color); + outline-offset: calc(-1 * var(--bw-emphasis)); + background: var(--client-info-surface-hover); +} +.client-risk-register-list button:focus-visible { + z-index: 2; + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: calc(-1 * var(--bw-emphasis)); +} +.client-risk-register-list button.is-current, +.client-risk-register-detail > header > strong.is-current { + --risk-register-tone: var(--client-info-green); +} +.client-risk-register-list button.is-attention, +.client-risk-register-detail > header > strong.is-attention { + --risk-register-tone: var(--client-info-amber); +} +.client-risk-register-list button.is-critical, +.client-risk-register-detail > header > strong.is-critical { + --risk-register-tone: var(--client-info-red); +} +.client-risk-register-list button > i { + grid-column: 1; + grid-row: 1 / 4; + width: var(--marker-width); + height: 100%; + min-height: 54px; + background: var(--risk-register-tone); +} +.client-risk-register-list button > span { + grid-column: 2 / -1; + display: grid; + gap: var(--space-1); + min-width: 0; +} +.client-risk-register-list button > span strong { + color: var(--client-info-text); + font-size: var(--type-table-body-size); + font-weight: var(--fw-semibold); + line-height: 1.35; + overflow-wrap: break-word; +} +.client-risk-register-list button > span small { + color: var(--client-info-muted); + font-size: var(--type-meta-size); + line-height: 1.3; + overflow-wrap: break-word; +} +.client-risk-register-list button > em { + grid-column: 2; + color: var(--risk-register-tone); + font-size: var(--type-badge-size); + font-style: normal; + font-weight: var(--fw-semibold); + text-transform: uppercase; +} +.client-risk-register-list button > time { + grid-column: 3; + color: var(--client-info-muted); + font-size: var(--type-meta-size); + font-variant-numeric: tabular-nums; + white-space: nowrap; +} +.client-risk-register-detail { + min-width: 0; + padding: var(--space-5) 0 var(--space-4) var(--space-5); +} +.client-risk-register-detail > header { + display: flex; + align-items: start; + justify-content: space-between; + gap: var(--space-5); + padding-bottom: var(--space-4); +} +.client-risk-register-detail > header > div { + display: grid; + gap: var(--space-1); + min-width: 0; +} +.client-risk-register-detail > header span { + color: var(--client-info-muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.client-risk-register-detail > header h2 { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-detail-title-size); + font-weight: var(--fw-semibold); + line-height: 1.35; + overflow-wrap: break-word; +} +.client-risk-register-detail > header > strong { + --risk-register-tone: var(--client-info-neutral); + flex: 0 0 auto; + padding: var(--space-1) var(--space-2); + border-left: var(--marker-width) solid var(--risk-register-tone); + color: var(--risk-register-tone); + background: var(--client-info-surface); + font-size: var(--type-badge-size); + font-weight: var(--fw-semibold); + text-transform: uppercase; +} +.risk-register-summary { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin: 0; + border-top: var(--border-hair) solid var(--client-info-line); + border-bottom: var(--border-hair) solid var(--client-info-line); +} +.risk-register-summary > div { + display: grid; + align-content: start; + gap: var(--space-1); + min-width: 0; + padding: var(--space-3); + border-right: var(--border-hair) solid var(--client-info-line); + border-bottom: var(--border-hair) solid var(--client-info-line); +} +.risk-register-summary > div:nth-child(3n) { + border-right: 0; +} +.risk-register-summary > div:nth-last-child(-n+3) { + border-bottom: 0; +} +.risk-register-summary dt, +.risk-register-detail-group dt { + color: var(--client-info-muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.risk-register-summary dd { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-table-body-size); + line-height: 1.4; + overflow-wrap: break-word; +} +.risk-register-detail-groups { + display: grid; + grid-template-columns: 1fr; + padding-top: var(--space-4); +} +.risk-register-detail-group { + min-width: 0; + padding-block: var(--space-2); + border-bottom: var(--border-hair) solid var(--client-info-line); +} +.risk-register-detail-group h3, +.risk-register-history h3 { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); +} +.risk-register-detail-group dl { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--tile-content-width)), 1fr)); + gap: var(--space-4); + margin: var(--space-3) 0; +} +.risk-register-detail-group dl > div { + display: grid; + gap: var(--space-1); + min-width: 0; +} +.risk-register-detail-group dd { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-body-size); + line-height: 1.5; + white-space: pre-wrap; + overflow-wrap: break-word; +} +.risk-register-history { + padding-top: var(--space-2); +} +.risk-register-history > summary > span { + margin-left: auto; + color: var(--client-info-muted); + font-size: var(--type-meta-size); +} +.risk-register-history ol { + display: grid; + gap: 0; + margin: 0; + padding: 0; + border-top: var(--border-hair) solid var(--client-info-line); + list-style: none; +} +.risk-register-history li { + display: grid; + gap: var(--space-2); + padding: var(--space-3) 0; + border-bottom: var(--border-hair) solid var(--client-info-line); +} +.risk-register-history li > span { + display: flex; + justify-content: space-between; + gap: var(--space-3); +} +.risk-register-history li strong { + font-size: var(--type-table-body-size); + font-weight: var(--fw-semibold); +} +.risk-register-history li time, +.risk-register-history li small { + color: var(--client-info-muted); + font-size: var(--type-meta-size); +} +.risk-register-history li p { + margin: 0; + color: var(--client-info-text); + font-size: var(--type-body-size); + line-height: 1.5; + white-space: pre-wrap; + overflow-wrap: break-word; +} +@container (max-width: 1300px) { + .client-overview-main { + grid-template-columns: 1fr; + } + .client-priority { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .client-risk-register-layout { + grid-template-columns: minmax(230px, .8fr) minmax(0, 1.2fr); + } + .risk-register-detail-groups { + grid-template-columns: 1fr; + } +} +@container (max-width: 760px) { + .client-overview-header { + grid-template-columns: 1fr; + gap: var(--space-3); + } + .client-overview-source { + justify-self: start; + } + .client-overview-facts { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .client-posture { + grid-template-columns: 1fr; + } + .client-posture-connectors { + display: none; + } + .client-priority { + grid-template-columns: 1fr; + } + .client-risk-register-layout { + grid-template-columns: 1fr; + } + .client-risk-register-list { + padding-right: 0; + border-right: 0; + border-bottom: var(--border-hair) solid var(--client-info-line); + } + .client-risk-register-detail { + padding-left: 0; + } +} +@container (max-width: 480px) { + .client-overview-facts, + .client-source-overview > div { + grid-template-columns: 1fr; + } + .client-priority-findings > header { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + .client-priority-findings > header h2 { + grid-column: 1 / -1; + } + .client-priority-context { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .client-priority-context button:nth-child(3) { + border-left: 0; + border-top: var(--border-hair) solid var(--client-info-line); + } + .client-priority-context button:nth-child(4) { + border-top: var(--border-hair) solid var(--client-info-line); + } + .client-risk-register > header, + .client-risk-register-detail > header { + align-items: start; + flex-direction: column; + } + .risk-register-summary { + grid-template-columns: 1fr; + } + .risk-register-summary > div, + .risk-register-summary > div:nth-child(3n), + .risk-register-summary > div:nth-last-child(-n+3) { + border-right: 0; + border-bottom: var(--border-hair) solid var(--client-info-line); + } + .risk-register-summary > div:last-child { + border-bottom: 0; + } + .client-risk-register-list button > time { + grid-column: 2; + white-space: normal; + } +} +.tone-deviation, +.tone-error, +.tone-critical { + --chart-color: var(--critical); +} +.tone-passed, +.tone-low, +.tone-coverage { + --chart-color: var(--success); +} +.tone-high { + --chart-color: var(--high); +} +.tone-medium { + --chart-color: var(--medium); +} +.tone-info { + --chart-color: var(--info); +} +.tone-not-run, +.tone-neutral, +.tone-dashboard-cis-cat-without-severity { + --chart-color: var(--donut-not-run); +} +.tone-accent, +.tone-pki { + --chart-color: var(--chart-tone-emphasis); +} +.tone-gpo { + --chart-color: var(--high); +} +.tone-risk { + --chart-color: var(--warning); +} +@media (max-width: 1100px) { + .client-info-top-row { + grid-template-columns: minmax(0, 1fr); + align-items: start; + } + .client-info-metric-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + .client-info-top-row > .client-info-metric-grid .client-info-metric { + height: auto; + min-height: 0; + aspect-ratio: 1; + } + .client-info-panels-layout { + grid-template-columns: minmax(0, 1fr); + } + .client-info-donut-rail { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} +@media (max-width: 800px) { + .client-info-metric-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .client-info-donut-rail { + grid-template-columns: minmax(0, 1fr); + } +} +@media (max-width: 560px) { + .client-info-card > header { + align-items: flex-start; + min-height: 68px; + padding: var(--space-3); + } + .client-info-card-heading { + display: grid; + gap: var(--space-1); + } + .client-info-card-details, + .client-info-card-extra { + padding-left: var(--space-3); + padding-right: var(--space-3); + } + .client-info-bar-row { + grid-template-columns: minmax(0, 1fr) auto; + grid-template-rows: auto auto auto; + min-height: 132px; + column-gap: var(--space-3); + } + .client-info-bar-label { + grid-column: 1; + grid-row: 1; + } + .client-info-bars strong { + grid-column: 2; + grid-row: 1; + } + .client-info-bars .client-info-bar-status { + grid-column: 1 / -1; + grid-row: 2; + text-align: left; + } + .client-info-bar-track { + grid-column: 1 / -1; + grid-row: 3; + height: 44px; + } + .client-info-donut-layout { + grid-template-columns: minmax(0, 1fr); + } +} +.db-structure-page { + width: 100%; + max-width: none; +} +.db-structure-meta { + margin: 0; + color: var(--muted); + font-size: var(--ui-body-size); +} +.page-actions-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--legacy-space-4); + margin-top: var(--legacy-space-4); +} +.page-action-buttons { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: var(--legacy-space-2); +} +.db-structure-intro { + display: flex; + align-items: end; + justify-content: space-between; + gap: var(--space-7); + padding-bottom: var(--space-5); + border-bottom: var(--border-hair) solid var(--line); +} +.db-structure-intro-copy { + display: grid; + gap: var(--space-2); + max-width: 780px; +} +.db-structure-eyebrow { + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.db-structure-intro h2 { + margin: 0; + color: var(--heading); + font-size: var(--type-h2-size); + font-weight: var(--fw-semibold); + line-height: 1.15; +} +.db-structure-intro p { + margin: 0; + color: var(--muted); + font-size: var(--type-body-size); + line-height: 1.55; +} +.db-structure-intro-actions { + display: flex; + align-items: center; + justify-content: flex-end; + flex-wrap: wrap; + gap: var(--space-3); + flex: 0 0 auto; +} +.db-structure-persistence { + display: inline-flex; + align-items: center; + gap: var(--space-2); + color: var(--muted); + font-size: var(--type-meta-size); +} +.db-structure-persistence i { + width: 8px; + height: 8px; + background: var(--muted); +} +.db-structure-persistence.is-postgresql i { + background: var(--success); +} +.db-structure-summary { + display: grid; + grid-template-columns: repeat(auto-fill, var(--tile-compact-width)); + justify-content: start; + gap: var(--segment-gap); + margin-top: var(--space-5); + padding: var(--segment-inset); + border: 0; + border-radius: var(--segment-radius); + background: var(--segment-surface); + box-shadow: none; +} +.db-structure-summary article { + display: grid; + align-content: space-between; + gap: var(--space-2); + min-height: 148px; + padding: var(--space-4); + border: 0; + border-radius: 0; + background: var(--tile-surface); + box-shadow: none; +} +.db-structure-summary article > span { + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.db-structure-summary article > strong { + color: var(--heading); + font-size: var(--type-h2-size); + font-weight: var(--fw-semibold); + line-height: 1; + font-variant-numeric: tabular-nums; +} +.db-structure-summary article > small { + color: var(--muted); + font-size: var(--type-meta-size); + line-height: 1.4; +} +.db-structure-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-4); + margin-top: var(--space-5); + padding: 0 var(--segment-inset); +} +.db-structure-meta { + font-size: var(--type-meta-size); +} +.db-structure-meta time { + color: var(--text); + font-variant-numeric: tabular-nums; +} +.db-structure-layers { + display: grid; + gap: var(--space-7); + margin-top: var(--space-5); + width: 100%; +} +.db-structure-layer { + padding: var(--segment-inset); + border: 0; + border-radius: var(--segment-radius); + background: var(--segment-surface); + box-shadow: none; +} +.db-structure-layer-header { + display: flex; + align-items: end; + justify-content: space-between; + gap: var(--space-5); + margin-bottom: var(--space-4); + padding: 0 var(--space-1); +} +.db-structure-layer-header > div { + display: grid; + gap: var(--space-1); + max-width: 760px; +} +.db-structure-layer-header span { + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.db-structure-layer-header h3 { + margin: 0; + color: var(--heading); + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); + line-height: 1.35; +} +.db-structure-layer-header p { + margin: 0; + color: var(--muted); + font-size: var(--type-body-size); + line-height: 1.5; +} +.db-structure-layer-header > strong { + flex: 0 0 auto; + color: var(--muted); + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); +} +.db-structure-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--tile-content-width)), var(--tile-content-width))); + justify-content: start; + align-items: start; + gap: var(--segment-gap); +} +.db-structure-card { + min-width: 0; + border: 0; + border-radius: 0; + background: var(--tile-surface); + box-shadow: none; +} +.db-structure-card.is-expanded { + grid-column: 1 / -1; + width: 100%; +} +.db-structure-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-4); + width: 100%; + min-height: 112px; + padding: var(--space-4); + border: 0; + color: inherit; + background: transparent; + text-align: left; + cursor: pointer; +} +.db-structure-card-header:hover { + background: var(--tile-surface-hover); +} +.db-structure-card-header:focus-visible { + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: calc(-1 * var(--bw-emphasis)); +} +.db-structure-card-copy { + display: grid; + gap: var(--space-2); + min-width: 0; +} +.db-structure-table-kind { + color: var(--muted); + font-size: var(--type-badge-size); + font-weight: var(--fw-semibold); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.db-structure-card-copy > strong { + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); + overflow-wrap: break-word; +} +.db-structure-card-facts { + display: flex; + flex-wrap: wrap; + gap: var(--space-1) var(--space-3); + color: var(--muted); + font-size: var(--type-meta-size); + font-variant-numeric: tabular-nums; +} +.db-structure-card-toggle { + flex: 0 0 auto; + color: var(--muted); +} +.db-structure-card-body { + display: grid; + grid-template-columns: minmax(0, 2fr) minmax(280px, 1fr); + gap: var(--space-6); + padding: var(--space-5); + border-top: var(--border-hair) solid var(--line); +} +.db-structure-card-section { + min-width: 0; +} +.db-structure-detail-heading { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-3); + margin-bottom: var(--space-3); +} +.db-structure-detail-heading h4 { + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-semibold); +} +.db-structure-detail-heading span { + color: var(--muted); + font-size: var(--type-meta-size); + font-variant-numeric: tabular-nums; +} +.db-structure-column-head, +.db-structure-columns li { + display: grid; + grid-template-columns: minmax(0, 1.4fr) minmax(100px, .8fr) minmax(76px, auto); + align-items: center; + gap: var(--space-4); +} +.db-structure-column-head { + min-height: 32px; + padding: 0 var(--space-3); + border-bottom: var(--border-hair) solid var(--line); + color: var(--muted); + font-size: var(--type-table-head-size); + font-weight: var(--fw-semibold); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.db-structure-columns { + display: grid; + gap: 0; + margin: 0; + padding: 0; + list-style: none; +} +.db-structure-columns li { + min-height: 48px; + padding: var(--space-2) var(--space-3); + border-bottom: var(--border-hair) solid var(--line); + font-size: var(--type-table-body-size); +} +.db-structure-columns li:last-child { + border-bottom: 0; +} +.db-structure-columns strong { + color: var(--heading); + font-weight: var(--fw-regular); + overflow-wrap: break-word; +} +.db-structure-columns span { + color: var(--muted); + overflow-wrap: break-word; +} +.db-structure-columns small { + color: var(--muted); + font-size: var(--type-meta-size); + text-align: right; +} +.db-structure-relations { + padding-left: var(--space-5); + border-left: var(--border-hair) solid var(--line); +} +.db-structure-relations > p { + margin: 0; + color: var(--muted); + font-size: var(--type-body-size); + line-height: 1.5; +} +.db-structure-fks { + display: grid; + gap: 0; + margin: 0; + padding: 0; + list-style: none; +} +.db-structure-fks li { + display: grid; + grid-template-columns: minmax(0, .8fr) auto minmax(0, 1.2fr); + align-items: start; + gap: var(--space-2); + min-height: 48px; + padding: var(--space-3) 0; + border-bottom: var(--border-hair) solid var(--line); + color: var(--muted); + font-size: var(--type-table-body-size); +} +.db-structure-fks li:last-child { + border-bottom: 0; +} +.db-structure-fks strong { + color: var(--heading); + font-weight: var(--fw-regular); + overflow-wrap: break-word; +} +.db-structure-fks span:last-child { + overflow-wrap: break-word; +} +@media (max-width: 900px) { + .db-structure-intro { + align-items: start; + flex-direction: column; + } + .db-structure-intro-actions { + justify-content: flex-start; + } + .db-structure-card-body { + grid-template-columns: minmax(0, 1fr); + } + .db-structure-relations { + padding-top: var(--space-5); + padding-left: 0; + border-top: var(--border-hair) solid var(--line); + border-left: 0; + } +} +@media (max-width: 560px) { + .db-structure-summary { + grid-template-columns: minmax(0, 1fr); + } + .db-structure-summary article { + min-height: 128px; + } + .db-structure-toolbar, + .db-structure-layer-header { + align-items: start; + flex-direction: column; + } + .db-structure-grid { + grid-template-columns: minmax(0, 1fr); + } + .db-structure-column-head { + display: none; + } + .db-structure-columns li { + grid-template-columns: minmax(0, 1fr) auto; + } + .db-structure-columns small { + grid-column: 1 / -1; + text-align: left; + } +} +.viewer.app-area-results { + overflow-x: hidden; + overflow-y: auto; + background: var(--surface-app); + scrollbar-color: var(--line-strong) var(--surface-app); + scrollbar-width: thin; +} +.results-browser-page { + width: 100%; + max-width: none; +} +.results-browser-layout { + display: grid; + grid-template-columns: minmax(220px, 300px) minmax(0, 1fr); + gap: var(--legacy-space-5); + margin-top: var(--legacy-space-5); + align-items: start; + width: 100%; +} +.results-filter-panel { + display: grid; + gap: var(--legacy-space-5); + padding: var(--legacy-space-4); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + background: var(--panel); + position: sticky; + top: 0; + max-height: calc(100vh - 200px); + overflow-y: auto; +} +.results-filter-group h3 { + margin: 0 0 var(--legacy-space-2); + color: var(--muted); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.results-filter-options { + display: grid; + gap: var(--legacy-space-1); + margin: 0; + padding: 0; + list-style: none; + max-height: 220px; + overflow-y: auto; +} +.results-filter-options label { + display: flex; + align-items: center; + gap: var(--legacy-space-2); + font-size: var(--ui-control-size); + color: var(--text); + cursor: pointer; +} +.results-filter-options label span { + flex: 1; + min-width: 0; + overflow-wrap: anywhere; +} +.results-filter-options label b { + color: var(--muted); + font-weight: 600; + flex: 0 0 auto; +} +.results-filter-empty { + margin: 0; + color: var(--muted); + font-size: var(--ui-control-size); +} +.results-filter-segmented { + display: flex; + gap: var(--legacy-space-1); +} +.results-filter-segmented button { + flex: 1; + min-height: var(--control-height); + padding: var(--legacy-space-1) var(--legacy-space-2); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + color: var(--text); + background: var(--panel-raised); + font-size: var(--ui-control-size); + cursor: pointer; +} +.results-filter-segmented button.active { + border-color: var(--line-strong); + color: var(--state-selected-text); + background: var(--state-selected); +} +.results-filter-readonly { + opacity: .8; +} +.results-filter-readonly ul li { + display: flex; + justify-content: space-between; + gap: var(--legacy-space-2); + font-size: var(--ui-control-size); + color: var(--muted); + padding: 2px 0; +} +.results-filter-reset { + justify-self: start; +} +.results-browser-table-wrap { + min-width: 0; + width: 100%; +} +.results-browser-table { + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + background: var(--panel); + width: 100%; + overflow-x: auto; +} +.results-browser-row { + display: grid; + grid-template-columns: minmax(280px, 1fr) 80px 120px 140px 50px 90px 110px 150px 110px; + gap: var(--legacy-space-3); + align-items: center; + padding: var(--legacy-space-2) var(--legacy-space-3); + border-top: var(--border-hair) solid var(--line); + font-size: var(--ui-control-size); + min-width: fit-content; +} +.results-browser-row:first-child { + border-top: 0; +} +.results-browser-row-toggle { + display: contents; +} +.results-browser-row.expanded { + background: var(--panel-raised); +} +.results-browser-head { + color: var(--muted); + background: var(--panel-soft); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; + padding: var(--legacy-space-2) var(--legacy-space-3); +} +.results-browser-row span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.results-browser-row span[data-label=Titel] { + overflow: visible; + white-space: normal; + text-overflow: clip; + line-height: 1.35; + overflow-wrap: anywhere; +} +.results-browser-row-detail { + grid-column: 1 / -1; + padding: var(--legacy-space-3); + border-top: var(--border-hair) dashed var(--line); + color: var(--muted); + font-size: var(--ui-control-size); + line-height: 1.55; +} +.results-browser-row-detail ul { + margin: var(--legacy-space-2) 0 0; + padding: 0; + list-style: none; + display: grid; + gap: var(--legacy-space-1); +} +.results-environment-value { + color: var(--text); + font-size: var(--fs-lg); + line-height: var(--lh-prose); +} +.results-environment-value strong { + color: var(--heading); +} +.results-environment-value p { + margin: var(--legacy-space-1) 0 var(--legacy-space-3); + overflow-wrap: anywhere; + white-space: pre-wrap; +} +.results-processing-alert { + margin-bottom: var(--legacy-space-3); +} +@media (max-width: 1150px) { + .results-browser-layout { + grid-template-columns: 1fr; + } + .results-filter-panel { + position: static; + max-height: none; + } + .results-browser-row { + grid-template-columns: 1fr 1fr; + gap: var(--legacy-space-2) var(--legacy-space-4); + } + .results-browser-row span::before { + content: attr(data-label); + display: block; + margin-bottom: 2px; + color: var(--muted); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; + } + .results-browser-head { + display: none; + } +} +.datahub-mitre-management { + margin-top: var(--legacy-space-6); + padding-top: var(--legacy-space-5); + border-top: var(--border-hair) solid var(--line); +} +.datahub-mitre-card { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--legacy-space-4); + padding: var(--legacy-space-4); + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-md); + background: var(--panel-raised); +} +.datahub-mitre-info strong { + display: block; + color: var(--heading); + font-size: var(--ui-heading-size); +} +.datahub-mitre-info p { + margin: 4px 0 0; + color: var(--muted); + font-size: var(--ui-control-size); +} +.datahub-mitre-actions { + display: flex; + align-items: center; + gap: var(--legacy-space-3); +} +.datahub-mitre-upload-btn { + cursor: pointer; +} +.datahub-mitre-file-input { + display: none; +} +.baseline-table .tenant-file-row { + grid-template-columns: minmax(260px, 1fr) 90px 160px 150px 92px; + min-width: 760px; +} +.baseline-table .tenant-file-row > span { + white-space: nowrap; +} +.baseline-cell-num { + font: inherit; + font-variant-numeric: tabular-nums; +} +.baseline-table .baseline-status { + display: inline-flex; + align-items: center; + gap: var(--legacy-space-2); + color: var(--text); + font-weight: var(--ui-body-weight); +} +.baseline-table .baseline-status::before { + content: ""; + flex: 0 0 auto; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--success); +} +.baseline-table .baseline-status[data-status=metadata-required]::before { + background: var(--warning); +} +@media (max-width: 1050px) { + .baseline-table .tenant-file-row { + grid-template-columns: 1fr 1fr; + min-width: 0; + } +} +.tenant-detail-page .tenant-editor-header { + grid-template-columns: minmax(0, 1fr) auto; + align-items: start; + gap: var(--space-5); + padding-bottom: var(--space-5); + border-bottom: 0; +} +.tenant-detail-page .tenant-back { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--space-2); + min-width: 0; + min-height: var(--control-h); + font-size: var(--fs-md); +} +.tenant-identity { + align-self: center; + min-width: 0; + padding: var(--space-3) 0; +} +.tenant-detail-page .tenant-identity h2 { + margin: 0; + padding-bottom: var(--space-1); + overflow: hidden; + font-size: calc(var(--fs-xl) * 3); + font-weight: var(--fw-semibold); + line-height: 1.15; + letter-spacing: -.04em; + text-overflow: ellipsis; + white-space: nowrap; +} +.tenant-detail-page .tenant-identity p { + margin: var(--space-5) 0 0; + color: var(--text-secondary); + font-size: var(--fs-xl); + font-variant-numeric: tabular-nums; +} +.tenant-rack { + display: flex; + justify-content: flex-end; +} +.tenant-detail-page .tenant-navigation-open { + min-width: calc(var(--space-8) * 2.5); +} +.tenant-detail-page > .tenant-actions { + justify-content: flex-end; + flex-wrap: nowrap; + gap: var(--space-3); + padding: var(--space-4) 0; + border-bottom: 0; +} +.tenant-detail-page > .tenant-actions .btn { + min-width: calc(var(--space-8) * 3); +} +.tenant-detail-page > .tenant-actions .btn.primary { + min-width: calc(var(--space-8) * 4.25); +} +.tenant-detail-page > .tenant-actions .gpo-folder-actions .btn { + min-width: calc(var(--space-8) * 5.25); +} +.tenant-detail-page .tenant-editor { + margin-top: var(--space-4); + padding: 0; + overflow: hidden; + border-radius: var(--radius-nav-item); + background: + linear-gradient( + 135deg, + var(--surface-panel-raised), + var(--surface-panel)); +} +.tenant-section-bar { + display: flex; + align-items: center; + justify-content: space-between; + min-height: calc(var(--row-h) + var(--space-3)); + padding: 0 var(--space-5); + border-bottom: var(--bw-hairline) solid var(--border-subtle); + color: var(--text-secondary); + font-size: var(--fs-md); + letter-spacing: var(--ls-caps); + text-transform: uppercase; +} +.tenant-section-bar > span { + display: inline-flex; + align-items: center; + gap: var(--space-2); +} +.tenant-section-bar strong { + color: var(--text-secondary); + font-size: inherit; + font-weight: var(--fw-semibold); +} +.tenant-section-bar i { + color: var(--text-muted); + font-style: normal; +} +.tenant-detail-page .tenant-editor-form { + gap: var(--space-5) var(--space-8); + padding: var(--space-4) var(--space-5) var(--space-5); +} +.tenant-detail-page .tenant-editor-form label { + color: var(--text-primary); + font-size: var(--fs-lg); + font-weight: var(--fw-regular); +} +.tenant-detail-page .tenant-editor-form label > span { + color: var(--text-primary); + font-size: var(--fs-md); +} +.tenant-detail-page .tenant-editor-form .input { + min-height: calc(var(--control-h) + var(--space-4)); + border-radius: var(--radius-nav-item); + font-size: var(--fs-md); +} +.tenant-detail-page .tenant-editor-form .input[readonly] { + border-color: var(--border-subtle); + color: var(--text-secondary); + background: var(--surface-panel); + cursor: default; +} +.tenant-detail-page .tenant-editor-description textarea { + min-height: calc(var(--space-8) * 4); + padding-top: var(--space-3); +} +.tenant-detail-page .tenant-files { + margin-top: var(--space-3); +} +.tenant-scan-history { + overflow: hidden; + border: var(--bw-hairline) solid var(--border-default); + border-radius: var(--radius-nav-item); + background: + linear-gradient( + 135deg, + var(--surface-panel-raised), + var(--surface-panel)); +} +.tenant-scan-history > summary { + cursor: pointer; + list-style: none; +} +.tenant-scan-history > summary::-webkit-details-marker { + display: none; +} +.tenant-section-bar .tenant-history-meta { + gap: var(--space-5); +} +.tenant-history-meta b { + display: inline-grid; + place-items: center; + min-width: var(--control-h); + min-height: var(--control-h-sm); + padding: 0 var(--space-2); + border: var(--bw-hairline) solid var(--border-default); + border-radius: var(--radius-nav-item); + color: var(--text-secondary); + background: var(--surface-input); + font-size: var(--fs-md); + font-weight: var(--fw-regular); + font-variant-numeric: tabular-nums; +} +.tenant-history-meta .triangle-icon { + transition: transform var(--dur-base) var(--ease); +} +.tenant-scan-history[open] .tenant-history-meta .triangle-icon-right { + transform: rotate(-90deg); +} +.tenant-scan-history > .tenant-file-table { + border: 0; + border-radius: 0; + background: transparent; +} +.tenant-scan-history .tenant-file-row { + min-height: calc(var(--row-h) + var(--space-4)); + padding-inline: var(--space-5); + font-size: var(--fs-md); +} +.tenant-detail-page .tenant-file-row { + grid-template-columns: minmax(calc(var(--space-8) * 5), 1.1fr) minmax(calc(var(--space-8) * 5), 1.15fr) .62fr .55fr .72fr minmax(calc(var(--space-8) * 5), 1.2fr) .55fr; + min-width: calc(var(--space-8) * 29); +} +.tenant-timeslots { + display: grid; + gap: var(--space-3); + margin-top: var(--space-8); +} +.tenant-timeslots-heading { + margin: 0; + color: var(--text); + font-size: calc(var(--fs-xl) * 1.25); + font-weight: var(--fw-semibold); +} +.tenant-timeslots .tenant-files { + margin-top: 0; +} +.tenant-timeslot.is-selected { + border-color: var(--state-active); + outline: var(--bw-hairline) solid var(--state-active); + outline-offset: calc(-1 * var(--bw-hairline)); +} +.tenant-timeslot-title { + display: inline-flex; + align-items: center; + gap: var(--space-3); +} +.tenant-timeslot-title input[type=checkbox] { + width: 16px; + height: 16px; + margin: 0; + accent-color: var(--state-active); + cursor: pointer; +} +.tenant-timeslot-actions { + display: inline-flex; + align-items: center; + justify-content: flex-end; + gap: var(--space-2); + margin-left: auto; + margin-right: var(--space-5); + letter-spacing: normal; + text-transform: none; +} +.tenant-timeslot-actions .btn { + min-width: calc(var(--space-8) * 3); + white-space: nowrap; +} +.tenant-timeslot-actions .btn.primary { + min-width: calc(var(--space-8) * 4); +} +.tenant-timeslot-actions .gpo-folder-actions .btn { + min-width: calc(var(--space-8) * 7); +} +.tenant-timeslot-create-row { + display: grid; + place-items: center; + width: 100%; + min-height: calc(var(--control-h) + var(--space-3)); + padding: 0; + border: var(--bw-hairline) solid var(--border-default); + border-radius: var(--radius-nav-item); + color: var(--text-secondary); + background: var(--surface-panel); + cursor: pointer; +} +.tenant-timeslot-create-row span { + font-size: calc(var(--fs-xl) * 1.6); + font-weight: var(--fw-regular); + line-height: 1; +} +.tenant-timeslot-create-row:hover { + color: var(--text-primary); + background: var(--surface-panel-raised); +} +.tenant-timeslot-create-row:focus-visible { + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: var(--bw-hairline); +} +.tenant-timeslot-selection { + display: flex; + align-items: center; + gap: var(--space-3); + min-height: var(--control-h); + padding: 0; + border: 0; + border-radius: 0; + color: var(--text-secondary); + font-size: var(--fs-lg); +} +.tenant-timeslot-selection strong { + color: var(--text-primary); +} +.tenant-timeslot-report-actions { + display: flex; + align-items: center; + gap: var(--space-1); +} +.tenant-timeslot-report-actions .tenant-scan-delete { + min-width: var(--control-h-sm); + width: var(--control-h-sm); + height: var(--control-h-sm); + padding: 0; +} +.timeslot-dialog-form { + display: grid; + gap: var(--space-4); + min-width: min(360px, 72vw); +} +.timeslot-dialog-form label { + display: grid; + gap: var(--space-2); + color: var(--text-primary); + font-weight: var(--fw-semibold); +} +.timeslot-dialog-form p { + margin: 0; + color: var(--text-secondary); + line-height: 1.5; +} +.timeslot-dialog-form footer { + display: flex; + justify-content: flex-end; + gap: var(--space-2); + padding-top: var(--space-3); + border-top: var(--bw-hairline) solid var(--border-subtle); +} +.tenant-scan-history .tenant-file-head { + min-height: calc(var(--row-h) + var(--space-2)); + background: color-mix(in srgb, var(--surface-input) 36%, transparent); + font-size: var(--fs-sm); +} +.tenant-scan-history .tenant-file-row b { + color: var(--text-primary); + font-weight: var(--fw-semibold); +} +.tenant-scan-history .tenant-scan-delete { + min-width: calc(var(--space-8) * 2.75); +} +@media (max-width: 1050px) { + .tenant-detail-page .tenant-editor-header { + grid-template-columns: 1fr; + } + .tenant-detail-page .tenant-file-row { + min-width: 0; + } +} +@media (max-width: 800px) { + .tenant-detail-page > .tenant-actions { + flex-wrap: wrap; + } + .tenant-timeslot-actions { + flex-wrap: wrap; + justify-content: flex-start; + margin: var(--space-2) 0; + } + .tenant-timeslot > summary { + align-items: flex-start; + flex-wrap: wrap; + padding-block: var(--space-2); + } +} +.datahub-page.tenant-detail-page { + height: 100%; + min-height: 0; + padding: var(--panel-inset); + overflow: hidden; +} +.tenant-detail-page > .tenant-detail-layout { + display: grid; + grid-template-columns: clamp(420px, 27vw, 520px) minmax(0, 1fr); + width: 100%; + max-width: none; + height: 100%; + min-height: 0; + margin: 0; +} +.tenant-detail-navigation, +.tenant-detail-information { + min-width: 0; + min-height: 0; + background: var(--surface-app); +} +.tenant-detail-navigation { + display: flex; + flex-direction: column; + overflow: hidden; + border-right: var(--bw-hairline) solid var(--border-default); +} +.tenant-detail-information { + display: block; + padding: var(--space-5) var(--space-6); + overflow-y: auto; + scrollbar-color: var(--border-strong) var(--surface-panel); + scrollbar-width: thin; +} +.tenant-information-sheet { + width: min(794px, 100%); + background: transparent; +} +.tenant-policy-information { + width: 100%; +} +.tenant-detail-page .tenant-editor-header { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + column-gap: var(--space-3); + flex: 0 0 auto; + padding: var(--space-5) var(--space-5) var(--space-4); + border-bottom: 0; +} +.tenant-detail-page .tenant-back { + grid-column: 1; + justify-self: start; + min-height: var(--control-h); + margin-bottom: 0; + color: var(--text-secondary); +} +.tenant-detail-page .tenant-navigation-open { + grid-column: 2; + justify-self: end; +} +.tenant-detail-page .tenant-identity { + grid-column: 1 / -1; + padding: 0; + margin-top: var(--space-4); +} +.tenant-detail-page .tenant-identity h2 { + padding: 0; + font-size: var(--type-h2-size); + font-weight: var(--fw-semibold); + line-height: 1.15; + letter-spacing: -.03em; +} +.tenant-detail-page .tenant-identity p { + margin: var(--space-2) 0 0; + font-size: var(--fs-lg); +} +.tenant-timeslots { + display: flex; + flex: 1 1 auto; + flex-direction: column; + gap: 0; + min-height: 0; + margin: 0; + overflow: hidden; +} +.tenant-timeslots-header { + display: flex; + flex: 0 0 auto; + align-items: center; + justify-content: space-between; + gap: var(--space-3); + padding: 0 var(--space-5) var(--space-3); + border-bottom: var(--bw-hairline) solid var(--border-default); +} +.tenant-timeslots-heading { + margin: 0; + color: var(--text-primary); + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); + letter-spacing: 0; + text-transform: none; +} +.tenant-timeslot-add { + flex: 0 0 auto; +} +.tenant-timeslot-add > span { + margin-right: var(--space-1); + font-size: var(--fs-lg); + line-height: 1; +} +.tenant-timeslot-list { + display: grid; + grid-auto-rows: max-content; + align-content: start; + flex: 1 1 auto; + gap: var(--space-3); + min-height: 0; + padding: var(--space-2) var(--space-2) var(--space-5); + overflow-y: auto; + scrollbar-color: var(--border-strong) var(--surface-inset); + scrollbar-gutter: stable; + scrollbar-width: thin; +} +.tenant-detail-page .tenant-files { + margin: 0; +} +.tenant-scan-history { + position: relative; + overflow: hidden; + border: var(--bw-hairline) solid var(--border-default); + border-radius: var(--radius-nav-item); + background: var(--surface-panel-raised); +} +.tenant-scan-history::after { + content: none; +} +.tenant-timeslot.is-selected { + border-color: var(--state-active); + outline: var(--bw-hairline) solid var(--state-active); + outline-offset: calc(-1 * var(--bw-hairline)); + box-shadow: inset var(--marker-width) 0 0 var(--state-active); +} +.tenant-timeslot.is-selected::after { + display: none; +} +.tenant-timeslot > .tenant-section-bar { + min-height: calc(var(--row-h) + var(--space-4)); + padding: 0 var(--space-4) 0 var(--space-5); + border-bottom: 0; + background: transparent; + letter-spacing: normal; + text-transform: none; +} +.tenant-timeslot.is-selected > .tenant-section-bar { + background: var(--surface-hover); +} +.tenant-timeslot > .tenant-section-bar:hover { + background: var(--surface-hover); +} +.tenant-timeslot-title { + align-self: stretch; + flex: 0 0 calc(var(--space-8) * 4.25); + padding-left: var(--space-1); + gap: var(--space-3); + cursor: pointer; +} +.tenant-timeslot > .tenant-section-bar > .tenant-history-meta { + align-self: stretch; + flex: 1 1 auto; + justify-content: flex-end; + cursor: pointer; +} +.tenant-timeslot-title input[type=checkbox], +.tenant-report-row input[type=checkbox] { + flex: 0 0 auto; + width: var(--space-4); + height: var(--space-4); + margin: 0; + accent-color: var(--state-active); + cursor: pointer; +} +.tenant-timeslot-title strong { + color: var(--text-primary); + font-size: var(--fs-lg); + font-weight: var(--fw-semibold); + font-variant-numeric: tabular-nums; +} +.tenant-section-bar .tenant-history-meta { + gap: var(--space-4); +} +.tenant-history-meta b { + min-width: var(--control-h); + min-height: var(--control-h); + border-color: var(--border-default); + background: var(--surface-panel-raised); + font-size: var(--fs-md); +} +.tenant-report-list { + border-top: var(--bw-hairline) solid var(--border-subtle); + container: timeslot-sources / inline-size; +} +.tenant-report-row { + display: grid; + grid-template-columns: var(--space-5) minmax(calc(var(--space-8) * 3.75), 1fr) calc(var(--space-8) * 4.25) calc(var(--space-8) * 3) calc(var(--space-8) * 2); + align-items: center; + gap: var(--space-2); + min-height: calc(var(--row-h) + var(--space-5)); + padding: var(--space-2) var(--space-3); + border-bottom: var(--bw-hairline) solid var(--border-subtle); + background: var(--surface-panel-raised); +} +.tenant-report-row:last-child { + border-bottom: 0; +} +.tenant-report-row:not(.tenant-report-head):hover { + background: var(--surface-hover); +} +.tenant-report-head { + min-height: calc(var(--row-h) + var(--space-2)); + color: var(--text-secondary); + background: var(--surface-panel); + font-size: var(--type-table-head-size); + font-weight: var(--fw-semibold); + letter-spacing: var(--ls-caps); + text-transform: uppercase; +} +.tenant-report-copy { + display: grid; + gap: var(--space-1); + min-width: 0; +} +.tenant-report-row > * { + min-width: 0; +} +.tenant-report-copy > * { + min-width: 0; +} +.tenant-report-copy b { + overflow: hidden; + color: var(--text-primary); + font-size: var(--fs-lg); + font-weight: var(--fw-regular); + text-overflow: ellipsis; + white-space: nowrap; +} +.tenant-report-copy small { + overflow: hidden; + color: var(--text-secondary); + font-size: var(--type-meta-size); + font-variant-numeric: tabular-nums; + text-overflow: ellipsis; + white-space: nowrap; +} +.tenant-report-imported { + overflow: hidden; + color: var(--text-primary); + font-size: var(--type-body-size); + font-variant-numeric: tabular-nums; + text-overflow: ellipsis; + white-space: nowrap; +} +.tenant-report-status { + display: inline-flex; + align-items: center; + gap: var(--space-2); + min-width: 0; + color: var(--text-primary); + font-size: var(--type-body-size); + font-weight: var(--fw-regular); + white-space: nowrap; +} +.tenant-report-status::before { + flex: 0 0 auto; + width: var(--space-2); + height: var(--space-2); + border-radius: 50%; + background: var(--text-secondary); + content: ""; +} +.tenant-report-status[data-status=recognized]::before { + background: var(--state-done); +} +.tenant-report-status[data-status=succeeded]::before { + background: var(--state-done); +} +.tenant-report-status[data-status=generic]::before { + background: var(--outcome-warning); +} +.tenant-report-status[data-status=queued]::before, +.tenant-report-status[data-status=running]::before { + background: var(--info); +} +.tenant-report-status[data-status=partial]::before, +.tenant-report-status[data-status=upload-required]::before, +.tenant-report-status[data-status=storage-unavailable]::before, +.tenant-report-status[data-status=recovery-required]::before { + background: var(--warning); +} +.tenant-report-status[data-status=not-viewable]::before, +.tenant-report-status[data-status=unavailable]::before, +.tenant-report-status[data-status=processing-error]::before, +.tenant-report-status[data-status=dead-letter]::before { + background: var(--state-offline); +} +.tenant-report-status[data-status=processing-error] { + color: var(--state-offline); +} +.tenant-report-status[data-status=dead-letter] { + color: var(--state-offline); +} +.tenant-report-status[data-status=reimport-recommended]::before, +.tenant-report-status[data-status=re-evaluation-required]::before, +.tenant-report-status[data-status=review-required]::before { + background: var(--warning); +} +.tenant-report-status[data-status=reimport-recommended], +.tenant-report-status[data-status=re-evaluation-required], +.tenant-report-status[data-status=review-required] { + color: var(--warning); +} +.tenant-processing-alert { + display: grid; + gap: var(--space-3); + margin: var(--space-4) var(--space-5); + padding: var(--space-4); + border: var(--bw-hairline) solid var(--warning); + color: var(--text-primary); + background: color-mix(in srgb, var(--warning) 8%, var(--surface-panel)); +} +.tenant-processing-alert > header { + display: grid; + gap: var(--space-1); +} +.tenant-processing-alert > header > strong { + color: var(--warning); + font-size: var(--fs-lg); +} +.tenant-processing-alert[data-status=error] { + border-color: var(--state-offline); + background: color-mix(in srgb, var(--state-offline) 8%, var(--surface-panel)); +} +.tenant-processing-alert[data-status=error] > header > strong { + color: var(--state-offline); +} +.tenant-processing-alert > header > span { + color: var(--text-secondary); + font-size: var(--fs-md); +} +.tenant-processing-alert-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: var(--space-4); + padding-top: var(--space-3); + border-top: var(--bw-hairline) solid var(--border-subtle); +} +.tenant-processing-alert-row p { + margin: var(--space-1) 0 0; + color: var(--text-secondary); + font-size: var(--fs-md); + line-height: var(--lh-prose); +} +.tenant-processing-alert-row .btn { + white-space: nowrap; +} +.tenant-report-row input[type=checkbox]:disabled { + cursor: not-allowed; + opacity: .42; +} +.tenant-report-row .tenant-scan-delete { + min-width: calc(var(--space-8) * 2); + width: 100%; +} +.tenant-report-gpo .tenant-report-copy b, +.tenant-report-gpo .tenant-report-copy small { + overflow: visible; + text-overflow: clip; + white-space: normal; + overflow-wrap: normal; +} +.tenant-report-gpo { + grid-template-columns: var(--space-5) minmax(0, 1fr) minmax(0, 8rem) minmax(0, 11rem) minmax(0, 7rem); +} +.tenant-report-gpo .tenant-report-status { + display: block; + white-space: normal; + overflow: visible; +} +.tenant-report-gpo .tenant-report-status::before { + display: inline-block; + margin-inline-end: var(--space-1); +} +.tenant-report-gpo .tenant-gpo-row-actions .btn { + white-space: normal; + word-break: normal; +} +@container timeslot-sources (max-width: 620px) { + .tenant-report-row:not(.tenant-report-head) { + grid-template-columns: var(--space-5) minmax(0, 1fr) calc(var(--space-8) * 2.5); + align-items: start; + } + .tenant-report-head { + display: none; + } + .tenant-report-row > :first-child { + grid-column: 1; + grid-row: 1; + } + .tenant-report-row > :not(:first-child) { + grid-column: 2; + } + .tenant-report-row > :last-child { + grid-column: 3; + grid-row: 1 / span 3; + align-self: start; + } + .tenant-report-copy b, + .tenant-report-copy small, + .tenant-report-imported { + overflow: visible; + text-overflow: clip; + white-space: normal; + overflow-wrap: anywhere; + } + .tenant-report-imported { + font-size: var(--type-meta-size); + } + .tenant-report-imported::before { + content: "Imported: "; + color: var(--text-secondary); + } + .tenant-report-status { + flex-wrap: wrap; + font-size: var(--type-table-body-size); + } +} +.tenant-gpo-source-marker { + display: grid; + place-items: center; + width: var(--space-5); + height: var(--space-5); + color: var(--surface-app); + background: var(--marking-color); + font-size: var(--type-badge-size); + font-weight: var(--fw-semibold); +} +.tenant-report-row .tenant-gpo-view { + min-width: calc(var(--space-8) * 2); + width: 100%; +} +.tenant-gpo-row-actions { + display: grid; + gap: var(--space-1); +} +.gpo-source-recovery { + flex-wrap: wrap; + min-width: 0; +} +.gpo-source-recovery .gpo-folder-feedback { + position: static; + width: 100%; + overflow-wrap: normal; +} +.tenant-gpo-row-actions .btn { + width: 100%; + min-width: 0; + padding-inline: var(--space-1); +} +.tenant-report-row .btn:not(.danger):not(.primary):hover:not(:disabled) { + background: var(--button-bg); + color: var(--button-text); + border-color: var(--border-strong); +} +.tenant-report-no-action { + color: var(--text-secondary); + text-align: center; +} +.tenant-timeslot-actions { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--space-2); + margin: 0; + padding: var(--space-3) var(--space-4) var(--space-3) var(--space-8); + border-top: var(--bw-hairline) solid var(--border-subtle); + background: var(--surface-panel-raised); +} +.tenant-timeslot-actions .btn, +.tenant-timeslot-actions .gpo-folder-actions, +.tenant-timeslot-actions .gpo-folder-actions .btn { + width: 100%; + min-width: 0; + white-space: nowrap; +} +.tenant-timeslot-actions .gpo-folder-actions { + display: contents; +} +.tenant-timeslot-add-heading { + grid-column: 1 / -1; + display: grid; + gap: var(--space-1); + margin-bottom: var(--space-1); +} +.tenant-timeslot-add-heading h4 { + margin: 0; + font-size: var(--type-body-size); + font-weight: var(--fw-semibold); +} +.tenant-timeslot-add-heading span, +.tenant-timeslot-delete-action > span { + color: var(--text-secondary); + font-size: var(--type-meta-size); +} +.tenant-timeslot-delete-action { + grid-column: 1 / -1; + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + gap: var(--space-2); + margin-top: var(--space-2); + padding-top: var(--space-3); + border-top: var(--bw-hairline) solid var(--border-subtle); +} +.tenant-timeslot-delete-action .btn { + width: auto; +} +.tenant-timeslot-actions .gpo-folder-feedback { + position: static; + grid-column: 1 / -1; + width: auto; +} +.tenant-files-empty { + margin: 0; + border: 0; + border-top: var(--bw-hairline) solid var(--border-subtle); + border-radius: 0; + background: var(--surface-panel-raised); +} +.tenant-information-header { + display: flex; + flex: 0 0 auto; + align-items: center; + justify-content: space-between; + gap: var(--space-4); + min-height: calc(var(--row-h) + var(--space-3)); + padding: 0 0 var(--space-3); + border-bottom: var(--bw-hairline) solid var(--border-default); + background: transparent; +} +.tenant-information-title, +.tenant-information-actions { + display: inline-flex; + align-items: center; + gap: var(--space-2); +} +.tenant-information-actions { + flex-wrap: wrap; + justify-content: flex-end; +} +.tenant-information-title > strong { + color: var(--text-primary); + font-size: var(--type-h3-size); + font-weight: var(--fw-semibold); + letter-spacing: 0; + text-transform: none; +} +.tenant-edit-client, +.tenant-save-client { + min-width: calc(var(--space-8) * 3); +} +.tenant-detail-page .tenant-editor-form { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 0; + padding: 0; +} +.tenant-detail-page .tenant-editor-form label { + display: block; + min-height: 0; + padding: var(--space-5) 0; + border-bottom: var(--bw-hairline) solid var(--border-subtle); +} +.tenant-detail-page .tenant-editor-form .tenant-field-label { + display: flex; + align-items: baseline; + justify-content: space-between; + justify-self: stretch; + gap: var(--space-2); + margin-bottom: var(--space-3); + padding: 0; + color: var(--text-primary); + background: transparent; + font-size: var(--type-label-size); + font-weight: var(--fw-semibold); + letter-spacing: 0; + text-transform: none; +} +.tenant-detail-page .tenant-editor-form .tenant-field-label i { + color: var(--text-secondary); + font-size: var(--fs-md); + font-style: normal; + font-weight: var(--fw-regular); +} +.tenant-detail-page .tenant-editor-form .tenant-field-value { + display: block; + justify-self: start; + color: var(--text-primary); + font-size: var(--type-body-size); + font-weight: var(--fw-regular); + letter-spacing: normal; + line-height: var(--lh-prose); + text-align: left; + text-transform: none; +} +.tenant-field-prose { + white-space: pre-wrap; +} +.tenant-detail-page .tenant-editor-form .input { + min-height: var(--control-h); + width: auto; + min-width: 0; + padding: 0; + border: 0; + border-radius: 0; + color: var(--text-primary); + background: transparent; + font-size: var(--fs-lg); +} +.tenant-detail-page .tenant-editor-form textarea.input { + display: block; + width: 100%; + min-height: calc(var(--space-8) * 2); + line-height: var(--lh-prose); + resize: none; +} +.tenant-detail-page .tenant-editor-form.is-editing .input { + min-height: calc(var(--control-h) + var(--space-3)); + margin: 0; + padding: 0 var(--space-3); + border: var(--bw-hairline) solid var(--border-default); + border-radius: var(--btn-radius); + background: var(--surface-input); +} +.tenant-detail-page .tenant-editor-form.is-editing textarea.input { + min-height: calc(var(--space-8) * 8); + padding-top: var(--space-3); + resize: vertical; +} +.tenant-detail-page .tenant-editor-form .input[readonly] { + border: 0; + color: var(--text-primary); + background: transparent; +} +.tenant-information-sheet > .datahub-alert, +.tenant-information-sheet > .tenant-save-feedback { + width: auto; + margin: var(--space-3) 0; +} +.tenant-delete-client { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: calc(var(--space-8) * 3); + margin: 0; + cursor: pointer; +} +.tenant-delete-client:focus-visible { + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: var(--space-1); +} +@media (max-width: 1050px) { + .datahub-page.tenant-detail-page { + height: auto; + min-height: 100%; + overflow: visible; + } + .tenant-detail-page > .tenant-detail-layout { + grid-template-columns: 1fr; + height: auto; + } + .tenant-detail-navigation { + max-height: calc(var(--space-8) * 20); + border-right: 0; + border-bottom: var(--bw-hairline) solid var(--border-default); + } + .tenant-detail-information { + min-height: calc(var(--space-8) * 15); + overflow: visible; + } + .tenant-information-sheet { + width: 100%; + } +} +@media (max-width: 700px) { + .tenant-timeslot-actions { + grid-template-columns: 1fr; + } + .tenant-detail-page .tenant-editor-form label { + grid-template-columns: 1fr; + gap: var(--space-2); + } +} + +/* src/styles/datahub-redesign.css */ +.datahub-page > .datahub-rack-module { + width: min(1180px, 100%); + margin-inline: auto; +} +.datahub-rack-module { + box-sizing: border-box; + margin: 0 0 var(--legacy-space-4); + border: var(--border-hair) solid var(--line); + color: var(--text); + background: var(--panel); +} +.datahub-history-module { + overflow: hidden; +} +.datahub-history-scroll { + overflow-x: auto; + scrollbar-color: var(--line-strong) var(--surface-app); + scrollbar-width: thin; +} +.datahub-history-grid { + display: flex; + width: 100%; + min-width: 1180px; + background: var(--surface-app); +} +.datahub-history-column { + display: grid; + flex: 1 0 145px; + grid-template-rows: var(--row-height) minmax(160px, auto) 40px; + min-width: 145px; + border-right: var(--border-hair) solid var(--line); + background: var(--panel); +} +.datahub-history-column > header { + display: grid; + grid-template-columns: minmax(0, 1fr); + align-items: center; + border-bottom: var(--border-hair) solid var(--line); + background: var(--panel-raised); +} +.datahub-history-column.placeholder > header { + display: grid; + grid-template-columns: 1fr; + place-items: center; + color: var(--muted); + font-size: var(--ui-body-size); +} +.datahub-history-column.active > header { + color: var(--state-selected-text); + background: var(--state-selected); +} +.datahub-client-name { + height: 100%; + min-width: 0; + padding: 0 var(--legacy-space-3); + overflow: hidden; + border: 0; + color: inherit; + background: transparent; + cursor: pointer; + font-size: var(--ui-body-size); + font-weight: var(--ui-strong-weight); + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; +} +.datahub-history-rows { + display: grid; + align-content: start; + background: var(--panel); +} +.datahub-history-row { + display: grid; + grid-template-columns: 28px minmax(0, 1fr) 40px; + align-items: center; + min-height: 40px; + padding: 0 var(--legacy-space-2); + border-bottom: var(--border-hair) solid var(--line); + background: var(--panel); +} +.datahub-history-row:hover { + background: var(--panel-hover); +} +.datahub-history-row.selected { + outline: var(--border-hair) solid var(--marking-color); + outline-offset: -1px; +} +.datahub-history-row.current, +.datahub-history-row.selected { + color: var(--state-selected-text); + background: var(--state-selected); +} +.datahub-history-row.empty { + grid-template-columns: 1fr; +} +.datahub-history-row.empty i { + width: 12px; + height: 12px; + background: var(--surface-input); +} +.datahub-history-select, +.datahub-history-date { + color: inherit; + cursor: pointer; +} +.datahub-history-select { + display: grid; + place-items: center; + width: 24px; + height: 24px; + padding: 0; + border: var(--border-hair) solid var(--line-strong); + background: var(--surface-input); + font-size: var(--ui-small-size); +} +.datahub-history-select[aria-pressed=true] { + border-color: var(--state-selected-text); +} +.datahub-history-date { + min-width: 0; + padding: 0 var(--legacy-space-1); + overflow: hidden; + border: 0; + background: transparent; + font-size: var(--ui-body-size); + font-variant-numeric: tabular-nums; + font-weight: var(--ui-strong-weight); + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; +} +.datahub-history-source { + color: inherit; + font-family: var(--font-mono); + font-size: var(--ui-small-size); + text-align: right; + opacity: .8; +} +.datahub-history-column > footer { + display: grid; + place-items: center; + padding: var(--legacy-space-1); + border-top: var(--border-hair) solid var(--line); + background: var(--panel-raised); +} +.datahub-history-column > footer strong { + font-family: var(--font-mono); + font-size: var(--ui-body-size); + font-weight: var(--ui-strong-weight); +} +.datahub-history-column.placeholder > footer i { + width: calc(100% - var(--legacy-space-2)); + height: 30px; + border: var(--border-hair) solid var(--line-strong); + background: var(--surface-input); +} +.datahub-add-client { + display: grid; + flex: 0 0 66px; + grid-template-rows: var(--row-height) minmax(160px, auto) 40px; + width: 66px; + min-width: 66px; + padding: 0; + border: 0; + border-left: var(--border-hair) solid var(--line); + color: var(--muted); + background: var(--panel); + cursor: pointer; +} +.datahub-add-client:hover { + color: var(--heading); + background: var(--panel-hover); +} +.datahub-add-client strong { + display: grid; + place-items: center; + width: 100%; + height: var(--row-height); + border-bottom: var(--border-hair) solid var(--line); + background: var(--panel-raised); + font-size: var(--ui-heading-size); + font-weight: 400; +} +.datahub-add-client > span { + border-bottom: var(--border-hair) solid var(--line); +} +.datahub-add-client footer { + display: grid; + place-items: center; + padding: var(--legacy-space-1); + border-top: var(--border-hair) solid var(--line); + background: var(--panel-raised); +} +.datahub-add-client footer i { + width: calc(100% - var(--legacy-space-2)); + height: 30px; + border: var(--border-hair) solid var(--line-strong); + background: var(--surface-input); +} +.datahub-status-module { + min-height: 0; + padding: 0; + border: 0; + background: transparent; +} +.datahub-reference-controls { + width: 100%; +} +.datahub-reference-knob { + font-style: normal; +} +.datahub-comparison-error { + display: block; + margin: 0 var(--legacy-space-3) var(--legacy-space-2); + color: var(--danger-text); + font-size: var(--ui-control-size); + font-style: normal; +} +.datahub-tenants-module { + min-height: 0; + padding: 0; + border: 0; + background: transparent; +} +.datahub-tenant-card-rack { + display: grid; + grid-template-columns: repeat(auto-fill, var(--tile-compact-width)); + justify-content: start; + gap: var(--segment-gap); + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); + box-shadow: none; +} +.datahub-tenant-card { + position: relative; + min-height: var(--donut-card-min-h); + padding: 0; + transition: background .12s ease, border-color .12s ease; +} +.datahub-tenant-card::before { + content: none; +} +.datahub-tenant-card:hover, +.datahub-tenant-card:focus-within { + border-color: transparent; + background: var(--tile-surface-hover); + box-shadow: var(--tile-card-shadow); +} +.datahub-tenant-card.is-selected { + border-color: var(--tile-selected-border); + outline: var(--bw-emphasis) solid var(--tile-selected-border); + outline-offset: calc(-1 * var(--bw-emphasis)); +} +.datahub-tenant-processing-dot { + position: absolute; + z-index: 3; + top: var(--datahub-readiness-dot-inset); + left: var(--datahub-readiness-dot-inset); + width: var(--datahub-readiness-dot-size); + height: var(--datahub-readiness-dot-size); + border: var(--border-hair) solid var(--surface-app); + border-radius: 50%; + background: var(--state-online); + pointer-events: none; +} +.datahub-tenant-processing-dot[data-status=update], +.datahub-tenant-processing-dot[data-status=review] { + background: var(--warning); +} +.datahub-tenant-processing-dot[data-status=processing], +.datahub-tenant-processing-dot[data-status=error] { + background: var(--state-offline); +} +.datahub-tenant-select { + position: absolute; + inset: 0; + display: grid; + grid-template-rows: minmax(0, 1fr) auto auto; + align-items: start; + width: 100%; + min-width: 0; + padding: var(--space-5) var(--space-3) var(--space-3); + border: 0; + color: inherit; + background: transparent; + text-align: left; + cursor: pointer; +} +.datahub-tenant-select:focus-visible, +.datahub-tenant-add:focus-visible { + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: calc(-1 * var(--bw-emphasis)); +} +.datahub-tenant-name { + display: -webkit-box; + align-self: center; + justify-self: center; + min-width: 0; + max-width: 100%; + overflow: hidden; + color: var(--donut-value); + font: var(--fw-semibold) calc(var(--donut-title-size) * 1.35) / 1.15 var(--font-donut-display); + overflow-wrap: anywhere; + text-align: center; + text-overflow: ellipsis; + white-space: normal; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} +.datahub-tenant-summary { + align-self: end; + justify-self: start; + display: flex; + align-items: baseline; + gap: var(--space-1); + margin-bottom: var(--space-1); + color: var(--muted); + font-family: var(--font-donut-display); + font-variant-numeric: tabular-nums; +} +.datahub-tenant-summary strong { + color: inherit; + font-size: var(--ui-body-size); + font-weight: var(--fw-semibold); + line-height: 1; +} +.datahub-tenant-summary small, +.datahub-tenant-latest { + color: var(--muted); + font-size: var(--ui-small-size); + font-weight: var(--fw-regular); +} +.datahub-tenant-latest { + min-width: 0; + max-width: calc(100% - 68px); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + opacity: .72; +} +.datahub-tenant-show, +.datahub-tenant-show:hover, +.datahub-tenant-show:active { + position: absolute; + z-index: 2; + top: var(--space-3); + right: var(--space-3); + min-width: 52px; + border-color: var(--button-border); + color: var(--button-marked-text); + background: var(--button-marked-bg); +} +.datahub-tenant-show[data-status=update], +.datahub-tenant-show[data-status=update]:hover, +.datahub-tenant-show[data-status=update]:active, +.datahub-tenant-show[data-status=review], +.datahub-tenant-show[data-status=review]:hover, +.datahub-tenant-show[data-status=review]:active { + border-color: var(--warning); + color: var(--warning); + background: color-mix(in srgb, var(--warning) 8%, var(--donut-card-surface)); +} +.datahub-tenant-show[data-status=error], +.datahub-tenant-show[data-status=error]:hover, +.datahub-tenant-show[data-status=error]:active { + border-color: var(--state-offline); + color: var(--state-offline); + background: color-mix(in srgb, var(--state-offline) 8%, var(--donut-card-surface)); +} +.datahub-tenant-open, +.datahub-tenant-open:hover, +.datahub-tenant-open:active { + position: absolute; + z-index: 2; + right: var(--space-3); + bottom: var(--space-3); + min-width: 52px; +} +.datahub-tenant-add { + display: grid; + place-items: center; + color: var(--muted); + cursor: pointer; +} +.datahub-tenant-add:hover { + color: var(--donut-all); +} +.datahub-tenant-add > span { + font-family: var(--font-donut-display); + font-size: calc(var(--donut-value-size) * 1.7); + font-weight: var(--fw-regular); + line-height: 1; + opacity: .48; +} +.datahub-tenant-add:hover > span { + opacity: .78; +} +@media (prefers-reduced-motion: reduce) { + .datahub-tenant-card { + transition: none; + } +} +@media (max-width: 1100px) { + .datahub-tenant-card-rack { + grid-template-columns: repeat(auto-fill, var(--tile-compact-width)); + } +} +@media (max-width: 760px) { + .datahub-tenant-card-rack { + grid-template-columns: minmax(0, var(--tile-compact-width)); + } +} +.datahub-reference-module { + overflow: hidden; +} +.datahub-rack-header { + display: grid; + grid-template-columns: 24px 12px minmax(0, 1fr) auto; + align-items: center; + gap: var(--legacy-space-2); + min-height: 46px; + padding: 0 var(--legacy-space-3); + border-bottom: var(--border-hair) solid var(--line); + background: var(--panel-raised); +} +.datahub-rack-header > strong { + overflow: hidden; + color: var(--text); + font-size: var(--ui-body-size); + font-weight: var(--ui-label-weight); + letter-spacing: .02em; + text-overflow: ellipsis; + white-space: nowrap; +} +.datahub-grip { + color: var(--muted); + font-size: var(--ui-heading-size); +} +.datahub-led { + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--success); +} +.datahub-rack-badge { + min-height: 24px; + padding: 2px var(--legacy-space-2); + border: var(--border-hair) solid var(--line-strong); + color: var(--text); + background: var(--surface-input); + font-size: var(--ui-small-size); + line-height: 20px; + font-variant-numeric: tabular-nums; + white-space: nowrap; +} +.datahub-rack-body { + display: flex; + align-items: center; + justify-content: flex-end; + gap: var(--legacy-space-2); + min-height: 62px; + padding: var(--legacy-space-2) var(--legacy-space-3); +} +.datahub-rack-actions { + display: flex; + align-items: center; + gap: var(--legacy-space-2); +} +.datahub-maintenance-action { + border: var(--bw-hairline) solid var(--button-border); + color: var(--button-marked-text); + background: var(--button-marked-bg); + font-weight: var(--ui-strong-weight); + cursor: pointer; +} +.datahub-maintenance-action:hover { + background: var(--button-marked-bg-hover); +} +.datahub-maintenance-action:disabled { + color: var(--muted); + background: var(--surface-active); + cursor: default; +} +.datahub-reference-row { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + align-items: start; + gap: var(--legacy-space-4); +} +.datahub-reference-row > .mitre-library { + grid-area: 1 / 1 / 2 / -1; +} +.datahub-reference-row > .baseline-catalog { + grid-area: 2 / 1 / 3 / -1; + margin-top: 0; +} +.datahub-reference-row.is-mitre-hidden > .baseline-catalog { + grid-area: 1 / 1 / 2 / -1; +} +.datahub-reference-row > .datahub-rack-module { + margin-bottom: 0; +} +.baseline-upload-action { + flex: 0 0 auto; + text-transform: none; + letter-spacing: normal; +} +.tenant-section-bar .baseline-title { + gap: var(--space-3); +} +.tenant-timeslot-toolbar { + display: grid; + grid-template-columns: minmax(220px, .8fr) minmax(340px, 1fr); + align-items: end; + gap: var(--legacy-space-3) var(--legacy-space-5); + margin-bottom: var(--legacy-space-4); + padding: var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + background: var(--panel-raised); +} +.tenant-timeslot-toolbar label { + display: grid; + gap: var(--legacy-space-2); + color: var(--heading); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); +} +.tenant-timeslot-toolbar p { + grid-column: 1 / -1; + margin: 0; + color: var(--muted); +} +.tenant-timeslot-create { + display: grid; + grid-template-columns: minmax(180px, 1fr) auto; + align-items: end; + gap: var(--legacy-space-2); +} +.tenant-file-row.is-active-timeslot { + background: var(--state-selected-flat); +} +.tenant-file-row.is-active-timeslot > span:first-child { + border-left: var(--marker-width) solid var(--state-selected); + padding-left: var(--legacy-space-2); +} +@media (max-width: 760px) { + .datahub-reference-row { + grid-template-columns: minmax(0, 1fr); + } + .datahub-reference-row > .mitre-library { + grid-area: 1 / 1; + } + .datahub-reference-row > .baseline-catalog { + grid-area: 2 / 1; + } + .datahub-reference-row.is-mitre-hidden > .baseline-catalog { + grid-area: 1 / 1; + } + .tenant-timeslot-toolbar, + .tenant-timeslot-create { + grid-template-columns: 1fr; + } + .datahub-rack-header { + grid-template-columns: 20px 10px minmax(0, 1fr) auto; + } + .datahub-rack-actions { + justify-content: stretch; + } + .datahub-rack-actions > * { + flex: 1; + } +} + +/* src/styles/policy-analysis.css */ +.policy-analysis-panel { + margin-top: var(--legacy-space-6); + padding-top: var(--legacy-space-5); + border-top: var(--border-hair) solid var(--line); +} +.policy-analysis-boundary { + margin: 0 0 var(--legacy-space-4); + padding: var(--legacy-space-3); + border-left: 3px solid var(--warning); + color: var(--heading); + background: var(--panel-soft); + font-size: var(--ui-control-size); + line-height: 1.5; +} +.policy-analysis-empty { + padding-block: 28px; +} +.policy-analysis-result-groups { + display: grid; + gap: var(--legacy-space-5); +} +.policy-analysis-result-group { + display: grid; + gap: var(--legacy-space-2); +} +.policy-analysis-result-group > h4 { + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); +} +.policy-analysis-summary { + display: grid; + grid-template-columns: repeat(auto-fill, var(--tile-compact-width)); + justify-content: start; + gap: var(--segment-gap); + padding: var(--segment-inset); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.policy-analysis-summary article { + display: grid; + gap: var(--legacy-space-1); + min-width: 0; + padding: var(--legacy-space-3); + overflow: hidden; + border: 0; + border-left: 3px solid var(--line-strong); + border-radius: var(--tile-radius); + background: var(--tile-surface); + box-shadow: none; +} +.policy-analysis-summary article[data-result=pass] { + border-left-color: var(--success); +} +.policy-analysis-summary article[data-result=fail] { + border-left-color: var(--critical); +} +.policy-analysis-summary span { + color: var(--muted); + font-size: var(--ui-control-size); +} +.policy-analysis-summary strong { + color: var(--heading); + font-family: inherit; + font-size: var(--ui-heading-size); +} +.policy-analysis-summary small { + color: var(--muted); + font-size: var(--ui-small-size); + line-height: 1.4; +} +.policy-analysis-problems article { + min-height: 116px; +} +.policy-analysis-technical, +.policy-analysis-controls { + margin-top: var(--legacy-space-5); + border-top: var(--border-hair) solid var(--line); +} +.policy-analysis-technical > summary, +.policy-analysis-controls > summary { + width: fit-content; + padding: var(--legacy-space-3) 0; + cursor: pointer; + color: var(--heading); + font-size: var(--ui-control-size); + font-weight: var(--ui-strong-weight); +} +.policy-analysis-technical[open] > summary, +.policy-analysis-controls[open] > summary { + margin-bottom: var(--legacy-space-3); +} +.policy-analysis-columns { + display: grid; + grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); + gap: var(--legacy-space-4); + align-items: start; +} +.policy-analysis-columns > section { + min-width: 0; + padding: var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + background: var(--panel); +} +.policy-analysis-subheading { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--legacy-space-2); + margin-bottom: var(--legacy-space-2); +} +.policy-analysis-subheading h4 { + margin: 0; + color: var(--heading); + font-size: var(--ui-body-size); +} +.policy-analysis-subheading span { + color: var(--muted); + font-family: var(--font-mono); + font-size: var(--ui-control-size); +} +.policy-analysis-muted { + margin: 0; + color: var(--muted); + font-size: var(--ui-control-size); + line-height: 1.5; +} +.policy-evaluation-list, +.policy-review-list { + display: grid; + gap: var(--legacy-space-2); +} +.policy-evaluation-list article { + padding: var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + border-left: 3px solid var(--marking-color); + background: var(--panel-raised); +} +.policy-evaluation-list header, +.policy-evaluation-list footer { + display: flex; + justify-content: space-between; + gap: var(--legacy-space-2); + color: var(--muted); + font-size: var(--ui-control-size); +} +.policy-evaluation-list header strong, +.policy-evaluation-list footer strong { + color: var(--heading); +} +.policy-evaluation-list article > div { + display: flex; + flex-wrap: wrap; + gap: var(--legacy-space-1) var(--legacy-space-3); + margin: var(--legacy-space-2) 0; + color: var(--muted); + font-size: var(--ui-control-size); +} +.policy-review-item { + border: var(--border-hair) solid var(--line); + border-left: 3px solid var(--warning); + background: var(--panel-raised); +} +.policy-review-item summary { + display: flex; + justify-content: space-between; + gap: var(--legacy-space-3); + padding: var(--legacy-space-2) var(--legacy-space-3); + cursor: pointer; +} +.policy-review-item summary strong { + color: var(--heading); + font-size: var(--ui-control-size); +} +.policy-review-item summary span { + color: var(--muted); + font-size: var(--ui-small-size); + text-align: right; +} +.policy-review-detail { + display: grid; + gap: var(--legacy-space-1); + padding: var(--legacy-space-2) var(--legacy-space-3) var(--legacy-space-3); + border-top: var(--border-hair) dashed var(--line); + color: var(--muted); + font-size: var(--ui-small-size); + overflow-wrap: anywhere; +} +.policy-review-detail code { + display: inline-block; + margin: 0 var(--legacy-space-1) var(--legacy-space-1) 0; + color: var(--heading); +} +@media (max-width: 900px) { + .policy-analysis-columns { + grid-template-columns: 1fr; + } +} + +/* src/styles/policy-analysis-actions.css */ +.policy-orchestration { + margin-top: var(--legacy-space-6); + padding-top: var(--legacy-space-5); + border-top: var(--border-hair) solid var(--line); +} +.policy-profile-editor { + margin-top: var(--legacy-space-3); + border: var(--border-hair) solid var(--line); + background: var(--panel); +} +.policy-profile-editor > summary { + padding: var(--legacy-space-3); + color: var(--heading); + font-weight: var(--ui-strong-weight); + cursor: pointer; +} +.policy-profile-editor form { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--legacy-space-3); + padding: var(--legacy-space-3); + border-top: var(--border-hair) solid var(--line); +} +.policy-profile-editor label { + display: grid; + gap: var(--legacy-space-1); + color: var(--heading); + font-size: var(--ui-control-size); +} +.policy-profile-editor label > span { + color: var(--muted); + font-size: var(--ui-small-size); +} +.policy-profile-editor fieldset { + display: grid; + grid-column: 1 / -1; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: var(--legacy-space-3); + margin: 0; + padding: var(--legacy-space-3); + border: var(--border-hair) solid var(--line); +} +.policy-profile-editor legend { + padding-inline: var(--legacy-space-1); + color: var(--muted); + font-size: var(--ui-label-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.policy-profile-editor .policy-profile-product-toggle { + display: flex; + grid-column: 1 / -1; + grid-template-columns: auto 1fr; + align-items: center; +} +.policy-profile-editor footer { + display: flex; + grid-column: 1 / -1; + justify-content: flex-end; +} +.policy-action-stages { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--segment-gap); + margin-top: var(--legacy-space-4); + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.policy-action-stages > section { + min-width: 0; + padding: var(--legacy-space-3); + overflow: hidden; + border: var(--border-hair) solid var(--tile-border); + border-radius: var(--tile-radius); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); +} +.policy-action-stages h4 { + margin: 0 0 var(--legacy-space-2); + color: var(--heading); + font-size: var(--ui-body-size); +} +.policy-action-stages section > p { + margin: 0; + color: var(--muted); + font-size: var(--ui-control-size); +} +.policy-action-stages article { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--legacy-space-3); + padding: var(--legacy-space-2) 0; + border-top: var(--border-hair) solid var(--line); +} +.policy-action-stages article > div { + display: grid; + gap: var(--legacy-space-1); + min-width: 0; + color: var(--muted); + font-size: var(--ui-small-size); +} +.policy-action-stages article strong { + color: var(--heading); + font-size: var(--ui-control-size); +} +.policy-action-stages article code { + overflow: hidden; + color: var(--muted); + text-overflow: ellipsis; + white-space: nowrap; +} +.policy-action-reasons { + display: flex; + flex-wrap: wrap; + gap: var(--legacy-space-1); +} +.policy-action-reasons code { + color: var(--warning); + white-space: normal; + overflow-wrap: anywhere; +} +@media (max-width: 1000px) { + .policy-action-stages { + grid-template-columns: 1fr; + } + .policy-profile-editor fieldset { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} +@media (max-width: 620px) { + .policy-profile-editor form, + .policy-profile-editor fieldset { + grid-template-columns: 1fr; + } +} + +/* src/styles/import-workflow.css */ +.dialog-backdrop { + position: fixed; + inset: 0; + z-index: 1000; + display: grid; + place-items: center; + padding: 24px; + background: var(--surface-scrim); + -webkit-backdrop-filter: blur(8px); + backdrop-filter: blur(8px); +} +.dialog-window { + width: min(500px, 100%); + max-height: calc(100vh - 48px); + display: flex; + flex-direction: column; + border: 1px solid var(--line-strong); + border-radius: 14px; + background: var(--panel); + box-shadow: var(--shadow); +} +.dialog-window > header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 16px 20px; + border-bottom: 1px solid var(--line); +} +.dialog-window > header h2 { + margin: 0; + font-size: var(--ui-heading-size); +} +.dialog-window > header button { + width: 24px; + height: 24px; + border: 1px solid var(--button-border); + border-radius: 0; + color: var(--button-text); + background: var(--button-bg); + font-size: var(--ui-heading-size); + cursor: pointer; + display: grid; + place-items: center; +} +.dialog-window > header button:hover { + color: var(--button-text); + background: var(--button-bg-hover); + border-color: var(--button-border); +} +.dialog-body { + min-height: 0; + overflow: auto; + padding: 20px; +} +.import-dialog-intro { + margin: 0 0 16px; + color: var(--muted); +} +.import-progress { + min-height: 180px; + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + color: var(--muted); +} +.import-spinner { + position: relative; + flex: 0 0 24px; + width: 24px; + height: 24px; +} +.import-spinner i { + position: absolute; + width: 5px; + height: 5px; + background: var(--line-strong); + opacity: .55; + animation: import-square-progress .8s steps(1, end) infinite; +} +.import-spinner i:nth-child(1) { + top: 0; + left: 9.5px; + animation-delay: 0s; +} +.import-spinner i:nth-child(2) { + top: 9.5px; + right: 0; + animation-delay: -.6s; +} +.import-spinner i:nth-child(3) { + bottom: 0; + left: 9.5px; + animation-delay: -.4s; +} +.import-spinner i:nth-child(4) { + top: 9.5px; + left: 0; + animation-delay: -.2s; +} +@keyframes import-square-progress { + 0%, 24.999% { + background: var(--critical); + opacity: 1; + transform: scale(1.18); + } + 25%, 100% { + background: var(--line-strong); + opacity: .55; + transform: scale(.82); + } +} +@media (prefers-reduced-motion: reduce) { + .import-spinner i { + animation: none; + transform: scale(.82); + } + .import-spinner i:first-child { + background: var(--critical); + opacity: 1; + transform: scale(1.18); + } +} +.import-workflow-error { + padding: 10px 12px; + border: 1px solid var(--critical); + border-radius: 8px; + color: var(--critical); + background: color-mix(in srgb, var(--critical) 10%, transparent); +} +.import-preview-list { + display: grid; + max-height: min(58vh, 660px); + overflow-x: hidden; + overflow-y: auto; +} +.import-preview-entry { + display: grid; + grid-template-columns: 28px minmax(0, 1fr); + gap: 12px; + min-width: 0; + padding: 14px 0; + border-bottom: 1px solid var(--line); +} +.import-preview-entry:first-child { + padding-top: 0; +} +.import-preview-entry:last-child { + padding-bottom: 0; + border-bottom: 0; +} +.import-preview-selection { + padding-top: 2px; +} +.import-preview-heading { + display: flex; + align-items: center; + gap: 9px; + min-width: 0; +} +.import-preview-main { + min-width: 0; +} +.import-preview-heading strong { + min-width: 0; + overflow-wrap: anywhere; +} +.import-status { + flex: 0 0 auto; + font-size: var(--ui-label-size); + font-weight: var(--fw-semibold); +} +.import-status-ready { + color: var(--low); +} +.import-status-replacement { + color: var(--low); +} +.import-status-warning, +.import-status-duplicate { + color: var(--medium); +} +.import-status-error { + color: var(--critical); +} +.import-preview-meta { + display: flex; + flex-wrap: wrap; + gap: 5px 12px; + margin-top: 7px; + color: var(--muted); + font-size: var(--ui-value-size); +} +.import-hash { + display: block; + margin-top: 7px; + color: var(--muted); + font-size: var(--ui-label-size); + overflow-wrap: anywhere; + white-space: normal; +} +.import-message { + margin: 7px 0 0; + color: var(--muted); + font-size: var(--ui-reading-size); + line-height: 1.45; + overflow-wrap: anywhere; +} +.import-duplicate-notice { + margin-top: 12px; + color: var(--muted); + overflow-wrap: anywhere; +} +.import-duplicate-notice h3 { + margin: 0 0 4px; + color: var(--text); + font-size: var(--ui-value-size); +} +.import-duplicate-notice p { + margin: 0; + font-size: var(--ui-reading-size); + line-height: 1.45; +} +.import-replacement-notice { + margin-top: 12px; + color: var(--muted); + overflow-wrap: anywhere; +} +.import-replacement-notice h3 { + margin: 0 0 4px; + color: var(--low); + font-size: var(--ui-value-size); +} +.import-replacement-notice p { + margin: 0; + font-size: var(--ui-reading-size); + line-height: 1.45; +} +.import-preview-action { + display: flex; + align-items: center; +} +.import-dialog-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-top: 16px; + padding-top: 14px; + border-top: 1px solid var(--line); +} +.import-dialog-footer > div { + display: flex; + gap: 8px; +} +.import-report-summary { + display: grid; + gap: 5px; + padding: 16px; + border-radius: 10px; + background: var(--panel-raised); +} +.import-report-summary span { + color: var(--muted); +} +.import-report-list { + display: grid; + gap: 8px; + margin-top: 12px; + max-height: 55vh; + overflow: auto; +} +.import-report-entry { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 4px 12px; + padding: 11px 12px; + border: 1px solid var(--line); + border-radius: 8px; +} +.import-report-entry small { + grid-column: 1 / -1; + color: var(--muted); +} +.import-report-imported > span { + color: var(--low); +} +.import-report-failed > span { + color: var(--critical); +} +@media (max-width: 760px) { + .import-preview-entry { + grid-template-columns: 26px minmax(0, 1fr); + } + .import-preview-action { + grid-column: 2; + } + .import-dialog-footer { + align-items: stretch; + flex-direction: column; + } + .import-dialog-footer > div { + justify-content: flex-end; + } +} + +/* src/styles/legacy-views.css */ +body { + font-family: var(--font); + font-size: var(--ui-body-size); + line-height: 1.45; + font-weight: var(--ui-body-weight); +} +button, +input, +select, +textarea { + font-family: inherit; +} +.btn, +.icon-btn, +.select, +.input, +.tab-btn, +.bookmark-btn, +.results-btn { + font-size: var(--ui-control-size); + line-height: 1.35; +} +.viewer { + overflow: hidden; + background: var(--bg); +} +.viewer-scroll, +.table-scroll { + height: 100%; + min-height: 0; + overflow: auto; + scrollbar-width: thin; + scrollbar-color: var(--line-strong) var(--panel-soft); +} +.viewer-scroll::-webkit-scrollbar, +.table-scroll::-webkit-scrollbar { + width: 10px; + height: 10px; +} +.viewer-scroll::-webkit-scrollbar-track, +.table-scroll::-webkit-scrollbar-track { + background: var(--panel-soft); +} +.viewer-scroll::-webkit-scrollbar-thumb, +.table-scroll::-webkit-scrollbar-thumb { + border: 2px solid var(--panel-soft); + border-radius: var(--radius-pill); + background: var(--line-strong); +} +.records-layout { + display: grid; + grid-template-columns: clamp(380px, 24vw, 470px) minmax(0, 1fr); + height: 100%; + min-height: 0; + padding: var(--panel-inset); + background: var(--bg); +} +.record-list { + min-width: 0; + min-height: 0; + padding: 0; + border: 0; + border-right: var(--border-hair) solid var(--border-strong); + background: transparent; + overflow-y: auto; + scrollbar-gutter: stable; + scrollbar-width: thin; + scrollbar-color: var(--border-strong) transparent; +} +.record-list::-webkit-scrollbar { + width: 6px; +} +.record-list::-webkit-scrollbar-track { + background: transparent; + margin: 4px 2px 4px 0; +} +.record-list::-webkit-scrollbar-thumb { + background: var(--border-strong); + border-radius: var(--radius-pill); + min-height: 36px; +} +.record-list::-webkit-scrollbar-thumb:hover { + background: var(--text-muted); +} +.record-card { + position: relative; + display: grid; + grid-template-columns: 28px minmax(0, 1fr); + grid-template-rows: auto auto; + column-gap: var(--space-2); + row-gap: var(--legacy-space-2); + width: 100%; + min-height: 74px; + margin: 0; + padding: 11px 14px; + border: 0; + border-left: var(--marker-width) solid transparent; + border-bottom: var(--border-hair) solid var(--line); + border-radius: 0; + color: var(--text); + background: var(--panel-raised); + box-shadow: none; + font: inherit; + text-align: left; + cursor: pointer; + transition: background .12s ease, border-color .12s ease; +} +.record-card:first-child { + border-top-left-radius: var(--radius-sm); + border-top-right-radius: var(--radius-sm); +} +.record-card:last-child { + border-bottom-left-radius: var(--radius-sm); + border-bottom-right-radius: var(--radius-sm); + border-bottom: 0; +} +.record-card::before { + content: ""; + grid-column: 1; + grid-row: 1 / 3; + align-self: center; + justify-self: center; + width: 24px; + height: 27px; + clip-path: polygon(50% 0, 94% 24%, 94% 76%, 50% 100%, 6% 76%, 6% 24%); + background: var(--muted); +} +.record-card::after { + content: ""; + grid-column: 1; + grid-row: 1 / 3; + align-self: center; + justify-self: center; + width: 7px; + height: 4px; + border-left: 2px solid var(--sev-on); + border-bottom: 2px solid var(--sev-on); + transform: translate(-6.5px, 0.5px) rotate(-45deg); + pointer-events: none; +} +.record-card:hover { + border-color: var(--line); + background: var(--panel-hover); + box-shadow: none; + transform: none; +} +.record-card.active, +.record-card.active:hover { + z-index: 1; + border-color: var(--line); + border-left-color: var(--state-selected-flat-border); + color: var(--state-selected-flat-text); + background: var(--state-selected-flat); + box-shadow: none; + transform: none; +} +.record-card.severity-critical::before { + background: var(--critical); +} +.record-card.severity-high::before { + background: var(--high); +} +.record-card.severity-medium::before { + background: var(--medium); +} +.record-card.severity-low::before { + background: var(--low); +} +.record-card.severity-info::before { + background: var(--info); +} +.record-card.is-workspace { + outline: 2px solid var(--state-active); + outline-offset: -2px; +} +.record-title { + grid-column: 2; + grid-row: 1; + align-self: end; + min-width: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--fw-regular); + line-height: 1.28; + overflow-wrap: anywhere; +} +.record-meta { + min-width: 0; + color: var(--muted); + font-size: var(--ui-control-size); + font-weight: 400; + line-height: 1.3; +} +.record-meta-line { + grid-column: 2; + grid-row: 2; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--legacy-space-2); + min-width: 0; +} +.record-diagnostic-badge { + display: inline-flex; + align-items: center; + min-height: 20px; + padding: 2px var(--legacy-space-2); + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--legacy-radius-sm); + color: var(--text); + background: transparent; + font-size: var(--ui-badge-size); + font-weight: var(--ui-label-weight); + line-height: 1.18; + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.record-card.active .record-title { + color: var(--state-selected-flat-text); +} +.record-card.active .record-meta { + color: var(--state-selected-flat-muted); +} +.record-card.active .record-diagnostic-badge { + border-color: var(--state-selected-flat-muted); + color: var(--state-selected-flat-text); +} +.action-pill { + display: inline-flex; + width: fit-content; + margin-left: var(--legacy-space-1); + padding: 1px var(--legacy-space-1); + border: var(--border-hair) solid var(--success); + border-radius: var(--legacy-radius-sm); + color: var(--sev-on); + background: var(--success); + font-size: var(--ui-small-size); + line-height: 1.4; + vertical-align: middle; +} +.finding-reader { + min-width: 0; + min-height: 0; + padding: var(--legacy-space-6) 0 var(--space-7); + color: var(--text); + background: var(--bg); + overflow-y: auto; +} +.finding-reader > * { + width: min(834px, calc(100% - var(--reader-inset) - var(--legacy-space-6))); + margin-left: var(--reader-inset); + margin-right: auto; +} +.reader-nav { + margin-bottom: var(--legacy-space-6); + color: var(--muted); + font-size: var(--ui-control-size); +} +.reader-nav button { + color: var(--text); +} +.reader-heading { + padding-bottom: var(--legacy-space-5); + border-color: var(--line); +} +.reader-heading h2 { + min-width: 0; + color: var(--heading); + font-size: var(--type-detail-title-size); + font-weight: var(--ui-strong-weight); + line-height: 1.3; + letter-spacing: 0; +} +.reader-heading h2 .technical-path, +.reader-summary h3 .technical-path { + display: block; + box-sizing: border-box; + width: 100%; + margin-top: var(--space-1); +} +.reader-title-hex { + width: 26px; + height: 30px; +} +.finding-badges, +.mitre-line { + gap: var(--legacy-space-2); + margin-top: var(--legacy-space-3); + font-size: var(--ui-badge-size); +} +.status-badge, +.severity-badge, +.mitre-badge, +.reader-severity { + display: inline-flex; + align-items: center; + min-height: 22px; + height: auto; + padding: 3px var(--legacy-space-2); + border: var(--border-hair) solid var(--line-strong); + border-radius: var(--legacy-radius-sm); + color: var(--text); + background: transparent; + font-size: var(--ui-badge-size); + font-weight: var(--ui-label-weight); + line-height: 1.18; + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; + white-space: normal; +} +.severity-badge.severity-critical, +.reader-severity.severity-critical { + border-color: var(--critical-badge); + color: var(--severity-ink); + background: var(--critical-badge); +} +.severity-badge.severity-high, +.reader-severity.severity-high { + border-color: var(--high-badge); + color: var(--severity-ink); + background: var(--high-badge); +} +.severity-badge.severity-medium, +.reader-severity.severity-medium { + border-color: var(--medium-badge); + color: var(--severity-ink); + background: var(--medium-badge); +} +.severity-badge.severity-low, +.reader-severity.severity-low { + border-color: var(--low-badge); + color: var(--severity-ink); + background: var(--low-badge); +} +.severity-badge.severity-info, +.reader-severity.severity-info { + border-color: var(--info-badge); + color: var(--severity-ink); + background: var(--info-badge); +} +.reader-summary, +.review-grid, +.all-fields { + border-color: var(--line); +} +.reader-summary h3 { + color: var(--heading); + font-size: var(--type-h3-size); + font-weight: var(--ui-strong-weight); + line-height: 1.3; + letter-spacing: 0; +} +.reader-summary h4 { + color: var(--heading); + font-size: var(--ui-reading-size); + font-weight: var(--ui-label-weight); + line-height: 1.25; + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.reader-summary p, +.reader-summary .rich-text-value { + color: var(--text); + font-size: var(--ui-reading-size); + font-weight: 400; + line-height: 1.55; +} +.dashboard-grid label, +.review-grid > label { + color: var(--heading); + font-size: var(--ui-control-size); + font-weight: var(--ui-label-weight); + letter-spacing: var(--ui-label-tracking); +} +.dashboard-grid input, +.dashboard-grid select, +.review-grid textarea { + border-color: var(--line); + background-color: var(--surface-inset); + color: var(--text); +} +.tile-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(0, var(--tile-content-width))); + align-items: stretch; + align-content: start; + justify-content: start; + gap: var(--segment-gap); + min-height: 100%; + padding: var(--segment-inset); + border: var(--border-hair) solid var(--segment-border); + border-radius: var(--segment-radius); + background: var(--segment-surface); +} +.data-tile { + position: relative; + display: grid; + grid-template-columns: 32px minmax(0, 1fr) 30px; + align-items: start; + gap: var(--legacy-space-3); + min-width: 0; + min-height: var(--tile-content-min-height); + padding: var(--legacy-space-4); + border: var(--border-hair) solid var(--tile-border); + border-radius: var(--tile-radius); + color: var(--text); + background: var(--tile-surface); + box-shadow: var(--tile-card-shadow); + cursor: pointer; + overflow: hidden; + text-align: left; + transition: background .12s ease, border-color .12s ease; +} +.data-tile:hover { + border-color: transparent; + border-radius: var(--tile-radius); + background: var(--tile-surface-hover); + box-shadow: var(--tile-card-shadow); + outline: 0; +} +.data-tile:focus-visible { + border-color: transparent; + border-radius: var(--tile-radius); + background: var(--tile-surface-hover); + box-shadow: var(--tile-card-shadow); + outline: var(--bw-emphasis) solid var(--focus-ring); + outline-offset: calc(-1 * var(--bw-emphasis)); +} +.data-tile-hex { + position: relative; + width: 26px; + height: 30px; + margin-top: 1px; + clip-path: polygon(50% 0, 94% 24%, 94% 76%, 50% 100%, 6% 76%, 6% 24%); + background: var(--muted); +} +.data-tile-hex::after { + content: ""; + position: absolute; + left: 2px; + top: 12px; + width: 7px; + height: 4px; + border-left: 2px solid var(--sev-on); + border-bottom: 2px solid var(--sev-on); + transform: rotate(-45deg); + pointer-events: none; +} +.data-tile.severity-critical .data-tile-hex { + background: var(--critical); +} +.data-tile.severity-high .data-tile-hex { + background: var(--high); +} +.data-tile.severity-medium .data-tile-hex { + background: var(--medium); +} +.data-tile.severity-low .data-tile-hex { + background: var(--low); +} +.data-tile.severity-info .data-tile-hex { + background: var(--info); +} +.data-tile-content { + min-width: 0; +} +.data-tile-content h3 { + margin: 0; + color: var(--heading); + font-size: var(--type-h4-size); + font-weight: var(--ui-strong-weight); + line-height: 1.35; + overflow-wrap: normal; + word-break: normal; + hyphens: manual; +} +.data-tile[data-tool=group-policy] .data-tile-content h3 { + max-width: 100%; + white-space: normal; + overflow-wrap: anywhere; + word-break: normal; +} +.data-tile-badges { + display: flex; + flex-wrap: wrap; + gap: var(--legacy-space-2); + margin-top: var(--legacy-space-4); + font-size: var(--ui-control-size); +} +.tile-grid > .data-tile .data-tile-badges { + display: grid; + grid-template-columns: max-content max-content; + align-items: start; + justify-content: start; +} +.tile-grid > .data-tile .data-tile-badges > * { + max-width: 100%; + overflow-wrap: normal; + word-break: normal; +} +.tile-grid > .data-tile [data-badge-role=status], +.tile-grid > .data-tile [data-badge-role=category], +.tile-grid > .data-tile [data-badge-role=score] { + grid-column: 1 / -1; + justify-self: start; +} +.data-tile-actions { + display: grid; + gap: var(--legacy-space-2); + align-content: start; +} +.tile-bookmark-btn, +.tile-results-btn { + display: grid; + place-items: center; + width: 28px; + height: 28px; + padding: 0; + border: var(--border-hair) solid var(--line); + border-radius: var(--legacy-radius-sm); + color: var(--text); + background: var(--panel-raised); + font-size: var(--ui-control-size); + font-weight: var(--ui-label-weight); + cursor: pointer; +} +.tile-bookmark-btn[aria-pressed=true] { + border-color: var(--state-active); + color: var(--state-active-text); + background: var(--state-active); +} +.tile-results-btn, +.tile-results-btn:hover { + border-color: var(--border-results-action); + color: var(--text-results-action); + background: var(--surface-results-action); +} +.tile-results-btn.is-open, +.tile-results-btn.is-open:hover { + border-color: var(--result-color); + color: var(--button-accent-text); + background: var(--result-color); +} +.data-tile.is-bookmarked { + outline: 2px solid var(--state-active); + outline-offset: -2px; +} +.table-scroll { + padding: var(--panel-inset); +} +.view-table table { + width: max-content; + min-width: 100%; + border-color: var(--line); + background: var(--panel); + color: var(--text); + font-size: var(--type-table-body-size); +} +.view-table th, +.view-table td { + min-width: var(--table-col-min-w); + max-width: min(440px, 46vw); + padding: var(--legacy-space-1) var(--legacy-space-2); + border-color: var(--line); + white-space: normal; + overflow-wrap: break-word; +} +.view-table th { + color: var(--muted); + background: var(--panel-soft); + font-size: var(--type-table-head-size); + font-weight: var(--ui-label-weight); + line-height: 1.2; + letter-spacing: var(--ui-label-tracking); + text-transform: uppercase; +} +.view-table td { + color: var(--text); + background: var(--panel); + font-size: var(--type-table-body-size); + font-weight: 400; + line-height: 1.35; +} +.view-table tbody tr:nth-child(even) td { + background: var(--panel-soft); +} +.view-table tbody tr:hover td { + color: var(--heading); + background: var(--panel-hover); +} +.view-table .row-index { + width: 54px; + min-width: 54px; + font-variant-numeric: tabular-nums; +} +.raw-view { + min-height: 100%; + margin: 0; + padding: var(--panel-inset); + color: var(--text); + background: var(--panel); + font-family: var(--font-ui); + font-size: var(--type-table-body-size); + font-weight: var(--fw-regular); + line-height: 1.5; + white-space: pre-wrap; + overflow-wrap: anywhere; +} +@media (max-width: 1050px) { + :root { + --reader-inset: var(--legacy-space-6); + } + .records-layout { + grid-template-columns: minmax(300px, 42%) minmax(0, 1fr); + } +} +@media (max-width: 760px) { + :root { + --reader-inset: var(--legacy-space-4); + } + .records-layout { + grid-template-columns: 1fr; + } + .record-list { + max-height: 320px; + border-right: 0; + border-bottom: var(--border-hair) solid var(--line); + } + .tile-grid { + grid-template-columns: 1fr; + padding: var(--panel-inset); + } +} +@media (prefers-reduced-motion: reduce) { + .data-tile, + .record-card { + transition: none; + } + .record-card:hover { + transform: none; + } +} + +/* src/styles/obsidian-graph.css */ +.app-area-graph { + overflow: hidden; +} +.obsidian-graph { + box-sizing: border-box; + position: relative; + width: 100%; + height: 100%; + min-width: 0; + min-height: 0; + padding: var(--panel-inset); + color: var(--text-primary); + background: transparent; + overflow: hidden; +} +.obsidian-graph-surface { + display: block; + width: 100%; + height: 100%; + min-height: 0; + touch-action: none; + cursor: grab; + user-select: none; +} +.obsidian-graph-surface:active { + cursor: grabbing; +} +.obsidian-graph-edges line { + stroke: var(--graph-edge); + stroke-width: 1; + vector-effect: non-scaling-stroke; + transition: stroke .12s ease, stroke-width .12s ease; +} +.obsidian-node { + color: var(--graph-technique); + cursor: pointer; + outline: none; +} +.obsidian-node-selection-ring { + fill: none; + stroke: var(--graph-selected); + stroke-width: 3; + opacity: 1; + vector-effect: non-scaling-stroke; + pointer-events: none; + filter: none; +} +.obsidian-node-branch-ring { + fill: none; + stroke: var(--graph-selected); + stroke-width: 2; + opacity: .82; + vector-effect: non-scaling-stroke; + pointer-events: none; +} +.obsidian-node.is-branch-muted { + opacity: .42; +} +.obsidian-graph-edges line.is-branch-path { + stroke: var(--graph-selected); + stroke-width: 2; + opacity: 1; +} +.obsidian-graph-edges line.is-branch-muted { + opacity: .2; +} +.obsidian-node.is-selection-muted { + opacity: .48; + transition: opacity .14s ease; +} +.obsidian-node.is-selection-muted:hover, +.obsidian-node.is-selection-muted:focus-visible { + opacity: 1; +} +.obsidian-graph-edges line.is-selection-muted { + opacity: .24; +} +.obsidian-node-role-ring { + fill: none; + stroke: currentColor; + stroke-width: 1.5; + opacity: .72; + vector-effect: non-scaling-stroke; + pointer-events: none; +} +.obsidian-node-core { + fill: currentColor; + stroke: var(--surface-app); + stroke-width: 1.5; + vector-effect: non-scaling-stroke; + transition: filter .12s ease, stroke .12s ease; +} +.obsidian-node-finding { + color: var(--graph-finding); +} +.obsidian-node-finding.severity-critical { + color: var(--critical); +} +.obsidian-node-finding.severity-high { + color: var(--high); +} +.obsidian-node-finding.severity-medium { + color: var(--medium); +} +.obsidian-node-finding.severity-low { + color: var(--low); +} +.obsidian-node-finding.severity-info { + color: var(--info); +} +.obsidian-node-finding.severity-unknown { + color: var(--graph-unknown); +} +.obsidian-node-category, +.obsidian-node-defense, +.obsidian-node-target, +.obsidian-node-technique, +.obsidian-node-tactic { + color: var(--graph-relation); +} +.obsidian-node:hover .obsidian-node-core, +.obsidian-node:focus-visible .obsidian-node-core { + filter: brightness(1.25); + stroke: var(--graph-selected); +} +.obsidian-node:hover .obsidian-node-role-ring, +.obsidian-node:focus-visible .obsidian-node-role-ring { + opacity: 1; + stroke-width: 2; +} +.obsidian-node.is-selected .obsidian-node-core { + stroke: var(--graph-selected); + stroke-width: 2.5; +} +.obsidian-node.is-selected .obsidian-node-role-ring { + opacity: 1; + stroke: var(--graph-selected); + stroke-width: 2; +} +.obsidian-graph-card-connectors { + pointer-events: none; +} +.obsidian-graph-card-connectors line { + vector-effect: non-scaling-stroke; +} +.obsidian-card-connector-backdrop { + stroke: color-mix(in srgb, var(--surface-app) 88%, var(--pathfinder-micro-connector-backdrop-mix)); + stroke-width: 5; + opacity: .9; +} +.obsidian-card-connector { + stroke: var(--graph-selected); + stroke-width: 2; +} +.obsidian-card-connector-anchor { + fill: var(--graph-selected); + stroke: color-mix(in srgb, var(--surface-app) 88%, var(--pathfinder-micro-connector-backdrop-mix)); + stroke-width: 1.5; + vector-effect: non-scaling-stroke; +} +.obsidian-node-inline-label { + fill: var(--text-secondary); + stroke: var(--surface-app); + stroke-width: 3px; + paint-order: stroke fill; + font-size: var(--fs-lg); + font-weight: var(--fw-medium); + letter-spacing: .01em; + pointer-events: none; +} +.obsidian-node-category .obsidian-node-inline-label, +.obsidian-node-defense .obsidian-node-inline-label, +.obsidian-node-target .obsidian-node-inline-label, +.obsidian-node-tactic .obsidian-node-inline-label { + fill: var(--text-primary); + font-weight: var(--fw-semibold); +} +.obsidian-node-card-wrap { + overflow: visible; + pointer-events: auto; + cursor: grab; + touch-action: none; +} +.obsidian-node-card-wrap:active { + cursor: grabbing; +} +.obsidian-node-matrix-card-wrap { + overflow: visible; +} +.obsidian-node-matrix-card { + width: 100%; + height: 100%; +} +.obsidian-node-matrix-card .data-tile-content { + display: grid; + grid-template-rows: auto minmax(0, 1fr); + min-height: 0; + overflow: hidden; +} +.obsidian-node-matrix-card .data-tile { + box-sizing: border-box; + width: 100%; + height: 100%; + min-height: 0; + grid-template-columns: 18px minmax(0, 1fr) 18px; + gap: var(--space-2); + padding: var(--space-3); + overflow: hidden; +} +.obsidian-node-matrix-card .data-tile-hex { + width: 18px; + height: 20px; +} +.obsidian-node-matrix-card .data-tile-content h3 { + display: -webkit-box; + overflow: hidden; + font-size: var(--pathfinder-micro-title-size); + line-height: 1.2; + -webkit-box-orient: vertical; + -webkit-line-clamp: 5; +} +.obsidian-node-matrix-card .data-tile-badges { + flex-wrap: wrap; + gap: var(--space-1); + margin-top: var(--space-1); + min-height: 0; + max-height: none; + align-content: start; + overflow: hidden; +} +.obsidian-node-matrix-card .data-tile-badges > * { + flex: 0 1 auto; + min-width: 0; + max-width: 100%; + height: auto; + min-height: 20px; + padding: 0 3px; + overflow: visible; + font-size: var(--pathfinder-micro-badge-size); + line-height: 1.1; + overflow-wrap: anywhere; + white-space: normal; +} +.obsidian-node-matrix-card .tile-badge-overflow { + justify-content: center; +} +.obsidian-node-matrix-card .data-tile-actions { + align-self: start; + gap: 2px; +} +.obsidian-node-matrix-card .tile-bookmark-btn, +.obsidian-node-matrix-card .tile-results-btn { + width: 18px; + height: 18px; +} +.obsidian-node-card.data-tile { + box-sizing: border-box; + width: 100%; + height: 100%; + min-height: 0; + grid-template-columns: 26px minmax(0, 1fr); + gap: var(--legacy-space-3); + padding: var(--legacy-space-3); + overflow: hidden; + cursor: pointer; +} +.obsidian-node-card-technique .data-tile-hex, +.obsidian-node-card-category .data-tile-hex, +.obsidian-node-card-defense .data-tile-hex, +.obsidian-node-card-target .data-tile-hex, +.obsidian-node-card-tactic .data-tile-hex { + background: var(--graph-relation); +} +.obsidian-node-card .data-tile-content h3 { + display: -webkit-box; + overflow: hidden; + font-size: var(--pathfinder-micro-title-size); + line-height: 1.3; + overflow-wrap: normal; + word-break: normal; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} +.obsidian-node-card-technique .data-tile-content h3, +.obsidian-node-card-tactic .data-tile-content h3 { + -webkit-line-clamp: 3; +} +.obsidian-node-card .data-tile-badges { + gap: var(--legacy-space-1) var(--legacy-space-2); + margin-top: var(--legacy-space-2); +} +.obsidian-node-card .reader-severity { + min-height: 20px; + padding: 2px var(--legacy-space-1); + font-size: var(--pathfinder-micro-relation-badge-size); +} +.obsidian-node-card .outcome-mark { + flex-basis: 100%; +} +.obsidian-node.is-selected .obsidian-node-card { + border-color: var(--graph-selected); + outline: var(--bw-emphasis) solid var(--graph-selected); + outline-offset: -2px; +} +.obsidian-graph-card.is-selected .obsidian-node-card, +.obsidian-graph-card.is-selected .obsidian-node-matrix-card .data-tile { + border-color: var(--graph-selected); + outline: 3px solid var(--graph-selected); + outline-offset: -3px; +} +.obsidian-graph-toolbar, +.obsidian-graph-filters, +.obsidian-graph-inspector, +.obsidian-graph-zoom { + position: absolute; + z-index: 5; + border: var(--bw-hairline) solid var(--border-default); + border-radius: var(--radius-md); + color: var(--text-primary); + background: color-mix(in srgb, var(--surface-panel-raised) 94%, transparent); + backdrop-filter: blur(var(--space-2)); +} +.obsidian-graph-toolbar { + top: var(--space-4); + left: 50%; + display: flex; + align-items: end; + gap: var(--space-2); + max-width: calc(100% - var(--space-8) * 2); + padding: var(--space-2); + transform: translateX(-50%); +} +.obsidian-graph-search { + display: grid; + gap: var(--space-1); + min-width: calc(var(--space-8) * 8); + color: var(--text-secondary); + font-size: var(--fs-sm); +} +.obsidian-graph-search input { + min-height: var(--control-h); + padding: 0 var(--space-2); + border: var(--bw-hairline) solid var(--border-strong); + border-radius: var(--radius-sm); + color: var(--text-primary); + background: var(--surface-input); + font-size: var(--fs-base); +} +.obsidian-graph-count { + align-self: center; + min-width: max-content; + padding-inline: var(--space-2); + color: var(--text-secondary); + font-size: var(--fs-sm); + font-variant-numeric: tabular-nums; +} +.obsidian-graph-branch-actions { + display: flex; + align-items: center; + gap: var(--space-2); + min-width: min(360px, 32vw); + padding-left: var(--space-3); + border-left: var(--bw-hairline) solid var(--border-default); +} +.obsidian-graph-branch-actions > span { + color: var(--text-secondary); + font-size: var(--fs-sm); + font-weight: var(--fw-semibold); + letter-spacing: var(--ls-caps); + text-transform: uppercase; +} +.obsidian-graph-branch-actions .btn { + min-width: 84px; +} +.obsidian-graph-reset-view { + position: relative; + display: inline-flex; + align-items: center; + gap: 6px; + border-color: var(--border-strong); + border-radius: 999px; + color: var(--text-primary); + background: var(--surface-input); + overflow: hidden; +} +.obsidian-graph-reset-view:hover, +.obsidian-graph-reset-view:focus-visible { + border-color: var(--text-secondary); + color: var(--text-primary); + background: var(--surface-hover); +} +.obsidian-graph-reset-view span { + font-size: 11px; + line-height: 1; +} +.obsidian-graph-filters { + top: calc(var(--space-8) * 2.7); + left: 50%; + display: grid; + grid-template-columns: repeat(3, minmax(calc(var(--space-8) * 5), 1fr)); + gap: var(--space-3); + width: min(calc(var(--space-8) * 20), calc(100% - var(--space-8) * 2)); + padding: var(--space-3); + transform: translateX(-50%); +} +.obsidian-graph-filters label { + display: grid; + gap: var(--space-1); + color: var(--text-secondary); + font-size: var(--fs-sm); +} +.obsidian-graph-filters select { + min-height: var(--control-h); + padding-inline: var(--space-2); + border: var(--bw-hairline) solid var(--border-strong); + border-radius: var(--radius-sm); + color: var(--text-primary); + background: var(--surface-input); + font-size: var(--fs-base); +} +.obsidian-graph-zoom { + top: var(--space-4); + right: var(--space-4); + display: grid; + overflow: hidden; +} +.obsidian-graph-zoom button { + display: grid; + place-items: center; + width: var(--space-8); + height: var(--space-8); + padding: 0; + border: 0; + border-bottom: var(--bw-hairline) solid var(--border-default); + color: var(--text-primary); + background: transparent; + font-size: var(--fs-lg); + cursor: pointer; +} +.obsidian-graph-zoom button:last-child { + border-bottom: 0; +} +.obsidian-graph-zoom button:hover { + background: var(--surface-hover); +} +.obsidian-graph-inspector { + right: var(--space-4); + bottom: var(--space-4); + display: grid; + gap: var(--space-2); + width: min(calc(var(--space-8) * 12), calc(100% - var(--space-8))); + padding: var(--space-4); +} +.obsidian-graph-inspector > small { + color: var(--text-secondary); + font-size: var(--fs-sm); + font-weight: var(--fw-semibold); + letter-spacing: var(--ls-caps); + text-transform: uppercase; +} +.obsidian-graph-inspector > strong { + padding-right: var(--space-6); + color: var(--text-primary); + font-size: var(--fs-lg); + line-height: var(--lh-prose); + overflow-wrap: anywhere; +} +.obsidian-graph-inspector > span { + color: var(--text-secondary); + font-size: var(--fs-lg); +} +.obsidian-graph-inspector dl { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--space-2); + margin: var(--space-2) 0 0; +} +.obsidian-graph-inspector dl div { + display: grid; + gap: var(--space-1); + padding: var(--space-2); + border: var(--bw-hairline) solid var(--border-subtle); + background: var(--surface-panel); +} +.obsidian-graph-inspector dt { + color: var(--text-secondary); + font-size: var(--fs-sm); +} +.obsidian-graph-inspector dd { + margin: 0; + color: var(--text-primary); + font-size: var(--fs-lg); + font-weight: var(--fw-semibold); +} +.obsidian-graph-inspector-actions { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + margin-top: var(--space-2); +} +.obsidian-inspector-close { + position: absolute; + top: var(--space-2); + right: var(--space-2); + display: grid; + place-items: center; + width: var(--control-h); + height: var(--control-h); + padding: 0; + border: 0; + color: var(--text-secondary); + background: transparent; + font-size: var(--fs-lg); + cursor: pointer; +} +.obsidian-graph-empty { + position: absolute; + inset: 0; + display: grid; + place-content: center; + gap: var(--space-2); + color: var(--text-secondary); + text-align: center; + pointer-events: none; +} +.obsidian-graph-empty strong, +.obsidian-graph-empty span { + font-size: var(--fs-lg); +} +.obsidian-graph-card-zoom-hint { + position: absolute; + left: 50%; + bottom: var(--space-4); + z-index: 7; + min-height: var(--control-h); + padding: 0 var(--space-4); + border: var(--bw-hairline) solid var(--border-strong); + border-radius: var(--radius-sm); + color: var(--text-primary); + background: color-mix(in srgb, var(--surface-panel-raised) 94%, transparent); + font-size: var(--fs-sm); + cursor: pointer; + transform: translateX(-50%); +} +.obsidian-graph-card-zoom-hint:hover, +.obsidian-graph-card-zoom-hint:focus-visible { + background: var(--surface-hover); + outline: none; +} +@media (max-width: 900px) { + .obsidian-graph-toolbar { + left: var(--space-3); + right: calc(var(--space-8) + var(--space-5)); + flex-wrap: wrap; + max-width: none; + transform: none; + } + .obsidian-graph-branch-actions { + flex: 1 1 100%; + min-width: 0; + padding-top: var(--space-2); + padding-left: 0; + border-top: var(--bw-hairline) solid var(--border-default); + border-left: 0; + } + .obsidian-graph-search { + flex: 1 1 100%; + min-width: 0; + } + .obsidian-graph-filters { + top: calc(var(--space-8) * 3.5); + grid-template-columns: 1fr; + } + .obsidian-graph-inspector { + left: var(--space-3); + right: var(--space-3); + width: auto; + } +} +@media (prefers-reduced-motion: reduce) { + .obsidian-node circle { + transition: none; + } +} +.obsidian-graph { + background: var(--surface-app); +} +.obsidian-graph-layout { + display: grid; + grid-template-columns: clamp(220px, 17vw, 280px) minmax(0, 1fr) clamp(270px, 21vw, 340px); + width: 100%; + height: 100%; + min-width: 0; + min-height: 0; +} +.obsidian-graph-filter-panel, +.obsidian-graph-inspector { + position: static; + display: flex; + flex-direction: column; + width: auto; + min-width: 0; + min-height: 0; + padding: 0; + border-radius: 0; + background: color-mix(in srgb, var(--surface-panel) 96%, var(--surface-app)); + backdrop-filter: none; +} +.obsidian-graph-filter-panel { + border: 0; + border-right: var(--bw-hairline) solid var(--border-default); +} +.obsidian-graph-inspector { + border: 0; + border-left: var(--bw-hairline) solid var(--border-default); +} +.obsidian-graph-filter-panel > header, +.obsidian-graph-inspector > header { + display: flex; + flex: 0 0 auto; + align-items: center; + justify-content: space-between; + gap: var(--space-3); + min-height: calc(var(--row-h) + var(--space-3)); + padding: 0 var(--space-4); + border-bottom: var(--bw-hairline) solid var(--border-default); +} +.obsidian-graph-filter-panel > header strong, +.obsidian-graph-inspector > header strong { + color: var(--text-primary); + font-size: var(--fs-md); + font-weight: var(--fw-semibold); + letter-spacing: var(--ls-caps); + text-transform: uppercase; +} +.obsidian-graph-filter-panel > header span { + color: var(--text-secondary); + font-size: var(--fs-sm); + font-variant-numeric: tabular-nums; +} +.obsidian-graph-filter-scroll { + display: grid; + align-content: start; + gap: var(--space-4); + min-height: 0; + padding: var(--space-4); + overflow-y: auto; + scrollbar-color: var(--border-strong) var(--surface-panel); + scrollbar-width: thin; +} +.obsidian-graph-filter-section { + display: grid; + gap: var(--space-2); +} +.obsidian-panel-label { + color: var(--text-secondary); + font-size: var(--fs-sm); + font-weight: var(--fw-semibold); + letter-spacing: var(--ls-caps); + text-transform: uppercase; +} +.obsidian-graph-filter-panel .search-text-group, +.obsidian-graph-filter-panel .search-input-wrap, +.obsidian-graph-filter-panel .search-input, +.obsidian-graph-filter-panel .sheet-select { + width: 100%; + min-width: 0; +} +.obsidian-graph-filter-panel .search-tools, +.obsidian-graph-filter-panel .primary-filter-group { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: var(--space-2); + min-width: 0; + margin: 0; + padding: 0; +} +.obsidian-graph-filter-panel .primary-filter-group { + display: contents; +} +.obsidian-graph-filter-panel .standard-filter-btn, +.obsidian-graph-filter-panel .dynamic-facet-select, +.obsidian-graph-filter-panel .dynamic-range-filter { + width: 100%; + min-width: 0; + margin: 0; +} +.obsidian-graph-filter-panel .standard-filter-btn { + order: -1; +} +.obsidian-graph-filter-panel .dynamic-range-filter { + grid-template-columns: minmax(0, 1fr) minmax(0, .8fr) minmax(0, .8fr); +} +.obsidian-graph-workspace-tools { + display: grid; + gap: var(--space-3); + min-width: 0; + padding-top: var(--space-4); + border-top: var(--bw-hairline) solid var(--border-default); +} +.obsidian-graph-workspace-check { + display: flex; + align-items: center; + gap: var(--space-2); + min-height: var(--control-h); + color: var(--text-primary); + font-size: var(--ui-label-size); + cursor: pointer; +} +.obsidian-graph-workspace-check input { + width: 14px; + height: 14px; + margin: 0; + accent-color: var(--marking-color); +} +.obsidian-graph-workspace-check:has(input:disabled) { + color: var(--text-muted); + cursor: not-allowed; +} +.obsidian-graph-workspace-tools .view-bookmark-bar, +.obsidian-graph-workspace-tools .view-bookmark-list { + align-items: stretch; + flex-direction: column; + width: 100%; +} +.obsidian-graph-workspace-tools .view-bookmark-create, +.obsidian-graph-workspace-tools .view-bookmark-item, +.obsidian-graph-workspace-tools .view-bookmark-entry { + width: 100%; +} +.obsidian-graph-workspace-tools .view-bookmark-item { + display: flex; +} +.obsidian-graph-workspace-tools .view-bookmark-entry { + flex: 1 1 auto; +} +.obsidian-graph-stage { + position: relative; + min-width: 0; + min-height: 0; + overflow: hidden; + background: color-mix(in srgb, var(--surface-app) 95%, var(--surface-panel)); +} +.obsidian-graph-stage .obsidian-graph-surface { + width: 100%; + height: 100%; +} +.obsidian-graph-edges line { + stroke: var(--graph-edge); + stroke-width: 1; +} +.obsidian-graph-edges .obsidian-edge-category { + stroke: color-mix(in srgb, var(--graph-edge) 58%, var(--text-muted)); + stroke-width: .8; +} +.obsidian-graph-edges .obsidian-edge-defense { + stroke: color-mix(in srgb, var(--graph-edge) 68%, var(--graph-defense)); + stroke-width: .9; +} +.obsidian-graph-edges .obsidian-edge-technique { + stroke-width: 1.15; +} +.obsidian-graph-edges line.is-direct-path { + stroke: var(--graph-alert); + stroke-width: 2; +} +.obsidian-node-core { + fill: color-mix(in srgb, currentColor 88%, var(--surface-app)); +} +.obsidian-node-card.data-tile { + grid-template-columns: 18px minmax(0, 1fr); + gap: var(--space-1); + padding: var(--space-1); +} +.obsidian-node-card .data-tile-hex { + width: 18px; + height: 20px; +} +.obsidian-node-card .data-tile-content h3 { + font-size: 16px; + line-height: 1.25; +} +.obsidian-node-card .data-tile-badges { + flex-wrap: nowrap; + gap: var(--space-1); + max-height: 18px; + margin-top: var(--space-1); + overflow: hidden; +} +.obsidian-node-card .reader-severity, +.obsidian-node-card .outcome-mark { + min-height: 18px; + padding: 1px var(--space-1); + font-size: var(--fs-sm); + white-space: nowrap; +} +.obsidian-node.is-selected .obsidian-node-card { + outline-width: var(--bw-hairline); + outline-offset: -1px; +} +.obsidian-graph-stage .obsidian-graph-toolbar { + top: var(--space-3); + left: var(--space-3); + align-items: center; + max-width: none; + padding: var(--space-1); + transform: none; +} +.obsidian-graph-stage .obsidian-graph-zoom { + top: var(--space-3); + right: var(--space-3); +} +.obsidian-graph-inspector-content, +.obsidian-graph-inspector-empty { + display: grid; + align-content: start; + gap: var(--space-3); + min-height: 0; + padding: var(--space-4); + overflow-y: auto; +} +.obsidian-graph-inspector-content > small { + color: var(--text-secondary); + font-size: var(--fs-sm); + font-weight: var(--fw-semibold); + letter-spacing: var(--ls-caps); + text-transform: uppercase; +} +.obsidian-graph-inspector-content > strong { + padding-right: var(--space-6); + color: var(--text-primary); + font-size: var(--fs-lg); + line-height: var(--lh-prose); + overflow-wrap: anywhere; +} +.obsidian-graph-inspector-content > span, +.obsidian-graph-inspector-empty span { + color: var(--text-secondary); + font-size: var(--fs-lg); + line-height: var(--lh-prose); +} +.obsidian-graph-inspector-empty strong { + color: var(--text-primary); + font-size: var(--fs-lg); +} +.obsidian-graph-inspector dl { + display: grid; + grid-template-columns: 1fr; + gap: 0; + margin: var(--space-2) 0 0; +} +.obsidian-graph-inspector dl div { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: var(--space-3); + padding: var(--space-3) 0; + border: 0; + border-bottom: var(--bw-hairline) solid var(--border-subtle); + background: transparent; +} +.obsidian-graph-inspector dt { + font-size: var(--fs-md); +} +.obsidian-graph-inspector-actions { + display: grid; + gap: var(--space-2); + margin-top: var(--space-3); +} +.obsidian-graph-inspector-actions .btn { + width: 100%; +} +.obsidian-inspector-close { + position: static; + flex: 0 0 auto; +} +@media (max-width: 1100px) { + .obsidian-graph-layout { + grid-template-columns: 220px minmax(0, 1fr) 270px; + } +} +@media (max-width: 850px) { + .obsidian-graph-layout { + grid-template-columns: 210px minmax(0, 1fr); + grid-template-rows: minmax(0, 1fr) 210px; + } + .obsidian-graph-inspector { + grid-column: 1 / -1; + border-top: var(--bw-hairline) solid var(--border-default); + border-left: 0; + } + .obsidian-graph-inspector-content { + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + } +} +@media (max-width: 650px) { + .obsidian-graph-layout { + grid-template-columns: 1fr; + grid-template-rows: 220px minmax(360px, 1fr) 220px; + overflow-y: auto; + } + .obsidian-graph-filter-panel { + border-right: 0; + border-bottom: var(--bw-hairline) solid var(--border-default); + } + .obsidian-graph-inspector { + grid-column: 1; + } +} + +/* src/styles/functional-icons.css */ +.triangle-icon { + display: block; + flex: 0 0 auto; + width: 12px; + height: 12px; + fill: currentColor; + transform-origin: center; +} +.triangle-icon-right { + transform: rotate(180deg); +} +.triangle-icon-up { + transform: rotate(90deg); +} +.triangle-icon-down { + transform: rotate(-90deg); +} +.reader-nav button, +.sidebar-toggle-inline, +.sidebar-toggle, +.icon-btn, +.tenant-back, +.db-structure-card-toggle, +summary, +.results-browser-title { + color: var(--muted); +} +.reader-nav button, +.sidebar-toggle-inline, +.sidebar-toggle, +.icon-btn { + align-items: center; + justify-content: center; +} +.reader-nav button .triangle-icon { + width: 18px; + height: 18px; +} +.sidebar-toggle-inline .triangle-icon, +.sidebar-toggle .triangle-icon { + width: 16px; + height: 16px; +} +.tenant-back { + display: inline-flex; + align-items: center; + gap: 7px; +} +.tenant-back .triangle-icon { + width: 28px; + height: 28px; + fill: var(--band-surface); +} +.db-structure-card-toggle { + display: grid; + place-items: center; + width: 18px; + height: 18px; +} +.results-browser-title { + display: flex; + align-items: center; + gap: 7px; +} +summary { + display: flex; + align-items: center; + gap: 7px; + list-style: none; +} +summary::-webkit-details-marker { + display: none; +} +details[open] > summary > .triangle-icon-right { + transform: rotate(-90deg); +} +select:not([multiple]) { + appearance: none; + padding-right: 30px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath fill='%23888a92' d='M1.5 2.5 6 9.5l4.5-7z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 9px center; + background-size: 12px 12px; +} +.results-parking-anchor { + position: absolute; + inset: 0 auto auto 0; + width: 0; + height: 0; + pointer-events: none; +} + +/* src/styles/tile-contract.css */ +.donut-metric-rack { + grid-template-columns: repeat(auto-fill, var(--tile-compact-width)); + justify-content: start; +} +@media (min-width: 1101px) { + .datahub-reference-controls { + grid-template-columns: repeat(6, minmax(0, 1fr)); + } +} + +/* tests/fixtures/client-info-design/preview.css */ +body { + overflow: auto; +} diff --git a/outputs/client-info-design-check/preview.js b/outputs/client-info-design-check/preview.js new file mode 100644 index 0000000..22b7370 --- /dev/null +++ b/outputs/client-info-design-check/preview.js @@ -0,0 +1,25649 @@ +(() => { + var __create = Object.create; + var __defProp = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod + )); + + // node_modules/scheduler/cjs/scheduler.development.js + var require_scheduler_development = __commonJS({ + "node_modules/scheduler/cjs/scheduler.development.js"(exports) { + "use strict"; + (function() { + function performWorkUntilDeadline() { + needsPaint = false; + if (isMessageLoopRunning) { + var currentTime = exports.unstable_now(); + startTime = currentTime; + var hasMoreWork = true; + try { + a: { + isHostCallbackScheduled = false; + isHostTimeoutScheduled && (isHostTimeoutScheduled = false, localClearTimeout(taskTimeoutID), taskTimeoutID = -1); + isPerformingWork = true; + var previousPriorityLevel = currentPriorityLevel; + try { + b: { + advanceTimers(currentTime); + for (currentTask = peek(taskQueue); null !== currentTask && !(currentTask.expirationTime > currentTime && shouldYieldToHost()); ) { + var callback = currentTask.callback; + if ("function" === typeof callback) { + currentTask.callback = null; + currentPriorityLevel = currentTask.priorityLevel; + var continuationCallback = callback( + currentTask.expirationTime <= currentTime + ); + currentTime = exports.unstable_now(); + if ("function" === typeof continuationCallback) { + currentTask.callback = continuationCallback; + advanceTimers(currentTime); + hasMoreWork = true; + break b; + } + currentTask === peek(taskQueue) && pop(taskQueue); + advanceTimers(currentTime); + } else pop(taskQueue); + currentTask = peek(taskQueue); + } + if (null !== currentTask) hasMoreWork = true; + else { + var firstTimer = peek(timerQueue); + null !== firstTimer && requestHostTimeout( + handleTimeout, + firstTimer.startTime - currentTime + ); + hasMoreWork = false; + } + } + break a; + } finally { + currentTask = null, currentPriorityLevel = previousPriorityLevel, isPerformingWork = false; + } + hasMoreWork = void 0; + } + } finally { + hasMoreWork ? schedulePerformWorkUntilDeadline() : isMessageLoopRunning = false; + } + } + } + function push(heap, node) { + var index = heap.length; + heap.push(node); + a: for (; 0 < index; ) { + var parentIndex = index - 1 >>> 1, parent = heap[parentIndex]; + if (0 < compare(parent, node)) + heap[parentIndex] = node, heap[index] = parent, index = parentIndex; + else break a; + } + } + function peek(heap) { + return 0 === heap.length ? null : heap[0]; + } + function pop(heap) { + if (0 === heap.length) return null; + var first = heap[0], last = heap.pop(); + if (last !== first) { + heap[0] = last; + a: for (var index = 0, length = heap.length, halfLength = length >>> 1; index < halfLength; ) { + var leftIndex = 2 * (index + 1) - 1, left = heap[leftIndex], rightIndex = leftIndex + 1, right = heap[rightIndex]; + if (0 > compare(left, last)) + rightIndex < length && 0 > compare(right, left) ? (heap[index] = right, heap[rightIndex] = last, index = rightIndex) : (heap[index] = left, heap[leftIndex] = last, index = leftIndex); + else if (rightIndex < length && 0 > compare(right, last)) + heap[index] = right, heap[rightIndex] = last, index = rightIndex; + else break a; + } + } + return first; + } + function compare(a, b) { + var diff = a.sortIndex - b.sortIndex; + return 0 !== diff ? diff : a.id - b.id; + } + function advanceTimers(currentTime) { + for (var timer = peek(timerQueue); null !== timer; ) { + if (null === timer.callback) pop(timerQueue); + else if (timer.startTime <= currentTime) + pop(timerQueue), timer.sortIndex = timer.expirationTime, push(taskQueue, timer); + else break; + timer = peek(timerQueue); + } + } + function handleTimeout(currentTime) { + isHostTimeoutScheduled = false; + advanceTimers(currentTime); + if (!isHostCallbackScheduled) + if (null !== peek(taskQueue)) + isHostCallbackScheduled = true, isMessageLoopRunning || (isMessageLoopRunning = true, schedulePerformWorkUntilDeadline()); + else { + var firstTimer = peek(timerQueue); + null !== firstTimer && requestHostTimeout( + handleTimeout, + firstTimer.startTime - currentTime + ); + } + } + function shouldYieldToHost() { + return needsPaint ? true : exports.unstable_now() - startTime < frameInterval ? false : true; + } + function requestHostTimeout(callback, ms) { + taskTimeoutID = localSetTimeout(function() { + callback(exports.unstable_now()); + }, ms); + } + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); + exports.unstable_now = void 0; + if ("object" === typeof performance && "function" === typeof performance.now) { + var localPerformance = performance; + exports.unstable_now = function() { + return localPerformance.now(); + }; + } else { + var localDate = Date, initialTime = localDate.now(); + exports.unstable_now = function() { + return localDate.now() - initialTime; + }; + } + var taskQueue = [], timerQueue = [], taskIdCounter = 1, currentTask = null, currentPriorityLevel = 3, isPerformingWork = false, isHostCallbackScheduled = false, isHostTimeoutScheduled = false, needsPaint = false, localSetTimeout = "function" === typeof setTimeout ? setTimeout : null, localClearTimeout = "function" === typeof clearTimeout ? clearTimeout : null, localSetImmediate = "undefined" !== typeof setImmediate ? setImmediate : null, isMessageLoopRunning = false, taskTimeoutID = -1, frameInterval = 5, startTime = -1; + if ("function" === typeof localSetImmediate) + var schedulePerformWorkUntilDeadline = function() { + localSetImmediate(performWorkUntilDeadline); + }; + else if ("undefined" !== typeof MessageChannel) { + var channel = new MessageChannel(), port = channel.port2; + channel.port1.onmessage = performWorkUntilDeadline; + schedulePerformWorkUntilDeadline = function() { + port.postMessage(null); + }; + } else + schedulePerformWorkUntilDeadline = function() { + localSetTimeout(performWorkUntilDeadline, 0); + }; + exports.unstable_IdlePriority = 5; + exports.unstable_ImmediatePriority = 1; + exports.unstable_LowPriority = 4; + exports.unstable_NormalPriority = 3; + exports.unstable_Profiling = null; + exports.unstable_UserBlockingPriority = 2; + exports.unstable_cancelCallback = function(task) { + task.callback = null; + }; + exports.unstable_forceFrameRate = function(fps) { + 0 > fps || 125 < fps ? console.error( + "forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported" + ) : frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5; + }; + exports.unstable_getCurrentPriorityLevel = function() { + return currentPriorityLevel; + }; + exports.unstable_next = function(eventHandler) { + switch (currentPriorityLevel) { + case 1: + case 2: + case 3: + var priorityLevel = 3; + break; + default: + priorityLevel = currentPriorityLevel; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; + exports.unstable_requestPaint = function() { + needsPaint = true; + }; + exports.unstable_runWithPriority = function(priorityLevel, eventHandler) { + switch (priorityLevel) { + case 1: + case 2: + case 3: + case 4: + case 5: + break; + default: + priorityLevel = 3; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; + exports.unstable_scheduleCallback = function(priorityLevel, callback, options) { + var currentTime = exports.unstable_now(); + "object" === typeof options && null !== options ? (options = options.delay, options = "number" === typeof options && 0 < options ? currentTime + options : currentTime) : options = currentTime; + switch (priorityLevel) { + case 1: + var timeout = -1; + break; + case 2: + timeout = 250; + break; + case 5: + timeout = 1073741823; + break; + case 4: + timeout = 1e4; + break; + default: + timeout = 5e3; + } + timeout = options + timeout; + priorityLevel = { + id: taskIdCounter++, + callback, + priorityLevel, + startTime: options, + expirationTime: timeout, + sortIndex: -1 + }; + options > currentTime ? (priorityLevel.sortIndex = options, push(timerQueue, priorityLevel), null === peek(taskQueue) && priorityLevel === peek(timerQueue) && (isHostTimeoutScheduled ? (localClearTimeout(taskTimeoutID), taskTimeoutID = -1) : isHostTimeoutScheduled = true, requestHostTimeout(handleTimeout, options - currentTime))) : (priorityLevel.sortIndex = timeout, push(taskQueue, priorityLevel), isHostCallbackScheduled || isPerformingWork || (isHostCallbackScheduled = true, isMessageLoopRunning || (isMessageLoopRunning = true, schedulePerformWorkUntilDeadline()))); + return priorityLevel; + }; + exports.unstable_shouldYield = shouldYieldToHost; + exports.unstable_wrapCallback = function(callback) { + var parentPriorityLevel = currentPriorityLevel; + return function() { + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = parentPriorityLevel; + try { + return callback.apply(this, arguments); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; + }; + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); + })(); + } + }); + + // node_modules/scheduler/index.js + var require_scheduler = __commonJS({ + "node_modules/scheduler/index.js"(exports, module) { + "use strict"; + if (false) { + module.exports = null; + } else { + module.exports = require_scheduler_development(); + } + } + }); + + // node_modules/react/cjs/react.development.js + var require_react_development = __commonJS({ + "node_modules/react/cjs/react.development.js"(exports, module) { + "use strict"; + (function() { + function defineDeprecationWarning(methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function() { + console.warn( + "%s(...) is deprecated in plain JavaScript React classes. %s", + info[0], + info[1] + ); + } + }); + } + function getIteratorFn(maybeIterable) { + if (null === maybeIterable || "object" !== typeof maybeIterable) + return null; + maybeIterable = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable["@@iterator"]; + return "function" === typeof maybeIterable ? maybeIterable : null; + } + function warnNoop(publicInstance, callerName) { + publicInstance = (publicInstance = publicInstance.constructor) && (publicInstance.displayName || publicInstance.name) || "ReactClass"; + var warningKey = publicInstance + "." + callerName; + didWarnStateUpdateForUnmountedComponent[warningKey] || (console.error( + "Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", + callerName, + publicInstance + ), didWarnStateUpdateForUnmountedComponent[warningKey] = true); + } + function Component(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + function ComponentDummy() { + } + function PureComponent(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + function noop() { + } + function testStringCoercion(value2) { + return "" + value2; + } + function checkKeyStringCoercion(value2) { + try { + testStringCoercion(value2); + var JSCompiler_inline_result = false; + } catch (e) { + JSCompiler_inline_result = true; + } + if (JSCompiler_inline_result) { + JSCompiler_inline_result = console; + var JSCompiler_temp_const = JSCompiler_inline_result.error; + var JSCompiler_inline_result$jscomp$0 = "function" === typeof Symbol && Symbol.toStringTag && value2[Symbol.toStringTag] || value2.constructor.name || "Object"; + JSCompiler_temp_const.call( + JSCompiler_inline_result, + "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.", + JSCompiler_inline_result$jscomp$0 + ); + return testStringCoercion(value2); + } + } + function getComponentNameFromType(type) { + if (null == type) return null; + if ("function" === typeof type) + return type.$$typeof === REACT_CLIENT_REFERENCE ? null : type.displayName || type.name || null; + if ("string" === typeof type) return type; + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + case REACT_ACTIVITY_TYPE: + return "Activity"; + } + if ("object" === typeof type) + switch ("number" === typeof type.tag && console.error( + "Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue." + ), type.$$typeof) { + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_CONTEXT_TYPE: + return type.displayName || "Context"; + case REACT_CONSUMER_TYPE: + return (type._context.displayName || "Context") + ".Consumer"; + case REACT_FORWARD_REF_TYPE: + var innerType = type.render; + type = type.displayName; + type || (type = innerType.displayName || innerType.name || "", type = "" !== type ? "ForwardRef(" + type + ")" : "ForwardRef"); + return type; + case REACT_MEMO_TYPE: + return innerType = type.displayName || null, null !== innerType ? innerType : getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: + innerType = type._payload; + type = type._init; + try { + return getComponentNameFromType(type(innerType)); + } catch (x) { + } + } + return null; + } + function getTaskName(type) { + if (type === REACT_FRAGMENT_TYPE) return "<>"; + if ("object" === typeof type && null !== type && type.$$typeof === REACT_LAZY_TYPE) + return "<...>"; + try { + var name = getComponentNameFromType(type); + return name ? "<" + name + ">" : "<...>"; + } catch (x) { + return "<...>"; + } + } + function getOwner() { + var dispatcher = ReactSharedInternals.A; + return null === dispatcher ? null : dispatcher.getOwner(); + } + function UnknownOwner() { + return Error("react-stack-top-frame"); + } + function hasValidKey(config) { + if (hasOwnProperty.call(config, "key")) { + var getter = Object.getOwnPropertyDescriptor(config, "key").get; + if (getter && getter.isReactWarning) return false; + } + return void 0 !== config.key; + } + function defineKeyPropWarningGetter(props, displayName) { + function warnAboutAccessingKey() { + specialPropKeyWarningShown || (specialPropKeyWarningShown = true, console.error( + "%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)", + displayName + )); + } + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, "key", { + get: warnAboutAccessingKey, + configurable: true + }); + } + function elementRefGetterWithDeprecationWarning() { + var componentName = getComponentNameFromType(this.type); + didWarnAboutElementRef[componentName] || (didWarnAboutElementRef[componentName] = true, console.error( + "Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release." + )); + componentName = this.props.ref; + return void 0 !== componentName ? componentName : null; + } + function ReactElement(type, key, props, owner, debugStack, debugTask) { + var refProp = props.ref; + type = { + $$typeof: REACT_ELEMENT_TYPE, + type, + key, + props, + _owner: owner + }; + null !== (void 0 !== refProp ? refProp : null) ? Object.defineProperty(type, "ref", { + enumerable: false, + get: elementRefGetterWithDeprecationWarning + }) : Object.defineProperty(type, "ref", { enumerable: false, value: null }); + type._store = {}; + Object.defineProperty(type._store, "validated", { + configurable: false, + enumerable: false, + writable: true, + value: 0 + }); + Object.defineProperty(type, "_debugInfo", { + configurable: false, + enumerable: false, + writable: true, + value: null + }); + Object.defineProperty(type, "_debugStack", { + configurable: false, + enumerable: false, + writable: true, + value: debugStack + }); + Object.defineProperty(type, "_debugTask", { + configurable: false, + enumerable: false, + writable: true, + value: debugTask + }); + Object.freeze && (Object.freeze(type.props), Object.freeze(type)); + return type; + } + function cloneAndReplaceKey(oldElement, newKey) { + newKey = ReactElement( + oldElement.type, + newKey, + oldElement.props, + oldElement._owner, + oldElement._debugStack, + oldElement._debugTask + ); + oldElement._store && (newKey._store.validated = oldElement._store.validated); + return newKey; + } + function validateChildKeys(node) { + isValidElement(node) ? node._store && (node._store.validated = 1) : "object" === typeof node && null !== node && node.$$typeof === REACT_LAZY_TYPE && ("fulfilled" === node._payload.status ? isValidElement(node._payload.value) && node._payload.value._store && (node._payload.value._store.validated = 1) : node._store && (node._store.validated = 1)); + } + function isValidElement(object) { + return "object" === typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE; + } + function escape(key) { + var escaperLookup = { "=": "=0", ":": "=2" }; + return "$" + key.replace(/[=:]/g, function(match) { + return escaperLookup[match]; + }); + } + function getElementKey(element, index) { + return "object" === typeof element && null !== element && null != element.key ? (checkKeyStringCoercion(element.key), escape("" + element.key)) : index.toString(36); + } + function resolveThenable(thenable) { + switch (thenable.status) { + case "fulfilled": + return thenable.value; + case "rejected": + throw thenable.reason; + default: + switch ("string" === typeof thenable.status ? thenable.then(noop, noop) : (thenable.status = "pending", thenable.then( + function(fulfilledValue) { + "pending" === thenable.status && (thenable.status = "fulfilled", thenable.value = fulfilledValue); + }, + function(error) { + "pending" === thenable.status && (thenable.status = "rejected", thenable.reason = error); + } + )), thenable.status) { + case "fulfilled": + return thenable.value; + case "rejected": + throw thenable.reason; + } + } + throw thenable; + } + function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + if ("undefined" === type || "boolean" === type) children = null; + var invokeCallback = false; + if (null === children) invokeCallback = true; + else + switch (type) { + case "bigint": + case "string": + case "number": + invokeCallback = true; + break; + case "object": + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + break; + case REACT_LAZY_TYPE: + return invokeCallback = children._init, mapIntoArray( + invokeCallback(children._payload), + array, + escapedPrefix, + nameSoFar, + callback + ); + } + } + if (invokeCallback) { + invokeCallback = children; + callback = callback(invokeCallback); + var childKey = "" === nameSoFar ? "." + getElementKey(invokeCallback, 0) : nameSoFar; + isArrayImpl(callback) ? (escapedPrefix = "", null != childKey && (escapedPrefix = childKey.replace(userProvidedKeyEscapeRegex, "$&/") + "/"), mapIntoArray(callback, array, escapedPrefix, "", function(c) { + return c; + })) : null != callback && (isValidElement(callback) && (null != callback.key && (invokeCallback && invokeCallback.key === callback.key || checkKeyStringCoercion(callback.key)), escapedPrefix = cloneAndReplaceKey( + callback, + escapedPrefix + (null == callback.key || invokeCallback && invokeCallback.key === callback.key ? "" : ("" + callback.key).replace( + userProvidedKeyEscapeRegex, + "$&/" + ) + "/") + childKey + ), "" !== nameSoFar && null != invokeCallback && isValidElement(invokeCallback) && null == invokeCallback.key && invokeCallback._store && !invokeCallback._store.validated && (escapedPrefix._store.validated = 2), callback = escapedPrefix), array.push(callback)); + return 1; + } + invokeCallback = 0; + childKey = "" === nameSoFar ? "." : nameSoFar + ":"; + if (isArrayImpl(children)) + for (var i = 0; i < children.length; i++) + nameSoFar = children[i], type = childKey + getElementKey(nameSoFar, i), invokeCallback += mapIntoArray( + nameSoFar, + array, + escapedPrefix, + type, + callback + ); + else if (i = getIteratorFn(children), "function" === typeof i) + for (i === children.entries && (didWarnAboutMaps || console.warn( + "Using Maps as children is not supported. Use an array of keyed ReactElements instead." + ), didWarnAboutMaps = true), children = i.call(children), i = 0; !(nameSoFar = children.next()).done; ) + nameSoFar = nameSoFar.value, type = childKey + getElementKey(nameSoFar, i++), invokeCallback += mapIntoArray( + nameSoFar, + array, + escapedPrefix, + type, + callback + ); + else if ("object" === type) { + if ("function" === typeof children.then) + return mapIntoArray( + resolveThenable(children), + array, + escapedPrefix, + nameSoFar, + callback + ); + array = String(children); + throw Error( + "Objects are not valid as a React child (found: " + ("[object Object]" === array ? "object with keys {" + Object.keys(children).join(", ") + "}" : array) + "). If you meant to render a collection of children, use an array instead." + ); + } + return invokeCallback; + } + function mapChildren(children, func, context) { + if (null == children) return children; + var result = [], count2 = 0; + mapIntoArray(children, result, "", "", function(child) { + return func.call(context, child, count2++); + }); + return result; + } + function lazyInitializer(payload) { + if (-1 === payload._status) { + var ioInfo = payload._ioInfo; + null != ioInfo && (ioInfo.start = ioInfo.end = performance.now()); + ioInfo = payload._result; + var thenable = ioInfo(); + thenable.then( + function(moduleObject) { + if (0 === payload._status || -1 === payload._status) { + payload._status = 1; + payload._result = moduleObject; + var _ioInfo = payload._ioInfo; + null != _ioInfo && (_ioInfo.end = performance.now()); + void 0 === thenable.status && (thenable.status = "fulfilled", thenable.value = moduleObject); + } + }, + function(error) { + if (0 === payload._status || -1 === payload._status) { + payload._status = 2; + payload._result = error; + var _ioInfo2 = payload._ioInfo; + null != _ioInfo2 && (_ioInfo2.end = performance.now()); + void 0 === thenable.status && (thenable.status = "rejected", thenable.reason = error); + } + } + ); + ioInfo = payload._ioInfo; + if (null != ioInfo) { + ioInfo.value = thenable; + var displayName = thenable.displayName; + "string" === typeof displayName && (ioInfo.name = displayName); + } + -1 === payload._status && (payload._status = 0, payload._result = thenable); + } + if (1 === payload._status) + return ioInfo = payload._result, void 0 === ioInfo && console.error( + "lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?", + ioInfo + ), "default" in ioInfo || console.error( + "lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))", + ioInfo + ), ioInfo.default; + throw payload._result; + } + function resolveDispatcher() { + var dispatcher = ReactSharedInternals.H; + null === dispatcher && console.error( + "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem." + ); + return dispatcher; + } + function releaseAsyncTransition() { + ReactSharedInternals.asyncTransitions--; + } + function enqueueTask(task) { + if (null === enqueueTaskImpl) + try { + var requireString = ("require" + Math.random()).slice(0, 7); + enqueueTaskImpl = (module && module[requireString]).call( + module, + "timers" + ).setImmediate; + } catch (_err) { + enqueueTaskImpl = function(callback) { + false === didWarnAboutMessageChannel && (didWarnAboutMessageChannel = true, "undefined" === typeof MessageChannel && console.error( + "This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning." + )); + var channel = new MessageChannel(); + channel.port1.onmessage = callback; + channel.port2.postMessage(void 0); + }; + } + return enqueueTaskImpl(task); + } + function aggregateErrors(errors) { + return 1 < errors.length && "function" === typeof AggregateError ? new AggregateError(errors) : errors[0]; + } + function popActScope(prevActQueue, prevActScopeDepth) { + prevActScopeDepth !== actScopeDepth - 1 && console.error( + "You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. " + ); + actScopeDepth = prevActScopeDepth; + } + function recursivelyFlushAsyncActWork(returnValue, resolve, reject) { + var queue = ReactSharedInternals.actQueue; + if (null !== queue) + if (0 !== queue.length) + try { + flushActQueue(queue); + enqueueTask(function() { + return recursivelyFlushAsyncActWork(returnValue, resolve, reject); + }); + return; + } catch (error) { + ReactSharedInternals.thrownErrors.push(error); + } + else ReactSharedInternals.actQueue = null; + 0 < ReactSharedInternals.thrownErrors.length ? (queue = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, reject(queue)) : resolve(returnValue); + } + function flushActQueue(queue) { + if (!isFlushing) { + isFlushing = true; + var i = 0; + try { + for (; i < queue.length; i++) { + var callback = queue[i]; + do { + ReactSharedInternals.didUsePromise = false; + var continuation = callback(false); + if (null !== continuation) { + if (ReactSharedInternals.didUsePromise) { + queue[i] = callback; + queue.splice(0, i); + return; + } + callback = continuation; + } else break; + } while (1); + } + queue.length = 0; + } catch (error) { + queue.splice(0, i + 1), ReactSharedInternals.thrownErrors.push(error); + } finally { + isFlushing = false; + } + } + } + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); + var REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = /* @__PURE__ */ Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = /* @__PURE__ */ Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = /* @__PURE__ */ Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = /* @__PURE__ */ Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = /* @__PURE__ */ Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = /* @__PURE__ */ Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = /* @__PURE__ */ Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = /* @__PURE__ */ Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = /* @__PURE__ */ Symbol.for("react.memo"), REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy"), REACT_ACTIVITY_TYPE = /* @__PURE__ */ Symbol.for("react.activity"), MAYBE_ITERATOR_SYMBOL = Symbol.iterator, didWarnStateUpdateForUnmountedComponent = {}, ReactNoopUpdateQueue = { + isMounted: function() { + return false; + }, + enqueueForceUpdate: function(publicInstance) { + warnNoop(publicInstance, "forceUpdate"); + }, + enqueueReplaceState: function(publicInstance) { + warnNoop(publicInstance, "replaceState"); + }, + enqueueSetState: function(publicInstance) { + warnNoop(publicInstance, "setState"); + } + }, assign = Object.assign, emptyObject = {}; + Object.freeze(emptyObject); + Component.prototype.isReactComponent = {}; + Component.prototype.setState = function(partialState, callback) { + if ("object" !== typeof partialState && "function" !== typeof partialState && null != partialState) + throw Error( + "takes an object of state variables to update or a function which returns an object of state variables." + ); + this.updater.enqueueSetState(this, partialState, callback, "setState"); + }; + Component.prototype.forceUpdate = function(callback) { + this.updater.enqueueForceUpdate(this, callback, "forceUpdate"); + }; + var deprecatedAPIs = { + isMounted: [ + "isMounted", + "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks." + ], + replaceState: [ + "replaceState", + "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)." + ] + }; + for (fnName in deprecatedAPIs) + deprecatedAPIs.hasOwnProperty(fnName) && defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + ComponentDummy.prototype = Component.prototype; + deprecatedAPIs = PureComponent.prototype = new ComponentDummy(); + deprecatedAPIs.constructor = PureComponent; + assign(deprecatedAPIs, Component.prototype); + deprecatedAPIs.isPureReactComponent = true; + var isArrayImpl = Array.isArray, REACT_CLIENT_REFERENCE = /* @__PURE__ */ Symbol.for("react.client.reference"), ReactSharedInternals = { + H: null, + A: null, + T: null, + S: null, + actQueue: null, + asyncTransitions: 0, + isBatchingLegacy: false, + didScheduleLegacyUpdate: false, + didUsePromise: false, + thrownErrors: [], + getCurrentStack: null, + recentlyCreatedOwnerStacks: 0 + }, hasOwnProperty = Object.prototype.hasOwnProperty, createTask = console.createTask ? console.createTask : function() { + return null; + }; + deprecatedAPIs = { + react_stack_bottom_frame: function(callStackForError) { + return callStackForError(); + } + }; + var specialPropKeyWarningShown, didWarnAboutOldJSXRuntime; + var didWarnAboutElementRef = {}; + var unknownOwnerDebugStack = deprecatedAPIs.react_stack_bottom_frame.bind( + deprecatedAPIs, + UnknownOwner + )(); + var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner)); + var didWarnAboutMaps = false, userProvidedKeyEscapeRegex = /\/+/g, reportGlobalError = "function" === typeof reportError ? reportError : function(error) { + if ("object" === typeof window && "function" === typeof window.ErrorEvent) { + var event = new window.ErrorEvent("error", { + bubbles: true, + cancelable: true, + message: "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error), + error + }); + if (!window.dispatchEvent(event)) return; + } else if ("object" === typeof process && "function" === typeof process.emit) { + process.emit("uncaughtException", error); + return; + } + console.error(error); + }, didWarnAboutMessageChannel = false, enqueueTaskImpl = null, actScopeDepth = 0, didWarnNoAwaitAct = false, isFlushing = false, queueSeveralMicrotasks = "function" === typeof queueMicrotask ? function(callback) { + queueMicrotask(function() { + return queueMicrotask(callback); + }); + } : enqueueTask; + deprecatedAPIs = Object.freeze({ + __proto__: null, + c: function(size) { + return resolveDispatcher().useMemoCache(size); + } + }); + var fnName = { + map: mapChildren, + forEach: function(children, forEachFunc, forEachContext) { + mapChildren( + children, + function() { + forEachFunc.apply(this, arguments); + }, + forEachContext + ); + }, + count: function(children) { + var n = 0; + mapChildren(children, function() { + n++; + }); + return n; + }, + toArray: function(children) { + return mapChildren(children, function(child) { + return child; + }) || []; + }, + only: function(children) { + if (!isValidElement(children)) + throw Error( + "React.Children.only expected to receive a single React element child." + ); + return children; + } + }; + exports.Activity = REACT_ACTIVITY_TYPE; + exports.Children = fnName; + exports.Component = Component; + exports.Fragment = REACT_FRAGMENT_TYPE; + exports.Profiler = REACT_PROFILER_TYPE; + exports.PureComponent = PureComponent; + exports.StrictMode = REACT_STRICT_MODE_TYPE; + exports.Suspense = REACT_SUSPENSE_TYPE; + exports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = ReactSharedInternals; + exports.__COMPILER_RUNTIME = deprecatedAPIs; + exports.act = function(callback) { + var prevActQueue = ReactSharedInternals.actQueue, prevActScopeDepth = actScopeDepth; + actScopeDepth++; + var queue = ReactSharedInternals.actQueue = null !== prevActQueue ? prevActQueue : [], didAwaitActCall = false; + try { + var result = callback(); + } catch (error) { + ReactSharedInternals.thrownErrors.push(error); + } + if (0 < ReactSharedInternals.thrownErrors.length) + throw popActScope(prevActQueue, prevActScopeDepth), callback = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, callback; + if (null !== result && "object" === typeof result && "function" === typeof result.then) { + var thenable = result; + queueSeveralMicrotasks(function() { + didAwaitActCall || didWarnNoAwaitAct || (didWarnNoAwaitAct = true, console.error( + "You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);" + )); + }); + return { + then: function(resolve, reject) { + didAwaitActCall = true; + thenable.then( + function(returnValue) { + popActScope(prevActQueue, prevActScopeDepth); + if (0 === prevActScopeDepth) { + try { + flushActQueue(queue), enqueueTask(function() { + return recursivelyFlushAsyncActWork( + returnValue, + resolve, + reject + ); + }); + } catch (error$0) { + ReactSharedInternals.thrownErrors.push(error$0); + } + if (0 < ReactSharedInternals.thrownErrors.length) { + var _thrownError = aggregateErrors( + ReactSharedInternals.thrownErrors + ); + ReactSharedInternals.thrownErrors.length = 0; + reject(_thrownError); + } + } else resolve(returnValue); + }, + function(error) { + popActScope(prevActQueue, prevActScopeDepth); + 0 < ReactSharedInternals.thrownErrors.length ? (error = aggregateErrors( + ReactSharedInternals.thrownErrors + ), ReactSharedInternals.thrownErrors.length = 0, reject(error)) : reject(error); + } + ); + } + }; + } + var returnValue$jscomp$0 = result; + popActScope(prevActQueue, prevActScopeDepth); + 0 === prevActScopeDepth && (flushActQueue(queue), 0 !== queue.length && queueSeveralMicrotasks(function() { + didAwaitActCall || didWarnNoAwaitAct || (didWarnNoAwaitAct = true, console.error( + "A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result:\n\nawait act(() => ...)" + )); + }), ReactSharedInternals.actQueue = null); + if (0 < ReactSharedInternals.thrownErrors.length) + throw callback = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, callback; + return { + then: function(resolve, reject) { + didAwaitActCall = true; + 0 === prevActScopeDepth ? (ReactSharedInternals.actQueue = queue, enqueueTask(function() { + return recursivelyFlushAsyncActWork( + returnValue$jscomp$0, + resolve, + reject + ); + })) : resolve(returnValue$jscomp$0); + } + }; + }; + exports.cache = function(fn) { + return function() { + return fn.apply(null, arguments); + }; + }; + exports.cacheSignal = function() { + return null; + }; + exports.captureOwnerStack = function() { + var getCurrentStack = ReactSharedInternals.getCurrentStack; + return null === getCurrentStack ? null : getCurrentStack(); + }; + exports.cloneElement = function(element, config, children) { + if (null === element || void 0 === element) + throw Error( + "The argument must be a React element, but you passed " + element + "." + ); + var props = assign({}, element.props), key = element.key, owner = element._owner; + if (null != config) { + var JSCompiler_inline_result; + a: { + if (hasOwnProperty.call(config, "ref") && (JSCompiler_inline_result = Object.getOwnPropertyDescriptor( + config, + "ref" + ).get) && JSCompiler_inline_result.isReactWarning) { + JSCompiler_inline_result = false; + break a; + } + JSCompiler_inline_result = void 0 !== config.ref; + } + JSCompiler_inline_result && (owner = getOwner()); + hasValidKey(config) && (checkKeyStringCoercion(config.key), key = "" + config.key); + for (propName in config) + !hasOwnProperty.call(config, propName) || "key" === propName || "__self" === propName || "__source" === propName || "ref" === propName && void 0 === config.ref || (props[propName] = config[propName]); + } + var propName = arguments.length - 2; + if (1 === propName) props.children = children; + else if (1 < propName) { + JSCompiler_inline_result = Array(propName); + for (var i = 0; i < propName; i++) + JSCompiler_inline_result[i] = arguments[i + 2]; + props.children = JSCompiler_inline_result; + } + props = ReactElement( + element.type, + key, + props, + owner, + element._debugStack, + element._debugTask + ); + for (key = 2; key < arguments.length; key++) + validateChildKeys(arguments[key]); + return props; + }; + exports.createContext = function(defaultValue) { + defaultValue = { + $$typeof: REACT_CONTEXT_TYPE, + _currentValue: defaultValue, + _currentValue2: defaultValue, + _threadCount: 0, + Provider: null, + Consumer: null + }; + defaultValue.Provider = defaultValue; + defaultValue.Consumer = { + $$typeof: REACT_CONSUMER_TYPE, + _context: defaultValue + }; + defaultValue._currentRenderer = null; + defaultValue._currentRenderer2 = null; + return defaultValue; + }; + exports.createElement = function(type, config, children) { + for (var i = 2; i < arguments.length; i++) + validateChildKeys(arguments[i]); + i = {}; + var key = null; + if (null != config) + for (propName in didWarnAboutOldJSXRuntime || !("__self" in config) || "key" in config || (didWarnAboutOldJSXRuntime = true, console.warn( + "Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance: https://react.dev/link/new-jsx-transform" + )), hasValidKey(config) && (checkKeyStringCoercion(config.key), key = "" + config.key), config) + hasOwnProperty.call(config, propName) && "key" !== propName && "__self" !== propName && "__source" !== propName && (i[propName] = config[propName]); + var childrenLength = arguments.length - 2; + if (1 === childrenLength) i.children = children; + else if (1 < childrenLength) { + for (var childArray = Array(childrenLength), _i = 0; _i < childrenLength; _i++) + childArray[_i] = arguments[_i + 2]; + Object.freeze && Object.freeze(childArray); + i.children = childArray; + } + if (type && type.defaultProps) + for (propName in childrenLength = type.defaultProps, childrenLength) + void 0 === i[propName] && (i[propName] = childrenLength[propName]); + key && defineKeyPropWarningGetter( + i, + "function" === typeof type ? type.displayName || type.name || "Unknown" : type + ); + var propName = 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++; + return ReactElement( + type, + key, + i, + getOwner(), + propName ? Error("react-stack-top-frame") : unknownOwnerDebugStack, + propName ? createTask(getTaskName(type)) : unknownOwnerDebugTask + ); + }; + exports.createRef = function() { + var refObject = { current: null }; + Object.seal(refObject); + return refObject; + }; + exports.forwardRef = function(render) { + null != render && render.$$typeof === REACT_MEMO_TYPE ? console.error( + "forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))." + ) : "function" !== typeof render ? console.error( + "forwardRef requires a render function but was given %s.", + null === render ? "null" : typeof render + ) : 0 !== render.length && 2 !== render.length && console.error( + "forwardRef render functions accept exactly two parameters: props and ref. %s", + 1 === render.length ? "Did you forget to use the ref parameter?" : "Any additional parameter will be undefined." + ); + null != render && null != render.defaultProps && console.error( + "forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?" + ); + var elementType = { $$typeof: REACT_FORWARD_REF_TYPE, render }, ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function() { + return ownName; + }, + set: function(name) { + ownName = name; + render.name || render.displayName || (Object.defineProperty(render, "name", { value: name }), render.displayName = name); + } + }); + return elementType; + }; + exports.isValidElement = isValidElement; + exports.lazy = function(ctor) { + ctor = { _status: -1, _result: ctor }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: ctor, + _init: lazyInitializer + }, ioInfo = { + name: "lazy", + start: -1, + end: -1, + value: null, + owner: null, + debugStack: Error("react-stack-top-frame"), + debugTask: console.createTask ? console.createTask("lazy()") : null + }; + ctor._ioInfo = ioInfo; + lazyType._debugInfo = [{ awaited: ioInfo }]; + return lazyType; + }; + exports.memo = function(type, compare) { + null == type && console.error( + "memo: The first argument must be a component. Instead received: %s", + null === type ? "null" : typeof type + ); + compare = { + $$typeof: REACT_MEMO_TYPE, + type, + compare: void 0 === compare ? null : compare + }; + var ownName; + Object.defineProperty(compare, "displayName", { + enumerable: false, + configurable: true, + get: function() { + return ownName; + }, + set: function(name) { + ownName = name; + type.name || type.displayName || (Object.defineProperty(type, "name", { value: name }), type.displayName = name); + } + }); + return compare; + }; + exports.startTransition = function(scope) { + var prevTransition = ReactSharedInternals.T, currentTransition = {}; + currentTransition._updatedFibers = /* @__PURE__ */ new Set(); + ReactSharedInternals.T = currentTransition; + try { + var returnValue = scope(), onStartTransitionFinish = ReactSharedInternals.S; + null !== onStartTransitionFinish && onStartTransitionFinish(currentTransition, returnValue); + "object" === typeof returnValue && null !== returnValue && "function" === typeof returnValue.then && (ReactSharedInternals.asyncTransitions++, returnValue.then(releaseAsyncTransition, releaseAsyncTransition), returnValue.then(noop, reportGlobalError)); + } catch (error) { + reportGlobalError(error); + } finally { + null === prevTransition && currentTransition._updatedFibers && (scope = currentTransition._updatedFibers.size, currentTransition._updatedFibers.clear(), 10 < scope && console.warn( + "Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table." + )), null !== prevTransition && null !== currentTransition.types && (null !== prevTransition.types && prevTransition.types !== currentTransition.types && console.error( + "We expected inner Transitions to have transferred the outer types set and that you cannot add to the outer Transition while inside the inner.This is a bug in React." + ), prevTransition.types = currentTransition.types), ReactSharedInternals.T = prevTransition; + } + }; + exports.unstable_useCacheRefresh = function() { + return resolveDispatcher().useCacheRefresh(); + }; + exports.use = function(usable) { + return resolveDispatcher().use(usable); + }; + exports.useActionState = function(action, initialState, permalink) { + return resolveDispatcher().useActionState( + action, + initialState, + permalink + ); + }; + exports.useCallback = function(callback, deps) { + return resolveDispatcher().useCallback(callback, deps); + }; + exports.useContext = function(Context) { + var dispatcher = resolveDispatcher(); + Context.$$typeof === REACT_CONSUMER_TYPE && console.error( + "Calling useContext(Context.Consumer) is not supported and will cause bugs. Did you mean to call useContext(Context) instead?" + ); + return dispatcher.useContext(Context); + }; + exports.useDebugValue = function(value2, formatterFn) { + return resolveDispatcher().useDebugValue(value2, formatterFn); + }; + exports.useDeferredValue = function(value2, initialValue) { + return resolveDispatcher().useDeferredValue(value2, initialValue); + }; + exports.useEffect = function(create, deps) { + null == create && console.warn( + "React Hook useEffect requires an effect callback. Did you forget to pass a callback to the hook?" + ); + return resolveDispatcher().useEffect(create, deps); + }; + exports.useEffectEvent = function(callback) { + return resolveDispatcher().useEffectEvent(callback); + }; + exports.useId = function() { + return resolveDispatcher().useId(); + }; + exports.useImperativeHandle = function(ref, create, deps) { + return resolveDispatcher().useImperativeHandle(ref, create, deps); + }; + exports.useInsertionEffect = function(create, deps) { + null == create && console.warn( + "React Hook useInsertionEffect requires an effect callback. Did you forget to pass a callback to the hook?" + ); + return resolveDispatcher().useInsertionEffect(create, deps); + }; + exports.useLayoutEffect = function(create, deps) { + null == create && console.warn( + "React Hook useLayoutEffect requires an effect callback. Did you forget to pass a callback to the hook?" + ); + return resolveDispatcher().useLayoutEffect(create, deps); + }; + exports.useMemo = function(create, deps) { + return resolveDispatcher().useMemo(create, deps); + }; + exports.useOptimistic = function(passthrough, reducer) { + return resolveDispatcher().useOptimistic(passthrough, reducer); + }; + exports.useReducer = function(reducer, initialArg, init) { + return resolveDispatcher().useReducer(reducer, initialArg, init); + }; + exports.useRef = function(initialValue) { + return resolveDispatcher().useRef(initialValue); + }; + exports.useState = function(initialState) { + return resolveDispatcher().useState(initialState); + }; + exports.useSyncExternalStore = function(subscribe, getSnapshot, getServerSnapshot) { + return resolveDispatcher().useSyncExternalStore( + subscribe, + getSnapshot, + getServerSnapshot + ); + }; + exports.useTransition = function() { + return resolveDispatcher().useTransition(); + }; + exports.version = "19.2.4"; + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); + })(); + } + }); + + // node_modules/react/index.js + var require_react = __commonJS({ + "node_modules/react/index.js"(exports, module) { + "use strict"; + if (false) { + module.exports = null; + } else { + module.exports = require_react_development(); + } + } + }); + + // node_modules/react-dom/cjs/react-dom.development.js + var require_react_dom_development = __commonJS({ + "node_modules/react-dom/cjs/react-dom.development.js"(exports) { + "use strict"; + (function() { + function noop() { + } + function testStringCoercion(value2) { + return "" + value2; + } + function createPortal$1(children, containerInfo, implementation) { + var key = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null; + try { + testStringCoercion(key); + var JSCompiler_inline_result = false; + } catch (e) { + JSCompiler_inline_result = true; + } + JSCompiler_inline_result && (console.error( + "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.", + "function" === typeof Symbol && Symbol.toStringTag && key[Symbol.toStringTag] || key.constructor.name || "Object" + ), testStringCoercion(key)); + return { + $$typeof: REACT_PORTAL_TYPE, + key: null == key ? null : "" + key, + children, + containerInfo, + implementation + }; + } + function getCrossOriginStringAs(as, input) { + if ("font" === as) return ""; + if ("string" === typeof input) + return "use-credentials" === input ? input : ""; + } + function getValueDescriptorExpectingObjectForWarning(thing) { + return null === thing ? "`null`" : void 0 === thing ? "`undefined`" : "" === thing ? "an empty string" : 'something with type "' + typeof thing + '"'; + } + function getValueDescriptorExpectingEnumForWarning(thing) { + return null === thing ? "`null`" : void 0 === thing ? "`undefined`" : "" === thing ? "an empty string" : "string" === typeof thing ? JSON.stringify(thing) : "number" === typeof thing ? "`" + thing + "`" : 'something with type "' + typeof thing + '"'; + } + function resolveDispatcher() { + var dispatcher = ReactSharedInternals.H; + null === dispatcher && console.error( + "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem." + ); + return dispatcher; + } + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); + var React = require_react(), Internals = { + d: { + f: noop, + r: function() { + throw Error( + "Invalid form element. requestFormReset must be passed a form that was rendered by React." + ); + }, + D: noop, + C: noop, + L: noop, + m: noop, + X: noop, + S: noop, + M: noop + }, + p: 0, + findDOMNode: null + }, REACT_PORTAL_TYPE = /* @__PURE__ */ Symbol.for("react.portal"), ReactSharedInternals = React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE; + "function" === typeof Map && null != Map.prototype && "function" === typeof Map.prototype.forEach && "function" === typeof Set && null != Set.prototype && "function" === typeof Set.prototype.clear && "function" === typeof Set.prototype.forEach || console.error( + "React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills" + ); + exports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = Internals; + exports.createPortal = function(children, container) { + var key = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null; + if (!container || 1 !== container.nodeType && 9 !== container.nodeType && 11 !== container.nodeType) + throw Error("Target container is not a DOM element."); + return createPortal$1(children, container, null, key); + }; + exports.flushSync = function(fn) { + var previousTransition = ReactSharedInternals.T, previousUpdatePriority = Internals.p; + try { + if (ReactSharedInternals.T = null, Internals.p = 2, fn) + return fn(); + } finally { + ReactSharedInternals.T = previousTransition, Internals.p = previousUpdatePriority, Internals.d.f() && console.error( + "flushSync was called from inside a lifecycle method. React cannot flush when React is already rendering. Consider moving this call to a scheduler task or micro task." + ); + } + }; + exports.preconnect = function(href, options) { + "string" === typeof href && href ? null != options && "object" !== typeof options ? console.error( + "ReactDOM.preconnect(): Expected the `options` argument (second) to be an object but encountered %s instead. The only supported option at this time is `crossOrigin` which accepts a string.", + getValueDescriptorExpectingEnumForWarning(options) + ) : null != options && "string" !== typeof options.crossOrigin && console.error( + "ReactDOM.preconnect(): Expected the `crossOrigin` option (second argument) to be a string but encountered %s instead. Try removing this option or passing a string value instead.", + getValueDescriptorExpectingObjectForWarning(options.crossOrigin) + ) : console.error( + "ReactDOM.preconnect(): Expected the `href` argument (first) to be a non-empty string but encountered %s instead.", + getValueDescriptorExpectingObjectForWarning(href) + ); + "string" === typeof href && (options ? (options = options.crossOrigin, options = "string" === typeof options ? "use-credentials" === options ? options : "" : void 0) : options = null, Internals.d.C(href, options)); + }; + exports.prefetchDNS = function(href) { + if ("string" !== typeof href || !href) + console.error( + "ReactDOM.prefetchDNS(): Expected the `href` argument (first) to be a non-empty string but encountered %s instead.", + getValueDescriptorExpectingObjectForWarning(href) + ); + else if (1 < arguments.length) { + var options = arguments[1]; + "object" === typeof options && options.hasOwnProperty("crossOrigin") ? console.error( + "ReactDOM.prefetchDNS(): Expected only one argument, `href`, but encountered %s as a second argument instead. This argument is reserved for future options and is currently disallowed. It looks like the you are attempting to set a crossOrigin property for this DNS lookup hint. Browsers do not perform DNS queries using CORS and setting this attribute on the resource hint has no effect. Try calling ReactDOM.prefetchDNS() with just a single string argument, `href`.", + getValueDescriptorExpectingEnumForWarning(options) + ) : console.error( + "ReactDOM.prefetchDNS(): Expected only one argument, `href`, but encountered %s as a second argument instead. This argument is reserved for future options and is currently disallowed. Try calling ReactDOM.prefetchDNS() with just a single string argument, `href`.", + getValueDescriptorExpectingEnumForWarning(options) + ); + } + "string" === typeof href && Internals.d.D(href); + }; + exports.preinit = function(href, options) { + "string" === typeof href && href ? null == options || "object" !== typeof options ? console.error( + "ReactDOM.preinit(): Expected the `options` argument (second) to be an object with an `as` property describing the type of resource to be preinitialized but encountered %s instead.", + getValueDescriptorExpectingEnumForWarning(options) + ) : "style" !== options.as && "script" !== options.as && console.error( + 'ReactDOM.preinit(): Expected the `as` property in the `options` argument (second) to contain a valid value describing the type of resource to be preinitialized but encountered %s instead. Valid values for `as` are "style" and "script".', + getValueDescriptorExpectingEnumForWarning(options.as) + ) : console.error( + "ReactDOM.preinit(): Expected the `href` argument (first) to be a non-empty string but encountered %s instead.", + getValueDescriptorExpectingObjectForWarning(href) + ); + if ("string" === typeof href && options && "string" === typeof options.as) { + var as = options.as, crossOrigin = getCrossOriginStringAs(as, options.crossOrigin), integrity = "string" === typeof options.integrity ? options.integrity : void 0, fetchPriority = "string" === typeof options.fetchPriority ? options.fetchPriority : void 0; + "style" === as ? Internals.d.S( + href, + "string" === typeof options.precedence ? options.precedence : void 0, + { + crossOrigin, + integrity, + fetchPriority + } + ) : "script" === as && Internals.d.X(href, { + crossOrigin, + integrity, + fetchPriority, + nonce: "string" === typeof options.nonce ? options.nonce : void 0 + }); + } + }; + exports.preinitModule = function(href, options) { + var encountered = ""; + "string" === typeof href && href || (encountered += " The `href` argument encountered was " + getValueDescriptorExpectingObjectForWarning(href) + "."); + void 0 !== options && "object" !== typeof options ? encountered += " The `options` argument encountered was " + getValueDescriptorExpectingObjectForWarning(options) + "." : options && "as" in options && "script" !== options.as && (encountered += " The `as` option encountered was " + getValueDescriptorExpectingEnumForWarning(options.as) + "."); + if (encountered) + console.error( + "ReactDOM.preinitModule(): Expected up to two arguments, a non-empty `href` string and, optionally, an `options` object with a valid `as` property.%s", + encountered + ); + else + switch (encountered = options && "string" === typeof options.as ? options.as : "script", encountered) { + case "script": + break; + default: + encountered = getValueDescriptorExpectingEnumForWarning(encountered), console.error( + 'ReactDOM.preinitModule(): Currently the only supported "as" type for this function is "script" but received "%s" instead. This warning was generated for `href` "%s". In the future other module types will be supported, aligning with the import-attributes proposal. Learn more here: (https://github.com/tc39/proposal-import-attributes)', + encountered, + href + ); + } + if ("string" === typeof href) + if ("object" === typeof options && null !== options) { + if (null == options.as || "script" === options.as) + encountered = getCrossOriginStringAs( + options.as, + options.crossOrigin + ), Internals.d.M(href, { + crossOrigin: encountered, + integrity: "string" === typeof options.integrity ? options.integrity : void 0, + nonce: "string" === typeof options.nonce ? options.nonce : void 0 + }); + } else null == options && Internals.d.M(href); + }; + exports.preload = function(href, options) { + var encountered = ""; + "string" === typeof href && href || (encountered += " The `href` argument encountered was " + getValueDescriptorExpectingObjectForWarning(href) + "."); + null == options || "object" !== typeof options ? encountered += " The `options` argument encountered was " + getValueDescriptorExpectingObjectForWarning(options) + "." : "string" === typeof options.as && options.as || (encountered += " The `as` option encountered was " + getValueDescriptorExpectingObjectForWarning(options.as) + "."); + encountered && console.error( + 'ReactDOM.preload(): Expected two arguments, a non-empty `href` string and an `options` object with an `as` property valid for a `` tag.%s', + encountered + ); + if ("string" === typeof href && "object" === typeof options && null !== options && "string" === typeof options.as) { + encountered = options.as; + var crossOrigin = getCrossOriginStringAs( + encountered, + options.crossOrigin + ); + Internals.d.L(href, encountered, { + crossOrigin, + integrity: "string" === typeof options.integrity ? options.integrity : void 0, + nonce: "string" === typeof options.nonce ? options.nonce : void 0, + type: "string" === typeof options.type ? options.type : void 0, + fetchPriority: "string" === typeof options.fetchPriority ? options.fetchPriority : void 0, + referrerPolicy: "string" === typeof options.referrerPolicy ? options.referrerPolicy : void 0, + imageSrcSet: "string" === typeof options.imageSrcSet ? options.imageSrcSet : void 0, + imageSizes: "string" === typeof options.imageSizes ? options.imageSizes : void 0, + media: "string" === typeof options.media ? options.media : void 0 + }); + } + }; + exports.preloadModule = function(href, options) { + var encountered = ""; + "string" === typeof href && href || (encountered += " The `href` argument encountered was " + getValueDescriptorExpectingObjectForWarning(href) + "."); + void 0 !== options && "object" !== typeof options ? encountered += " The `options` argument encountered was " + getValueDescriptorExpectingObjectForWarning(options) + "." : options && "as" in options && "string" !== typeof options.as && (encountered += " The `as` option encountered was " + getValueDescriptorExpectingObjectForWarning(options.as) + "."); + encountered && console.error( + 'ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s', + encountered + ); + "string" === typeof href && (options ? (encountered = getCrossOriginStringAs( + options.as, + options.crossOrigin + ), Internals.d.m(href, { + as: "string" === typeof options.as && "script" !== options.as ? options.as : void 0, + crossOrigin: encountered, + integrity: "string" === typeof options.integrity ? options.integrity : void 0 + })) : Internals.d.m(href)); + }; + exports.requestFormReset = function(form) { + Internals.d.r(form); + }; + exports.unstable_batchedUpdates = function(fn, a) { + return fn(a); + }; + exports.useFormState = function(action, initialState, permalink) { + return resolveDispatcher().useFormState(action, initialState, permalink); + }; + exports.useFormStatus = function() { + return resolveDispatcher().useHostTransitionStatus(); + }; + exports.version = "19.2.4"; + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); + })(); + } + }); + + // node_modules/react-dom/index.js + var require_react_dom = __commonJS({ + "node_modules/react-dom/index.js"(exports, module) { + "use strict"; + if (false) { + checkDCE(); + module.exports = null; + } else { + module.exports = require_react_dom_development(); + } + } + }); + + // node_modules/react-dom/cjs/react-dom-client.development.js + var require_react_dom_client_development = __commonJS({ + "node_modules/react-dom/cjs/react-dom-client.development.js"(exports) { + "use strict"; + (function() { + function findHook(fiber, id) { + for (fiber = fiber.memoizedState; null !== fiber && 0 < id; ) + fiber = fiber.next, id--; + return fiber; + } + function copyWithSetImpl(obj, path, index, value2) { + if (index >= path.length) return value2; + var key = path[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj); + updated[key] = copyWithSetImpl(obj[key], path, index + 1, value2); + return updated; + } + function copyWithRename(obj, oldPath, newPath) { + if (oldPath.length !== newPath.length) + console.warn("copyWithRename() expects paths of the same length"); + else { + for (var i = 0; i < newPath.length - 1; i++) + if (oldPath[i] !== newPath[i]) { + console.warn( + "copyWithRename() expects paths to be the same except for the deepest key" + ); + return; + } + return copyWithRenameImpl(obj, oldPath, newPath, 0); + } + } + function copyWithRenameImpl(obj, oldPath, newPath, index) { + var oldKey = oldPath[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj); + index + 1 === oldPath.length ? (updated[newPath[index]] = updated[oldKey], isArrayImpl(updated) ? updated.splice(oldKey, 1) : delete updated[oldKey]) : updated[oldKey] = copyWithRenameImpl( + obj[oldKey], + oldPath, + newPath, + index + 1 + ); + return updated; + } + function copyWithDeleteImpl(obj, path, index) { + var key = path[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj); + if (index + 1 === path.length) + return isArrayImpl(updated) ? updated.splice(key, 1) : delete updated[key], updated; + updated[key] = copyWithDeleteImpl(obj[key], path, index + 1); + return updated; + } + function shouldSuspendImpl() { + return false; + } + function shouldErrorImpl() { + return null; + } + function warnInvalidHookAccess() { + console.error( + "Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. You can only call Hooks at the top level of your React function. For more information, see https://react.dev/link/rules-of-hooks" + ); + } + function warnInvalidContextAccess() { + console.error( + "Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()." + ); + } + function noop() { + } + function warnForMissingKey() { + } + function setToSortedString(set) { + var array = []; + set.forEach(function(value2) { + array.push(value2); + }); + return array.sort().join(", "); + } + function createFiber(tag, pendingProps, key, mode) { + return new FiberNode(tag, pendingProps, key, mode); + } + function scheduleRoot(root2, element) { + root2.context === emptyContextObject && (updateContainerImpl(root2.current, 2, element, root2, null, null), flushSyncWork$1()); + } + function scheduleRefresh(root2, update) { + if (null !== resolveFamily) { + var staleFamilies = update.staleFamilies; + update = update.updatedFamilies; + flushPendingEffects(); + scheduleFibersWithFamiliesRecursively( + root2.current, + update, + staleFamilies + ); + flushSyncWork$1(); + } + } + function setRefreshHandler(handler) { + resolveFamily = handler; + } + function isValidContainer(node) { + return !(!node || 1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType); + } + function getNearestMountedFiber(fiber) { + var node = fiber, nearestMounted = fiber; + if (fiber.alternate) for (; node.return; ) node = node.return; + else { + fiber = node; + do + node = fiber, 0 !== (node.flags & 4098) && (nearestMounted = node.return), fiber = node.return; + while (fiber); + } + return 3 === node.tag ? nearestMounted : null; + } + function getSuspenseInstanceFromFiber(fiber) { + if (13 === fiber.tag) { + var suspenseState = fiber.memoizedState; + null === suspenseState && (fiber = fiber.alternate, null !== fiber && (suspenseState = fiber.memoizedState)); + if (null !== suspenseState) return suspenseState.dehydrated; + } + return null; + } + function getActivityInstanceFromFiber(fiber) { + if (31 === fiber.tag) { + var activityState = fiber.memoizedState; + null === activityState && (fiber = fiber.alternate, null !== fiber && (activityState = fiber.memoizedState)); + if (null !== activityState) return activityState.dehydrated; + } + return null; + } + function assertIsMounted(fiber) { + if (getNearestMountedFiber(fiber) !== fiber) + throw Error("Unable to find node on an unmounted component."); + } + function findCurrentFiberUsingSlowPath(fiber) { + var alternate = fiber.alternate; + if (!alternate) { + alternate = getNearestMountedFiber(fiber); + if (null === alternate) + throw Error("Unable to find node on an unmounted component."); + return alternate !== fiber ? null : fiber; + } + for (var a = fiber, b = alternate; ; ) { + var parentA = a.return; + if (null === parentA) break; + var parentB = parentA.alternate; + if (null === parentB) { + b = parentA.return; + if (null !== b) { + a = b; + continue; + } + break; + } + if (parentA.child === parentB.child) { + for (parentB = parentA.child; parentB; ) { + if (parentB === a) return assertIsMounted(parentA), fiber; + if (parentB === b) return assertIsMounted(parentA), alternate; + parentB = parentB.sibling; + } + throw Error("Unable to find node on an unmounted component."); + } + if (a.return !== b.return) a = parentA, b = parentB; + else { + for (var didFindChild = false, _child = parentA.child; _child; ) { + if (_child === a) { + didFindChild = true; + a = parentA; + b = parentB; + break; + } + if (_child === b) { + didFindChild = true; + b = parentA; + a = parentB; + break; + } + _child = _child.sibling; + } + if (!didFindChild) { + for (_child = parentB.child; _child; ) { + if (_child === a) { + didFindChild = true; + a = parentB; + b = parentA; + break; + } + if (_child === b) { + didFindChild = true; + b = parentB; + a = parentA; + break; + } + _child = _child.sibling; + } + if (!didFindChild) + throw Error( + "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue." + ); + } + } + if (a.alternate !== b) + throw Error( + "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue." + ); + } + if (3 !== a.tag) + throw Error("Unable to find node on an unmounted component."); + return a.stateNode.current === a ? fiber : alternate; + } + function findCurrentHostFiberImpl(node) { + var tag = node.tag; + if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node; + for (node = node.child; null !== node; ) { + tag = findCurrentHostFiberImpl(node); + if (null !== tag) return tag; + node = node.sibling; + } + return null; + } + function getIteratorFn(maybeIterable) { + if (null === maybeIterable || "object" !== typeof maybeIterable) + return null; + maybeIterable = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable["@@iterator"]; + return "function" === typeof maybeIterable ? maybeIterable : null; + } + function getComponentNameFromType(type) { + if (null == type) return null; + if ("function" === typeof type) + return type.$$typeof === REACT_CLIENT_REFERENCE ? null : type.displayName || type.name || null; + if ("string" === typeof type) return type; + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + case REACT_ACTIVITY_TYPE: + return "Activity"; + } + if ("object" === typeof type) + switch ("number" === typeof type.tag && console.error( + "Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue." + ), type.$$typeof) { + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_CONTEXT_TYPE: + return type.displayName || "Context"; + case REACT_CONSUMER_TYPE: + return (type._context.displayName || "Context") + ".Consumer"; + case REACT_FORWARD_REF_TYPE: + var innerType = type.render; + type = type.displayName; + type || (type = innerType.displayName || innerType.name || "", type = "" !== type ? "ForwardRef(" + type + ")" : "ForwardRef"); + return type; + case REACT_MEMO_TYPE: + return innerType = type.displayName || null, null !== innerType ? innerType : getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: + innerType = type._payload; + type = type._init; + try { + return getComponentNameFromType(type(innerType)); + } catch (x) { + } + } + return null; + } + function getComponentNameFromOwner(owner) { + return "number" === typeof owner.tag ? getComponentNameFromFiber(owner) : "string" === typeof owner.name ? owner.name : null; + } + function getComponentNameFromFiber(fiber) { + var type = fiber.type; + switch (fiber.tag) { + case 31: + return "Activity"; + case 24: + return "Cache"; + case 9: + return (type._context.displayName || "Context") + ".Consumer"; + case 10: + return type.displayName || "Context"; + case 18: + return "DehydratedFragment"; + case 11: + return fiber = type.render, fiber = fiber.displayName || fiber.name || "", type.displayName || ("" !== fiber ? "ForwardRef(" + fiber + ")" : "ForwardRef"); + case 7: + return "Fragment"; + case 26: + case 27: + case 5: + return type; + case 4: + return "Portal"; + case 3: + return "Root"; + case 6: + return "Text"; + case 16: + return getComponentNameFromType(type); + case 8: + return type === REACT_STRICT_MODE_TYPE ? "StrictMode" : "Mode"; + case 22: + return "Offscreen"; + case 12: + return "Profiler"; + case 21: + return "Scope"; + case 13: + return "Suspense"; + case 19: + return "SuspenseList"; + case 25: + return "TracingMarker"; + case 1: + case 0: + case 14: + case 15: + if ("function" === typeof type) + return type.displayName || type.name || null; + if ("string" === typeof type) return type; + break; + case 29: + type = fiber._debugInfo; + if (null != type) { + for (var i = type.length - 1; 0 <= i; i--) + if ("string" === typeof type[i].name) return type[i].name; + } + if (null !== fiber.return) + return getComponentNameFromFiber(fiber.return); + } + return null; + } + function createCursor(defaultValue) { + return { current: defaultValue }; + } + function pop(cursor, fiber) { + 0 > index$jscomp$0 ? console.error("Unexpected pop.") : (fiber !== fiberStack[index$jscomp$0] && console.error("Unexpected Fiber popped."), cursor.current = valueStack[index$jscomp$0], valueStack[index$jscomp$0] = null, fiberStack[index$jscomp$0] = null, index$jscomp$0--); + } + function push(cursor, value2, fiber) { + index$jscomp$0++; + valueStack[index$jscomp$0] = cursor.current; + fiberStack[index$jscomp$0] = fiber; + cursor.current = value2; + } + function requiredContext(c) { + null === c && console.error( + "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue." + ); + return c; + } + function pushHostContainer(fiber, nextRootInstance) { + push(rootInstanceStackCursor, nextRootInstance, fiber); + push(contextFiberStackCursor, fiber, fiber); + push(contextStackCursor, null, fiber); + var nextRootContext = nextRootInstance.nodeType; + switch (nextRootContext) { + case 9: + case 11: + nextRootContext = 9 === nextRootContext ? "#document" : "#fragment"; + nextRootInstance = (nextRootInstance = nextRootInstance.documentElement) ? (nextRootInstance = nextRootInstance.namespaceURI) ? getOwnHostContext(nextRootInstance) : HostContextNamespaceNone : HostContextNamespaceNone; + break; + default: + if (nextRootContext = nextRootInstance.tagName, nextRootInstance = nextRootInstance.namespaceURI) + nextRootInstance = getOwnHostContext(nextRootInstance), nextRootInstance = getChildHostContextProd( + nextRootInstance, + nextRootContext + ); + else + switch (nextRootContext) { + case "svg": + nextRootInstance = HostContextNamespaceSvg; + break; + case "math": + nextRootInstance = HostContextNamespaceMath; + break; + default: + nextRootInstance = HostContextNamespaceNone; + } + } + nextRootContext = nextRootContext.toLowerCase(); + nextRootContext = updatedAncestorInfoDev(null, nextRootContext); + nextRootContext = { + context: nextRootInstance, + ancestorInfo: nextRootContext + }; + pop(contextStackCursor, fiber); + push(contextStackCursor, nextRootContext, fiber); + } + function popHostContainer(fiber) { + pop(contextStackCursor, fiber); + pop(contextFiberStackCursor, fiber); + pop(rootInstanceStackCursor, fiber); + } + function getHostContext() { + return requiredContext(contextStackCursor.current); + } + function pushHostContext(fiber) { + null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber, fiber); + var context = requiredContext(contextStackCursor.current); + var type = fiber.type; + var nextContext = getChildHostContextProd(context.context, type); + type = updatedAncestorInfoDev(context.ancestorInfo, type); + nextContext = { context: nextContext, ancestorInfo: type }; + context !== nextContext && (push(contextFiberStackCursor, fiber, fiber), push(contextStackCursor, nextContext, fiber)); + } + function popHostContext(fiber) { + contextFiberStackCursor.current === fiber && (pop(contextStackCursor, fiber), pop(contextFiberStackCursor, fiber)); + hostTransitionProviderCursor.current === fiber && (pop(hostTransitionProviderCursor, fiber), HostTransitionContext._currentValue = NotPendingTransition); + } + function disabledLog() { + } + function disableLogs() { + if (0 === disabledDepth) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + } + disabledDepth++; + } + function reenableLogs() { + disabledDepth--; + if (0 === disabledDepth) { + var props = { configurable: true, enumerable: true, writable: true }; + Object.defineProperties(console, { + log: assign({}, props, { value: prevLog }), + info: assign({}, props, { value: prevInfo }), + warn: assign({}, props, { value: prevWarn }), + error: assign({}, props, { value: prevError }), + group: assign({}, props, { value: prevGroup }), + groupCollapsed: assign({}, props, { value: prevGroupCollapsed }), + groupEnd: assign({}, props, { value: prevGroupEnd }) + }); + } + 0 > disabledDepth && console.error( + "disabledDepth fell below zero. This is a bug in React. Please file an issue." + ); + } + function formatOwnerStack(error) { + var prevPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + error = error.stack; + Error.prepareStackTrace = prevPrepareStackTrace; + error.startsWith("Error: react-stack-top-frame\n") && (error = error.slice(29)); + prevPrepareStackTrace = error.indexOf("\n"); + -1 !== prevPrepareStackTrace && (error = error.slice(prevPrepareStackTrace + 1)); + prevPrepareStackTrace = error.indexOf("react_stack_bottom_frame"); + -1 !== prevPrepareStackTrace && (prevPrepareStackTrace = error.lastIndexOf( + "\n", + prevPrepareStackTrace + )); + if (-1 !== prevPrepareStackTrace) + error = error.slice(0, prevPrepareStackTrace); + else return ""; + return error; + } + function describeBuiltInComponentFrame(name) { + if (void 0 === prefix) + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ""; + suffix = -1 < x.stack.indexOf("\n at") ? " ()" : -1 < x.stack.indexOf("@") ? "@unknown:0:0" : ""; + } + return "\n" + prefix + name + suffix; + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) return ""; + var frame = componentFrameCache.get(fn); + if (void 0 !== frame) return frame; + reentry = true; + frame = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher2 = null; + previousDispatcher2 = ReactSharedInternals.H; + ReactSharedInternals.H = null; + disableLogs(); + try { + var RunInRootFrame = { + DetermineComponentFrameRoot: function() { + try { + if (construct) { + var Fake = function() { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function() { + throw Error(); + } + }); + if ("object" === typeof Reflect && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + var control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x$0) { + control = x$0; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x$1) { + control = x$1; + } + (Fake = fn()) && "function" === typeof Fake.catch && Fake.catch(function() { + }); + } + } catch (sample) { + if (sample && control && "string" === typeof sample.stack) + return [sample.stack, control.stack]; + } + return [null, null]; + } + }; + RunInRootFrame.DetermineComponentFrameRoot.displayName = "DetermineComponentFrameRoot"; + var namePropDescriptor = Object.getOwnPropertyDescriptor( + RunInRootFrame.DetermineComponentFrameRoot, + "name" + ); + namePropDescriptor && namePropDescriptor.configurable && Object.defineProperty( + RunInRootFrame.DetermineComponentFrameRoot, + "name", + { value: "DetermineComponentFrameRoot" } + ); + var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(), sampleStack = _RunInRootFrame$Deter[0], controlStack = _RunInRootFrame$Deter[1]; + if (sampleStack && controlStack) { + var sampleLines = sampleStack.split("\n"), controlLines = controlStack.split("\n"); + for (_RunInRootFrame$Deter = namePropDescriptor = 0; namePropDescriptor < sampleLines.length && !sampleLines[namePropDescriptor].includes( + "DetermineComponentFrameRoot" + ); ) + namePropDescriptor++; + for (; _RunInRootFrame$Deter < controlLines.length && !controlLines[_RunInRootFrame$Deter].includes( + "DetermineComponentFrameRoot" + ); ) + _RunInRootFrame$Deter++; + if (namePropDescriptor === sampleLines.length || _RunInRootFrame$Deter === controlLines.length) + for (namePropDescriptor = sampleLines.length - 1, _RunInRootFrame$Deter = controlLines.length - 1; 1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter && sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]; ) + _RunInRootFrame$Deter--; + for (; 1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter; namePropDescriptor--, _RunInRootFrame$Deter--) + if (sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) { + if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) { + do + if (namePropDescriptor--, _RunInRootFrame$Deter--, 0 > _RunInRootFrame$Deter || sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) { + var _frame = "\n" + sampleLines[namePropDescriptor].replace( + " at new ", + " at " + ); + fn.displayName && _frame.includes("") && (_frame = _frame.replace("", fn.displayName)); + "function" === typeof fn && componentFrameCache.set(fn, _frame); + return _frame; + } + while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter); + } + break; + } + } + } finally { + reentry = false, ReactSharedInternals.H = previousDispatcher2, reenableLogs(), Error.prepareStackTrace = frame; + } + sampleLines = (sampleLines = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(sampleLines) : ""; + "function" === typeof fn && componentFrameCache.set(fn, sampleLines); + return sampleLines; + } + function describeFiber(fiber, childFiber) { + switch (fiber.tag) { + case 26: + case 27: + case 5: + return describeBuiltInComponentFrame(fiber.type); + case 16: + return describeBuiltInComponentFrame("Lazy"); + case 13: + return fiber.child !== childFiber && null !== childFiber ? describeBuiltInComponentFrame("Suspense Fallback") : describeBuiltInComponentFrame("Suspense"); + case 19: + return describeBuiltInComponentFrame("SuspenseList"); + case 0: + case 15: + return describeNativeComponentFrame(fiber.type, false); + case 11: + return describeNativeComponentFrame(fiber.type.render, false); + case 1: + return describeNativeComponentFrame(fiber.type, true); + case 31: + return describeBuiltInComponentFrame("Activity"); + default: + return ""; + } + } + function getStackByFiberInDevAndProd(workInProgress2) { + try { + var info = "", previous = null; + do { + info += describeFiber(workInProgress2, previous); + var debugInfo = workInProgress2._debugInfo; + if (debugInfo) + for (var i = debugInfo.length - 1; 0 <= i; i--) { + var entry = debugInfo[i]; + if ("string" === typeof entry.name) { + var JSCompiler_temp_const = info; + a: { + var name = entry.name, env = entry.env, location2 = entry.debugLocation; + if (null != location2) { + var childStack = formatOwnerStack(location2), idx = childStack.lastIndexOf("\n"), lastLine = -1 === idx ? childStack : childStack.slice(idx + 1); + if (-1 !== lastLine.indexOf(name)) { + var JSCompiler_inline_result = "\n" + lastLine; + break a; + } + } + JSCompiler_inline_result = describeBuiltInComponentFrame( + name + (env ? " [" + env + "]" : "") + ); + } + info = JSCompiler_temp_const + JSCompiler_inline_result; + } + } + previous = workInProgress2; + workInProgress2 = workInProgress2.return; + } while (workInProgress2); + return info; + } catch (x) { + return "\nError generating stack: " + x.message + "\n" + x.stack; + } + } + function describeFunctionComponentFrameWithoutLineNumber(fn) { + return (fn = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(fn) : ""; + } + function getCurrentFiberOwnerNameInDevOrNull() { + if (null === current) return null; + var owner = current._debugOwner; + return null != owner ? getComponentNameFromOwner(owner) : null; + } + function getCurrentFiberStackInDev() { + if (null === current) return ""; + var workInProgress2 = current; + try { + var info = ""; + 6 === workInProgress2.tag && (workInProgress2 = workInProgress2.return); + switch (workInProgress2.tag) { + case 26: + case 27: + case 5: + info += describeBuiltInComponentFrame(workInProgress2.type); + break; + case 13: + info += describeBuiltInComponentFrame("Suspense"); + break; + case 19: + info += describeBuiltInComponentFrame("SuspenseList"); + break; + case 31: + info += describeBuiltInComponentFrame("Activity"); + break; + case 30: + case 0: + case 15: + case 1: + workInProgress2._debugOwner || "" !== info || (info += describeFunctionComponentFrameWithoutLineNumber( + workInProgress2.type + )); + break; + case 11: + workInProgress2._debugOwner || "" !== info || (info += describeFunctionComponentFrameWithoutLineNumber( + workInProgress2.type.render + )); + } + for (; workInProgress2; ) + if ("number" === typeof workInProgress2.tag) { + var fiber = workInProgress2; + workInProgress2 = fiber._debugOwner; + var debugStack = fiber._debugStack; + if (workInProgress2 && debugStack) { + var formattedStack = formatOwnerStack(debugStack); + "" !== formattedStack && (info += "\n" + formattedStack); + } + } else if (null != workInProgress2.debugStack) { + var ownerStack = workInProgress2.debugStack; + (workInProgress2 = workInProgress2.owner) && ownerStack && (info += "\n" + formatOwnerStack(ownerStack)); + } else break; + var JSCompiler_inline_result = info; + } catch (x) { + JSCompiler_inline_result = "\nError generating stack: " + x.message + "\n" + x.stack; + } + return JSCompiler_inline_result; + } + function runWithFiberInDEV(fiber, callback, arg0, arg1, arg2, arg3, arg4) { + var previousFiber = current; + setCurrentFiber(fiber); + try { + return null !== fiber && fiber._debugTask ? fiber._debugTask.run( + callback.bind(null, arg0, arg1, arg2, arg3, arg4) + ) : callback(arg0, arg1, arg2, arg3, arg4); + } finally { + setCurrentFiber(previousFiber); + } + throw Error( + "runWithFiberInDEV should never be called in production. This is a bug in React." + ); + } + function setCurrentFiber(fiber) { + ReactSharedInternals.getCurrentStack = null === fiber ? null : getCurrentFiberStackInDev; + isRendering = false; + current = fiber; + } + function typeName(value2) { + return "function" === typeof Symbol && Symbol.toStringTag && value2[Symbol.toStringTag] || value2.constructor.name || "Object"; + } + function willCoercionThrow(value2) { + try { + return testStringCoercion(value2), false; + } catch (e) { + return true; + } + } + function testStringCoercion(value2) { + return "" + value2; + } + function checkAttributeStringCoercion(value2, attributeName) { + if (willCoercionThrow(value2)) + return console.error( + "The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.", + attributeName, + typeName(value2) + ), testStringCoercion(value2); + } + function checkCSSPropertyStringCoercion(value2, propName) { + if (willCoercionThrow(value2)) + return console.error( + "The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.", + propName, + typeName(value2) + ), testStringCoercion(value2); + } + function checkFormFieldValueStringCoercion(value2) { + if (willCoercionThrow(value2)) + return console.error( + "Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.", + typeName(value2) + ), testStringCoercion(value2); + } + function injectInternals(internals) { + if ("undefined" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return false; + var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__; + if (hook.isDisabled) return true; + if (!hook.supportsFiber) + return console.error( + "The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools" + ), true; + try { + rendererID = hook.inject(internals), injectedHook = hook; + } catch (err) { + console.error("React instrumentation encountered an error: %o.", err); + } + return hook.checkDCE ? true : false; + } + function setIsStrictModeForDevtools(newIsStrictMode) { + "function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode); + if (injectedHook && "function" === typeof injectedHook.setStrictMode) + try { + injectedHook.setStrictMode(rendererID, newIsStrictMode); + } catch (err) { + hasLoggedError || (hasLoggedError = true, console.error( + "React instrumentation encountered an error: %o", + err + )); + } + } + function clz32Fallback(x) { + x >>>= 0; + return 0 === x ? 32 : 31 - (log(x) / LN2 | 0) | 0; + } + function getHighestPriorityLanes(lanes) { + var pendingSyncLanes = lanes & 42; + if (0 !== pendingSyncLanes) return pendingSyncLanes; + switch (lanes & -lanes) { + case 1: + return 1; + case 2: + return 2; + case 4: + return 4; + case 8: + return 8; + case 16: + return 16; + case 32: + return 32; + case 64: + return 64; + case 128: + return 128; + case 256: + case 512: + case 1024: + case 2048: + case 4096: + case 8192: + case 16384: + case 32768: + case 65536: + case 131072: + return lanes & 261888; + case 262144: + case 524288: + case 1048576: + case 2097152: + return lanes & 3932160; + case 4194304: + case 8388608: + case 16777216: + case 33554432: + return lanes & 62914560; + case 67108864: + return 67108864; + case 134217728: + return 134217728; + case 268435456: + return 268435456; + case 536870912: + return 536870912; + case 1073741824: + return 0; + default: + return console.error( + "Should have found matching lanes. This is a bug in React." + ), lanes; + } + } + function getNextLanes(root2, wipLanes, rootHasPendingCommit) { + var pendingLanes = root2.pendingLanes; + if (0 === pendingLanes) return 0; + var nextLanes = 0, suspendedLanes = root2.suspendedLanes, pingedLanes = root2.pingedLanes; + root2 = root2.warmLanes; + var nonIdlePendingLanes = pendingLanes & 134217727; + 0 !== nonIdlePendingLanes ? (pendingLanes = nonIdlePendingLanes & ~suspendedLanes, 0 !== pendingLanes ? nextLanes = getHighestPriorityLanes(pendingLanes) : (pingedLanes &= nonIdlePendingLanes, 0 !== pingedLanes ? nextLanes = getHighestPriorityLanes(pingedLanes) : rootHasPendingCommit || (rootHasPendingCommit = nonIdlePendingLanes & ~root2, 0 !== rootHasPendingCommit && (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))))) : (nonIdlePendingLanes = pendingLanes & ~suspendedLanes, 0 !== nonIdlePendingLanes ? nextLanes = getHighestPriorityLanes(nonIdlePendingLanes) : 0 !== pingedLanes ? nextLanes = getHighestPriorityLanes(pingedLanes) : rootHasPendingCommit || (rootHasPendingCommit = pendingLanes & ~root2, 0 !== rootHasPendingCommit && (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))); + return 0 === nextLanes ? 0 : 0 !== wipLanes && wipLanes !== nextLanes && 0 === (wipLanes & suspendedLanes) && (suspendedLanes = nextLanes & -nextLanes, rootHasPendingCommit = wipLanes & -wipLanes, suspendedLanes >= rootHasPendingCommit || 32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)) ? wipLanes : nextLanes; + } + function checkIfRootIsPrerendering(root2, renderLanes2) { + return 0 === (root2.pendingLanes & ~(root2.suspendedLanes & ~root2.pingedLanes) & renderLanes2); + } + function computeExpirationTime(lane, currentTime) { + switch (lane) { + case 1: + case 2: + case 4: + case 8: + case 64: + return currentTime + 250; + case 16: + case 32: + case 128: + case 256: + case 512: + case 1024: + case 2048: + case 4096: + case 8192: + case 16384: + case 32768: + case 65536: + case 131072: + case 262144: + case 524288: + case 1048576: + case 2097152: + return currentTime + 5e3; + case 4194304: + case 8388608: + case 16777216: + case 33554432: + return -1; + case 67108864: + case 134217728: + case 268435456: + case 536870912: + case 1073741824: + return -1; + default: + return console.error( + "Should have found matching lanes. This is a bug in React." + ), -1; + } + } + function claimNextRetryLane() { + var lane = nextRetryLane; + nextRetryLane <<= 1; + 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304); + return lane; + } + function createLaneMap(initial) { + for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial); + return laneMap; + } + function markRootUpdated$1(root2, updateLane) { + root2.pendingLanes |= updateLane; + 268435456 !== updateLane && (root2.suspendedLanes = 0, root2.pingedLanes = 0, root2.warmLanes = 0); + } + function markRootFinished(root2, finishedLanes, remainingLanes, spawnedLane, updatedLanes, suspendedRetryLanes) { + var previouslyPendingLanes = root2.pendingLanes; + root2.pendingLanes = remainingLanes; + root2.suspendedLanes = 0; + root2.pingedLanes = 0; + root2.warmLanes = 0; + root2.expiredLanes &= remainingLanes; + root2.entangledLanes &= remainingLanes; + root2.errorRecoveryDisabledLanes &= remainingLanes; + root2.shellSuspendCounter = 0; + var entanglements = root2.entanglements, expirationTimes = root2.expirationTimes, hiddenUpdates = root2.hiddenUpdates; + for (remainingLanes = previouslyPendingLanes & ~remainingLanes; 0 < remainingLanes; ) { + var index = 31 - clz32(remainingLanes), lane = 1 << index; + entanglements[index] = 0; + expirationTimes[index] = -1; + var hiddenUpdatesForLane = hiddenUpdates[index]; + if (null !== hiddenUpdatesForLane) + for (hiddenUpdates[index] = null, index = 0; index < hiddenUpdatesForLane.length; index++) { + var update = hiddenUpdatesForLane[index]; + null !== update && (update.lane &= -536870913); + } + remainingLanes &= ~lane; + } + 0 !== spawnedLane && markSpawnedDeferredLane(root2, spawnedLane, 0); + 0 !== suspendedRetryLanes && 0 === updatedLanes && 0 !== root2.tag && (root2.suspendedLanes |= suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes)); + } + function markSpawnedDeferredLane(root2, spawnedLane, entangledLanes) { + root2.pendingLanes |= spawnedLane; + root2.suspendedLanes &= ~spawnedLane; + var spawnedLaneIndex = 31 - clz32(spawnedLane); + root2.entangledLanes |= spawnedLane; + root2.entanglements[spawnedLaneIndex] = root2.entanglements[spawnedLaneIndex] | 1073741824 | entangledLanes & 261930; + } + function markRootEntangled(root2, entangledLanes) { + var rootEntangledLanes = root2.entangledLanes |= entangledLanes; + for (root2 = root2.entanglements; rootEntangledLanes; ) { + var index = 31 - clz32(rootEntangledLanes), lane = 1 << index; + lane & entangledLanes | root2[index] & entangledLanes && (root2[index] |= entangledLanes); + rootEntangledLanes &= ~lane; + } + } + function getBumpedLaneForHydration(root2, renderLanes2) { + var renderLane = renderLanes2 & -renderLanes2; + renderLane = 0 !== (renderLane & 42) ? 1 : getBumpedLaneForHydrationByLane(renderLane); + return 0 !== (renderLane & (root2.suspendedLanes | renderLanes2)) ? 0 : renderLane; + } + function getBumpedLaneForHydrationByLane(lane) { + switch (lane) { + case 2: + lane = 1; + break; + case 8: + lane = 4; + break; + case 32: + lane = 16; + break; + case 256: + case 512: + case 1024: + case 2048: + case 4096: + case 8192: + case 16384: + case 32768: + case 65536: + case 131072: + case 262144: + case 524288: + case 1048576: + case 2097152: + case 4194304: + case 8388608: + case 16777216: + case 33554432: + lane = 128; + break; + case 268435456: + lane = 134217728; + break; + default: + lane = 0; + } + return lane; + } + function addFiberToLanesMap(root2, fiber, lanes) { + if (isDevToolsPresent) + for (root2 = root2.pendingUpdatersLaneMap; 0 < lanes; ) { + var index = 31 - clz32(lanes), lane = 1 << index; + root2[index].add(fiber); + lanes &= ~lane; + } + } + function movePendingFibersToMemoized(root2, lanes) { + if (isDevToolsPresent) + for (var pendingUpdatersLaneMap = root2.pendingUpdatersLaneMap, memoizedUpdaters = root2.memoizedUpdaters; 0 < lanes; ) { + var index = 31 - clz32(lanes); + root2 = 1 << index; + index = pendingUpdatersLaneMap[index]; + 0 < index.size && (index.forEach(function(fiber) { + var alternate = fiber.alternate; + null !== alternate && memoizedUpdaters.has(alternate) || memoizedUpdaters.add(fiber); + }), index.clear()); + lanes &= ~root2; + } + } + function lanesToEventPriority(lanes) { + lanes &= -lanes; + return 0 !== DiscreteEventPriority && DiscreteEventPriority < lanes ? 0 !== ContinuousEventPriority && ContinuousEventPriority < lanes ? 0 !== (lanes & 134217727) ? DefaultEventPriority : IdleEventPriority : ContinuousEventPriority : DiscreteEventPriority; + } + function resolveUpdatePriority() { + var updatePriority = ReactDOMSharedInternals.p; + if (0 !== updatePriority) return updatePriority; + updatePriority = window.event; + return void 0 === updatePriority ? DefaultEventPriority : getEventPriority(updatePriority.type); + } + function runWithPriority(priority, fn) { + var previousPriority = ReactDOMSharedInternals.p; + try { + return ReactDOMSharedInternals.p = priority, fn(); + } finally { + ReactDOMSharedInternals.p = previousPriority; + } + } + function detachDeletedInstance(node) { + delete node[internalInstanceKey]; + delete node[internalPropsKey]; + delete node[internalEventHandlersKey]; + delete node[internalEventHandlerListenersKey]; + delete node[internalEventHandlesSetKey]; + } + function getClosestInstanceFromNode(targetNode) { + var targetInst = targetNode[internalInstanceKey]; + if (targetInst) return targetInst; + for (var parentNode = targetNode.parentNode; parentNode; ) { + if (targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey]) { + parentNode = targetInst.alternate; + if (null !== targetInst.child || null !== parentNode && null !== parentNode.child) + for (targetNode = getParentHydrationBoundary(targetNode); null !== targetNode; ) { + if (parentNode = targetNode[internalInstanceKey]) + return parentNode; + targetNode = getParentHydrationBoundary(targetNode); + } + return targetInst; + } + targetNode = parentNode; + parentNode = targetNode.parentNode; + } + return null; + } + function getInstanceFromNode(node) { + if (node = node[internalInstanceKey] || node[internalContainerInstanceKey]) { + var tag = node.tag; + if (5 === tag || 6 === tag || 13 === tag || 31 === tag || 26 === tag || 27 === tag || 3 === tag) + return node; + } + return null; + } + function getNodeFromInstance(inst) { + var tag = inst.tag; + if (5 === tag || 26 === tag || 27 === tag || 6 === tag) + return inst.stateNode; + throw Error("getNodeFromInstance: Invalid argument."); + } + function getResourcesFromRoot(root2) { + var resources = root2[internalRootNodeResourcesKey]; + resources || (resources = root2[internalRootNodeResourcesKey] = { hoistableStyles: /* @__PURE__ */ new Map(), hoistableScripts: /* @__PURE__ */ new Map() }); + return resources; + } + function markNodeAsHoistable(node) { + node[internalHoistableMarker] = true; + } + function registerTwoPhaseEvent(registrationName, dependencies) { + registerDirectEvent(registrationName, dependencies); + registerDirectEvent(registrationName + "Capture", dependencies); + } + function registerDirectEvent(registrationName, dependencies) { + registrationNameDependencies[registrationName] && console.error( + "EventRegistry: More than one plugin attempted to publish the same registration name, `%s`.", + registrationName + ); + registrationNameDependencies[registrationName] = dependencies; + var lowerCasedName = registrationName.toLowerCase(); + possibleRegistrationNames[lowerCasedName] = registrationName; + "onDoubleClick" === registrationName && (possibleRegistrationNames.ondblclick = registrationName); + for (registrationName = 0; registrationName < dependencies.length; registrationName++) + allNativeEvents.add(dependencies[registrationName]); + } + function checkControlledValueProps(tagName, props) { + hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || null == props.value || ("select" === tagName ? console.error( + "You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set `onChange`." + ) : console.error( + "You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`." + )); + props.onChange || props.readOnly || props.disabled || null == props.checked || console.error( + "You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`." + ); + } + function isAttributeNameSafe(attributeName) { + if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) + return true; + if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) + return false; + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) + return validatedAttributeNameCache[attributeName] = true; + illegalAttributeNameCache[attributeName] = true; + console.error("Invalid attribute name: `%s`", attributeName); + return false; + } + function getValueForAttributeOnCustomComponent(node, name, expected) { + if (isAttributeNameSafe(name)) { + if (!node.hasAttribute(name)) { + switch (typeof expected) { + case "symbol": + case "object": + return expected; + case "function": + return expected; + case "boolean": + if (false === expected) return expected; + } + return void 0 === expected ? void 0 : null; + } + node = node.getAttribute(name); + if ("" === node && true === expected) return true; + checkAttributeStringCoercion(expected, name); + return node === "" + expected ? expected : node; + } + } + function setValueForAttribute(node, name, value2) { + if (isAttributeNameSafe(name)) + if (null === value2) node.removeAttribute(name); + else { + switch (typeof value2) { + case "undefined": + case "function": + case "symbol": + node.removeAttribute(name); + return; + case "boolean": + var prefix2 = name.toLowerCase().slice(0, 5); + if ("data-" !== prefix2 && "aria-" !== prefix2) { + node.removeAttribute(name); + return; + } + } + checkAttributeStringCoercion(value2, name); + node.setAttribute(name, "" + value2); + } + } + function setValueForKnownAttribute(node, name, value2) { + if (null === value2) node.removeAttribute(name); + else { + switch (typeof value2) { + case "undefined": + case "function": + case "symbol": + case "boolean": + node.removeAttribute(name); + return; + } + checkAttributeStringCoercion(value2, name); + node.setAttribute(name, "" + value2); + } + } + function setValueForNamespacedAttribute(node, namespace, name, value2) { + if (null === value2) node.removeAttribute(name); + else { + switch (typeof value2) { + case "undefined": + case "function": + case "symbol": + case "boolean": + node.removeAttribute(name); + return; + } + checkAttributeStringCoercion(value2, name); + node.setAttributeNS(namespace, name, "" + value2); + } + } + function getToStringValue(value2) { + switch (typeof value2) { + case "bigint": + case "boolean": + case "number": + case "string": + case "undefined": + return value2; + case "object": + return checkFormFieldValueStringCoercion(value2), value2; + default: + return ""; + } + } + function isCheckable(elem) { + var type = elem.type; + return (elem = elem.nodeName) && "input" === elem.toLowerCase() && ("checkbox" === type || "radio" === type); + } + function trackValueOnNode(node, valueField, currentValue) { + var descriptor = Object.getOwnPropertyDescriptor( + node.constructor.prototype, + valueField + ); + if (!node.hasOwnProperty(valueField) && "undefined" !== typeof descriptor && "function" === typeof descriptor.get && "function" === typeof descriptor.set) { + var get = descriptor.get, set = descriptor.set; + Object.defineProperty(node, valueField, { + configurable: true, + get: function() { + return get.call(this); + }, + set: function(value2) { + checkFormFieldValueStringCoercion(value2); + currentValue = "" + value2; + set.call(this, value2); + } + }); + Object.defineProperty(node, valueField, { + enumerable: descriptor.enumerable + }); + return { + getValue: function() { + return currentValue; + }, + setValue: function(value2) { + checkFormFieldValueStringCoercion(value2); + currentValue = "" + value2; + }, + stopTracking: function() { + node._valueTracker = null; + delete node[valueField]; + } + }; + } + } + function track(node) { + if (!node._valueTracker) { + var valueField = isCheckable(node) ? "checked" : "value"; + node._valueTracker = trackValueOnNode( + node, + valueField, + "" + node[valueField] + ); + } + } + function updateValueIfChanged(node) { + if (!node) return false; + var tracker = node._valueTracker; + if (!tracker) return true; + var lastValue = tracker.getValue(); + var value2 = ""; + node && (value2 = isCheckable(node) ? node.checked ? "true" : "false" : node.value); + node = value2; + return node !== lastValue ? (tracker.setValue(node), true) : false; + } + function getActiveElement(doc) { + doc = doc || ("undefined" !== typeof document ? document : void 0); + if ("undefined" === typeof doc) return null; + try { + return doc.activeElement || doc.body; + } catch (e) { + return doc.body; + } + } + function escapeSelectorAttributeValueInsideDoubleQuotes(value2) { + return value2.replace( + escapeSelectorAttributeValueInsideDoubleQuotesRegex, + function(ch) { + return "\\" + ch.charCodeAt(0).toString(16) + " "; + } + ); + } + function validateInputProps(element, props) { + void 0 === props.checked || void 0 === props.defaultChecked || didWarnCheckedDefaultChecked || (console.error( + "%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components", + getCurrentFiberOwnerNameInDevOrNull() || "A component", + props.type + ), didWarnCheckedDefaultChecked = true); + void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue$1 || (console.error( + "%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components", + getCurrentFiberOwnerNameInDevOrNull() || "A component", + props.type + ), didWarnValueDefaultValue$1 = true); + } + function updateInput(element, value2, defaultValue, lastDefaultValue, checked, defaultChecked, type, name) { + element.name = ""; + null != type && "function" !== typeof type && "symbol" !== typeof type && "boolean" !== typeof type ? (checkAttributeStringCoercion(type, "type"), element.type = type) : element.removeAttribute("type"); + if (null != value2) + if ("number" === type) { + if (0 === value2 && "" === element.value || element.value != value2) + element.value = "" + getToStringValue(value2); + } else + element.value !== "" + getToStringValue(value2) && (element.value = "" + getToStringValue(value2)); + else + "submit" !== type && "reset" !== type || element.removeAttribute("value"); + null != value2 ? setDefaultValue(element, type, getToStringValue(value2)) : null != defaultValue ? setDefaultValue(element, type, getToStringValue(defaultValue)) : null != lastDefaultValue && element.removeAttribute("value"); + null == checked && null != defaultChecked && (element.defaultChecked = !!defaultChecked); + null != checked && (element.checked = checked && "function" !== typeof checked && "symbol" !== typeof checked); + null != name && "function" !== typeof name && "symbol" !== typeof name && "boolean" !== typeof name ? (checkAttributeStringCoercion(name, "name"), element.name = "" + getToStringValue(name)) : element.removeAttribute("name"); + } + function initInput(element, value2, defaultValue, checked, defaultChecked, type, name, isHydrating2) { + null != type && "function" !== typeof type && "symbol" !== typeof type && "boolean" !== typeof type && (checkAttributeStringCoercion(type, "type"), element.type = type); + if (null != value2 || null != defaultValue) { + if (!("submit" !== type && "reset" !== type || void 0 !== value2 && null !== value2)) { + track(element); + return; + } + defaultValue = null != defaultValue ? "" + getToStringValue(defaultValue) : ""; + value2 = null != value2 ? "" + getToStringValue(value2) : defaultValue; + isHydrating2 || value2 === element.value || (element.value = value2); + element.defaultValue = value2; + } + checked = null != checked ? checked : defaultChecked; + checked = "function" !== typeof checked && "symbol" !== typeof checked && !!checked; + element.checked = isHydrating2 ? element.checked : !!checked; + element.defaultChecked = !!checked; + null != name && "function" !== typeof name && "symbol" !== typeof name && "boolean" !== typeof name && (checkAttributeStringCoercion(name, "name"), element.name = name); + track(element); + } + function setDefaultValue(node, type, value2) { + "number" === type && getActiveElement(node.ownerDocument) === node || node.defaultValue === "" + value2 || (node.defaultValue = "" + value2); + } + function validateOptionProps(element, props) { + null == props.value && ("object" === typeof props.children && null !== props.children ? React.Children.forEach(props.children, function(child) { + null == child || "string" === typeof child || "number" === typeof child || "bigint" === typeof child || didWarnInvalidChild || (didWarnInvalidChild = true, console.error( + "Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to