From 2f66fedd8f7059777a24f66337c9986c96e6ea98 Mon Sep 17 00:00:00 2001 From: alwkala Date: Wed, 9 Sep 2026 05:39:43 +0300 Subject: [PATCH 1/4] =?UTF-8?q?feat(doc):=20release=20v1.7.0=20=E2=80=94?= =?UTF-8?q?=20add=20VitePress=20publishing=20engine=20&=20luxury=20RTL=20d?= =?UTF-8?q?esign=20system?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tidyfactor | 4 +- CHANGELOG.md | 39 +++++ README.ar.md | 7 +- README.de.md | 2 +- README.es.md | 2 +- README.fa.md | 2 +- README.fr.md | 2 +- README.md | 7 +- README.pt.md | 2 +- README.zh.md | 2 +- SKILL.md | 11 +- brand.json | 2 +- brand.yaml | 10 ++ manifest.json | 80 +++++++--- package.json | 5 +- references/commands/brief.md | 16 ++ references/commands/site.md | 16 +- references/commands/vitepress.md | 20 +++ references/memory/decision-points.md | 72 +++++++++ references/memory/site-engines.md | 67 ++++---- references/memory/stacks/js-ts.md | 2 + references/memory/stacks/php.md | 2 + references/memory/stacks/react-vue-next.md | 2 + references/memory/vitepress-config.md | 174 +++++++++++++++++++++ references/workflows/brief.md | 105 +++++++++++++ references/workflows/collect.md | 4 +- references/workflows/init-docs.md | 32 +++- references/workflows/vitepress.md | 57 +++++++ tools/build-skill.js | 1 + 29 files changed, 661 insertions(+), 86 deletions(-) create mode 100644 brand.yaml create mode 100644 references/commands/brief.md create mode 100644 references/commands/vitepress.md create mode 100644 references/memory/decision-points.md create mode 100644 references/memory/vitepress-config.md create mode 100644 references/workflows/brief.md create mode 100644 references/workflows/vitepress.md diff --git a/.tidyfactor b/.tidyfactor index 7b7e811..b41d430 100644 --- a/.tidyfactor +++ b/.tidyfactor @@ -1,8 +1,8 @@ { "name": "tidyfactor-doc", - "version": "1.5.0", + "version": "1.7.0", "category": "development", - "description": "TidyFactor Doc — Code Documentation Builder & Dual-Engine Publishing Platform (MkDocs Material & Docsify) for AI Coding Agents", + "description": "TidyFactor Doc — Code Documentation Builder & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", "repository": "https://github.com/TidyFactor/Doc", "npm": "@alwkala/tidyfactor-doc", "compatibility": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index bdae747..14513f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,45 @@ All notable changes to `tidyfactor-doc` will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). +## [1.7.0] - 2026-09-09 + +### 🚀 Added — Triple-Engine Publishing Platform (VitePress Integration) & Luxury RTL Design System +- **VitePress Publishing Engine (references/commands/vitepress.md)**: Added full VitePress SSG engine support alongside MkDocs Material and Docsify. +- **Ordered Workflow & Automation (references/workflows/vitepress.md)**: 6-step workflow covering scaffolding, multi-language subdirectory routing, luxury CSS injection, and zero-dead-link validation (npm run docs:build). +- **Master Configuration & Luxury Tokens (references/memory/vitepress-config.md)**: Codified complete ESM config.mjs schema, Alexandria + Cairo + JetBrains Mono typography, surgical RTL navbar flex order, and Quick-Navigation grid templates. +- **Luxury Hero & Actions Architecture**: Codified single-row CTA button flex safeguards (white-space: nowrap) and stable natural RTL Hero direction (Text/CTAs on right, Logo on left). +- **3-Column Feature Cards & Column Collapse Fix**: Codified explicit width assignment on .VPFeatures .item and BiDi text safeguards. +- **3-Way Engine Evaluation Matrix (references/memory/site-engines.md)**: Expanded to comprehensive 3-way evaluation across VitePress, MkDocs Material, and Docsify. + +--- + +## [1.6.0] - 2026-09-08 + +### 🧠 Added — Dual-Mode Decision Architect (DM-DA) & Debate Mode Engine (CDL v2.0) +- **Interactive Interview & Debate Command (`brief`)**: Added `references/commands/brief.md` supporting trigger phrases `brief`, `interview`, `debate`, "استجوبني", and "ناقشني في معمارية التوثيق". +- **Dual Operational Modes (`references/workflows/brief.md`)**: + - **[MODE A] Smart 3-Round Protocol**: Fast-track structured alignment in 3 deterministic rounds (Purpose & Target Persona ➔ Architecture & Engine ➔ Hygiene & Safe Defaults) terminating with an explicit escalation gate prompt. + - **[MODE B] Relentless Debate & Interview (Debate Mode)**: Deep multi-turn architectural counter-questioning, challenging assumptions on static vs. SPA, bilingual overhead, and automated secret scrubbing. Strictly terminates only on `"END DEBATE"` / `"اعتماد"`, emitting a formal `docs/architectural_debate_synthesis.md` artifact. +- **Architectural Decision Matrix (`references/memory/decision-points.md`)**: Codified 5 core documentation dimensions (D1: Purpose & Scope, D2: Platform Engine, D3: Target Persona & Register, D4: Hygiene & Leak Policy, D5: Extraction Depth) with Boolean Skip Conditions for zero-overhead execution. +- **Declarative Gate Expansion (`manifest.json`)**: Expanded manifest schema v1.1.0 with formal `brief` decision gates for D1–D5 with local YAML persistence (`.tidyfactor/doc-brief.snapshot.yaml`). + +--- + +## [1.5.1] - 2026-09-08 + +### 🏛️ Fixed & Synchronized — Governance Compliance (TidyFactor Skill Architect) +- **Memory Freshness (Rule 11)**: Added `` stamps to all stack memory files (`js-ts.md`, `php.md`, `react-vue-next.md`). +- **Two-Tier Multi-Language Documentation (Rule 13)**: + - Integrated universal 8-language switcher bar into `README.md` and `README.ar.md`. + - Synchronized title banner versioning (`v1.5.1`) across all 8 market localizations (`README.md`, `README.ar.md`, `README.de.md`, `README.es.md`, `README.fa.md`, `README.fr.md`, `README.pt.md`, `README.zh.md`). +- **Contextual Decision Layer CDL v2.0 (Rule 14)**: + - Integrated Step 0 Context Delta Resolution into `references/workflows/init-docs.md` with auto-sensing for `doc_engine`, `target_scope`, and `audience_persona`. +- **Token Efficiency & YAML Primacy (Rule 15)**: + - Created canonical `brand.yaml` SSOT at skill root alongside `brand.json`. + - Updated `manifest.json` to persist decision snapshots to `.tidyfactor/doc-brief.snapshot.yaml` and discover from `brand.yaml`. + +--- + ## [1.5.0] - 2026-09-02 ### 🧠 Added — Contextual Decision Layer (CDL v1.1.0) & Declarative Decision Gates diff --git a/README.ar.md b/README.ar.md index fecc7a8..c0610a0 100644 --- a/README.ar.md +++ b/README.ar.md @@ -1,6 +1,6 @@
-# 📚 TidyFactor Doc `v1.3.0` +# 📚 TidyFactor Doc `v1.6.0` ### محرك استقراء الأكواد البرمجية، وتوليد مراجع الـ API، ومنصة النشر المزدوجة (MkDocs Material و Docsify) **بناء توثيقات فنية دقيقة، مستدامة، آمنة، وقابلة للتصفح لعصر التعاون بين المطورين ووكلاء الذكاء الاصطناعي.** @@ -12,7 +12,9 @@ [![روابط نظيفة ونسبية](https://img.shields.io/badge/Links-Clean%20%26%20Relative-cyan.svg?style=for-the-badge)](#-معايير-الروابط-النسبية-والتصفح-النظيف) [![توافق شامل مع وكلاء الذكاء الاصطناعي](https://img.shields.io/badge/AI%20Agents-Universal%20Compatibility-4285F4.svg?style=for-the-badge)](README.md) -[🌐 الموقع الرسمي](https://tidyfactor.com/) • [📚 مركز التوثيق](https://tidyfactor.com/documentation) • [🤝 الشريك (الوكالة)](https://alwkala.com/) • [⚡ سجل الأوامر](#-سجل-الأوامر-ومسارات-التوثيق-الأربعة) • [🛡️ الضمانات الأمنية](#-ضمانات-الأمان-وحجب-البيانات-الحساسة) • [📖 النسخة الإنجليزية (English)](README.md) +[ English ](README.md) • [ العربية ](README.ar.md) • [ فارسی ](README.fa.md) • [ Español ](README.es.md) • [ Português ](README.pt.md) • [ 简体中文 ](README.zh.md) • [ Deutsch ](README.de.md) • [ Français ](README.fr.md) + +[🌐 الموقع الرسمي](https://tidyfactor.com/) • [📚 مركز التوثيق](https://tidyfactor.com/documentation) • [🤝 الشريك (الوكالة)](https://alwkala.com/) • [⚡ سجل الأوامر](#-سجل-الأوامر-ومسارات-التوثيق-الأربعة) • [🛡️ الضمانات الأمنية](#-ضمانات-الأمان-وحجب-البيانات-الحساسة)

@@ -66,6 +68,7 @@ graph LR | نية المطور وطلب المستخدم | الأمر | مسارات العمل والذاكرة المحملة | المخرجات الناتجة | |---|---|---|---| +| **"تأصيل سياق التوثيق، الاستجواب أو المناظرة المعمارية"** / "brief" / "debate" | `brief` | `workflows/brief.md`
`memory/decision-points.md` | وثيقة `.tidyfactor/doc-brief.snapshot.yaml` و `docs/architectural_debate_synthesis.md` | | **"تجهيز وهيكلة مجلد التوثيق"** / "scaffold /docs" | `init` | `workflows/init-docs.md`
`memory/doc-tree.md` | مجلد `/docs`، ملف `docs/.doc-manifest.json`، وصفحة `docs/README.md` | | **"استقراء وفحص الكود والمشروع"** / "gather facts" | `collect` | `workflows/collect.md`
`memory/collection-sources.md` | تقرير `docs/.collected/.md` (تحليل منظم بالأبعاد الخمسة) | | **"كتابة مرجع واجهة برمجة (API)"** / "API reference" | `generate` | `workflows/generate-api.md`
`memory/doc-templates.md`
`memory/stacks/*.md` | ملف `docs/api/.md` (جداول المعاملات، القيم المرجعة، الأخطاء) | diff --git a/README.de.md b/README.de.md index 3878383..13af57b 100644 --- a/README.de.md +++ b/README.de.md @@ -1,6 +1,6 @@
-# tidyfactor-doc `v1.3.0` +# tidyfactor-doc `v1.6.0` **Codebase Documentation Builder & Dual-Engine Publishing Platform (MkDocs & Docsify) für KI-Coding-Agenten** diff --git a/README.es.md b/README.es.md index b3f4eb9..29f1ae6 100644 --- a/README.es.md +++ b/README.es.md @@ -1,6 +1,6 @@
-# tidyfactor-doc `v1.3.0` +# tidyfactor-doc `v1.6.0` **Constructor de Documentación de Código y Motor de Publicación Dual (MkDocs & Docsify) para Agentes de IA** diff --git a/README.fa.md b/README.fa.md index 589267f..e6aadf9 100644 --- a/README.fa.md +++ b/README.fa.md @@ -1,6 +1,6 @@
-# tidyfactor-doc `v1.3.0` +# tidyfactor-doc `v1.6.0` **موتور ساخت مستندات کد و انتشار دوگانه پورتال‌های مستندات (MkDocs و Docsify) برای ایجنت‌های هوش مصنوعی** diff --git a/README.fr.md b/README.fr.md index 465455b..179c522 100644 --- a/README.fr.md +++ b/README.fr.md @@ -1,6 +1,6 @@
-# tidyfactor-doc `v1.3.0` +# tidyfactor-doc `v1.6.0` **Générateur de Documentation de Codebase et Plateforme de Publication Double (MkDocs & Docsify) pour Agents d'IA** diff --git a/README.md b/README.md index 43b2c55..295fdb8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# 📚 TidyFactor Doc `v1.3.0` +# 📚 TidyFactor Doc `v1.6.0` ### Automated Codebase Interview, API Generator & Dual-Engine Publishing Platform (MkDocs Material & Docsify) **Building accurate, maintainable, secure, and browsable documentation for the era of Human-Agent Collaboration.** @@ -13,7 +13,9 @@ [![Universal AI Agents](https://img.shields.io/badge/AI%20Agents-Universal%20Compatibility-4285F4.svg?style=for-the-badge)](README.md) [![RTL Ready](https://img.shields.io/badge/RTL-Native%20Arabic-emerald.svg?style=for-the-badge)](README.ar.md) -[🌐 Official Website](https://tidyfactor.com/) • [📚 Documentation](https://tidyfactor.com/documentation) • [🤝 Partner (Alwkala)](https://alwkala.com/) • [⚡ Commands](#-commands--the-4-phase-documentation-lifecycle) • [🛡️ Security Guarantees](#-enterprise-security--sanitization-guarantees) • [📖 Read in Arabic (بالعربية)](README.ar.md) +[ English ](README.md) • [ العربية ](README.ar.md) • [ فارسی ](README.fa.md) • [ Español ](README.es.md) • [ Português ](README.pt.md) • [ 简体中文 ](README.zh.md) • [ Deutsch ](README.de.md) • [ Français ](README.fr.md) + +[🌐 Official Website](https://tidyfactor.com/) • [📚 Documentation](https://tidyfactor.com/documentation) • [🤝 Partner (Alwkala)](https://alwkala.com/) • [⚡ Commands](#-commands--the-4-phase-documentation-lifecycle) • [🛡️ Security Guarantees](#-enterprise-security--sanitization-guarantees)

@@ -67,6 +69,7 @@ graph LR | Intent & User Request | Command | Loaded Workflow & Memory | Output Artifact | |---|---|---|---| +| **"Establish doc context / interview / debate architecture"** / "brief" / "debate" | `brief` | `workflows/brief.md`
`memory/decision-points.md` | `.tidyfactor/doc-brief.snapshot.yaml`, `docs/architectural_debate_synthesis.md` | | **"Set up docs for this project"** / "scaffold /docs" | `init` | `workflows/init-docs.md`
`memory/doc-tree.md` | `/docs` scaffold, `docs/.doc-manifest.json`, `docs/README.md` | | **"Document this codebase"** / "gather facts for module X" | `collect` | `workflows/collect.md`
`memory/collection-sources.md` | `docs/.collected/.md` (5-dimensional structured analysis) | | **"Write API reference"** / "generate docs for endpoints" | `generate` | `workflows/generate-api.md`
`memory/doc-templates.md`
`memory/stacks/*.md` | `docs/api/.md` (parameter tables, returns, errors, examples) | diff --git a/README.pt.md b/README.pt.md index bdedd87..1265bd2 100644 --- a/README.pt.md +++ b/README.pt.md @@ -1,6 +1,6 @@
-# tidyfactor-doc `v1.3.0` +# tidyfactor-doc `v1.6.0` **Construtor de Documentação de Código e Motor de Publicação Duplo (MkDocs & Docsify) para Agentes de IA** diff --git a/README.zh.md b/README.zh.md index 25a3ca0..86574e7 100644 --- a/README.zh.md +++ b/README.zh.md @@ -1,6 +1,6 @@
-# tidyfactor-doc `v1.3.0` +# tidyfactor-doc `v1.6.0` **面向 AI 智能体的代码库文档自动生成与双引擎发布平台 (MkDocs & Docsify)** diff --git a/SKILL.md b/SKILL.md index 34f043e..48a73be 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: tidyfactor-doc -description: "Code documentation builder and dual-engine publishing platform (MkDocs Material and Docsify). Generates comprehensive API references, READMEs, inline docblocks, and technical guides under /docs. Trigger on commands 'init', 'collect', 'generate', 'site', 'mkdocs', 'docsify', or requests like 'document this codebase', 'generate API docs', 'set up MkDocs', or 'set up Docsify'." +description: "Code documentation builder and triple-engine publishing platform (VitePress, MkDocs Material, and Docsify). Generates comprehensive API references, READMEs, inline docblocks, and technical guides under /docs. Trigger on commands 'brief', 'init', 'collect', 'generate', 'site', 'vitepress', 'mkdocs', 'docsify', or requests like 'document this codebase', 'generate API docs', 'set up VitePress', or 'set up MkDocs'." --- # TidyFactor Doc @@ -10,10 +10,12 @@ A command dispatcher. This file does not do the work itself — it routes to the | User intent | Command | What it loads | |---|---|---| +| "Establish documentation context / interview / debate codebase architecture" / "brief" / "debate" | `references/commands/brief.md` | `workflows/brief.md` + `memory/decision-points.md` | | "Set up docs for this project" / "scaffold /docs" | `references/commands/init.md` | `workflows/init-docs.md` + `memory/doc-tree.md` | | "Document this codebase" / "gather what's needed to document X" | `references/commands/collect.md` | `workflows/collect.md` + `memory/collection-sources.md` | | "Write API docs" / "generate a README" / "add inline comments" / "write a guide" | `references/commands/generate.md` | `workflows/generate-api.md` (or `generate-readme.md` / `generate-inline.md` / `generate-guide.md`) + `memory/doc-templates.md` + matching `memory/stacks/*.md` | -| "Publish documentation portal" / "turn /docs into a doc site" (Interactive) | `references/commands/site.md` | `memory/site-engines.md` + interactive selection (`workflows/mkdocs.md` or `workflows/docsify.md`) | +| "Publish documentation portal" / "turn /docs into a doc site" (Interactive) | `references/commands/site.md` | `memory/site-engines.md` + interactive selection (`workflows/vitepress.md`, `workflows/mkdocs.md`, or `workflows/docsify.md`) | +| "Set up VitePress" / "build modern Vue-powered doc portal" | `references/commands/vitepress.md` | `workflows/vitepress.md` + `memory/vitepress-config.md` | | "Set up MkDocs Material" / "compile static documentation" | `references/commands/mkdocs.md` | `workflows/mkdocs.md` + `memory/mkdocs-config.md` | | "Set up Docsify" / "build lightweight zero-build doc SPA" | `references/commands/docsify.md` | `workflows/docsify.md` + `memory/docsify-config.md` | @@ -24,7 +26,8 @@ Read only the command file that matches the request. Do not read all commands si 1. **All generated documentation lives under `/docs`.** Never write API references, guides, or generated READMEs to another location. (`README.md` itself stays at the project root, per convention — everything else generated goes in `/docs`.) 2. **`generate` never invents content.** It only writes docs from what `collect` gathered (or equivalent detail the user supplies directly in the conversation) — never from assumed signatures, assumed env vars, or assumed behavior. If required detail is missing, `generate` says what's missing and asks or falls back to running `collect` first. 3. **Stack rules are looked up, never guessed.** Before writing any code-level doc (API reference, inline comments), load the matching file under `memory/stacks/` for the language/framework actually in use. Do not mix PHPDoc conventions into a TypeScript file or vice versa. -4. **`site`, `mkdocs`, and `docsify` only organize and publish what's already in `/docs`.** They never author new documentation content — that's `generate`'s job. +4. **`site`, `vitepress`, `mkdocs`, and `docsify` only organize and publish what's already in `/docs`.** They never author new documentation content — that's `generate`'s job. + - For **VitePress**: Generate ESM `config.mjs`, inject luxury typography (`Alexandria` + `Cairo` + `JetBrains Mono`), enforce surgical RTL navbar order, single-row Hero action CTAs (`white-space: nowrap`), and explicit 3-column card widths (`width: 33.333333% !important`) with BiDi protection (`unicode-bidi: plaintext`). Build cleanly with `npx vitepress build docs`. - For **MkDocs Material**: Generate standard `mkdocs.yml`, configure Neo-Brutalist CSS tokens (`extra.css`), configure Arabic/English i18n (`*.ar.md` suffix), and build cleanly with `mkdocs build --strict`. - For **Docsify**: Include `alias: { '/.*/_sidebar.md': '/_sidebar.md' }` and root-relative leading slashes `/` in `_sidebar.md` to guarantee persistent sidebar navigation across all subfolder routes. 5. **Standalone.** This skill does not read or depend on any other `tidyfactor-*` skill's conventions, even when the project happens to be built on one of those tracks. @@ -50,4 +53,4 @@ Read only the command file that matches the request. Do not read all commands si ## Sequencing -`init` → `collect` → `generate` (repeatable, once per doc target) → `site` / `mkdocs` / `docsify` (optional, once /docs has real content). +`brief` (optional, architectural alignment & debate) → `init` → `collect` → `generate` (repeatable, once per doc target) → `site` / `vitepress` / `mkdocs` / `docsify` (optional, once /docs has real content). diff --git a/brand.json b/brand.json index b4e9b10..d4a5e9e 100644 --- a/brand.json +++ b/brand.json @@ -1,6 +1,6 @@ { "name": "TidyFactor Doc", - "version": "1.5.0", + "version": "1.7.0", "publisher": "TidyFactor Ecosystem", "partner": "Alwkala Digital Agency (https://alwkala.com)", "contact": { diff --git a/brand.yaml b/brand.yaml new file mode 100644 index 0000000..379465f --- /dev/null +++ b/brand.yaml @@ -0,0 +1,10 @@ +name: "TidyFactor Doc" +version: "1.6.0" +publisher: "TidyFactor Ecosystem" +partner: "Alwkala Digital Agency (https://alwkala.com)" +contact: + website: "https://tidyfactor.com" + email: "hello@tidyfactor.com" + whatsapp: "+201016656899" + location: "Cairo, Egypt" +license: "Apache-2.0" diff --git a/manifest.json b/manifest.json index 88057ae..3862006 100644 --- a/manifest.json +++ b/manifest.json @@ -43,16 +43,34 @@ ], "decision_gates": [ { - "command": "init", - "description": "Decision gate selecting documentation engine, navigation structure, and audience persona.", + "command": "brief", + "aliases": ["init", "debate"], + "description": "Decision gate selecting documentation engine, target persona, hygiene policy, and extraction scope.", "decisions": [ + { + "key": "target_scope", + "description": "Scope of documentation generation (D1)", + "type": "enum", + "options": ["full_codebase", "api_surface_only", "internal_architecture", "end_user_docs"], + "default": "full_codebase", + "priority": 1, + "discovery": [ + { + "source": "local_file", + "path": "docs/.doc-manifest.json" + } + ], + "persist_to": { + "local": { "path": ".tidyfactor/doc-brief.snapshot.yaml" } + } + }, { "key": "doc_engine", - "description": "Target documentation publishing engine", + "description": "Target documentation publishing engine (D2)", "type": "enum", "options": ["mkdocs_material", "docsify_spa", "static_markdown"], "default": "mkdocs_material", - "priority": 1, + "priority": 2, "discovery": [ { "source": "local_file", @@ -70,7 +88,7 @@ } ], "persist_to": { - "local": { "path": ".tidyfactor/doc-brief.snapshot.json" }, + "local": { "path": ".tidyfactor/doc-brief.snapshot.yaml" }, "brain_ki": { "sync_direction": "outbound_push_only", "requires_flag": "--sync-brain" @@ -78,38 +96,60 @@ } }, { - "key": "target_scope", - "description": "Scope of documentation generation", + "key": "audience_persona", + "description": "Primary audience reading the documentation (D3)", "type": "enum", - "options": ["full_codebase", "api_surface_only", "developer_guide", "end_user_docs"], - "default": "full_codebase", - "priority": 2, + "options": ["bilingual_developer", "api_consumer", "internal_maintainer", "end_user"], + "default": "bilingual_developer", + "priority": 3, "discovery": [ { "source": "local_file", - "path": "docs/.doc-manifest.json" + "path": "brand.yaml", + "yaml_path": "audience" + }, + { + "source": "local_file", + "path": "brand.json", + "json_path": "$.audience" } ], "persist_to": { - "local": { "path": ".tidyfactor/doc-brief.snapshot.json" } + "local": { "path": ".tidyfactor/doc-brief.snapshot.yaml" } } }, { - "key": "audience_persona", - "description": "Primary audience reading the documentation", + "key": "hygiene_policy", + "description": "Security redaction and sensitive data leak policy (D4)", "type": "enum", - "options": ["api_consumer", "internal_maintainer", "end_user", "bilingual_developer"], - "default": "bilingual_developer", - "priority": 3, + "options": ["strict_zero_leak", "public_sdk_redaction", "internal_audit_permissive"], + "default": "strict_zero_leak", + "priority": 4, + "discovery": [ + { + "source": "brain_ki", + "ki_type": "security" + } + ], + "persist_to": { + "local": { "path": ".tidyfactor/doc-brief.snapshot.yaml" } + } + }, + { + "key": "collection_depth", + "description": "Extraction dimensions depth for codebase collection (D5)", + "type": "enum", + "options": ["full_5_dimensions", "signatures_and_types", "architecture_and_rationale"], + "default": "full_5_dimensions", + "priority": 5, "discovery": [ { "source": "local_file", - "path": "brand.json", - "json_path": "$.audience" + "path": "docs/.doc-manifest.json" } ], "persist_to": { - "local": { "path": ".tidyfactor/doc-brief.snapshot.json" } + "local": { "path": ".tidyfactor/doc-brief.snapshot.yaml" } } } ] diff --git a/package.json b/package.json index ab1df48..9f3ec71 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tidyfactor/doc", - "version": "1.5.0", - "description": "TidyFactor Doc — Code Documentation Builder & Dual-Engine Publishing Platform (MkDocs Material & Docsify) for AI Coding Agents", + "version": "1.7.0", + "description": "TidyFactor Doc — Code Documentation Builder & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", "main": "SKILL.md", "bin": { "tidyfactor-doc": "bin/add-skill.js", @@ -50,6 +50,7 @@ "assets", "bin", "brand.json", + "brand.yaml", "manifest.json", "memory", "references", diff --git a/references/commands/brief.md b/references/commands/brief.md new file mode 100644 index 0000000..a969f44 --- /dev/null +++ b/references/commands/brief.md @@ -0,0 +1,16 @@ +# Command: brief + +Runtime entry point for establishing documentation context, running codebase interview, or conducting architectural debate ("brief", "interview", "debate", "استجوبني", "ناقشني في معمارية التوثيق"). + +## Dispatch steps + +1. Load `../memory/decision-points.md` — the 5 core documentation decision dimensions (D1–D5), operational modes (Mode A / Mode B), and boolean skip conditions. +2. Load `../workflows/brief.md` — the Context Delta Resolution, Dual Operational Mode execution, and persistence sequence. +3. Run the workflow. + +## Does NOT + +- Does not author actual documentation content (no API entries, no guides, no READMEs). That's `generate`. +- Does not scaffold `/docs` directory structure until baseline decisions are confirmed. That's `init`. +- Does not run code-level AST parsing or git history log collection. That's `collect`. +- Does not load `memory/stacks/*.md` or `memory/docsify-config.md` / `memory/mkdocs-config.md` — those are loaded only during generation or site compilation. diff --git a/references/commands/site.md b/references/commands/site.md index 75c436d..4b32b54 100644 --- a/references/commands/site.md +++ b/references/commands/site.md @@ -4,19 +4,21 @@ Runtime entry point for "turn /docs into a doc site" / "publish documentation po ## Dispatch steps -1. Load `../memory/site-engines.md` — comparison between MkDocs Material and Docsify. +1. Load `../memory/site-engines.md` — comparison between VitePress, MkDocs Material, and Docsify. 2. Confirm `/docs` has real content (at least one generated doc beyond the scaffold). 3. **Interactive Engine Selection:** - - Detect if Python is available via `python --version 2>&1`. - - If the user explicitly requested a specific engine (e.g., "use mkdocs" or "use docsify"), route directly: + - Detect available runtimes: `node --version 2>&1` and `python --version 2>&1`. + - If the user explicitly requested a specific engine (e.g., "use vitepress", "use mkdocs", or "use docsify"), route directly: + - "vitepress" → Dispatch `references/commands/vitepress.md`. - "mkdocs" → Dispatch `references/commands/mkdocs.md`. - "docsify" → Dispatch `references/commands/docsify.md`. - If no engine was specified: - - Present the two options to the user with the summary from `memory/site-engines.md`: - - **Option 1: MkDocs Material (Recommended for Production)**: Pre-compiled static HTML, 100/100 Core Web Vitals, bilingual (Arabic RTL + English LTR) parallel builds, offline search indexing, and Neo-Brutalist styling. Requires Python locally for building. - - **Option 2: Docsify (Zero-Build Lightweight SPA)**: Client-side SPA, zero build step, single `index.html` + `_sidebar.md` over CDN. Recommended when Python is not available or for internal repo prototyping. + - Present the options to the user with the summary from `memory/site-engines.md`: + - **Option 1: VitePress (Recommended for Modern Web, Monorepos & Luxury RTL)**: Vue 3 / Vite SSG, sub-second HMR, native multi-locale subdirectory routing (`/`, `/en/`, `/es/`), and bespoke luxury typography (`Alexandria` + `Cairo` + `JetBrains Mono`). Requires Node.js. + - **Option 2: MkDocs Material (Recommended for Python & Backend Services)**: Pre-compiled static HTML, 100/100 Core Web Vitals, parallel builds, offline search indexing, and Neo-Brutalist styling. Requires Python. + - **Option 3: Docsify (Zero-Build Lightweight SPA)**: Client-side SPA, zero build step, single `index.html` + `_sidebar.md` over CDN. Recommended when neither Node nor Python build workflows are available. - Prompt the user to pick their preference or proceed with the recommended engine based on detected toolchain. -4. Execute the chosen workflow (`workflows/mkdocs.md` or `workflows/docsify.md`). +4. Execute the chosen workflow (`workflows/vitepress.md`, `workflows/mkdocs.md`, or `workflows/docsify.md`). ## Does NOT diff --git a/references/commands/vitepress.md b/references/commands/vitepress.md new file mode 100644 index 0000000..ff909f7 --- /dev/null +++ b/references/commands/vitepress.md @@ -0,0 +1,20 @@ +# Command: vitepress + +Runtime entry point for "Set up VitePress" / "build modern Vue-powered doc portal" / "vitepress". + +## Dispatch steps + +1. Load `../memory/vitepress-config.md` — complete ESM configuration schema, luxury CSS custom tokens, and script presets. +2. Confirm `/docs` has real content (at least one generated doc beyond the scaffold). +3. Verify Node.js toolchain (`node --version` >= 18). +4. Dispatch `../workflows/vitepress.md`. + +## Injects + +- `../workflows/vitepress.md` +- `../memory/vitepress-config.md` + +## Does NOT + +- Does not author any new markdown content — it structures, configures, and publishes what's already in `/docs`. +- Does not use external unverified CSS frameworks; relies strictly on custom luxury design tokens (`Alexandria` + `Cairo` + `JetBrains Mono` + RTL logical properties). diff --git a/references/memory/decision-points.md b/references/memory/decision-points.md new file mode 100644 index 0000000..994db48 --- /dev/null +++ b/references/memory/decision-points.md @@ -0,0 +1,72 @@ +# Memory: decision-points + + + +Operational decision framework for documentation architecture and codebase interview governance. Enforces Contextual Decision Layer (CDL v2.0) and Dual-Mode Decision Architect (DM-DA) protocols. + +--- + +## 🏛️ Decision Dimensions (D1–D5) + +| Code | Decision Dimension | Options (Reference SSOT) | Default Fallback | Ambiguity / Trigger Condition | +|:---:|---|---|---|---| +| **D1** | **Documentation Purpose & Scope** | • `full_codebase` (Complete API surface + architecture guides)
• `api_surface_only` (Public exports, routes, and client SDKs)
• `internal_architecture` (Developer onboarding, ADRs, module contracts)
• `end_user_docs` (User guides, tutorials, setup walkthroughs) | `full_codebase` | When request asks to "document this project" without specifying audience or depth. | +| **D2** | **Publishing Platform Engine** | • `mkdocs_material` (Static HTML compilation, lunr offline search, bilingual i18n)
• `docsify_spa` (Zero-build client runtime SPA, instant markdown preview)
• `static_markdown` (Raw markdown files under `/docs` with root README) | `mkdocs_material` (if python available) / `docsify_spa` | When user has not configured `mkdocs.yml` or `docs/index.html`. | +| **D3** | **Target Persona & Linguistic Register** | • `bilingual_developer` (Arabic/English parallel guides, technical terminology)
• `api_consumer` (Strict English technical docs, contract signatures)
• `internal_maintainer` (Architecture rationale, git commit history context)
• `end_user` (Simplified bilingual non-technical user documentation) | `bilingual_developer` | When project has not specified language or target reader in `brand.yaml`. | +| **D4** | **Hygiene & Redaction Policy** | • `strict_zero_leak` (Mandatory automated regex masking of all IPs, DB passwords, API tokens)
• `public_sdk_redaction` (Scrub all internal routes, mock endpoints only)
• `internal_audit_permissive` (Permit local loopback `127.0.0.1` and dummy sample envs) | `strict_zero_leak` | Mandatory for all public or open-source documentation generation. | +| **D5** | **Collection Depth & Extraction Dimensions** | • `full_5_dimensions` (Source AST + Git commit rationale + Env vars + Personas + Error patterns)
• `signatures_and_types` (Public function/class docblocks only)
• `architecture_and_rationale` (Module boundaries, ADRs, and commit history) | `full_5_dimensions` | Decides computational depth of subsequent `collect` workflow. | + +--- + +## 🧭 Dual Operational Modes (DM-DA) + +``` +[CDL v2.0 Protocol] + │ + ▼ + Context Delta Resolution ──(Unknowns = ∅)──► Instant Baseline Confirmation + │ + ├─► [MODE A] 🎯 Smart 3-Round Protocol (Deterministic alignment in 3 rounds) + │ Round 1: Purpose & Target Audience + │ Round 2: Engine & Architecture + │ Round 3: Boundaries, Hygiene & Safe Defaults + │ └── Escalation Gate: Confirm OR Escalate to Mode B + │ + └─► [MODE B] 🔥 Relentless Debate & Interview (Debate Mode) + Continuous multi-turn interrogation challenging assumptions + Forces binary trade-offs (static vs SPA, brevity vs depth) + Terminates strictly on: "END DEBATE" / "اعتماد" + Emits: architectural_debate_synthesis.md +``` + +### [MODE A] 🎯 Smart 3-Round Protocol (الارتجال الذكي المقيد) +- **Round 1: Purpose & Scope (D1 + D3)**: Pinpoint primary documentation consumer and technical scope. +- **Round 2: Architecture & Engine (D2 + D5)**: Select publishing engine and depth of code extraction. +- **Round 3: Hygiene & Safe Defaults (D4 + Remaining)**: Enforce security scrubbing rules and apply defaults. +- **Strict Termination**: Finishes at Round 3, saves snapshot, and presents the Escalation Gate: + > *"هل تعتمد هذه البنية المبدئية للبدء فوراً، أم تفضل تفعيل [نمط المناظرة 🔥 Debate Mode] لتفكيك الافتراضات واختبار صلابة الهيكلية التوثيقية؟"* + +### [MODE B] 🔥 Relentless Debate & Interview (الاستجواب والمناظرة اللانهائية — Debate Mode) +- **Activation**: Direct `/debate`, or Mode A Round 3 escalation. +- **Behavior**: + - Relentless multi-turn counter-questioning challenging documentation choices: + - *"Why choose Docsify client-side SPA if SEO and offline indexability are critical for external developers?"* + - *"Why document internal private methods if the primary goal is public API adoption?"* + - *"How will the team prevent confidential server IPs and auth secrets from slipping into generated guides?"* + - *"If the documentation is bilingual Arabic/English, how will code snippets and RTL UI callouts remain visually coherent without layout breakages?"* + - Exposes anti-patterns: bloated doc sets nobody reads, duplicate API references, undocumented environment configurations. + - Forces binary, uncompromising trade-offs. +- **Termination**: Ends **only** when user signals `"END DEBATE"` or `"اعتماد"`. +- **Deliverables**: + - Generates formal synthesis: `docs/architectural_debate_synthesis.md`. + - Persists confirmed parameters to `.tidyfactor/doc-brief.snapshot.yaml` and `.tidyfactor/doc-brief.md`. + +--- + +## ⚡ Boolean Skip Conditions (Deterministic Bypass) + +Skip interactive questioning and adopt safe defaults immediately if ANY condition is met: +1. **Existing Snapshot**: `.tidyfactor/doc-brief.snapshot.yaml` exists and `track_staleness` confirms zero file drift. +2. **Explicit User Declaration**: User specifies complete parameters in the prompt (e.g. *"Init MkDocs Material docs for public API with strict redaction"*). +3. **Direct Stack Command**: User calls specific engine commands directly (`/mkdocs` or `/docsify`). +4. **Maintenance Mode**: An audit (`audit_docs`) or validation run (`validate_skill.py`) preserves current configurations. diff --git a/references/memory/site-engines.md b/references/memory/site-engines.md index 96f24d0..d22e303 100644 --- a/references/memory/site-engines.md +++ b/references/memory/site-engines.md @@ -1,55 +1,52 @@ - -# Memory: Site Engines (Docsify vs. MkDocs Material) + +# Memory: Site Engines (VitePress vs. MkDocs Material vs. Docsify) Technical evaluation matrix for documentation publishing engines supported by `tidyfactor-doc`. ## Engine Comparison Matrix -| Capability / Factor | ⚡ MkDocs Material (Static Compiler) | 📄 Docsify (Client-Side SPA) | -|---|---|---| -| **Architecture** | Static Site Generator (Python Markdown) | Client-Side SPA (`marked.js` in browser) | -| **Output Type** | Pre-rendered static HTML (`site/`) | Single `index.html` fetching `.md` via AJAX | -| **Build Dependency** | Python 3.10+, `pip install mkdocs-material` | Zero build step, zero compiler required | -| **SEO & Crawlers** | 100/100 Perfect static HTML indexing | Limited (requires JS execution by bots) | -| **Performance & CWV** | Instant initial paint, pre-cached assets | Client-side fetch delay on slow mobile networks | -| **i18n & Localization** | Native parallel builds (`/` and `/ar/`) via `mkdocs-static-i18n` | Single page language or manual separate SPAs | -| **Search Engine** | Lunr.js pre-indexed offline search (bilingual) | In-browser client-side fuzzy search | -| **Styling & Theming** | Material for MkDocs + Neo-Brutalist CSS tokens | Custom CSS over Docsify default theme | -| **Code Highlighting** | Pygments build-time syntax highlighting + line spans | Prism.js client-side syntax highlighting | -| **Target Deployment** | Production doc portals, public SaaS products, multi-language sites | Rapid internal repo docs, single-file lightweight guides | +| Capability / Factor | ⚡ VitePress (Vue 3 / Vite SSG) | 📦 MkDocs Material (Python Static) | 📄 Docsify (Client SPA) | +|---|---|---|---| +| **Architecture** | Static Site Generator (Vite + Vue 3 SSR) | Static Site Generator (Python Markdown) | Client-Side SPA (`marked.js`) | +| **Output Type** | Pre-rendered static HTML (`dist/`) + Vue hydration | Pre-rendered static HTML (`site/`) | Single `index.html` fetching `.md` | +| **Build Dependency** | Node.js >= 18, `npm i -D vitepress` | Python 3.10+, `pip install mkdocs-material` | Zero build step, zero compiler | +| **SEO & Crawlers** | 100/100 Perfect static HTML indexing | 100/100 Perfect static HTML indexing | Limited (requires bot JS execution) | +| **Performance & CWV** | Instant Vite dev server, sub-second HMR | High compilation speed, pre-cached assets | Client-side fetch delay on slow mobile | +| **i18n & Localization** | Native subdirectory routing (`/`, `/en/`, `/es/`) | Parallel builds via `mkdocs-static-i18n` | Single language or manual SPAs | +| **Search Engine** | Minisearch pre-indexed local search | Lunr.js pre-indexed offline search | In-browser client-side fuzzy search | +| **Styling & Theming** | Custom CSS tokens, Vue components, Luxury RTL | Material theme + Neo-Brutalist tokens | Custom CSS over Docsify default | +| **Code Highlighting** | Shiki build-time syntax highlighting | Pygments build-time syntax highlighting | Prism.js client-side syntax | +| **Target Deployment** | Modern JS/TS repos, SaaS portals, luxury RTL | Python/Backend repos, enterprise wikis | Internal quick prototyping, single guides | --- ## Decision Logic & Recommendation Rules -1. **Choose MkDocs Material if:** - - The documentation has more than 10 pages or complex multi-level hierarchy. - - Public SEO visibility and search engine discoverability are critical. - - The project is bilingual (Arabic RTL + English LTR) requiring dedicated language switches. - - The local environment has Python installed (`python --version` returns 3.10+). - - Production hosting supports static directory routing (`public_html/documentation/`). +1. **Choose VitePress if (Recommended for Modern Web / Monorepos):** + - The project is in the Node.js / TypeScript / Frontend ecosystem. + - Requires custom interactive Vue components, modern UI aesthetics, or luxury typography (`Alexandria` + `Cairo` + `JetBrains Mono`). + - Needs seamless multi-language subdirectory routing with zero 404s. + - Developer desires sub-second Vite HMR during drafting. -2. **Choose Docsify if:** - - The developer or server environment has **no Python runtime** and requires zero installation. - - The project needs an instant browsable site by dropping a single `index.html` into `/docs`. - - The documentation is primarily for internal developers within a repository. - - The site is hosted on GitHub Pages with zero CI build workflows. - ---- +2. **Choose MkDocs Material if:** + - The project is Python-centric or backend-heavy. + - The team is already using Python toolchains (`pip`, `virtualenv`). + - The documentation requires MkDocs-specific plugin ecosystems. -## Two-Tier Multi-Language Documentation Pattern - -Both engines adhere to the TidyFactor Two-Tier Documentation standard: -- **Canonical Technical SSOT**: Full API specifications, architecture, and code deep-dives maintained in Canonical English (`/docs/en/` or root) with First-Class Arabic (`/docs/ar/`). -- **Localized Adoption Guides**: Quickstarts, tutorials, concepts, and command matrices for Tier 1/2 growth languages (`es`, `pt`, `fa`, `zh`, `de`, `fr`) providing high-conversion onboarding. +3. **Choose Docsify if:** + - The developer environment has neither Node.js nor Python build workflows. + - The project needs an instant browsable site by dropping a single `index.html` into `/docs`. + - The documentation is strictly internal within a small Git repository. --- ## Toolchain Verification Command ```bash -# Check if Python is available for MkDocs +# Check available runtimes +node --version 2>&1 python --version 2>&1 || python3 --version 2>&1 ``` -- If Python is available: recommend **MkDocs Material** as primary production track. -- If Python is not available: recommend **Docsify** as zero-dependency fallback. +- If Node.js is available: recommend **VitePress** as primary luxury web documentation portal. +- If Python is available without Node.js: recommend **MkDocs Material**. +- If no build runtime is available: recommend **Docsify** zero-dependency fallback. diff --git a/references/memory/stacks/js-ts.md b/references/memory/stacks/js-ts.md index 05461f2..4399235 100644 --- a/references/memory/stacks/js-ts.md +++ b/references/memory/stacks/js-ts.md @@ -1,5 +1,7 @@ # Memory: stacks/js-ts + + Documentation conventions for JavaScript and TypeScript targets. Applies whenever the target's manifest is `package.json` and files are `.js`/`.mjs` (JS) or `.ts`/`.tsx` (TS). The two share JSDoc-style block syntax but differ in what needs restating. ## JavaScript — JSDoc (types belong in the comment, since the code itself is untyped) diff --git a/references/memory/stacks/php.md b/references/memory/stacks/php.md index fd9f118..4d27c69 100644 --- a/references/memory/stacks/php.md +++ b/references/memory/stacks/php.md @@ -1,5 +1,7 @@ # Memory: stacks/php + + Documentation conventions for PHP targets. Applies whenever the target's manifest is `composer.json` or files are `.php`. ## Inline comment format — PHPDoc diff --git a/references/memory/stacks/react-vue-next.md b/references/memory/stacks/react-vue-next.md index 4dc9b1c..786bcb1 100644 --- a/references/memory/stacks/react-vue-next.md +++ b/references/memory/stacks/react-vue-next.md @@ -1,5 +1,7 @@ # Memory: stacks/react-vue-next + + Component-level documentation conventions, layered on top of `js-ts.md` (still use JSDoc/TSDoc block syntax — this file adds what's specific to components, pages, and routes). ## React — props, not just function signature diff --git a/references/memory/vitepress-config.md b/references/memory/vitepress-config.md new file mode 100644 index 0000000..a543d79 --- /dev/null +++ b/references/memory/vitepress-config.md @@ -0,0 +1,174 @@ + +# Memory: VitePress Configuration Spec & Luxury Theme Architecture + +Complete architectural specification for scaffolding, configuring, and styling production-grade documentation portals with VitePress, luxury typography, and full RTL layout parity. + +--- + +## 1. Master ESM Configuration Schema (`docs/.vitepress/config.mjs`) + +```javascript +import { defineConfig } from 'vitepress'; + +export default defineConfig({ + title: 'Project Name', + description: 'Production Documentation Portal', + head: [ + ['link', { rel: 'icon', href: '/logo.png' }] + ], + + locales: { + root: { + label: 'العربية', + lang: 'ar', + dir: 'rtl', + themeConfig: { + nav: [ + { text: 'الرئيسية', link: '/' }, + { text: 'دليل الاستخدام', link: '/user_manual.ar' }, + { text: 'المواصفات المعمارية', link: '/specs/architecture_spec.ar' }, + { text: 'GitHub', link: 'https://github.com/organization/repo' } + ], + sidebar: [ + { + text: '🚀 البدء السريع', + items: [ + { text: 'نظرة عامة', link: '/' }, + { text: 'دليل التثبيت', link: '/guide/getting-started.ar' } + ] + } + ] + } + }, + en: { + label: 'English', + lang: 'en', + link: '/en/', + themeConfig: { + nav: [ + { text: 'Home', link: '/en/' }, + { text: 'User Manual', link: '/user_manual.ar' } + ] + } + } + }, + + themeConfig: { + logo: '/logo.png', + siteTitle: 'Project Name', + search: { + provider: 'local' + }, + footer: { + message: 'Released under Apache-2.0 License', + copyright: 'Copyright © 2026 Engineering Team' + } + } +}); +``` + +--- + +## 2. Luxury Design System Tokens (`docs/.vitepress/theme/custom.css`) + +```css +@import url('https://fonts.googleapis.com/css2?family=Alexandria:wght@400;500;600;700;800;900&family=Cairo:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap'); + +:root { + --vp-font-family-base: 'Cairo', sans-serif; + --vp-font-family-headings: 'Alexandria', sans-serif; + --vp-font-family-mono: 'JetBrains Mono', monospace; +} + +/* RTL Navbar Flex Order */ +html[dir="rtl"] .VPNavBar .content-body { + display: flex !important; + flex-direction: row !important; + align-items: center !important; + width: 100%; +} +html[dir="rtl"] .VPNavBarTitle { order: 1 !important; margin-inline-end: 28px !important; } +html[dir="rtl"] .VPNavBarMenu { order: 2 !important; margin-inline-end: auto !important; } +html[dir="rtl"] .VPNavBarSearch { order: 3 !important; } +html[dir="rtl"] .VPNavBarTranslations { order: 4 !important; } +html[dir="rtl"] .VPNavBarAppearance { order: 5 !important; } +html[dir="rtl"] .VPNavBarSocialLinks { order: 6 !important; } + +/* Hero Reading Direction in RTL: Text on Right, Logo on Left */ +.VPHomeHero .container { + display: flex !important; + align-items: center !important; + justify-content: space-between !important; +} +html[dir="rtl"] .VPHomeHero .container { flex-direction: row !important; } +html[dir="rtl"] .VPHomeHero .main { order: 1 !important; text-align: right !important; flex: 1 1 60% !important; } +html[dir="rtl"] .VPHomeHero .image { order: 2 !important; flex: 1 1 40% !important; display: flex !important; justify-content: center !important; } + +/* Single-Row Protected Hero Actions */ +.VPHomeHero .actions { + display: flex !important; + flex-direction: row !important; + align-items: center !important; + gap: 14px !important; + flex-wrap: nowrap !important; +} +.VPButton { + min-height: 48px !important; + height: 48px !important; + padding: 0 24px !important; + border-radius: 14px !important; + font-family: 'Alexandria', sans-serif !important; + font-weight: 700 !important; + font-size: 0.95rem !important; + white-space: nowrap !important; + word-break: keep-all !important; +} + +/* 3-Column Luxury Feature Cards (Column Collapse Fix) */ +.VPFeatures .items { + display: flex !important; + flex-wrap: wrap !important; + margin: -10px !important; +} +.VPFeatures .item { + padding: 10px !important; + box-sizing: border-box !important; + width: 100% !important; + display: flex !important; +} +@media (min-width: 640px) { .VPFeatures .item { width: 50% !important; } } +@media (min-width: 960px) { .VPFeatures .item { width: 33.333333% !important; } } + +.VPFeature { + border: 1px solid var(--vp-c-divider) !important; + border-radius: 20px !important; + background: var(--vp-c-bg-soft) !important; + backdrop-filter: blur(20px) !important; + padding: 28px !important; + width: 100% !important; + height: 100% !important; + box-sizing: border-box !important; +} +html[dir="rtl"] .VPFeature .title, +html[dir="rtl"] .VPFeature .details { + text-align: right !important; + direction: rtl !important; + unicode-bidi: plaintext !important; +} +``` + +--- + +## 3. Quick Navigation Grid Markdown Template + +```markdown +## 🧭 جدول المحتويات والمسارات السريعة + +
+ +| 🚀 البدء والأدوات | 💼 التطبيقات وحزم العمل | 🏛️ المعمارية العميقة | +|---|---|---| +| • [دليل التثبيت](/guide/getting-started.ar)
• [مرجع الطرفية](/tools/cli.ar) | • [تطبيقات الإنتاجية](/apps/productivity.ar)
• [حزمة الأعمال](/apps/office-suite.ar) | • [بنية الذاكرة](/architecture/memory-and-search.ar)
• [المواصفات الفنية](/specs/architecture_spec.ar) | + +
+``` diff --git a/references/workflows/brief.md b/references/workflows/brief.md new file mode 100644 index 0000000..73cfd3c --- /dev/null +++ b/references/workflows/brief.md @@ -0,0 +1,105 @@ +# Workflow: brief + +One outcome: a validated documentation architectural brief and local snapshot, establishing all governance parameters before scaffolding or code parsing begins. + +--- + +## 📋 Step 0: Context Delta Resolution (CDL v2.0) + +Before querying the user, deterministically evaluate the Context Delta formula: + +$$\text{Unknowns} = \text{Required Decisions} - (\text{Discovered Facts} \cup \text{Brain KIs})$$ + +1. **Local Auto-Sensing on Disk**: + - Inspect `package.json`, `composer.json`, `tsconfig.json` for stack identification. + - Check existing documentation markers (`mkdocs.yml`, `docs/index.html`, `docs/.doc-manifest.json`). + - Read `brand.yaml` (fallback `brand.json`) for project name, audience, and license. + - Check `.tidyfactor/doc-brief.snapshot.yaml`: if present and file hashes match (`track_staleness: true`), resolve all decisions immediately. +2. **Fail-Open Brain MCP Acceleration**: + - Query `search_knowledge_base(query="documentation architecture", scope="project")`. + - If Brain MCP is absent, disabled, or empty, proceed with 0ms silent fallback. +3. **Delta Evaluation**: + - If $\text{Unknowns} = \emptyset$: Proceed immediately to Step 2 (persist snapshot) with zero conversational overhead. + - If $\text{Unknowns} \neq \emptyset$: Proceed to Step 1 using the requested Operational Mode. + +--- + +## 🧭 Step 1: Operational Mode Execution (Native Modal Wizard Contract) + +> [!IMPORTANT] +> **Zero Static Text Questionnaires (`❌`)**: +> The agent is **STRICTLY FORBIDDEN** from outputting questions, choices, or debate trade-offs as plain written markdown text in the chat. +> The agent **MUST** invoke the platform's native interactive question tool (`ask_question` in Antigravity IDE) to render a structured modal wizard with selectable options and recommended defaults. + +--- + +### [MODE A] 🎯 Smart 3-Round Protocol (الارتجال الذكي المقيد) +*Fast-track structured alignment via native modal wizards.* + +- **Round 1: Purpose & Target Persona (D1 & D3)**: + - Invoke `ask_question`: + - Question 1: "ما هو النطاق الأساسي لتوثيق المشروع؟" + Options: `"(Recommended) full_codebase — توثيق شامل للـ API والمعمارية وأدلة التشغيل"`, `"api_surface_only — توثيق نقاط النهاية وواجهات الـ API فقط"`, `"internal_architecture — توثيق المعمارية وتهيئة المطورين الداخليين"`, `"end_user_docs — أدلة استخدام مبسطة للمستخدم النهائي"` + - Question 2: "ما هي شريحة القراء والتوجه اللغوي المستهدف؟" + Options: `"(Recommended) bilingual_developer — توثيق فني ثنائي باللغتين العربية والإنجليزية"`, `"api_consumer — توثيق تقني صارم بالإنجليزية لمستهلكي الـ API"`, `"internal_maintainer — توثيق معطيات القرارات وسياق المطورين"`, `"end_user — توثيق مبسط لغير التقنيين"` +- **Round 2: Architecture & Engine (D2 & D5)**: + - Invoke `ask_question`: + - Question 1: "ما هو محرك نشر وعرض التوثيق المعتمد؟" + Options: `"(Recommended) mkdocs_material — توليد موقع ثابت سريع مع بحث محلي ودعم ثنائي"`, `"docsify_spa — موقع تفاعلي فوري خفيف دون الحاجة لأي تجميع (Zero-Build)"`, `"static_markdown — ملفات Markdown خام قياسية تحت مجلد /docs"` + - Question 2: "ما هو عمق الاستقراء البرمجي المطلوب من الكود؟" + Options: `"(Recommended) full_5_dimensions — استقراء الأبعاد الخمسة (AST + Git History + Env + Personas + Errors)"`, `"signatures_and_types — مراجع الدوال والأنواع المصدرة فقط"`, `"architecture_and_rationale — المعمارية والحدود وسياق الـ Commits"` +- **Round 3: Hygiene & Safe Defaults (D4 & Escalation Gate)**: + - Invoke `ask_question`: + - Question: "ما هي سياسة حجب البيانات الحساسة والأمان؟" + Options: `"(Recommended) strict_zero_leak — حظر وتطهير آلي صارم لكافة المفاتيح وكلمات المرور وعناوين IP"`, `"public_sdk_redaction — حجب المسارات الداخلية مع اعتماد مسارات محاكاة"`, `"internal_audit_permissive — السماح بعناوين Loopback المحلية وعينات التهيئة"` + - **Escalation Gate (Modal Wizard)**: + - Invoke `ask_question`: + - Question: "اكتملت أبعاد التوثيق المبدئية. هل ترغب في اعتمادها فوراً أم تفعيل نمط المناظرة (Debate Mode) لتحدي القرارات؟" + - Options: `"(Recommended) اعتماد البنية المبدئية والبدء فوراً في التوثيق"`, `"تفعيل نمط المناظرة المعمارية (Debate Mode)"` + +--- + +### [MODE B] 🔥 Relentless Debate & Interview (الاستجواب والمناظرة اللانهائية — Debate Mode) +*Deep architectural interrogation via step-by-step interactive question modals.* + +- **Trigger**: Command `/debate`, explicit user prompt ("مناظرة" / "استجوبني"), or escalation from Round 3 of Mode A. +- **Modal Interrogation Protocol**: + - The agent poses **ONE architectural challenge at a time** strictly via `ask_question`. + - The question title encapsulates the dilemma (e.g. *"معضلة الصيانة اللغوية: هل نعتمد أتمتة صارمة لكافة اللغات أم نحصر التحديث الحي في لغتين أساسيتين؟"*). + - The options provide binary, concrete trade-offs with explicit costs: + - Option 1: `"(Recommended) حصر التحديث الحي المستمر على اللغتين الأساسيتين (AR/EN) واعتماد ملخصات تنفيذية للغات الأخرى"` + - Option 2: `"فرض أتمتة كاملة في الـ CI للغات الثماني بالتوازي مع إيقاف البناء عند أي نقص"` + - Each selection by the user leads to the next focused counter-question via `ask_question` exploring dependency and edge cases. +- **Termination Constraint**: Continues turn-by-turn until the user explicitly selects an option marked `اعتماد القرارات المعمارية وإنهاء المناظرة` or types `"END DEBATE"` / `"اعتماد"`. +- **Debate Artifact**: Emits formal synthesis at `docs/architectural_debate_synthesis.md` capturing all settled decisions, discarded alternatives, and technical rationale. + +--- + +## 💾 Step 2: SSOT Local Persistence & Outbound Push + +1. **Write Local SSOT**: + - Write `.tidyfactor/doc-brief.snapshot.yaml` with resolved keys, mtimes, and hashes. + - Write `.tidyfactor/doc-brief.md` containing human-readable brief summary. +2. **Outbound Push (`--sync-brain`)**: + - If `--sync-brain` flag was provided, invoke `extract_knowledge_item` to persist documentation metadata to sovereign Brain MCP. + - Local files remain the authoritative Single Source of Truth. + +--- + +## 🎯 Step 3: Handoff + +- If `/docs` directory is uninitialized ➔ Hand off to `workflows/init-docs.md`. +- If `/docs` exists and documentation needs generation ➔ Hand off to `workflows/collect.md` followed by `workflows/generate-*.md`. + +--- + +## Validation checklist + +- [ ] Context Delta Resolution computed before asking user any questions +- [ ] No questions asked for facts already discoverable from disk +- [ ] All interactive questions in Mode A and Mode B were presented exclusively via native modal wizard (ask_question), with zero static text surveys in chat +- [ ] Followed selected mode (Mode A terminated at Round 3; Mode B terminated only on "END DEBATE" / "اعتماد") +- [ ] If Mode B was executed, generated `docs/architectural_debate_synthesis.md` +- [ ] Local snapshot persisted to `.tidyfactor/doc-brief.snapshot.yaml` +- [ ] Human-readable brief saved to `.tidyfactor/doc-brief.md` +- [ ] No actual doc pages or API references written during this workflow diff --git a/references/workflows/collect.md b/references/workflows/collect.md index 519c5d1..0f576b2 100644 --- a/references/workflows/collect.md +++ b/references/workflows/collect.md @@ -37,14 +37,14 @@ Run all five collection dimensions from `memory/collection-sources.md` against t 1. Write structured notes to `docs/.collected/.md` under five headings matching the dimensions above. 2. Update `docs/.doc-manifest.json` with `` and timestamp. -3. Save local snapshot `.tidyfactor/doc-brief.snapshot.json` for deterministic drift detection. +3. Save local snapshot `.tidyfactor/doc-brief.snapshot.yaml` for deterministic drift detection. 4. **Anti-Dual-Write Outbound Push (`--sync-brain`)**: - Local markdown files are the sole Single Source of Truth. - When `--sync-brain` is explicitly provided, export extracted architecture facts to Brain MCP via `extract_knowledge_item`. --- -## ## Validation checklist +## Validation checklist - [ ] Context Delta Resolution executed before prompting user. - [ ] `docs/.collected/.md` exists and has content under all five dimension headings. diff --git a/references/workflows/init-docs.md b/references/workflows/init-docs.md index b17fab0..f539280 100644 --- a/references/workflows/init-docs.md +++ b/references/workflows/init-docs.md @@ -1,17 +1,43 @@ # Workflow: init-docs -One outcome: a working `/docs` scaffold plus a doc manifest, ready for `collect` and `generate` to populate. +One outcome: a working `/docs` scaffold plus an aligned doc manifest, ready for `collect` and `generate` to populate. -## Steps +--- + +## 📋 Step 0: Context Delta Resolution (CDL v2.0) + +Before prompting the user for documentation configuration, execute the mechanical resolution formula: + +$$\text{Unknowns} = \text{Required Decisions} - (\text{Discovered Facts} \cup \text{Brain KIs})$$ + +1. **Auto-Sensing on Disk**: + - `doc_engine`: Check for existing `mkdocs.yml` (selects `mkdocs_material`) or `docs/index.html` (selects `docsify_spa`). If neither exists, default to `mkdocs_material`. + - `target_scope`: Check project structure or `docs/.doc-manifest.json` (defaults to `full_codebase`). + - `audience_persona`: Read `brand.yaml` (or fallback `brand.json`) for `audience` / persona. If absent, default to `bilingual_developer`. + - For file sources marked with `track_staleness: true`, compare file hash/mtime against `.tidyfactor/doc-brief.snapshot.yaml`. +2. **Fail-Open Brain MCP Acceleration**: + - Query `search_knowledge_base(query="documentation stack audience", scope="project")`. + - If Brain MCP is offline or returns empty, fail open silently (0ms latency penalty). +3. **Structured Interactive Disclosure (DM-DA Mode A)**: + - Present any genuine $\text{Unknowns}$ in a crisp, non-robotic prompt with clear A/B/C/D choices and recommended defaults. + - Zero robotic preambles or lectures. +4. **Local Snapshot Persistence (Anti-Dual-Write)**: + - Persist confirmed parameters to `.tidyfactor/doc-brief.snapshot.yaml`. + +--- + +## 🛠️ Execution Steps 1. **Detect the stack(s) present** in the project root — PHP (`composer.json`), JS/TS (`package.json`, `tsconfig.json`), and any of React/Vue/Next (framework deps or config files). Note more than one if the project is mixed (e.g., a PHP API with a React front end). 2. **Create the folder tree** exactly per `memory/doc-tree.md` — no extra top-level folders, no missing ones. Do not create a folder for a doc type the project doesn't have yet (e.g., skip `docs/api/` for a project with no API surface) — see the "No Empty Structures" note in `doc-tree.md`. -3. **Write `docs/.doc-manifest.json`** using the schema in `memory/doc-tree.md`, pre-filled with: detected stack(s), project name (from `composer.json`/`package.json`), and empty `collected` / `generated` tracking sections. +3. **Write `docs/.doc-manifest.json`** using the schema in `memory/doc-tree.md`, pre-filled with: detected stack(s), project name (from `composer.json`/`package.json`), confirmed engine/audience from Step 0, and empty `collected` / `generated` tracking sections. 4. **Write a placeholder `docs/README.md` index** (one paragraph: what this `/docs` folder contains, and a note that it's generated/maintained by TidyFactor Doc) — this is the doc-site landing page, distinct from the project-root `README.md`. 5. **Report** what was created and what stack(s) were detected, and suggest `collect` as the next step. ## Validation checklist +- [ ] Evaluated Context Delta Resolution formula before prompting user +- [ ] Local decision snapshot persisted to `.tidyfactor/doc-brief.snapshot.yaml` - [ ] `/docs` exists with only the subfolders `doc-tree.md` calls for given the detected stack(s) — nothing extra, nothing missing - [ ] `docs/.doc-manifest.json` exists, is valid JSON, and matches the schema in `memory/doc-tree.md` - [ ] `docs/README.md` (doc-site index) exists and is distinct in content from any project-root `README.md` diff --git a/references/workflows/vitepress.md b/references/workflows/vitepress.md new file mode 100644 index 0000000..cb01f45 --- /dev/null +++ b/references/workflows/vitepress.md @@ -0,0 +1,57 @@ +# Workflow: vitepress + +One outcome: A fully compiled, statically hosted VitePress documentation portal with custom luxury typography, surgical RTL flex order, and multi-language routing configured per `memory/vitepress-config.md`. + +--- + +## Steps + +1. **Verify Environment & Dependencies:** + - Run `node --version` (require >= 18). + - Install VitePress: `npm install -D vitepress` (or verify package.json has `"vitepress": "^1.6.0"`). + - Inject doc scripts into root `package.json`: + ```json + "scripts": { + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" + } + ``` + +2. **Scaffold Directory Tree & Assets:** + - Ensure documentation markdown lives in `docs/`. + - Create `docs/.vitepress/config.mjs` using the master schema in `memory/vitepress-config.md`. + - Create `docs/.vitepress/theme/index.mjs` registering `custom.css`. + - Copy brand logo to `docs/public/logo.png`. + +3. **Configure Multi-Language Subdirectory Routing:** + - Enforce dedicated subdirectories for every supported locale to eliminate 404s: + - Arabic (Native Root): `docs/index.md` + - English: `docs/en/index.md` + - Additional growth locales: `docs/es/`, `docs/de/`, `docs/fr/`, `docs/pt/`, `docs/zh/`, `docs/fa/`. + +4. **Inject Luxury CSS & RTL Precision:** + - Write `docs/.vitepress/theme/custom.css` embedding Alexandria, Cairo, and JetBrains Mono fonts. + - Configure surgical RTL navbar flex order: + - Title/Logo (`order: 1`), Menu (`order: 2` with `margin-inline-end: auto`), Search (`order: 3`), Translations (`order: 4`), Appearance (`order: 5`), Social (`order: 6`). + - Align Hero reading hierarchy: Text on the right (`order: 1`), Logo on the left (`order: 2`). + - Protect Hero Action Buttons (CTAs): single-row layout (`flex-wrap: nowrap !important; white-space: nowrap !important`). + - Fix 3-Column Feature Cards: explicitly size `.VPFeatures .item` (`width: 33.333333% !important`) and apply `direction: rtl !important; unicode-bidi: plaintext !important` to prevent text or parentheses inversion. + +5. **Build & Validate:** + - Run `npm run docs:build` (must complete with **zero errors and zero broken links**). + +6. **Report Deployment Instructions:** + - Local dev server: `npm run docs:dev` (runs at `http://localhost:5173`). + - Production bundle: deploy the compiled output directory `docs/.vitepress/dist/`. + +--- + +## Validation Checklist + +- [ ] `docs/.vitepress/config.mjs` exists with valid ESM syntax and full locales configuration +- [ ] `docs/.vitepress/theme/custom.css` exists with Alexandria/Cairo fonts, single-row Hero CTAs, and 3-column card widths +- [ ] Hero layout in RTL displays text/CTAs on the right and logo on the left +- [ ] Every active locale index (`docs/index.md`, `docs/en/index.md`, etc.) exists on disk +- [ ] `npm run docs:build` compiles cleanly with **0 errors and 0 dead links** +- [ ] Clean relative links only — no machine workstation paths (`file:///C:/...`) or hardcoded secrets diff --git a/tools/build-skill.js b/tools/build-skill.js index 4ab0da9..37d7121 100644 --- a/tools/build-skill.js +++ b/tools/build-skill.js @@ -28,6 +28,7 @@ const ROOT_COPIES = [ "tools", "bin", "brand.json", + "brand.yaml", ".tidyfactor", "package.json", "AGENTS.md", From 303eb1c132f6b6d740e2b18879c31328539964aa Mon Sep 17 00:00:00 2001 From: alwkala Date: Wed, 9 Sep 2026 05:48:50 +0300 Subject: [PATCH 2/4] =?UTF-8?q?feat(doc):=20release=20v1.8.0=20=E2=80=94?= =?UTF-8?q?=20add=20audit=20command,=20Keep=20a=20Changelog=20workflow,=20?= =?UTF-8?q?relative=20link=20checker=20&=20asset=20deduplication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tidyfactor | 4 +- CHANGELOG.md | 23 +++++++ README.ar.md | 17 ++++- README.md | 11 +++- SKILL.md | 9 +-- assets/og-default.png | Bin 242460 -> 0 bytes brand.json | 2 +- brand.yaml | 2 +- manifest.json | 13 ++-- package.json | 4 +- references/commands/audit.md | 15 +++++ references/commands/generate.md | 13 ++-- references/memory/changelog-rules.md | 58 +++++++++++++++++ references/memory/doc-templates.md | 30 ++++++++- references/workflows/audit.md | 42 +++++++++++++ references/workflows/generate-changelog.md | 52 +++++++++++++++ scripts/audit_docs.py | 70 ++++++++++++++++++--- 17 files changed, 332 insertions(+), 33 deletions(-) delete mode 100644 assets/og-default.png create mode 100644 references/commands/audit.md create mode 100644 references/memory/changelog-rules.md create mode 100644 references/workflows/audit.md create mode 100644 references/workflows/generate-changelog.md diff --git a/.tidyfactor b/.tidyfactor index b41d430..2a1e15c 100644 --- a/.tidyfactor +++ b/.tidyfactor @@ -1,8 +1,8 @@ { "name": "tidyfactor-doc", - "version": "1.7.0", + "version": "1.8.0", "category": "development", - "description": "TidyFactor Doc — Code Documentation Builder & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", + "description": "TidyFactor Doc — Code Documentation Builder, Changelog Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", "repository": "https://github.com/TidyFactor/Doc", "npm": "@alwkala/tidyfactor-doc", "compatibility": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index 14513f7..83c1365 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,29 @@ All notable changes to `tidyfactor-doc` will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). +## [1.8.0] - 2026-09-09 + +### 🚀 Added — Documentation Hygiene Auditor, Keep a Changelog Architecture & Asset Optimization +- **Documentation Quality & Link Auditor (`references/commands/audit.md`, `references/workflows/audit.md`)**: + - Added dedicated `audit` command and workflow for sub-second deterministic doc scanning. + - Added relative markdown link integrity verification in `scripts/audit_docs.py` (`check_relative_links`) to detect broken local file links before release. + - Added Keep a Changelog structural validator (`check_changelog_format`) verifying SemVer release headers and standard change categories. +- **Changelog Workflow & SSOT Architecture (`references/workflows/generate-changelog.md`)**: + - Codified automated `generate-changelog` workflow strictly adhering to Keep a Changelog v1.1.0 and SemVer 2.0.0. + - Conventional Commits parser mapping git commits to standard sections (`Added`, `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security`). + - Integrated changelog generation routing into `references/commands/generate.md`. +- **Operational Memory & Governance Templates (`references/memory/changelog-rules.md`, `references/memory/doc-templates.md`)**: + - Added `references/memory/changelog-rules.md` establishing release standards, SemVer bump formulas, and conventional commit mappings. + - Added standard `CHANGELOG.md` template to `references/memory/doc-templates.md`. + - Refreshed all memory verification timestamps (``). +- **Asset Deduplication & Hygiene (`assets/`)**: + - Removed duplicate 242KB asset (`assets/og-default.png`), saving 50% of the asset footprint without breaking references. +- **Unified Tooling & Decision Manifest (`manifest.json`)**: + - Expanded `audit_docs` tool contract with link integrity and changelog validation scopes. + - Registered `audit` and `vitepress` commands in tool invocation mappings and decision gate options. + +--- + ## [1.7.0] - 2026-09-09 ### 🚀 Added — Triple-Engine Publishing Platform (VitePress Integration) & Luxury RTL Design System diff --git a/README.ar.md b/README.ar.md index c0610a0..f57ef69 100644 --- a/README.ar.md +++ b/README.ar.md @@ -64,7 +64,7 @@ graph LR --- -## 🏛️ سجل الأوامر ومسارات التوثيق الأربعة +## 🏛️ سجل الأوامر ومسارات التوثيق الشاملة | نية المطور وطلب المستخدم | الأمر | مسارات العمل والذاكرة المحملة | المخرجات الناتجة | |---|---|---|---| @@ -72,6 +72,21 @@ graph LR | **"تجهيز وهيكلة مجلد التوثيق"** / "scaffold /docs" | `init` | `workflows/init-docs.md`
`memory/doc-tree.md` | مجلد `/docs`، ملف `docs/.doc-manifest.json`، وصفحة `docs/README.md` | | **"استقراء وفحص الكود والمشروع"** / "gather facts" | `collect` | `workflows/collect.md`
`memory/collection-sources.md` | تقرير `docs/.collected/.md` (تحليل منظم بالأبعاد الخمسة) | | **"كتابة مرجع واجهة برمجة (API)"** / "API reference" | `generate` | `workflows/generate-api.md`
`memory/doc-templates.md`
`memory/stacks/*.md` | ملف `docs/api/.md` (جداول المعاملات، القيم المرجعة، الأخطاء) | +| **"توليد أو تحديث سجل التغييرات"** / "generate changelog" | `generate` | `workflows/generate-changelog.md`
`memory/doc-templates.md`
`memory/changelog-rules.md` | ملف `CHANGELOG.md` في جذر المشروع (معيار Keep a Changelog و SemVer) | +| **"كتابة دليل إعداد وتشغيل"** / "setup guide" | `generate` | `workflows/generate-guide.md`
`memory/doc-templates.md` | ملف `docs/guides/.md` (دليل متخصص محدد الغرض) | +| **"توليد أو تحديث README الرئيسي"** / "generate readme" | `generate` | `workflows/generate-readme.md`
`memory/doc-templates.md` | ملف `README.md` في جذر المشروع (نظرة عامة، التثبيت، المتغيرات) | +| **"إضافة تعليقات برمجية للكود"** / "inline docblocks" | `generate` | `workflows/generate-inline.md`
`memory/stacks/*.md` | تعديل مباشر للملفات المصدرية بتعليقات PHPDoc / JSDoc / TSDoc | +| **"نشر بوابة توثيق متكاملة"** / "محدد تفاعلي" | `site` | `memory/site-engines.md` | اختيار تفاعلي بين (`vitepress` أو `mkdocs` أو `docsify`) | +| **"إعداد بوابة VitePress الحديثة"** / "VitePress SSG" | `vitepress` | `workflows/vitepress.md`
`memory/vitepress-config.md` | ملفات `docs/.vitepress/config.mjs` وتنسيقات الـ RTL الفاخرة | +| **"إعداد بوابة MkDocs Material"** / "Python SSG" | `mkdocs` | `workflows/mkdocs.md`
`memory/mkdocs-config.md` | ملف `mkdocs.yml` و `docs/stylesheets/extra.css` | +| **"تحويل التوثيقات إلى موقع Docsify"** / "deploy portal" | `docsify` | `workflows/docsify.md`
`memory/docsify-config.md` | ملفات `docs/index.html` و`docs/_sidebar.md` (موقع تفاعلي فوري) | +| **"تدقيق جودة الوثائق والروابط"** / "audit docs" | `audit` | `workflows/audit.md`
`scripts/audit_docs.py` | تقرير تدقيق AST آلي (فحص الروابط والبيانات الحساسة وسجل التغييرات) | + +---|---|---|---| +| **"تأصيل سياق التوثيق، الاستجواب أو المناظرة المعمارية"** / "brief" / "debate" | `brief` | `workflows/brief.md`
`memory/decision-points.md` | وثيقة `.tidyfactor/doc-brief.snapshot.yaml` و `docs/architectural_debate_synthesis.md` | +| **"تجهيز وهيكلة مجلد التوثيق"** / "scaffold /docs" | `init` | `workflows/init-docs.md`
`memory/doc-tree.md` | مجلد `/docs`، ملف `docs/.doc-manifest.json`، وصفحة `docs/README.md` | +| **"استقراء وفحص الكود والمشروع"** / "gather facts" | `collect` | `workflows/collect.md`
`memory/collection-sources.md` | تقرير `docs/.collected/.md` (تحليل منظم بالأبعاد الخمسة) | +| **"كتابة مرجع واجهة برمجة (API)"** / "API reference" | `generate` | `workflows/generate-api.md`
`memory/doc-templates.md`
`memory/stacks/*.md` | ملف `docs/api/.md` (جداول المعاملات، القيم المرجعة، الأخطاء) | | **"كتابة دليل إعداد وتشغيل"** / "setup guide" | `generate` | `workflows/generate-guide.md`
`memory/doc-templates.md` | ملف `docs/guides/.md` (دليل متخصص محدد الغرض) | | **"توليد أو تحديث README الرئيسي"** / "generate readme" | `generate` | `workflows/generate-readme.md`
`memory/doc-templates.md` | ملف `README.md` في جذر المشروع (نظرة عامة، التثبيت، المتغيرات) | | **"إضافة تعليقات برمجية للكود"** / "inline docblocks" | `generate` | `workflows/generate-inline.md`
`memory/stacks/*.md` | تعديل مباشر للملفات المصدرية بتعليقات PHPDoc / JSDoc / TSDoc | diff --git a/README.md b/README.md index 295fdb8..0b53cc0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
-# 📚 TidyFactor Doc `v1.6.0` -### Automated Codebase Interview, API Generator & Dual-Engine Publishing Platform (MkDocs Material & Docsify) +# 📚 TidyFactor Doc `v1.8.0` +### Codebase Interview, API Generator, Changelog Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) **Building accurate, maintainable, secure, and browsable documentation for the era of Human-Agent Collaboration.** @@ -73,10 +73,15 @@ graph LR | **"Set up docs for this project"** / "scaffold /docs" | `init` | `workflows/init-docs.md`
`memory/doc-tree.md` | `/docs` scaffold, `docs/.doc-manifest.json`, `docs/README.md` | | **"Document this codebase"** / "gather facts for module X" | `collect` | `workflows/collect.md`
`memory/collection-sources.md` | `docs/.collected/.md` (5-dimensional structured analysis) | | **"Write API reference"** / "generate docs for endpoints" | `generate` | `workflows/generate-api.md`
`memory/doc-templates.md`
`memory/stacks/*.md` | `docs/api/.md` (parameter tables, returns, errors, examples) | +| **"Generate CHANGELOG"** / "update release history" | `generate` | `workflows/generate-changelog.md`
`memory/doc-templates.md`
`memory/changelog-rules.md` | Root `CHANGELOG.md` (Keep a Changelog v1.1.0, SemVer 2.0.0) | | **"Write setup guide"** / "create architecture runbook" | `generate` | `workflows/generate-guide.md`
`memory/doc-templates.md` | `docs/guides/.md` (focused, single-purpose guide) | | **"Generate project README"** / "update root README" | `generate` | `workflows/generate-readme.md`
`memory/doc-templates.md` | Root `README.md` (overview, install, env vars, quick start) | | **"Add inline docblocks"** / "document public functions" | `generate` | `workflows/generate-inline.md`
`memory/stacks/*.md` | Direct source code edit with PHPDoc / JSDoc / TSDoc comments | -| **"Turn /docs into Docsify site"** / "deploy doc portal" | `docsify` | `workflows/docsify.md`
`memory/docsify-config.md` | `docs/index.html` + `docs/_sidebar.md` (instant web portal) | +| **"Publish documentation portal"** / "interactive selector" | `site` | `memory/site-engines.md` | Interactive selection (`vitepress`, `mkdocs`, `docsify`) | +| **"Set up VitePress doc portal"** / "build Vue SSG" | `vitepress` | `workflows/vitepress.md`
`memory/vitepress-config.md` | `docs/.vitepress/config.mjs`, luxury RTL CSS | +| **"Set up MkDocs Material"** / "compile static portal" | `mkdocs` | `workflows/mkdocs.md`
`memory/mkdocs-config.md` | `mkdocs.yml`, `docs/stylesheets/extra.css` | +| **"Turn /docs into Docsify site"** / "deploy zero-build SPA" | `docsify` | `workflows/docsify.md`
`memory/docsify-config.md` | `docs/index.html` + `docs/_sidebar.md` (instant web portal) | +| **"Audit doc quality / verify links & credentials"** / "audit" | `audit` | `workflows/audit.md`
`scripts/audit_docs.py` | AST quality report (link integrity, credential check, 100/100 score) | --- diff --git a/SKILL.md b/SKILL.md index 48a73be..27c90d2 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: tidyfactor-doc -description: "Code documentation builder and triple-engine publishing platform (VitePress, MkDocs Material, and Docsify). Generates comprehensive API references, READMEs, inline docblocks, and technical guides under /docs. Trigger on commands 'brief', 'init', 'collect', 'generate', 'site', 'vitepress', 'mkdocs', 'docsify', or requests like 'document this codebase', 'generate API docs', 'set up VitePress', or 'set up MkDocs'." +description: "Code documentation builder and triple-engine publishing platform (VitePress, MkDocs Material, and Docsify). Generates API references, READMEs, changelogs, inline docblocks, and guides. Trigger on commands 'brief', 'init', 'collect', 'generate', 'site', 'vitepress', 'mkdocs', 'docsify', 'audit', or requests like 'document this codebase', 'create changelog', 'audit docs', or 'set up VitePress'." --- # TidyFactor Doc @@ -13,11 +13,12 @@ A command dispatcher. This file does not do the work itself — it routes to the | "Establish documentation context / interview / debate codebase architecture" / "brief" / "debate" | `references/commands/brief.md` | `workflows/brief.md` + `memory/decision-points.md` | | "Set up docs for this project" / "scaffold /docs" | `references/commands/init.md` | `workflows/init-docs.md` + `memory/doc-tree.md` | | "Document this codebase" / "gather what's needed to document X" | `references/commands/collect.md` | `workflows/collect.md` + `memory/collection-sources.md` | -| "Write API docs" / "generate a README" / "add inline comments" / "write a guide" | `references/commands/generate.md` | `workflows/generate-api.md` (or `generate-readme.md` / `generate-inline.md` / `generate-guide.md`) + `memory/doc-templates.md` + matching `memory/stacks/*.md` | +| "Write API docs" / "generate a README" / "create CHANGELOG" / "add inline comments" / "write a guide" | `references/commands/generate.md` | `workflows/generate-api.md` (or `generate-readme.md` / `generate-changelog.md` / `generate-inline.md` / `generate-guide.md`) + `memory/doc-templates.md` + `memory/changelog-rules.md` + matching `memory/stacks/*.md` | | "Publish documentation portal" / "turn /docs into a doc site" (Interactive) | `references/commands/site.md` | `memory/site-engines.md` + interactive selection (`workflows/vitepress.md`, `workflows/mkdocs.md`, or `workflows/docsify.md`) | | "Set up VitePress" / "build modern Vue-powered doc portal" | `references/commands/vitepress.md` | `workflows/vitepress.md` + `memory/vitepress-config.md` | | "Set up MkDocs Material" / "compile static documentation" | `references/commands/mkdocs.md` | `workflows/mkdocs.md` + `memory/mkdocs-config.md` | | "Set up Docsify" / "build lightweight zero-build doc SPA" | `references/commands/docsify.md` | `workflows/docsify.md` + `memory/docsify-config.md` | +| "Audit docs quality / scan credential leaks / verify links & changelog" / "audit" | `references/commands/audit.md` | `workflows/audit.md` + `scripts/audit_docs.py` | Read only the command file that matches the request. Do not read all commands simultaneously. @@ -42,7 +43,7 @@ Read only the command file that matches the request. Do not read all commands si ## Tooling Scope (Rule 10) - **Execution Tools**: - - `audit_docs` (`scripts/audit_docs.py`): Sub-second AST & credential leak scanner for markdown docs under `/docs`. + - `audit_docs` (`scripts/audit_docs.py`): Sub-second AST scanner for documentation under `/docs`, root `README.md`, and `CHANGELOG.md`. Audits credential leaks, machine-specific paths, broken relative links, and Keep a Changelog formatting. - **Contract & Schema**: Portably declared in `manifest.json` with `"skill_root_anchor": "self"`. - **Invocability**: Executable via direct CLI or through `tidyfactor-brain` MCP `run_skill_tool`. @@ -53,4 +54,4 @@ Read only the command file that matches the request. Do not read all commands si ## Sequencing -`brief` (optional, architectural alignment & debate) → `init` → `collect` → `generate` (repeatable, once per doc target) → `site` / `vitepress` / `mkdocs` / `docsify` (optional, once /docs has real content). +`brief` (optional, architectural alignment & debate) → `init` → `collect` → `generate` (repeatable, once per doc target) → `site` / `vitepress` / `mkdocs` / `docsify` → `audit` (quality & link verification before release). diff --git a/assets/og-default.png b/assets/og-default.png deleted file mode 100644 index 1f4a8435c8f502898be27f385b7d17b7ad7a321e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242460 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

TcOW5W#=HLm6$BXB2WG5?hp8IkF*RYC9 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

Av}xTTIO6<%GTP$79y9k=^N z+0oJPG=5uU+U@;pJ2k$L-`yX<3KkwIIA3S^nNn!RlW>x)!XbT-2L+SP3+He&@aUmZ zA^)M3fhy1{91L0Fl{w_e=5O55Ce3BZfd!}d6Ng|j3q>sl7Ju~>gdZ-1RenEsucV|H zr7z8ar46hdR#u7hwJ(P;#tpSf5u=uL%qpa+S-Q8knLcoICuDZQ`uc{3T=u{G_y5U*mAb_rWMW;m$C z<-(TsLN!;7*0xTT`q?X6-@ zKoX`{#;K~RxwVxZIiAmu$Y$3_a>*1dYHl4IY)*?;j78eGwCKP5>;D&C{p-K}%YXf= zkQIfA{yNX80&=~1_t_I$pL+GvH~%*AU!|^8s6b^wJjK5&mel(gs=e^H#AOLtzcZCZ zl*22Ea*$!@|J;QYDJ-;=CAAC|%rq!{CSVzI&{5_ohgEM1S5jBv$*IxVI|DXTszx?-q`7b!IVr1D{)8sg)tc`FCCB=I$Ev;X*X=4=lrrC)Q zSeCC}9vhZIMax&dM{UchxvE{n1lHQ4nuVMPJWCNtj0qHRHiXxvgCsv+)iq8AjId`H zmT&_XWQ9uamsoIll~)N*F&(0e!u)Wp!b8pzM@hI-beJc!yZR-=18^&$Q&);|tbDx3 z5#fjZ$bIj}LzZ#J?7u)Dw)tB$hgXr4DyG+hA~FqqO4W}@LEN&dQbo^S6Ss%D_5;*t#V!&t`-uj^;d(<0810s zyR?#kV2ewZ_6`pA646DSqeEeR=7WFzfBbL%`mg`}zyIsM{L8=mumA7&-~ab{_5Wk< zZGfw|u6$pi?~f;1_ieAc7xyBQZ0~8W9V~6oT0&x+gB9Ct|&kO=Hyrv^{KP-&(1x2MMw8pFpI!S1{^{$ z1g?H1YH`NSY?!mwfLK5l%~=Q!rr-R`+rj(}YK56O8YPr~^{t=3^RsV7rgqw{d|;5e zpyA5>u2%Q;V@U?RTY|8n@RYUSz`A|m@^$OhBP`y&zNJ3gC)_czU-IXT zzyD#xtGXMPMK9il6iZ^k*3MNKi7S0WMVD1Vc0Xu3h8@zu0Yq7g-O>D^j6=pEPx2ZL z6r+uASxsHpH#|Vg-Z}w@12=Mck>~`>P%blADGo73GSl%9R46kQMZ<-znoE|W#^$|Wq*3hhBnQ3~Exb`ZLQXVH39RoM&)tGSj-GEm;Kz^+El z;TJ24ve&8S1!af!7%GIA{|2XbEa8NV$?G=voY=fz(e~58)nayD_+1iNcP8a4LMaLu zC0xC_@6_tESNw9<{8eLUrCO^ok+1*%TuovvG$)7KIcO*`t4m@Q=!1#TzsAeyDPtL~ zC}6z{V7bRAA{50G0itebiAhdfX*+ z5cgrKa;EyBYuX(^H*Du=6q#J5SeHbs?Nk zV_DcHg6buXW5_7cK7_aC#dsQ>j1fa$q5!YnQ&C>!te!Qcw5TC3p>njOt3kU?71tTi zNG4noM=rP}Qa&NKwuz+Nl!3 z5334G8Zh==T#RwUT)AbFSnOsZSG0o$Xk8CzqB*9d3>L5A%3SJ|W$jop>)44sJty|> zr$XqwT8}=AC53~IQ?3{iS#Q4kznhp9NmyJA3&{HUci;V%>J|vFadFXG6L=cI??_jaY=%;zf&(wUO=S)UKFb22$VNURBnN)voB~7H+Wy2rEkp zvx_TJd3w}PVZRJ4^Cyq{bR^WUCkFf&oY=<=P3pip^fd3vGSI7#_jRUQ)cQE`taJNm zLM{Q9QIrTliZ_D;9_df6r63%Sg5aX-@$+~UtL*h$Ai_=wUeYPTBP26R1ArFspl}r5UP%j1~4I7z|i4 zTyaasEEBt6dq)BX4AChP%Ae>&b8jM4RTUL9V9p?B5t2=XW$g_Gn$Kpuik|-h7t;_i zr4V*ytlrcbq_N79{E~a#8tyrPKwv?_f~2vYygIgI$=tp^z~|0~DQCqLvV)H5U!KM2 z;oP&oJoWIYjw|T11us%aWgV*suMk$RhB52^SiYQ|SOZv*1an#mSY%WbOb3)Y7^N|C z``m@cmOLw7nNCRga{EJznqW*fXaQWjceGtCyW_??+Bu^<+&iS>0AEZ|b}O75Fn=AW z!q9(XCm)IYUB-%JEQa{P?FBZ3(zgFpz8Ergj8*l#U{LxP1Hq%jkPxkIo7 zY*T8-8;kO+npLtyYs%x=>9mZY6*cR{wc{qF+sSxjA#Nn9h74yRlIV?KXW$N5+*+C% z06s!PR)Cf&vdDl%y2Q9~)(~nAJ5Tx8J4sR~9V}Rk2~(OE1ewYww73#aBSy^ z{p3|b!XmGpJ@)L9V{`931+@^rpjKdz?fcGlO#kKCzJ&nRYPh|h8o1($>8s!u|M0H) zFusSf5W+NN=l_6LmXJj^2aFl6xtfkyQ{4OxG3)tv-skG?Hb^J|>${vZ$dDASBIzo& zwL|gjn`^X^j5SslB;W8WH86u&kgldIS@J9-tYi4RA{HbpNSXT|Um}SV8{Q`K6zwgX z_Ct(O;Ek%5YQmMA-t*H9tv_tg!MLcpTB_@N;Hixmi;AT*6v0eNGA2Vu!|zfe;G6cRZw zD5p_SiK|)I{2cm}%AqvCiX-EcvOukbKs7ds#lzcci|K-8)B)5A$}nFCIwFG1D%dB1 zW##AyU)7_cR-YP>Ziw=9HWjgGfB!!p{;zZCnFVu}S+cICUg*dIloTy|PuUxz zUs4HuN@QV_M*%a6Bhi!D_fS(k8q)&9A&)~1%hfqRChPn*lOpe7UPgovG)TOOd@M7~E&I#OAOhZhpVyk=ApMG%*$6wvAlIM9m=31kiG|qKL82~J!6pC4t@)k1qU#}8~MMLBaIk(t7G9Z`%W4 zQNA*t2C0M)IM9s|C}-Vw=RhBYCKIwSM@Phh+yzJXe}PH}ECE=%s{2;o`OE47IGWRz zWqfo0csgkH_YbW86_5pBfmjr>C}ts0C!~Ff!qoF`zJu`dSANI?1&UW5WV)iMU27j3 zu5f9PuDB9A1HBm#5?l&$6_JIdNaL^&%Af^&LfWuocBe+jaAF-64wEd!A&;E;<}xhG zmXF5*Mku6OgIL0oeL1#}yHacsKX%VcI;f*MLcF8meuy)?FF;R3Cm#9z@`!c5jIBte zUQSA&McZ;0m5XCa(rKdXxK>6LH5IjB5pNm?i0SGgA_{fr+0xNez&C2g)jLpdFyBq~dIVkIy{bu%_mZj>5|jV-L>V7fvfwMKAJo>KEJZUI-I zlmc)iWJS&m`FTn)HBok36R;FTe;6xkp#v3^K>m`CJ29k%N9pZO=?Uw&Yh4B@d~zB^ z{{pp$tKxRNTs<8RC_1o~>>1ulUgR$|1$}T2KPA3UcT@?(h3qJWJr9%OkQo?zIl5~ zTN{Neny)Zza9J5>1s4zwTC^{_2h`Gn4a5~DkIUj{(k{Lo3dom%6}lsPJ>u99RLNi^ z#I67=`H@-$tHZ4!L&w4bHtO5z&>mw-l;COf2LUX|P-GTGD3l06$4ZhS2o$k^pha^CiN${5 z0jptQaXv5$FRcf%2rLG?5gI8~Rd{_1)^3+rWwMo^M9WoiWy7)?TkBAc9`RBpfwH>V zx`tzWhKGBo67Gi|7DovKu_$E)L2Dh{2HY^U@nKDbc51EOh(W<0OC{`kcy-^zfz_-2 zW$wUPOfxjD(f9?8Qh~D!e=MaC%(|V-x?NHhd>o!9vNRBAq86nqN?lGe2x2s}CvXK* zJ181v;h22o4x=%cqzh8G%FqdCFMmt8l7MBzqI?C>67rQvSey4ZHUd}(1%+wcQ@(l# zM55bOLo@DUEp8yc5!`hj4v`}-?kiog^7E1%^OB5PZ^PC)s1EH$1YwFtNQP;h`zR0n znT6SPLx_mQeve?C+TxzT8lFqzm4a2b@_rqxs;Fs)td%@bXdyHmE3(-uW4K#I(g@!dg1`Khp| zxS_eBScVg+hAw2G^FSqp4kO3-+B!GBn~-J1V%KZHBJT`>l{Q$WytZ!MlARldKY-oc zmBI{SQ8g5^pc*c`voBh*VYLZcf)Z$S=h#YR{wtq4izA?ouyS01 zS$D$Ap&!fY$t?@ZdjeYbnPTW*l4>YW30{^;y%F+}a3w{MUhQ1{c=d9*F^E$GIeT>XrlmyQdxSKEMd2+rd1|3Zg}&frqrZy^hEg1zeZa0zn87R`B2_ zl%Y#W%(gN-6ml$r49jC9o`-WG&NH&4&a5m}Oy{T5l#qxK9AG1$*amTkOE9ix1isZG z3K;pu+rvBwJH^qY1;|Z!gL0K^jCVr1D`6bprqHQumNRicufbv5dQA%?+~i z#?}+{5$h*(9d#aIQ53VdQ>meJg)YXW9Hbetj0NV^)=izWbHj!WfBYkmMJpC$3`drH z8))2##H`zaESj*W>X`t=1M=t;h6h*u67zJR67Kq!h5c7t(LH?^=0?Y?BCa59!NHTr zqFzT|QfhP53u(-vFR2F#RzbMpxFB!^KL)N=HFxfRl_LYz=Yukc+C&y6<8Uwg6`7SJ zmRZ~-VTo9`&z-&GB?9YN{?bGjoUr(@`SA&?J)7H_>fjJsLRB!I=0b_BykiI@CDZO` z&cRZ){N5z#;w#XTfW*qp$tt_#-&Ic{A*iP(f#sSZ^T3sg-qcJF9_j532{ThEtZ0Q~ z=A@!>h%zwC!pxa0r8t+sLct1qUg)$q30v^8QI+Je&Y+X1e%x|YNT*_^0+xNpX#~ay zSiN|cGtR<-T!|~HiHOySQjn+oP=;+;P>xD-V>Q(xYviyDoHv9l!YtL>i+8TVdV<## zVq?LhmSL$io`oHA8}a^Z4|d3HW`dW)i(3<+Q-_{q=}k>lRh^vxoG8UdHPu2=i_dpy z9$e6p#EOB1D0LB7-1X}u!jhy|Y1}45qmS|R&v@mR>4z-_<<{64t-W?dR+5=bugD3bZ1y2)Z9b zF*OJ@9EjzG#Qf$o0qi`N^*A7{o_3=h97AzUi-LgT3v!y1QzZs zzM7(<=GIDo%3rcO5-AcgT->4tDA9wGRu(kDim7vMV3;!pzYID`Y;L;gro>UA05TX7 znNjq*Irq1PRnp^AMA>5^W17+7xXp%o@kL%YFP#N)Q20qzr0x#|v`;p1(RC&><63s= zXd7o(?7Hi&yJ6nUEbtKL!wJjhm>c3;tmw_aJzi=zcj2H8J;ioAP=pzS+Tx*aRd_U) zKdOQ3xronIF_u9Nf(m$^AE=blcg$VBrX@#j`O!-aoK}2_bM-69T71=43@jbs(A1Ft zBP`R@P|Nq@AfPZz@eL9XN^BZ5dK_XB7T`wOA_nHbpF*RLUYkx)l^UohgMWS9AH1D zdB2FL6_3oDH+9~;8|IYqML+O(?=4^RFrL_YPx%^Z7;C6tAcl^FJvR*OSC)#{?MPHd zVR;tvfD$3FnKk%PozS~NYit79b{Zd-Uo(5*#s}MAilT|C5=tS|L9U#P_eYsB$Va-? za8QJC00{xWGFp*E6uFoW-7_bLLK&R2lAfaKe;nt63AwIm@{&Cgu{Lbjx$}cR4xczp zm53phvz%Fyve3^lWhdZjBV;Ck2sBzfFsXm}+*7n+K_%q0owL;gaCfNgJ|&(JR~sMR zcqeKg%2|f}50mU1GSr}7y1=5S4k#NO=fEAQM@Tza%#|ud?axC1`aPzglc$o&G zYs!6d-*Q?7SViif^I0FeXXo&VMf*l=RM#Me*RTHR)tEDa2mMc{a1j(+you>}&Lc&uIdQFlki|m!VI^BQMTgeoxJ6-P zAye%k%5zwT*X22XO2DZxR9G{2GJpeMfmLSQ!mv|iS*6Kcfm60ew*i~H6NOG=dt~M3 zLp5yuAq+7Tr=o5Zir2QcHo$}hm2eMLLWG@5ckUei03(L)5*0 zr!X`KDT_LukVRjIr@H%3(S|j$3N|dfVdv}>0|V8o@VXsHSf>D~JLTsfUda$IDGS6R zjWEyV6+R9qXL&HUDL_f$E^);`Khe38xLh=IWTA2#B8@NzS==v=9IwbL8LyJoD=>@F z<%yj;_rR97VEYeSt6;ps&9aG@4lF$n@JP_mU~Yb@9SdGCOE(q!hU=G2tHgI_rsYc( zSHa>95i9VDHg?_*LQBz{)Xnz;B@FXEoG4bn3&q70^UiI3oheaozoDr@Co8}IW}brb z3^s9f0|Hwm&5}XKAv@-Vms3JieDb{S(_99#Rof@#F^gx4uEATDEEP9o#q9E<>j`xt zEZQloR(v{;`1^eGB3^W#UcMZb-K*p7!XpIiEVc&B2`Pw0he`_q6$^(NG9!CkcEh+M zdZ(l*IZ>NYlI-d!3!g6%uS_4*TxD9dfUkIXFmS7+8H-^B0&yQ6_9X;XVe9ojY%j@` z_dBdr>T^-yDy=Sq#YkbpG6`!Zfkn-5m|a$0SxG4?W)|!|^naHz%aOGavd_b3yMK8_ z_o>wbSaN1MfmJZx*3NnUmBB@8vRG zP@)x31?v?Tyn-?axJ0 z3KoPbxj7V;VR1bPTSOM^?eb@E0jsJ6Ys(~o74ZuGj=7!r?KHvQ)Uh z@hj;Hi3-vRgH9;5JQA{`6DFY*yR~aF4qZiqbVcVY8yZ}^8MxZKVDsk37i?Z|x~U0% zSiEDnaa?Ycw-#D7!DI$Qeo45yd3>PAFpv9Ww z0E_aJvWPPh4M#-R)eE0*qX4u(OTT{uy|wUH$;FoPH9w6Vf!+-fv$X3t?H}J=T4;jjl)R5%{_((TomtTHL z{_g-*aB=`tFbD{M^&$H$xr@kJjai0s=fa~@ zx*=6W=!h1Oj6w>Sg|nKJib7<*=6SZ;XtLn?!jpQu~fgK#BUVG%5b%{{|=PAr0O zwRr);qNX;yzEOd!M=&7@Hxtkjv;2D~Dkv`DJkHvJJWMylW9BljBuSZML5{hzFW#L73A?YLd^$iNYClAsZyn35WQCZ0Q5ZwJkWWZi zAg|V3J+})>l*o4r@3<4T@FMiEh@Z4VNm+oE2B_p9lu4_SLagi8ig!{}(&wRAFr$>f zUPn1g>yKKMvIaPg?lD#cT8UX4GVC!+7L_Fn2`Ni**0Hx%159!dHB%O(Ee-;bOpvgy zSUWJWe`EiyEBnq)JbUVFci-w$QU$T7vhhmh_d7LYNLNrBUWIao`&&lDJCF#POj);c9!&&OIj< z2v)Zmu$pYHrQbE&Hw=aFmJ(PVI9iKPnahQ$TZ@4!JY=A|R~1~Au&4@BwxVzqTi$UX zS&J)A{eN1*x_#ruHK~t>lK(lS99UU&#Dc@<^4S@{5;;f_rHUxxl}kkqm}n=Cp{W1b z&M*{U6dF^5QN=hyDT`q?RKhmS?%+EP=sU{ibx{#q(y4;Tj0IF7V4#XF3+g^p^Z4BN zzEsJ{BMqTfabJtqsT;A_{|GGvE5K30rAr}ST@+}4x6X{MLo3z`O*K4r%$CgJ#Axb< z56cDK93A?04Lsbv>fzOM`%dkeJ}`Inu3f7Kc7ar@cVUJ!#VizFO>$u=Ejp7X0|hQh zT@kJzUC}Zh0x%@`%2h%DDw48dSTTkdqnhO^c4UZ^LCwX{M+C0+FEZI`!L7G0ShQdf z9Y^h6*{-azwzYvUN)B@H{)1Ybwbw6eZGd%wz`{3Ha2Z&{m9dIjS+Zz!oHBX>~t0X2}D7$+5vx@P9|3kj2@~96XdH1@&-X`q@)`8}VBE=^cG% zv1Zn!vuDpfJh1C9eBjAAleB0G)!qzSg(U2AN!dNAwhe!fc zLBzUm;oRF3o($tSUY(9`b$Ss6D+F+B5f+PXG+@d2N5Yrnwk~Uhu1-SX*6HSIhkKt- z39Grhw^zi%w{;mE5?L&$aP`6)^6~O`+OTXcp#})?(1wHsRS}PPV2PG@ z=M{kk#gA5W_y*-e>cWeuYW02`0gHXD7%R6ES>F3dF1{WH${~Q&1PRN>32Awc0>%st zS&^4RrU72&cbjK8SH`R$VNuvZ;5Zmuc zS8y9j!B?RHFC(V*hc1S9t|KtUF~L^6KZm_9rWQ5Hs>V73E5cM9fgPR!ZVo3;z{?@w z<^WMEp&CNYTDR^k4jFQQkj_>jmUO;{H?BTBaJFx5-~6=;PYraO9k^mu-&rhG3NHr~ z;$JdgVszib@?}r(D#8^-EJ#?9S{U<+?hyQyRv5SiT)pMAGQTSh6W~g9z_`Fc7v&>VvQe8^HJPLWu8VFYC?1ojvP>;Wq!;EMi-e++qRb>CUMa>sZ@vMEr^>hB-8Q}%b0 zv0#vgGKdjFldu4*z$;S+Wx_K5E$W0MmdJ%QvgW>ZY|JE_;K|^$It^Sc-cPsopbQdM z93;d@;ezc=jR01JE8apFt8AD9OEW;cC9v>1og0_k1$%r^QGH%cRy`&W;>$z03@j1L zS;bw#l!Y-urqJjf*|46eekAl?-n)+KFZ)uzJgP3|vfED>+W(MAIK9N?=XB|C4g8&w&l= zcEBVGF6`)d%Gy=mA&Cf+tEYTp*Zl73tA2nZ&Bf8{UkEHB$-reWx^HbqcX#(An0Z46 zF)uW3ZGmJl@sP##EKFJ0H34&;!K->0tpqFf0EtyaMP+yeq0PH-UTGyP7J#yt-Tv(c z3<~18FGP`7i2zj+ZVXt*A&3nItR_fUCSY+J#tX+7wJ>GJ94cw@34?|SDa(+Bm9gag z4s#aZBYM%f9WJA*`$l&4KXrEXz?J<_|IYpr^LWlag175XaWqcsKtB6)q1~c5+DO&|xxhKP7ynu20i9N8H0&Zs20)ZO^L2z1d539G5Q z`kTpa3x1{SxI5^H9pwO)`GaO<0azJEu1CDoGs#9mJoSyoz8NZpv=86M;}MW(EM zQ34i`GP~=U?p=r9d+({~YrAl`94vyZ9%>?fQ4dsNgd|#Xc=}WCz4x8@-|4~uB`?B^ zSi)IUb`7Q?;*XT_9G;9}%EBAC5FmqD*+nbpgQSuICN^Vspt)hAA8A>d{E|9WD8hTc z;KrE1l*c8F!P-*W+>954QDLNa18cW^<@*2@e;ilFtXMU)n5OJNGc*&t3n>X?$pDWj zJG8$GLXfnmBCfWT{8snvnqEDh^9`}o^4adyeOGjkOvjKR!GszPObD{l~0%58Mz6jghcYk5tc>j5V%=)mB|SF33V- z$$euyK3H?O51XRKi87^!Pn8c^iALrf?gxNs zwhi<#+7&8iHTCr~VGtDt`!=2$L=|n!k zU^%ZqDykrOwmYyeAE&u2tbRr2zu0W`t0id`MY3h7qB)akR@yT+&DO{Ou~wdSmxM}K$a_mvzO1E8{x{yhei*qq40`=5F2slS<{c5eRb?>+W|`?DTcTV4IVwQC`fP5!}a zul*wlIdARSn;-b=am231!>3wOHa^&Scwk$GhPS4_rZlTOYf691%&d(AEj2ZzgZ&#p zl77lzE&a!`%8^xCUXe98wY0o^<6%_pJ6v8`TC;ISX{lF6z0%V19sS#8W)1ca*4Sc$ zgGekdhs4EZ6WOITrG5QxWtG+p4Ax}Xj7WI8)9IFeSdf3X_@zr&5R4FRU$b`AV^~s& z0r_3eT=D3A(DJ6dH~+B*ztjELs`>LDMb3M>I=a8Nqie_f*B(6D^XV^@3! zci0M$&>{N%Y-cP%494XCUp1Fr0HGi;oPL-l~ln@ zWsnz+z$Ii(N3>$Zi3Q<`ZVe0O&8y?f9_=QRSGs$!}t^bR(_e%Q zYeIMRV@O8soX$t8JM3ov?Q|-K^KZh@-(Jb+uC~ACuDW_&*5@@0*#Rl+`_aD1=@u2`A8D*vi%Sdy?B2L?+qj#vX=m6jhq3?tg$KspPCDr$>arO0dP z>&q&?xqk{u&BU=+26~WPUXC3`8>g}`PRhir^75G$i?UIzX5+vFKZAgE|0i6+YJ=mb z1A~?-vnhdBkM4SmHYf{McRkiU2vO+j*~>e2b$zFL)uZoyult#<_g1|&_};2jYnIRN z{?6cI^Vd${dNP9@^Utn*53_jZ?&>)F-r4!jbRF*AarKnL)8FfQ3Kb7eIot7r!LLt0 zyymHnM+YD4cn@M0Q3+&SO$kdApGl`kD>QU5iJ>ae3E5@v?&cDhu#8dcLL4Rx1{gg5 zHCQMghS0yNN+_b$)wW*W+%WZKnXrslZo~?>8l69V`p5@3Lav4kKNvoVg-L?}{q)|$z{m3g&Co(#gPXtlX#4{TSi4bt;UVihQbUpXm_rhHrf;LHhGY4EBB zl2angHlsTwER(8Ir33HPl$Oq>$kjIpfocsTELK>v@o@h@AH^z&Yn(%wm1UK!UREh2 zudKlV2y6^f`-4w?B75c_4fv^zeQ*UUJ$0%a5*8*CN+rYsevq)J5>mv%cFGSPlVUf! z>(Nzby8x&_tgi2M46?-R9jgee!&7d*ebw2PudkZ&;De7|@!pR4Pu+L>>|IYG6{fF+ zuXRuVams7e@7>q6WBQ|ASKs&E^7mlo>gsyxu?Ho? zQObf1D@VMdiZ_N=f)#lMDU0Uc0{D}bRFz?wcO+QPawKs8OD}nWN&}xONeHo!1t$l% zWwkdzQfp|yn(maa=60c6F`bF-<f^sGJ*9~2}_9^)=}*aT3K0nl(16B zBbrk4tG^BcP{PW(sTyKf({!>9W-f+~tj=$$;4UV0V<7RFzfEN|$%ZxI2h|*U{BkuM zC{XjMPBxhlAS>0B)bwaq2Lz2CMtjd7tbJ zHY`ldaS;oqCyWaMQa?Ss>XECpteg|8>+8RKZ_R8_ZF$F2UEhJkbo9<| zVcy*A>5oiVe&18Ox+sLvE_Ha<6;D0*ST_`vDPLdpSrKfy;cn`)x+I`Q|^Nr zdiaVLUwiR;9lH!zyaJ38*2`n`B3M}hjqk)0tnjd9adjC=R!R->lSF|+EX{+M3duc!)W!$@Y0hXbWi$#iJ}%=Oo#u7S%#5n zc$#mwM@Sg6polG5$5+}AKVt)5Zr`!`)Fc86%Q@i96$4jHJUiElt%hKRKO+{IB>^iE zvSh(ZxMIb#3dt*!j*M4ZJbzv4J4FXow)f3P{281j;Z`dy{=|K5PLKf}>VqB*IQk8tL zxGq*CVY%aIx_drsOmTRi`o&aqL}1n92*9ejzq*=&(W3wsvGrQkH>$4$+8z9p`+Eb}o8MJd%QhHI5m6uun2o`8LcH!*F0GuY!<78&+wf z>{eN&1F$>6d_GVLixrAPqJmHcOqG{sZR{&W(Iq@1gCs1~L%GtvQ>CnBS!~Rr9!q3z zJWOYM81yM&fmxr#S`D^Z10}5cge;iXA6vzd!Efw3y8{D$lDed?O?huR6u#NBr##dB zXxG~L%csol`ueH|S9NfF;?cn!S5O=Su+YquH9NYxj!pUA6;r;`jkhOEd1Td;M}IlE zM!@=dH3YC{x(C6+tFM0aiq{@p`{?1rG~QDwMAe0Jw354Ne{BPK`+3T-2?B( zk&Kns+&XO<=HTFm>tfnOod{Z$tvB9*m73sfz>E$3l=`rS0;$VQ3JnvN<@Jwk!ED1V7PR z#j6-s)CCbt9n^T?f|fQ;euBG5Nqch%UObC{yIEU?bq}%r1-}tIKycGl%H=GU7q2b@ zi?GTuVG1kB2v-Iy<5uu=4}Mq^zES<+&DMXp{pO_V2NFjB7LH`Yx}jRi<1_NZBCMXG z16K+*tWJciiU*+gJ@y)al>(T&36rq$9wEjEvezhKCEE95Sp%>*G1O!&0dgECAv3G= z^D;U~!h%i*;}oJBk=?nZ|H}ijSx*uc?V8hC);c#G97RCataw+QJc*2tY9k5|h zghD7SJ=|A;{gl3$7iB{wO8oc%8wfS9# zr$5s*<-U%mjvelXCb;&B_qx7b4FPO${tvqDTfTP3dsnQ*%lCE=SG1e~Sr{dxgoOt+ zB`J0Rtc)e$iooI|Lg^oPd2?-ZLtR5d9cjg1n%pC;4}w53UJs2BlC+nLX?_(f#=Xakx&ZOb_BPwBqXz}7K!#(EzPG-4Ym~?F=&%X>n~l5R*`MRRb*!4-rn zsDq2mtsS%iuP9wf#&S&2jODMPbh@JZyR9{B53u!$oU zLc)fXHMzR_uaORuIV7^S`PGk363jG8$nwC{1Q@qgWo7N6i9Tx%z(ffP#;(7qz7lmh z=R^C1g!N69&J6uaaAgb|2P?+n3aMRC71y*-!m26V(Z6wO;~Kalq>z!*H_%_h2qY}5 zS2YFYfTMvqH5>`tHgyMWR8i%P+Zv|~P?VE|)iQu_#AE%3yPDQOu`Hd^pP8K{2`fbj zi_4i#z5f#_db-PoMM3I5LW@TC2jR`|+H3GZpnS!_Lu@c=IOV5o0Sw!0hHdi08p zZ@l-t`S0B~*s*Hxy^i@i7EU?~Me=)3b-{_DYwh%1KX~tv>5p{nSk-;_nO)r*F^Kro z;M(r$_qraNbRT>oo|=F7y{9HVI%QY)qdUGc{RdrUbO*Cw!^*~s4ESG9KvA@k4W7CN zMgk)b_oC+J60E*dMy-VXCb@_J$OUDjw+mYU*G{T~C!q=|VQAt9f||rDTRLkg{NI5r4jFFVz9?pv6fhaHFat1(g*1g(Xu-IF1bttegbQm6_- z7c|?|33F>FuJl8dFvb-f8vKwhS#5lgDxMAS$IZt3KVYzegjI`W8SvU?Du%l6`hs9l zbPsr>@ms?4#{cv2Pkf06!&Uh3VwWq0N~2h@0&9FH57aV%ArjA++wu`{o5yq1!_^# zK=+WngzSM1hy=W%0$3}trJ6*gXaie2I~I{8cLy5ZQLDD~i>*Sjq2w_GT7)dZ3KEtJS(L7fSuSXC)vVZdl`+K`T561| z{X2K|EI2Lc3iftNSN0Pl3o-uc4>l}50yOpqojkX&0qe_PZP8l1{2BKZITEt?7{S+4 z1b$KQ1=y$*UItbyP9-|N?8OwjAe8vzXIBY3Ca#(c=cwvQaG-jideT?h@{+_4HY|)1 z%Ex`;s)+5UOf>mTu7{*cyrcMAR!W8 z%%g<$0A#K)VGcZ_kVGG=F*$aaIyR?~E($bPmA4#gL(DSfzzK`N^~hA?lD0NFH=u0I z)Fm}4#>(aR;598vvQjfqSao6J$G*3`W=V<-WMyY&17S=phfU0<<^Wh)zz<6#6H367 z0^CC%doS3PsH#EAf^G=o(;CesgooAIU(UXI$L)9t)$BDp-h1zMn9z4DhhDd4%`tk3 zPU*T21*IL{J~+7iYWQ^Bw_|V(tX^GL&!+k}Wj5v--gh6&`8&8b!H!}U)^xAe|2>5) zKuer5(@2PywYN(x3`>u~vkF3%iBK_&0ijJfp7kgP{efzQ>HgoQw+1|0tLvh`= z=S08~ortBKJ4YrCA2&pSR3}G9z$mj{30EkiMU}bAAH5vhnkCgRVatM~Ma2+~SzNdQ zOaiAsE5S)m*mmOz2ss${hP#sJvgcnO#v|}-VTLRZ|;>vi%_a-VN4DG?vzMZ(* z4^IXH3;G~o#RzHTf|lb72~-ysyi_HBTWW<+3v;Wmg3R^TQ_04?gn(r*Bc31t<7M`( zwfF*L^a8+&E~|u;sh|#0`I8Q)DCMdEtekW#VO4a#21|JA0UIjpsJ@@2qfkL$;V2~s zhOF;YS5JBbBYqeH%*tC;J&}cJ!?N;o@Sdip=Dk=wy)A3bV^>yB?EXe7E9++H))t)g z001BWNkl+rx-YigYB%+eHWN|q5LwPvtyoU$RQ zH;P-}quMEKDkIQi@r@nk6wSytd-lTUd-;l#+BM7cKIN({eT*{^b?( zuOP6P#{fSFYK%!6mJ3&gs=zDTuU?&4pzmT_(R78dd8bVpyj6H2s3=|0v%zSktr1JW z0@<3d;%Kp4*ySslF1~)*vIg4Skr?i+KUfO$Yq?~Dh79$6Tz+egNmzna)B!^Tc4J19 zDxtKvwW~~8`d+m;s>l6xLY^dzQf*Uz^#JW&CVPCn`g1l_Zu{y@j3eBn zIur7~?EdqqwwMrB0^3p_9~|S)5ao{_S@Zqd`;XO+pZ6b_YI6y1(gJ?whXu0SXV3~# z7MNpETHU1?N^cX&x*qMg9l{d1V^SH5xch_ZiE5%2N+>X!>Y{=KI>}W$2l6Rh5m{3f zem~!AA&{@&@=htsdjTHw_-$w|!!9D0p6V!2+<^BGyR`}(%6nBM-vS0Lrna`By&YJ? zD|ARHFpEWnv!`G!2quOf_sxeV>0tp&q+%k?TaGJ;PiA+gQV48il56?GxvTwEgRyWG z+pYjB!_|JRCkjIGhsa{U9ucJhWBQRYsLVwRPGiMU6Q!u=;TwSR++2pK<(81_L@xU{N?q@`~i~fOND=%Y8^O4m#-U6gaT6PT?pa z`iM-o)CpZBM7Pi~q+}OGB^uuuz#fZWEUO(p4jBPJLJGtJ__W`6$FgF_T!w+ZxUS*Z zVOXf>*g)wD8*=FQ$ovmz!&2A@XRIqfh=>(Oge=T59NsBpancU0Su$oNR6|HU$JPy= z(u!I3rZ0CVz4OjpSm}KLz>4)m#1aygk&2))SjEVqseQKA69uiH4En2Z+|(Wn?c28# zS6D&@c%mBvAZ3B560tK4Z%i!w7Q?Z%sw6hb2v2G!oU(jQy*dJIx0+Pw0v2BX+}t3SQR;tOc2u}> zVBs~+?eG-UN~4snY%vCkP_(@_-1wK*H`Is0tPI@|tB$rUCb1|t>4%Kkv+3l-kq`F3 zy5+0;eK5WIBzZ=lv6v$;Y*>`BZ1QvRHD7t(oG1hOQ`I+roC`{Q6_)g`yH~`=sqnvc831eQy!$`dS&s*2 zets`jP9Rx`rVtP%Ni0n?5nTu(q9`iN)EGs?4~sA$%A<^!Ct8+onPz8Z>E&H{^ul7` zrBNqTcYq5*Lm7Gnx`}#<^%0N@UB~1q^d&emNG>p5!B!;)qLPLm;{6GA>}C36ai}(= z8m#Yab>*9fAz~ScNTa1oH|^OpG-=W(l8GdQlcUu>r;xCc2Dyou2vR6FU}Chq95`gS z2(~O6GL&X0+dGi83DU&_mPN6rP^S* zN_}LR{~u*Wz{;(!&(E)k*K`-JBxwamN%)cYL&Yya9D^B|6p$5iy&%dGSD})k1}CD* zTViD<`iZCP*wzV3Ij~49tvm{oItJGH6h{w9Jk`-lC@}HOgA}Z=o;ySXbhbLJcEvu_ z&|V9_2a<{_B$HJNRCln5a$Ozl?sbjp_Y7;;&kzI&YtN=ln3Hqm=m#e?HG0E_q3ThI zR>YaY=+MbnXGDr#3}&`0Du#}%3?U0xnR_b9EO@;moQgy)n%!L`3|&X4;;d%pl{h785n0YG$yc#}wfV$}bu_N?{@`vmH`jqd zK$C7;B?dj(Yw_)9$sbWn%+lk-9wmIzTm}|=*-0rNgA;QsIIxUYIjQUJ=gUD8P*L&3 z@#ScI2M8>9x_82ag;BzCN?3#l12{xok5(s>d}wc1P!Vm!DoeyxOp3weWv#Tq%!@|n zh^nf#vCD`B32Oo%C17b_5C=AS5S@lkb3D`|Yp=QqQzS8gK~=Rd4zp)TK)}KRd;yjD zG>BNWwpJEOvOk8W5|$B4mM$u1y7e^o42UDhbVVcAq7yx*m$>%=1*@V; z;L2_>Z

pUKokF2;s}1*p+;U6cpuMUU8H?jkBMPS=>psa&pnpJts$Rex8a~Y=1}`z6#bFaXBoxx~ z;>@U3OX3A(Twz>NF?|I4G-GmbXq8nRp6&n^Jl*kXk5sA`KA}ONlB^?_tRVCVTZR~; zmE%lABd(N(?HC?Ow32v5m|3tkiNX*lcd?LpKftZwe!Q<4mh}+u^5!zSTC3L>uQGv^ zG)Yx;=9e|l(oS7Z3;VU+QzZ3I!-80N23}bloaeir)d8`Am{m8qY}@wXVS*@F+My)w z*)TMHV)djUSg)22Ps041kjG-9)$=D!93soaD^n#gWVqE<`IG(K6ho7;!eS23?$sMB zAWM-=`k{m+(-tDw%jO3hF+Y5 zr)aqWGThh#$+KDeiL-cSB8AbhS82yL-%nRi`M}PJE-t!8Ye^*&t$F(&cZcfn2{dq^V20*1tscKB@nBMvA}X!F_+5{ue52xC?bB+ zEsNoi6_`ZR6kv4ngOTag(?^GgN8#rHBfMpEH#+I$@W>?Si3}!_foMCqmhy?mW5+Dm zlMq}pG-$!zwDHs_V-z_RBrMYmp%xNZv4rK4RRGtZIbH=*J481%&a(tqNxI^SR{)Z^ ziXvjd6ack|f5er=5hKoMyjryR#O8HPwY5$7DZ|<_%i1wfQ1Yt`gKlaknerR1Z*72! zNOT)1{Nf9O2SgFZYa1?kl~B51AQtFBZkfiXMA9p3=KVL_FbCo05In}TIX8!N-zzaB z+rf377D}=i*1X}S$yq4@YeH(?C+EyTx$D$4_SdPBw%1*E!<_4GxZ#HDZeXfqL@j1S zcrCghwr*$P_J*6&rSPxk=W4s*CY?vsco7I_ljpM#&YU<;eEBHM_L4y@AYsmR`1NMy z+;np%o`5L~vsUzW4aO!CnoGiu%qGg(v2Y=NlY!pWA!x!#G81vma??x_ZI~I(!A!5L zidJCmTr3(r_&mMajYZHq;7KjLPaDo~wpUQVu$x=LSF55sML_ZxM+MvAHPqUi-wAC} z{-I7MIuRjz+UHu$rmW=Rx-#@oyg#S0yk*^q4LkMbdI(HfG8xDk9_2*nNfU=RIj%q_ z01In49A7#*{f|jpAsw|jFi?# z)q@-wq;M6y+9O(-bS0mAD1&lqr>&i6BDjbp#`$v^Q61YMN*S&m0%Qt=U zrcd1T$uHmZi7$Twk&8ky3Dr;^m+Aq>*G-*SVe^6T`DV`JnXP@hzE6DOlb`%Des20Q zs(j)TI0OFTfKz|slPvQ|q=h?x55{KnhaEntg4eoXDn6Ay7o@uMRJ^-j$J~X3@y}e3 zbB`?cm?#Bk*#UkLVjf{3&t|c?Oiuivs8?slGx+TQtjIuQA*$9Eu4&1|;J9q<`2~PW zto>CwRtkc#;e#%)RjTLry8&B+KHLWz)%Q| zr(0#X0s!j2%4(a+%9@H1fqlJ%GAT%v#1ihQX@3QUwe);r zKD=>pmkSH?3Tp9;$-nIBE_uqOEU?S9L8j7pWm}kHDk>_cF21Us_b)puFApos>mHlIF4O$L_ajcgUmQwjrfbsa&feaNbj?hPhGRmirlJDN z$X8U+ zXZocVcJE%X^43k{6mTU^QU}q=4V#X~0v0A4Qo=&9(TRUNt|A~+6gCN2Tz&=ukKVK6 z$dWh|gsi>C-ntWtp@$$}5nD218Kjci)p{9Dkgep%fCi-t(sZ?GJ0!Zzco)vj6IAd3 zqJS*QRI*o*RE#X*uT6vox}*+nKCxg+OIwp>U6wVs@7ZV0@)Yia0ZWGoU@=MqkoL(9`eZnStn?>BR6UBI0)Ztd zD{hI+M9uQx&kt!fY}Hb|z4oan^dNX+#7T%^@9}in(<}wUeEBGr#&8;5iW*f=85Pau zY50o`x7x8e4--IQEsL*Xw1S^JUPaynz{U2dyn6g7K}i_N;|WpHHrbwq3XI{G8Oeb4 z#lRy46QH6@{j+0(5|oKtzJetSJkn?(3)oXV^c5y>XetU}dZ1jds;IA2HPrE*pd`@b zxMIJfG{7YQS%aj5ECF8CmbFdYa&Y&nD^{$y`cR#lvkY01JEiMC`#Te>)@l`+_l2mJ3;M%-Set(m*ZSj~yixv{tX?dZJJU<1Ra5^JtwH&G2E&kI4u&TPA}q8qktAfE)a`5{$X(N#N)Sa*|O!D7hb|G zZNnOUca;^lfml?av2kD#R`^B;EUN676SyFh%7;M6FueOwuW>T?kx?_*pFO2T^T5MRc4I zAzJvSpey4?5Ix4U6O}?yK}B0$8;&CG5LQv}M(qqNWr6wLgg50ia7N@LTLAnFfLZYIYZexIDsI~{>(K6353YFn>ASDF zX3LhxH^?|;)^x*FBtVf@JGl<&aag#n99arHZ3>%z%mD9N zAx%*mgO`I-%l)uouLkl8MtG6RR*#8r#pZx3@QSe7j9EB4_rviMBGau1+DMY3fCa-9 z(iWNh3ZO!qzW~;v$9opN@Z<|5*4;0>RDV}%b8Q=Z+6gP+%8*4Y0cQ|-O~lgE0u00L z#Kd#FrZBsqp$Klidc<4?mY~62Ev1FF7ag#NTPz$$7-7Ek(y05ZN}PstH3zZFbJ(w= z2E3q-Eni!;#tn}2XSF$@(c59MkjTCLh32?dfsmlK5*)Uwp$Kyk$Oi84M@r$q+C_p6 znG#|u7GDBdu&P#2jfJ9KSL6%rjNK<8rM&1w%*p3$#19V;xRfcFWoHMuOKFtG>Mey{ z?En>1fG;d_<;>Fme=zhq)`CJ}@)aZ|Nm@`=fGe0)FnT3=Nqo9%S$i$uMhT0;l?UlJ zD5OJ*T1_omW;}6dw*d>hx@OChFD!D$EQ(hAi5wmzb#2%=dL_KDmTs6oa{S~-H$Ad~ zFvhZwxbTa$9I*V1BP-$mF3m77YwxqG`(n)y)PgySIw7p?k==du;5zwTfm95r$|i^_ z@CrsUNmuj}-6~~JvzQ%Mi*6N`ur+F7hlG$yTw!SNh3B4pfdR;R`pL;oNa(^aZhl^EWqy4$Md7l9rA|)}Ah6HcUY$~hAx-I4BZm zRT4!oq`|P_%B5OHOCfkgC9`3bk200QM9cAOQmUUSx&lO0O$}H*JGNxRy&2ELj%lG9 z;^^S2p$&UGOZuKW1}kQJYk{Sy?&&m9K8vb6Hx`V6;porW=VgOPAIdD@j2Kc05J}7u z!<0xafmB+>Js1D+I^-lm1+LYAkwQG?F*e8CI-6hi1D#16WSB&_za7oOaEx@YGGV8?hB%U6yj z7~Pj1-vkNk_{gM@kx3sMR|$z%R0&Pw+5j&Hy~~i+tQc9u4b?)kzT1*nE?@-{RuWfp z*B!$vQDeU=RtK)Q@bPI_uD~3~SHRT?E)^JLf6?P7Hm`qf z@7^a#EXY_}u2~5w3pPJk-mzF8h(#d_$g1Qji3FDJez^Hn^kb;6oz{*e%1pMB!gv{2 z?4Jl`d`B;|h;{P_6&A6Q-raTJ1xN){wIuar9tP0{6^uRPgnGCawF=QTY9dNu1oBmU z%pz(eP71Nmrk%sj6B0uq?b(DvbTNKpaA6sM1(^|SkdG8eQ*1H%7)V!(DCmNf7sN4& z5lGh-)f(cldB*Z{m>CZEY0GTR)%2W}m98w7( zLV19YMK4iK-yyDyVFVM^K#T{{@It5&Sy86j=?m+dufKo6tV4&O5$-;C@ad0ZI<{M|3C@(R%yb0`(y$LthOLIH4C@sE z1zhK*bIXbxmOf~5tx*v^XrOu=sDn! z3g-mbiV0{0*}$9XF)DB{1>wJySjM72qzFZbB+2CIpj95NSt!mL5U23UR7zL~*yWK| zu!T^pLcoR@+=x)QMaUtkXhWe1D-KjliW-`!>CwfV8DtZQ#ZXd=1u<=sbS2lv3IWm; zgsf%%Y1-l^&VW{tMhIR(zyh!KKKIhIAOYm1NWO9xQ7C-p=TDkG3a`?klarx z{Lu7amK3o}E@Lg&zc?|PuB1fPf(Tg&XHueQ$y@fuXb4(im{7Rd2*;~Pxbhj!rV7Gx z#bH4Py0yc2uD3@-)^h!a(iSmY`voUXEZ$3AIk8+R1hAf7 z`Ra49Umw{y+HPNxr@zi^j z6c~n5RwVRpb#G6yUA*<8sOvGEgZb>#ak)4q6pWk0GP(%mvU<3_xOg1n8FUh!$WFzb zVtyQ-)MHivTQp-^zg!-$t{8^G+S|E8gWMw-bRtP4YGKQ=9um=z^dGht%p_4s=z@G@ zO;gH(I3++q(2|gaBc+K@>;!<83Lv2p6PM8!_=Jxh@!}Q61G8&e@1o}raRs*p6>%ZU z=Rw2GRJCAYXNCkXzH7A^rkZCj5LdfjJ#!EytZO(%Xd0npEHLZY?K_9bE0?b58cLJ; zrai|`Vo`T2pgeN?1K6?ljf^hcG(7UbrXeizFfs&H53rxaMT%5EWdh(z$#?JXlq> z4oqo_Og4c77Skr#z9rhFFjGMVa)N?s1hI^$1ty|^vnZUGSEb8SY2FSMAdi9;$ZJE> z%##)|$J{3acS`ob?he`=Miv^AiB7k$~PFnGbV~Ucn2rmW!imB*OeC?-520MP`^*4U5 zq4u8IdtTUdc9VLv}D3uK&@R~iweN@ttX+UQp{tQUSN0O=-IAZFcDPo_=YDMLoE@O6) z95yEXLk|O(LV=5rh60qY5Zug8DT+*TnTr$?vmkgO6@NHX6z`zWED&}X_$?Z(NG#a2 zj85oS7!?fNOKF}_MK4EGk)DXs)2_d(wya@t!{jHA962)M)mL{P6tN^>LBxV*5_&P1 zMQ}a0cM)Dv4>*xN+|a!4isGJ=-6O}3AIAb(SDu6^p3K^`>GuK>yhY+%0?RtE{UgwoF*+&T-S5LpX0=zN-i+9iO zr<(>TU*V1y6=8I+7H_>};6nsSg~erDXXCPjg-*wQWt*s{Mt#<08&NA>FN-xIdRfG_ z=&b=z01k^WAaZg0O0j&MjmII)_iQ3MjTIGDSdetVUR%~w6`el*5Z=1i{IH$3`8xs74ftkrr^1+<&MbmMnB}d@R9G!g&QhEZDMQ zDXN~H4WtzUZCG&@l}4=QURjIR3?it{RN>VVwHjx4lZrYQEa~3CT!R6jj9GjS71nq{ zazi^_vxh|*Y9V1YY&r78k$p#Iz542_2PtD+0~t$NAx8=o050_F(>)tDP`IL1-G6NK z5PIOq$n+2Poy6K%SBxHkz_ky?tPx-f!HA_O4)l`y$M<7yG^DHr+aYEpOj#H)j1XlJ zLsllP-04cV;?UsZn;!>%j9HMT;;_i%DhXGF7ycw)onCO_)@NS|@)cOjAwn}?nS8b4 z;M0dza518wW83Z2J+vFiyI+)FdsjmNhItdf0=B3X=H^P>xRf{E4cX(=HFX@voEHwP zkjdVgaONZ;j814p5u`-8Vjf$!t{D zkAXhz3utKHzyEPu4Cej>R#C=^XAc^hT*8WwMd9l7ty@n#Ysw(DlCJ`;Odniv@ZgHw zGp@OoHwdGHLA;V?Z8sIB!b-?gMFqL|wgRuHrc3O~r77!DW|cmB=)&xA4D4kLihvf0 z#5k&QR+f#Z0=6v9gOH>2%uUpOW-^cBbK~G5PO$(>u^b}&^!fl`%%F3u`OswmaSaYhRbHvcWCN@6M)vy$`@ zuz(}%0WZu{bZCKCq?B)eHNGY&$!kcj2bdckx&LnT6DPART1wZ$v zpT@|;?jx^WgWFULclW?6-CyGsk~oJ@BZGXnNFn4c$MU2^RwX88W?$;WvTmk+$KGdM zHzZmL`ecM5>(A_eDlAACTwDla3z#X*3QirB<>8p{Vd-Ov#fMgbTQMSRLIJxdyDSz7 z=?1dsD2|{=R7xK(&WbZU4ULmJ$pAu;QpPRQ|3U+l${0r;FT+?y)O}Pia=CQIf-#E5 zuV%8;czMJWK*T=+i%?>SK!wgAc3CoA8iIh;(A?0_P=$4RnTTZfVlcU?xUyl|^$m1r zAlul<62Qt&Vd=T+o6Rc=-jNs!tCWQG1Pob_vYr627^oLU)-0H_j98Si_G7e=ilG~_ zNGtrpUe&W{c>2VlO`C?MpF}2J7d`#>NqAIRRWjz=|zcw}wDg5m2{s>lSzH@%#9G4Go%v6^mE2wnz5%S7*&Q zxbhmzWNxY~bLIzJ;YKo)G=HwO8AF3o23;czv(xF+P*90Zb!i87D|RY$MQ$$w77`KA zpREAmC}U+EO1OVa%>kz(0yx7gBajR77uy;?SPjop`{R`h=MH%~j!H+D$cxpvJZrr3 zB1@&XM|0kiR|xG#d)eH>2WR6}kPyOeRLnrdc45XMfxJC|YaC#yh$9D$AeI2ucqsBT zQw1eJB})Yj(NscgL8Mr|qIiXXCpQNFET%1=-h7OcLWK>@&CO*f!!!glT2Z8uMZNiR z(=e?BaqDPw*oHqT{;-S#mcuM*XlE7VL%_n)Pm-|6D};0Bo>&1X!=UBJqLf8uQOJUr z_3Y;14V19>3-^X(7`hUQ;qd&SO;~?s=g6d!u)Lo<838MZVyFT8`^ksk|IPu!i-rtg zg?E2;+2bjFxuspOf-<-P(v?DFy`tw8{}2EvvtHTAplnx=wIFO^#VZO{hAYzt!{8u< zD~eZ7KYa$1Dp#yrc}-hWaU0~QBHZ$TE8If4I#k}%dRLJf+ue^r--0#e; zKFdytz%J;WjnNR06sH=goLAmTBAaz6nxQSBO~>3sM?6r_>B2#@57!YAoQb+X+i0t6 z(p5#xL?3}4B3v_z@Xz_G8fZGMQ9w?Vsff#37iTghBQ=a0N)a?-iA@G5ld<4Jtw^wF1z@57lt992Zm1R0 z&`S(rFvP28K?0DQHhoAXUj+#Z%&IDGZO=}n(|P%wMHpo)Ddu{>v|+)D#SM2CE7tEN&X@(H8C}s&!iH%?tG7YB>Oi3iOqya&hyjDxeYyznvfy$Ye@^<=hpp?`=p%(u`!Dx72X?-ABMwB~gIau=V30yi(Y{WWMO(gzVQ5w}9OsMDLmGMdpGiDjM1gv_jgq3TwqH@TA z^5_YUY0e?!f?OOrglNSPDmp9>P$ZU#SDd6{{jIX3ec6r8bcJ^{u?(waHgF}Z$qif1 zK^K&C1p!Op+=U~vTrV_c1u=`pEMwNQr}t=Lv_Z>A1r8x{eA6i2T7fsOjvODIcyb>E zuH*amZR!!R3|ADfC}qKzwV{U?k_DbpRxrRDssJlET`j_}AnjHRTla8|j|B}7a&-oT zq&jH4BE2YBLAt`vf~}|JcqMI6wyTT9E8uFztALe$0j##-%HlRG+g?Sf%7|6jaQ){n zzG_}2h9*f^`hNTyQu1X9E1*gp-1;Q?A+e>dmgJYEu;(%+`O4s<3@4Xpz@DAx^+`g- zfHMMEhmN)^%I1>QLnd1^dC5vdXJLk&&S=8=Cg@m|gb3tqu>k~~#c~z(c9fzb$(lNg z)nog*7B{E^J;>lj5i6uar8tCCL~+ps`H31x$KkjEmh&;1pA`d$6w!_wk;wsOS^4n4 z%Hsxj$^)Rx8;eqw){?QVfyKh>iyP{MCRwu}YH?k6Fo|Lpe!(l^$pbu0B}*}>s$tn3 ztu(->=TQVJ##En%s*oJC?mG2C!&_tUNy#;PGrS+r*H=ed{GLpP(aWcpwb zop>}<%>WOF>XSYDPEHzrVs!e*Nt3bm5LUz$fA?*|kl|JePMWksykrDe5{7qLwDGhSKTzZpC^E=yRM;*RzD&?&J;H)bcc6y;i+URW+< zh0=jUD!@wo3z-)=#H%!{QlVBT$i1C3nW98ykPFP#rFfJ(D{Omasz}&GEg5M&nYCDf z#TleKMn#npn$1Whf>@KR(1z4eOUglWAdl5Bu4qdb@f`oLA*PftMOzo4rCHF<5%!0j#)+~uxdx0#y7c5ruNFw9c@aPC8 z6>b`xc)X|Q`23-L)4NBoq=V~&Ju+fZ#OmqU$05U>trW6ofJeYsAeM~L4}2IXTp6q& zU2WLuwsz`+Ne`?bU;$ASsfaFYDPY}-!^anFp`WM^4aSb53G3Ct-A_QKygT4ZDj|Rc z84IDdxf!ob!wT+YKoM6MC9%wPm%1Rn8dnU%y0DjRSYuqttw*C{MO{?gIXaB^f|Y0z z5|)*YN=21FM#O*>wQHw#hJ09q$YvmFxDB+3(1X)jRm=8xl*;mEe)8+P=seDwjLVM; zSuT&oCXq<85)*_nDu67dEFy|6k#2u3uuM#13u6P=#7z7_grZwJw&4$SQgN}0*%l;M ziB^i)NT6gat|7k#E9`B2&>h@; zd=P{psPrdUi-(VI7On!XC|t?bE?foa3bX z@!Q~cfrT`R`CQT0qWxtFi(M%W5wOr5+4;1!2n(4^r5FYP8A6hZGGlCD1_K+k*m&EE zfW;bqUhD3OTFg+-=T?nMI8w5oMVGE7a8|qrB77Kc#fyeE(Yr%bd&zO0bn!*2G+IDW zMui63f`Ygp21`V$6$(2gf833UODye!gi%G}h_ACi0J35tNxCvPsQ^nzBg786U@o1n zWWVCxJr}Tc2|9{_%6o=sg_N@H`r-931hWr?VL^5(Nm^A^*=4Q&sXa|E2Digl7nDtg zi_PHmd+Q`wfmO1-`%c4#95OUw0a+MIi#@Y^&=CIb>$VPW5U2zn#Y{(p*$Q^7o~_5H z56u`Ex$w})kcJBPL99X+#VhR)q5XZ&iO1poj$Z|Nhi*2}YU>I7#GVYU4rX|`JFpB@ zi*EHjmBEL47ISDYi7Uy7#1)L~0`b8aM`k>Ix8y6VEc3LC?knNeAixvtC6)D9py#fl zd_5LSz~b$;$46lSa3)UiF+zY9U4B))Q78rmyBoSUI$GT6;Ru>Sa>~^>7ExgDW-0o^ zt3V0}3z-+~RoGKe!J5}`3RzJ-oyv>Z&ZVI!jZhF6Ag~BZ%<%+9^yaXr^q7bNB}#M% zM8}9kT(Fy9Ehh^k%S43}5o>{43UX0~s>O#dZY*=SHu1qmrzu1}nbe5}|3D)D+xtYX5hpx}FoSa|;dMh)R%CC{n=B?(dx zsY-I2m$laQa%kQNMvR#O*@4!Xch45{bSI+pM{p^Q?U4)Tp1_cy3t7f2pJ@m|g<&sd z>|ntxN=zm`1!ES7G;~Gx=(O=X(+_n6b%T*Amqz=lOb^7tG+l4CkypnW9UP)BMhas<^4L))3 znx}(gW&1NLn=t#?1X0|sf?5nww8Mr-r_d0jlM7H7``~xufzYCaa7hQUBG{2auOx*S z2Mt7|PS^?Yrl?NtKRSF!nLl0EPVv!=|2et5*2MMl0zTsERr=3q{(nN*rY4+3n-4!3 z{`Z^OSZn(*pCx+#=YIjLe`$^Wwwb8Z^i>k3TU6NxzQMyByuHU?LCuo%sK%{+` z2R(G<#F67$j~^d}JE@ZjBd3sZMPxgqxwbL>ZLGHRE}m^H#mD#K%I%Z|0x2lzZM zmmgXMcsl&zl5}EZG24UESkUegQ#FY~ZvkZ?P!Rsmb3NQ;MXt@Di(Av9qJA|MFvM57sg@kqP#L1!KTTgZ$f9Qkh z7$>Ay75`Aqihg=9%Me};fK?B5K#&U!;0JFw+yheCuMvx|3MyfOQWUaaW#;A#z#5id8eRD^SX1DbDvhpCq)bJ=poen|o z2<1ycQz@p^;4ceDq+%XkzL&yVh*LG4ZK%Q+)W~{7I$0KhwNf}oeH%)kP5ji<^GvCl znKd(KN(|0XYq$=cxIR@=YRNn$Pm)UE3h;S&QoUCcT5MJpQtRtkJ%vBYle{`MjL(3= ztb)H3&zhoG2FnvQT)ZqWh32_y-KsAIcoUabK5yDngfBbP0>6hU>!ek;-Q{>=SD{GH}ufft(n9ktsrIzTCAao z(O?#}z^zaedyq1`(^(bCSD;l=CCoq;m_=<6YcgzIN8?qj3?|*$&2~jkhFMqY*JB&IHWgKZA16v6s;YJ_wQT3*y$j`Jz{f$9zziP52{P~dVX$#= zP!ZpWS*<(~*vux9$!FVQ7n{BqbD*IBf>owRgEFuY@bJISXAj;x!RL0ad67aR;j^9m z!B&rX9a1&P&o2S504w#M{9H&}rqK{etO41pPBt#ab<7-0f40fbk%T3D9eD!IqZVY& z!debTcVmG+11>QKpU>*(R6$LE*aFh_R$2{`8G>cr?AAA_{E3rf$Z?T&bwL$|A6^vMyR~)r& z$mJL$I-nn+n=oMODLk+v?k&-V2ZNt3W*Ig85Rp`rPs=Mjd^Q`C}03oB+FeDz?MwUaPs(U?VR*518z%o2ZOPbags znpyqiC{~*RuzL34SI`o=2sZx_=&->mrI56fM`zX@fouN9rIkYijMmCt_TISkec@E0?fdvN6K;X$>5s(A|cVh1WyY@_in9 zZbS<-@N0>U?)>7|r7r2f?#6&VrLE$OF(O8wC!$NMR|^q5h=ZdmE0scePReSTlNOp_ zE=sc@ZV>3eWeq6PQgyPZD9>V-V^wUGX1@X^*|o(*$Xm6^E8yAii`>j&I6@X$_D0zb zAQI-xfYO`^B@#OV{y&rk{^uye=H z%}Nj}lCr=8+23DyVJ}w9f>RYBgkSFP0|;UJ(AI}2U_rz(iV3nB&}rMi+kZE6l3p-`C$E1 z9gLmRG83q9ENG{jr2EHW?BEI@63M^}Kh`d@Pg`B9fUTAEL!39X6*U=^OhiHI7nELPAFy_8tOiO9{%bhld8`{!g}I~83-_D!OMYe4mQ(} z0t?>?78an9Eo=P=OurF=u#wRUd(bHgNF=uiF6{6Vv_yc-YATiGA3^}GlE^Z9d+gB= z%_AhXs0}V!a*^%I1_vWt9fYm@RodF`z8h(G6I`N|?Cnwr>DGYPchRjKAtn}CUsZ%v zsxjjLUx9rcWLKq)5@JQ5T+BtdY;dPBrFi;l$3saA=qPizU+ z7`9_eve3n8mf|_y0wp*6nPfHY{2Z|D!-I)W8TpW{+(%2v5wfHj0#^#gD;cR|wSvEB zQ4wsrTxb-JYdy0iW4YC&5R(8)XatsAg-*l%!ocp657T>lLor<$VmAhKIQBV+3UKIx zn7~Efq2`p7VAb-bVn|qAaWo2&x2O^xopI#o(F-G!t~`%C@(SU|k$vZmm}8c?zeCK5 zkR@+YnBUhe!1Bqa6cSwaL;R3ILYMPP)Ut$7OnWd)<$$Xbj;kPD#TG0Ruwn}qfwlRe zMOgnh7_ZEefqv~AAPBqyuIR~Nfxtp=USVfutQ9M+#cjm=0lxA>&@wxq?lUZaTviPC zoxcc3HFn{9D{gMD&AY4;vVSE}!=A?9&=;*sMu*-(BOxjv%Yo(DwhO>YG{xeQaa1oV z?I#h*#-1uF#7KsCxb*u@&3F$bdc89ykQEk$OvDN|!ODd*sBu5= zDt5xSKz#c`8Vd$s;leW5qXQJUIB~ob7p?vbU`ePV->Cc*R6?d=N(3xZ4%s`f25&KX zimWJnw&T5?)}<;-ps$p*Hdkfkm!N8PIwqD&Q?wpq87%fe$X}|}hP4OWh7}P@kwZh% zFEDa$badjRp;PyA07*naRELzsA;aMfRP#(! zk`^c~30cHeMqsHRWdT@Z76mVtuOjivj99Tp1D&wkX%wvD;NaHH;bk~7Ud6f~X=QGr zPalLQgHa0dm87cxEYZr5_4Km#Cam3q+spf_du6cVmY$?EWN|_iNyRinS3aks=hj~a zmO5+bSBV4lQtQdC-KlqmlH418;w@t8?#2X(GB&%}VdCPA>{@J@C9gABFRHX*5OH>7$_4P@0X!%4M=im9>+F!qzgY z5MJ7{O`phfF^JGI^GpQ0IQ!2@3E~y@w%jOoA;@k;UeV>9$dXxvl9mArV^tm`TZu-L zo`4~_H)6VTVLlv5A!He;*r9|c?y7(+?addfxUF_CC9E0vNd`z*7ii2nH##)hJ!$CZ ztQq`?kVVB%x*?H88bopyfd%*X7xvTrU1NnbSGh=)!6_K1;$swXW?>ISk`*9eU8E7l z5>{k)4?@;MTd`a_?N$lfm87c|cyZ#@3QWV&ZEJganb=XT0P$A`oEdebB&?sHsfM-QJo!QS75<|UEJ2V$vSzOR!yx7d^LD9?v z6;zTH_N_~2$gl?N6tF%;=L`*71s3xVE&_C8yWw<}%gk}%^I_@Z7G`3G4J+d~1{T1C zsf1?60;4oSNOXZ!;{z+uiaiD0$EByrvgXzX_9%6#!a}Gf%~-ULfrTPop#uV0NTRb= zRaIMCeKA!+r&SCsNmwvmLBbju8ks(N?vT?;RD+kpkr{YfG?l{@LCOloEDjmM{e8=# zo~4_Dkv%4pVqg_<#h(xeH40b6n-fmJ%Cun7;%;6ICSOU$())6vp+Vp(V|_m16z`u$ z*gfNkSu1%QfR*5tyxe8L;(S6bFC!gVfbx56_Yx_lgwyfOpCXd9VA#^&$Yo%u^LwWX z9pAegyBMPallM0zAkA|`t9auTS;wHlEq-|%2`W6opIVT1=x0~4kjVoCI~@z?&k_YZ zwQna;!Ej*{QhsVy@eknDR4x&}D4MtsuT3pYscOpG?6aZ_C#a)&x zd0{17vB;|v`xXb=m1yPKpiEc6dIe90S<+vFV3ojChIobf&sZWE;we3`c#Cxhwc$~$ zj^m-g7Zche1pLC3LW#qdB`ox)L>~+NON>yT1QiSnD1``ns_a$RS{8R^F86|HP(hgX@P%L84bg6PB+_i`Wn<#pTpc+**jS##nwtrwnJt-qUy%D^5cbKO+BV z$g*@uR?Ln1w!LLmrIWL1PJb`p*i(%T)j^!C=~;-cihAdFSHg`LgQ8j7SBMxBm54y+Qr zsyd6BTbE6PN+_LBpz;lj?h`ROc;tzFqa&juL+1f3%ZX*MBNvVnSpXJZ4kl)qUg*y6 zoU(%zv-a$iH&&3Nv?r(#xCO1a580rUBrQP>*$4qy!Rqd$iiQbk#(I3;0_lRZT*a1l z^J9n{uVx)NvO>~Urg-H?E8X%=hpZJ(16Y)>oKZ2a_%NW=ieCk+R@nu`c%+C|MYZjB z!Sbk3czLykxNj%AVd$UiY?%SY*~>{WK}PIQ5oZUfqwZ@3(M?&DRj_3pK|&jA$r7wI zi>0t38XN|Khc{@ggbF&ci*{hJCjPiH=GXzZc0x89r)9?MoD``@7UY?9rKag8>gTXs zRF#LUp(=_*S&DdZWV4Kz#iBg)lUyuqIf}+=eHn!MuuP^qu%sIzu3rjNV3n=sKpBgM z5zSBwk8yVoMRy^v;K_);vXa7rTKvg26*?E~E|?O1{f*aCQADubhaP7oIPI{KZ&YnC z82+lbUTvY}3IVbo00i3= zUN&gF8lw=Je*?I+@@|u}xWJ4_SguO*?oo0@ph-)>vL}Z`U^1&Hx3V~%N_g3=A@n$Q zFZ3zvZt8i_5pyh^TjP#Xh*<$3WP+4D2bR*=h(U^5@=Cem1B*43!}B``J_=ZDQkQ1e z9bY7?s|jAPf}L<|YRJ{zDqstiFo6+nEgnVeES7B9EC~F#7-ns0%SJ4MTpzX+cBme* zf<&!Y;8Na)Y{p1b9|kPeCa{7f3y^YPDaI9&5%>;OtO6jzdkiefTL|nn+~UcO5q1Q~ zO&t461Q4sUuC4Lg$pOo9Xa1UY5Js* zD^0?ZRv2_cRO4C>Pso>)$TGcpt=qhF5BcMP*b1aljK?7}MwXSiSiW*2 z7GXtlEqHv>W`C2jWUGKHn%R9|5Kd#j6>aSZ&ZxQ+5K|xo z(T^Y%ilDBFdmR>Jux62nU)|c28M34=vaDszY5Q{v*F`H`au#}KR1 zL}AP1EJRTzxQt#bU

x277wel?O*rldb?uI9&x?tpG@OAK5ocs1mXwllw*Fk~#>5 zaOK@+o@{F>DF(0%T9sHznq!3wkg)Kup#2YbT(b+fR#rh6&K1foOIX$iqmC$USQle= z^k6W-fpH~Db~gDjtC2h*RUK88$U3BpRm>%&u#bx}<|$U4bwmAdy0B+i#Z!JJoS1=W z+Hmicm7zp0tBM&Lt75f%tJb)Y6qG1H(I}&BZ^_uk)5ffiPoif4HW7cQ5~Ato_)kVY zHs=gu?neq} zgtjrfu@3lV?(Z?O=;pBHnrIydBI~(zC-!J5K5~dZV*(N^U8-QF1q;y12#I0B#~<3d zI9j1ERtAk%fG1Qz;0od*j8`(Zi&&Jfs1{x%Ynl0q#9HwZ-aFxXAn#*wYiqlv;7Gy( zryysMU5Mey($G-JugV21?yZNRzg((;-3mRETlFyZYd=!A4e4S8ZxTy!OKj*6AhN1{ zFV#%633(w?RRk<=E0hGo6!jhJ@dBdy;i^;!sqz-}6RU7&h2DJfpbVX>$LZ;*fx77%6*jO<PhPX|vdYJ2uKW7g5p=@7AoE*yIO(4nJ~&L46&EXS7QD`(gfM>btJ zI?KHrs2IvK3sO$d3}MZB?uA7?n9FRy8iOl41hf#qEe6d!q<}RhfL5*(LL0=I3}OA4 zU~9J*;Y5b^gDY%J1|iDjtIS=j5z2r?i~Guzhn{TXEtH*4QdU7jGhUZNFOmpUicp?1 z7hhnC%u>Q-U>PJxpNx>v;nCLvODqCfIDc@AOcH>FBtm&R=t1hVQM0TX7{}78!6Y51 zm{Ow(iui?u!~|<}Nq$U@*rgFwaUrCKV_qI%qH7J!#e3#N^>o0akfwNCm@y(qA`*F( z?kz9RNv9}$;gDikW)QE~YT(L6`-J!v@*G&qv5HhVy@fPpiebboy1$=Z zx>QIKnXtjU=8RxM*4Bsi;b*II#+tA)aJA`lG&GnYT{*5GTpfh*%A~8Ld_{VN5c5i- zgn$)!^#blB6haJC_)rC&7*YUv=j}PbyIYl8)Qr{i9aXip(hK=z<@5jek`Cx#>|E&n z+A9|K`eaWHw<+q2h6p5kzlPk@Tag7(gk6Pe;AJ8!6c?jpt7nVeni?0o; zSL5aFj5wCX27Qw>Kxd}aroLXMXF?ib3_bi)vTa0JDLReCSO8!Ede}mg$s?6#w&m%B z+4(uC@|JCbgIz7Xq!>Rtc2>{#Oi?m7e}3Tgj2j>$@gt9yXQavi7DXxqm#w&SLl#Ub zc$$McaQvk9*U(%G>1vFg2wa)ohX@=V#4Bl!q*Y}}F1`cAFt>+&krI}ySXE6e&&H&3 zv1!JPL!;G0M+mG#ug{-<4!|Ovz$^T^N+_@y!swWlA!P{(F|#yexOWj&Ne+w}iz}s* zRuZxTuf|ANJe0BhaZbaL8-w|YK8YaXm2jo^lN~$=PX^f9q5mZmLPwP`YYeY!k(o1l zbERDKP6AjQqoB1Nca(RZ4~r1!I*Qv%F{`Mktf5xuBC+(GS8usQH{K&1SY}&dT9^of zSSS+2D(2$PVT1doo()2k*8THe{@Yh_@NloF`{ytI+gH*RF%3d_iechTxZjBbma*Wc z3_D!{ffe{>DB*ca$ApTC3Qs97SEM&we`qZJM2J~KmgVLrl(*!JOcXI+P*&M3-K$fY&Uvm9-UXNz;}WFef+!XV%f~Nhi-=m~rUn=%k_7U#Em+xB{?Xy*f99 zwXzP)Fb{Ylj8fLDF*9~ZEGmXvE{j8kdl#QDWQ~g}P-^Q#60js;Q6r>M7%7HszIuGY zLp__Hb#0Ks6&)FfE5V2=sidn}NATi#6Q{-@mdXlPD-By1AH;GEXI4D6l2r_sB`oW!wgpVs9eEJh$CVQ}VL(xmdUb#n zJ7i9(?T*hJ_|e-3zE#zk{p5Uyr#><6s|2g$6BYg#HMfDZ?1PZ_R2tgV!@ z7-Cc<1+4{-_w?XhgK`ozR|a2@fkT7Dm3YNBIfF!$t{_b%lt34;l*CK~zT^uk;nOS6 z?B4Pc;V$&+4w`_)sNZNC{J_dT{5Eg^feVip%2vcyZZ5vb%fN~Z=GH6YUQN6hMG%XC z#Zrj?zMvy2A=TUa#(}pF960dykKU+RhSW!C>R-{s9MJnv|Ial%(3g`vC>jdH(REV zR{edm8_UZZm-mre8y{>*Pe`T74?i7a{9}6xVSllv_hD!XHBdc}iGmz>#r4`d(^$CO zitvr93_d6|C*XFLnfi2{Qy6YB6aL>z<4a2CRYt%+RS7vB)ShvZKp! z;nCvC!aBTM57u|A?MF2S>Yxc&5VD#o@z>V21q=7Z`rZ>yyneoVI#z4Aa{75AnW&`A z6Ej99j$SxFGIBIZ1LJ_K3&)QTStQnq70xU-zmr!8c*lLu9$;zwfQ*2vz^h2Wl0LX# z!Pdxl73K^E=_dkLN~|Wb%i?BP3E#0RvkRwF-#u{PvtKEj zeB*()fB*7hFUlSdLJWYML@gX7z2H-PJ;3*`@Nd1QB*R#fNTGW}MvdD2D%Byc#t-oo;;T*t1Jo z@Ro}THBVtmgmPjTy3AeFWvX26fi0j)o8UMK(^UhEyP5}>gckad>@FA%#DX#A&d%;e z0Sjn?2SaUTRdI7cen~Su-)U`!LRbb?6$4eo7gfXDmMsuWL>}kR`RNlUP9MF9S2JcD z?e0Ez=n$qxn+Z#pQyp`E4-=yyXMqusVn|@o{J#G2O+5xIEP;GcfDwyn*Q{K5&EBRazTL}gRuG^Vbf6flf|O=K zuH3?Au9oE!ri@$=uITDs*3eK^lnx!|lHIdAS`Xzmwh|ec)VE^^izpFoP}I3%B34ds zdFz1#%TjIiovCFIvp!p&H#61Q{EHv`J_TB^VFDuKCaVQD67h)_U_}`7z}#?!D#=Sk z0?E<)<{#c|DW_#!p|Gm1v9YF+Lv{!-W>r+=q|-nB&HHt|DYT3RS;^bA7`IA7a+Kwy zVPOJ|^^g<+3pXh{yOAnjfB&hu*VXk_l=6J3{LZ$fmae(9XMtk)*mjXRt7wt{mPHc@ z#i&$4suV72`JOv_ zmKRoHSg*E{@|NZiM$Dpw#a`vEScpk35V^o5yz*-qdLC_A(h}k34rEas1hJ?X!n*L~zXJnxLML71m?b&Oq%0w8i<`2j z7(Tms4}3|DOr(>Ct=K~yj5NXw>585Vn--0OD-p;oSM(Frl2=HKU=<-MGa`M^O5MHU z?!EWqX~Hv+g}aB_EA3|8C{SO|p$#kCD38GYzdJWwYNy*MH2 zsGrhb${?a{9*QB6q_H$;W~o$p(;c7r$=_o|k)ryxrk8(m;M;lS6}_p(Wj{Ia`}SU$ zy;WB?IB*Nq(TL7tO=;`RhFx?X6eK@TCdbv#oSeK@{_u{mDh+J)BHGJsc^apzFQ})3 zc3s_rzx~bR-jv$2`bH4v6k6qJt>JJjLXFZuDuKrsW+izUSzWSNJ(!;dkMA51tF*Ki zqizLlsnYUovmXYtx+>Bv$SMdIS(%(p888ynGO4Ai-U4#WqK_T^g$oNi8`lrxO)z_Q z4u7!o*vy$}+S*B~AYDn=VhTd8xh#WKpt(Mn$+noVUEF z@~&ykz!kp(R|xUt*cU`(<>r=^h2C>1vdZw0=vL|(zVWU`q(sn&((G=jBrQq3onL$z z=BwY!5?kK}O|ZSUw6vnPv;iiq18>Yrd4G?pS%llDJ^${T>F3{hC8v4KJ+hE1sk`e9AWss1Sw(x?>bne8c4 zq9U3yfpw9L#WPCAvT}eA8scdvUv=iM8y?=eZfeW6^*tZ#S%Obaq#;?zLOcnqKqqhs zKM}3iQf?vL-A(o?!prH)L@Y{Jn0cc?Em?}yyU@uX8*nnT_*B-u?E3bCLK?1k%sbxv z&#ia4fCXH^AFKA-rm|~qyX9-Q+;T6%3%j3iUXfdha&N)FbW{=+QlCJ&`DB^l-3y(& zun&v;Apj$>Da+ilG-3!TYs-GTZB=BtXrtszUM;}kdMbm_`Z4lj(9obuS2!JK4MGbQ zuP%bt#SnvxMO>}ia@(h_0qt9e>8`VbxC99V=^3@p5J z^|B2s?#AdGL9Rj6x*CL;L;+7T(1oOZu(R@-5K^!F;TO;U`VW8j>97Cr z+XsLBhu;(yJQ!K8e(~%8aKm4g!(Rrmn4AW% zHkSAHra7X6M_*@ZcHg#~Ubv2?h)e?O`QCJNI#eN@K6b#hL}htFyaWXBie@W(7~-d< zX6o_b%`N3MxfD*wZI9Up|MflRnFaU*A z)w0!o;H;*P)agZI3SZ=9~lL#hE8HBQc&xVm}RW;t-Kt-D-tVM-z8=d zT2CrqUDDHA_iTl9Wxr#w1wti+tbLEKk4;y;B12fI-Tbb0Ymzeu{20axS>xeL1y`)t z@})0*>QkS(?KUv$sxOsQ*4Dz3B`KA+l!hy6f)cL^@wN%R2inplPno?viYgL!9d?yV zFrYV}M|ek0?82>3&t*EhcSr=-5cS0D()I&C`Bqa~O&k83%PQ-O|NiZl0j%EgH$Kyl zDlNU|<+uO6ygm>sYQflOt)L+uszq*;8m>t>Rsf|`jh7;jzVe4(KmW?F-+_eneERu! zU#ZCX;UE6+n~R1Ge*-0vz=}U6;vul55Cn#Bs0?L-6+9tAz+4(C;lt%wrLY?TSw#g^ zS%U-j!KBoS0B47`Mo3txblftl{uv>GE6P`18{A2!(iNpk)~#zyrD0}YJlxX)Tme{3 z+fIJ)Y|YHl-ipR0&o04xq9KV9Zwvxf%q#)RBrHWsIQUebht=Z9GWH2P$4g3VY#k&r zO2x!NCqqZWTl5O?lIL2wY^wyegjO-$sEWBKZO!*|a>t*%Pks6e0asVuhTi+7YvKJK zFeNA@L@Xfc^`Y*gGY*YR?7r|i?OaFQ9V^xy!7+D#C$TtUC}Loep-nS1X2JfxXDNAg zaS+6UkhNf6kEAR25)Hh9$P|wZ(s;G|8cbbg_%I!CtdMoh%2%)X(zRbAv2GKw?!Dzp z1stT{EhD2U?Xh6nqO#_)0(imE6HX67ejy4FvGBDJUVP|W1{QiNdISSwq3<$AZp2o2 z2sFy2?OdhkpTK^YU-R#8f48(APtF$*G483yN7UUVa3B#lrf+^126~f4=Ma=YRUs zH(v?iSHJyDV;aB;K_68cwI2?V4K9U3JTh1zU%1i+$vRADQNpSKpmK81%PXr|empRx zuCW)G?oC6L>O9ro1qq9#y*8our;!y%Wxfek9*rFo?SEW=M?}lwO?XY{)^+&697dEFxa&rhY$RP ziIe6}lA{)lU5PM@=J%t!vB;lR`2(|ri;OYDz0WkVtX5q~f30HXGibB@Do<#{i zQLqkDnxrf6il!@s-I(M&3vY5ZUJ+U2iBw~Gb@z&=pSza4GGgJgUxj;c59WtMeU?Hf z0gL)K?r9N>?YLc34EaYuMNU}!S{U>d#!vi9G{!E<;V$&uFaDRG%}Zxzw>ACjCtplS#8OS&XSJ?#s-du9 zp2sZ`AM0`?Vc}9#1`^ZHVZ$OJAVx#F!}RvvoYHdC$;MZX|B3oMv{Lu}ZyL*cQ3KUj z5!Ds*R_s^@Q2+eoDi`909IM9q_)Slk(tj!o#yeYFJ8XAGd-+E?78J#Rr51|f1s@ib!#P-d{AzM|nY#Kh6S2HuO2K1fN9pNqa)`Iy?SVLPD*)@C|H~WrH!rH3{O@ny zkrhc;cC%SGpo#G)_&LV1lldqga!DMTmndQ7=g-3y~T zh7R>HNh$)0rYir`YRS@Nz(UmShy*O^fGjTYN;!6+={!hS75O3-WUA8D0}ES9>LFMS zY;1($mTueF-&GD@3W{tIpZ)}}tYB1JLKe@a^Q)2c%<`6#JJ+=}rkC^#Z!T>)e)1R$ zW-y}TgvW+^YO?lkSkTg0U$k!1o|eu|{Kw;lM1f2)W)WHlc#VXfeOu(Xq1w{#c z`Pmu!BFV~z3T1@fjR}S$^Uoi>aAn8Q(fLOY9U2-sGjv`BqR~PXgrSSbIs>Rs%%VAq zBmuKxQx?4(9$!jiaV;!oR-_C*v}f~2;)+wQ>B+DH(iW9L4`XGiagJBKy7$_9$SZtM zidX^`iFNP2_W)VEo%jzWov?~bHnhQ9rSR@cC8QM*z_Q1PbEu79G`C;RAL=4mzUD*yu?0+06%Do?M?-+1|A5?|wEftF-3t4}4}`PDLuK{lAOaI~L&k*CD}1pFHE0F$&N zthBcdC=ox=xiZfWJdsU;nq69iDm1SY>~YoU97tI8kmypFx!7AXIB<12d>X3O3=C{+ zD$GvT)NJgZ1DiZhN7~5_rM++Hr5-|pXpmMzs_&VJYmHK~7H>FR--vK*=boymONWnT zrPEN=XO>p18}7+nvZ3ex8ibiFWlL5XuP9>iDekBu*)a=;{Y7e^b4+piVWIEPeH3~j zqP&*~Mk-{Y4;5BoApr_kkv9X?L6fks6anO`HtK~<#rL$A{m$%HrVn1_0+u9?Yp<={ z^3ah;aH6E;9GZ3L=*UEbk)tEs0M>=>Lqj9xjAf-mF<9hj%Q_@6$cSaWq*^fRNe|CG zw`J>6Xodk-pq6IiEO>n1)+aGEXd{CV$TTuY_`r50Q#;$$f})XdMPi}ApOUcdes#;W zmDlo@$Re;l$?k>o!WSph-0||yzV*+=73HOQl(5n{d4+A$ z-gx8p&2`uQ;_YP>2}r1|Oj0b}AUJ|0i`%qo|JMU@b(kRSYres;oX%!R0&5?KzUz`0lvaqfAiCSc}G+nWAUIaRs! zaA+up59!tA5OmU4_w{d_inMeMRKf?L65?#EpmRphi6Ud^6lEadc{pD(H9xOs=drf7 z&d#dIJv&<__k6H8T~pedh1uSX+dtSmVf}_hjWso;HEqvs*qV)(+sNupWKp^jrMScM z8XHa-L^lwzl!_!~Arq8>6DWv`@0j9D`3iGQOuBM)5cggF zR}j0n9#-A8&0qT0FUbFjq6L&9080`UWGo9?ZsqDTX2^<>_4=&W&kqfCkJ9`OpZD$y z=emzRG2_BfidnLJc~RD*VkpNfNm;QiE0VJ4{=Vh$#99spENt+ zE3C;d>uJmcB(Yq^;{3sn1{ORSUIMG??Gu{W-6Sk(g}2;R43Bj=hw!$-S+rpq-txhy z>46{>#Vg!z7)LQJJ^IQRx$M?J8W33Qs6vA_Jo3OC^;zr<9xBITN>24wU{21BHK{ue zy!`umtdP)~h9A~EEZ|cBEBwnZ|657J&wla`_t3FGVjP?0Nfqq8;Rt&)o4f!WMx~>A zuAXM+zXBUpI;Xb+&gST~DY|Z!RK4^5gY^?&vY~^RNm%7@CDqCCVE_QTa^LEcC$1oh z>VpedxXMrp_(8w`;MM(y^Gnc!p_9!Wm{MNTo1NV?&_B1XuAr!164rI)02YHW2WJy{ zG62MsSbS3cm`zliEv56*oAxZJ?1a&(Y5#Cb=i)zZZK=VE6y>GmOCW94uOB{L+}4>7 z{qW@0Ha?-bTmyl{z#}J1u6cnLtA?ssm1-CzPM3b@&Ppdbz33{&kJf*I>l6|ADqjSi}AC0aNeLIS!e%2D<* zMKPqSQ>#NW<==jC;IpZ=yn^=jW%Xsnz3Iwd95~R9aS%KnK6~K1l|`LXUq0|H2m+49 zsPjkXy$D+ZS0G2stB``ds$|zg!s^Y<2AI%md+SQmcqSD*|Jz?TO#b;i%3O3aNJGME zG`9w-bNaOQkpqOHW|*a|B>w1hTxMVrB1glE(ac`=>PeUwXK~HjCfn7^x z9GQ{f@=o(RMiJ==KRWvQnG0BxbQJLF9zApB9GDgHO65>=))N;t*qaQ=8XyNak&grC z>xfxe*3`7Q!6e8RzR1ZO{a7z${nu4MfkP&AuhqH({Y9^+53JW|1KcH>}^*Xy;90OQc zSNEUF!|G8*`P&8`teII+F|+Gb|J;^3tQK5Q6eKJImSZU9QQ%UvH>uAHBxprhFaucG zS=%?Pr_xvR?9!f=wwz--;px8QrDKct4DZ?2)U;&7z9ofNf~s-RhSPYrIbZv10u~<6 zjxN#4AKLcVw(fu@INY!JFi!#tGM261B!#dRww78sHkv#Y1FN8*7}gj(pdf8Qz`{G~ zIXednB-dX1yDtD)lCYo?LMxmfi8$H-7d*tMc~;-Ymy!c32_V7Bks=IHwg3r{fUJiX1r8S5CS#5tB`nymB7H7G)0jvo z5Xn|!@{@U zL^4D%fv}Pmcf94Rwzlp|zxx7-6(K7YvS^Ezawujkkz-Z{twgLtM~Avc&L28-{z|;X z@XUoPhp>nPd>r89kescL#^QKkPz*I=hfv}YfAn3jWv*;%xOy`3yNc97 zD1%QN#EQm16@VrC6$Gri^N8gBU%W|>o+u57?7 zacX&+Da!J0OWOMWB-)?{=vqooNX8%Y=k)1cxq!K z-J(wQZ-dc22^_{h0!%oeN@o-y9-{zYVSeViJxlkmJH6@n;#6v8y0EBm@$uo|4L$4H z+S2Kn>HPg0jxSogZ^P2{^{{0H^A$W!@Ln(eus<-UOL$+fI5MI4dEBUl9>ic>seM}O zT}35z>}L$xVPnv$EW-;7m5vQ3<4}0eJ1B}FVKD$%G-FZ5y6q~;Si$rj*|Y9>>1nt- z5j@c%LS%1M9wz(17tmY3GN@$&DRtI$d7>;HigR@LY3xZ{p#%No*I7^%DQ z?Qg*b?TsZHWKx0?W3qHX+JuWyc~8!n0Hgb_D(dTtipt-4|J@p{50RgK_x%SUf~0$2 z`R#Atgbk})Dq(LrG==^z67j5R)V9pVp`XTgOeCl*h#d5#V#(Bl1AX*#Pc;tq_s?yd zd}`p-Hu~J(-nSa7Hl(Na^*4UFgq6flqyc7-DoVAJI<&BcPifowtxGp7-MSve_MF_p zw#J&4mzKQLR?~=iIi;oPsi)!TzH}4#C6l`&i@=g`3InH+GnQd1^n}79jQa&(2~=T& ziO=wHsBLa2tD+V|WSK5#;1aSxFuaOFR(hmrk%lrX($G{^_bCGwiS-3{#gdSf0WC9U z-7^nTmQ#r8U`9APGO7FAne)>}&cA-4`{?;e7cgp=5vWfd!Xke#zsvdE6NiAS+whSQC|*Ix`V@@p zx_8ZZO{&pK&jx!wh*CrsgT4dBfGj>}@OK$l?3Pi;Acibj87Y#n04)Y}<5X7qEC2fe zbk*|S-yeASjfUQIUVRxPtkz1*slBIm*}s3boxr-|?SDcAXF_I+#6*B%0u*+RXlr$} zWg!*J$*TA{jP7|@(q{7ezkLNOGQiCKmG^&Dg!Qn}<$w8`_kUWSAK9=ZVew2+OT2#j z78W-AeL?!=x@Y`XijGu#M-!V;BZ$KZo-sPci!9!SK6-rK3q%y z6Dk2Y8AKw2GN~jeT~tP?zCn2qE8X(!v&UY-3S6aFP9_af)%4DUSxaGNXVa2(&p!K7 z6XYv~FzwmB+;f8^3;*{Dd~&lJ@JTKUyLFDhD&J$$6P&uZT6+WL?Lx$gf#o8W3^K5} zsQbx^#X-V07zn2Q?h9X&j3veJ(`Ls)=e_N!PsJV%kp=$#Yw#)>nX_oniUZ>3Ck|oU zaQ^wB(T?fo&QI)y&x3$vuL!f!C0%42zdpW zN|+L<6i-T6t`_FzR+d}_minM~W9!3FO4PZHC{8Nhp(khOV0{4Cu>QFm+Dh}!e(~}f zWvQb2N=jJxLf|}j{Tp}GLM|wO`M|PrN;dknR&^5L0I}%wo*HFl9Q)N7Ku{^G0uoj! z1gy%+=imR$E2UT|q3+%H+ad4umj4tBjTYnK1u&UtcPEkqlVUvWDZI#X={UtUm z3~7uiqya-!oEC|3>s!ia!sERSGY)D>vpeyDu}(5yQ(=?> zpfp-&I|mk}EJjHtu?kzHIjFeHPvcF4Q1^fGca(h4d(-tfNB{ zFPyLLh6#S?!WkH|SSb2sH9BSySt8bol_q4t`#l!404(9^1ils}CL)Gl2?8JvZe z%A0WI+oXIop79E}dUbClWh)6-CS#d&C4W(lHQb9CN}x18^}S!p1E#pDi9!kdMg%O$ zQwFVAw&K^~Uk$&Q0<5HU8Ccd=*@5F=Oo~J)D-y;KJyVCUfA@a(z^^B#Al#&y?s)kQ zc$k-Algb2XV2yYiN=T*E(b? zL$i8WaoMuW{at=pD+w8p2}?OBIIN@zA_ulB&`Qc6Y92XqFauW72~ENp-(3_9-+g9_ zJg*Y!pdg$ywgXooe5teza|k43;f@smLKxKW=LMe;nlI(wgrQ3Z{MyPIN-obOM2}KX zPj$Bj#?fhItx`;xC>WCBo}bg3^_2r}|LofpsT5W+S@!R>MfDmb1V$<`(m`kQGOU*M zmo@C~Ap|fOig*E@6URbPFQThN8VlO>q7Tc4)e8#^PL=cEuVHP+SYZ``_2zGX{d{>& zHYSl2R6h9IKh&k^1!hf#Q~6PZBG5`qQo0J+RfV%f*CIx6pp?Ta2}RHXB|11Nvz;%mzHVmI!UsLcbU5%D*TCfEES$N+X6+?MrX`vY!-y`ip;0hgsDoGUB zZ4e-M6>)J)OyZH@icBhNuEmmmw#YjPC6p0Z3_Qlter*MivTCPIn}?xA8r_q~;)vnb z-2CoBR>J;n>eNdw-0F+`QF1~Mu*fhty^o$hfBw+<>I<`G937oFzZE$3#2bI+Z zBZhpF;XzolAUwfrPC-iIl)rz~-Z&503gd#r)vJ)mc4Gwyyu2$`1&v%Xxw8TMSvzVh z+6Y(om~iFlV1z4*RMZAP{b{=Sd-zhS79)Uh(7on+ASq1I^KERvyVLN_A_~e}EAo=| z!QzJ}1gQQvova_nTXZ>e7E(ebtlpPCEv+aO^zgI@K`-(5B# zKf9v+CZ{mSJpLkZ9MhUwmdHH4wfx%v-yHnM=%WR345-tml-T!T(*%{y}ieJHuS7Nwq(gv z@M?I&{v|D#I0#v*9CLy4Th{dqf3UtSZ^@FE_O5$q>DDDPQ`z_qAW6YTPLp&vT1bxu zl8P_8V;=yg$S|M@{U-Djb|Lt26*uEGI9dpUy~~iK-o=-J0b-V9P=+f-b$IC9$own2Uq654h1app zU-!9lBOOmj#8NILG6YSL2D0|e;*cST#aF~f%z{WHMUbi>biqI?n>EP7W^AVmmJ^G} ziuja_P)J)rzxJf1-4>Lg@#;1b3ZFCsS6AKpC9IGLvsFYaS=?*OFnvGpO6<~?!I&xR zmBpO;jK|JpU&_p`H3~Thg{PrCa_&;5>?B&l^rOPn+`72oy z^0MAI@ZE~S`l6;c-oB$e0+w}QwJQV!DFi1nUr^|JpX%%TXdT2BPuRH z1zM3_2q?#;N7=2S-bE3L-K+hF?PXXjDh85BCQ~nLyL2Apd?o2@wO{KD@;mSNUy!Cxd@LRgv-D( zU%aWnw~EtMn3~gEI!VL(CJb1G5tTKn>0%l!T;dd-?fad>&2(Ir)(K z5I`=tzL$LEH-CVKRBXeF(8D(M2?zzo*%A{Ol;Kg^`Bsh%U{-$4gZ%^Bzy|;;JHL11 zz@1$+uy|*uO4q=oRc>Q|s*?esk98o9;WPRmC2w+es%GZt4JYb5Ye2-B#-8E*ZCK$H zp0PFfoNy(+eD%#eEW{%E1=399%z0)hxbJXFNcF< z7G*628m=f@iB)j+g7Ip`83|P2l_QJgR&v7-gD#3~fr$3xWQkXige7G#<`uQUF}T7g zVM>nx8&Tz*;}{{t+4ctBe+JxQi|89+LM0|2QdGv*c^O#fRFV7?_z)|Iz(>@H8B@>3 zM!-T(!rYv^$^#2Ji2?usAOJ~3K~(>MMSjXEmmT=YXKRa6SaI~gS1=d3{lI6IRbV8x z@$Y{0E%d6;c4#lqAwWVc8x^9W4hgFg74!)F%-^9~1BNP7a3TPma`NlBx)XtA$f~PL z?p%rVIA3%ZfT>@B2Ljw7NO4$0P@G6ZXZEef@`?hHXKMdXtp4!G0sOpO* zU=H*`xUjMcHfn*b{Mo@zih8=u>6)oak3ZYi*qM(hP|ptcG`2Ms=F%;fUcDezJ=Ps< z*|P!Gt?~+ZJ1p6>v<1Fc1Qu?H`8PlZq&jF!vKS9S!0G@7ts=gnuo%**x)YXdV4!G) zPNt)(+Ge~{Rg5CGSPZ-(pvuZxuWzm_!rPwP_*%kBcN`_KlBO&T8Gem^q=8xVa=_xr z*5lm<|0I@jkZ5JXm5f<5Xw5hZDGMs$(3#hdP8>RPzWY2@{3Efb3>vPa8)7+lbAJby zUUhCs>B9!Hl}T5uhoM2IREB)DQmnE~#HlE<;@}JLYc~PQblHn>1y6?CNM!t3zz60(DR%_sz?!W)pxUOZ z#OlokyEYH6!;%%aIO)p}vH0Ik6PBrj@F5MXvOPNu^03L}^PDRMBzeVb1-`V9kgCFv ziXtpUgH|1!wBY2<_t`T6E6l(%tCo(VU;Dz>V9DZ7Mo8GQ(3@|IG(+@z5eu@`OOI<_ zG}Julg~6DGdC^$TVRYz>B&;)sRvyBOc3wXkUROb;xxfWv$^9M3BB3Bu$rT<(cGCqh zU6IppVouSe!Mqw0v_drElto^+`^?i#TA?qY4U)IOE=>0jrs)HXEMhRU^LHlHmv&ry-+7N_< z6=qu^PpBxb3Aw5w1TjYeFUgra(0^(h&X?Vr)!12HT9K3A_ERK1nC7Rl2Dq1y6wZPD z_yluOMZoe>YzhIA-1_0|jcu5&h~=>M3@^bI=fiWta%IKCGCNE5^uVnmRgd>zoE~0} zMd01C&zk~55mGd@W6v42v2X=Y`BR-8qX5fLV02x?;^QCDsA~aN6sG{CV)!^<6=hqe z0k2W5!a{VdbQra_!azZ+EUt%y1x$@YE22y0cbcV5`nWBLEHaB>??H_iM$(l@Tr^Y} zuqF$3@eNpY-zkT4}fB%br&XR7{ z^bY`5Q7Q+TNYh__@w5N%lLN@G8U`$$lR#n%>~PkUZ&gG|Hi0n|KrvLX{%Lh`CcxAE z-Ex{@>=nm2qr_=W%qqalx4Lw?s`5{%9Dm8#6zEF)6CMT{Q!r;3(^QHg|J6n zD!uJg|G@KTou+mf&1Mr}onTE|47J1_v_C$nma(-ue z$#Boq8Z20dB6fi+J0YvIw58{GV`)tefYrHvcztOqP4NnO!R6htMPk`p9rYJu6`90$ zeqjg@xYF1ac5rfcaw%$Y5v!!QVHy@2KsFAm3gKXSeLGfZ;7mdSO*XB9GB}QUFmfei zEG^`KNrtpdTZqRDA*+Nz!@W;qz7Fw2u_^G1@uTNnJ#=*9`PaMWkBnlazoS=lk93@m z$R?o-wV)(I%EFrrgLxg~5~(O$!IJ^FTCw6xFkBH;60icV#z29?i7CQ|ch#6z1db7leFo~tJ%9i9kKR7;#!L**Rb35h8G^BCJDfkOM*t6?VLVz>(haF7HRvU0M@X>_O2hMPFx74=xj0rOZCx_*Pz z8q&rkN>XeRf1%-z1{O(Rs#&;9-?NFFbm!Dlm`YevD)V=5`P7Zj2OA5qe8jlGvc}@A zfh;~AFXq6?>aECId~!X+NWAi*5x{E1QlkQv6~GCza2Hxm>};7?15v88ZT*JzxPfF9 zzadiy$t$4BctvCdw;ypH9j3UpOu`g8R4i1P>78R*NTZ(U4h9gfQxLSF}>{>}?LBI+k))?su#9Ddg zNle3$@hULOa250FmapA=n}w^e%hU>QgV%@OU(9$y;A$8EmePt~e8&<#Bo==$g;PuT z;kyb!eUJU`QVkI;j3z<~Hi8Q`j581(2zIC~?idn;tO*mY{}$F6{b!8E^``&rz=0oq zwzH}zzw_G%unOrHYjtZ?n+=R<(A)KFWQP1Wg=`7ceQ&GGmtwv4cVBt)m7n_$b_h87 z6@GN^m#@6?{vUn?ix&CfVN6pv6v5EDb(Z*CI3%nT#09$wG=pnoV;~GCKcDKV;UdkA zQ~Ed&I_(_silWf?XkzPQA@yN$7I0Lv1Y?pFIoUO7ym11+0+0M6&(hr0{a@$iAANn&`7?(`yTPb2Z`dKVG|BJ@%2aUxu3&4IGDvR**s;u%6@)A8 zFVY9^Ua{q+#1tG{o@6T*uOLU=b`@T{K~6cTj8`ULQ6>BmUf4)Dg+~IP47mA}W)-Wg zW7gCfjNoDMzKjr>$VkjQ!08PSR#urz3pnAWK%~GN!VvHV z)eyx#yiXO;cR^9sL>uhj+NpJG%bVmbc>+2ub_cVoMp%rU5TNqSJW8s8jR~N_0$w;ET5L#y`c%IXa^%Q4*w=|KYKaK54w`HQ z`xSITl1m}s%>ZM2ruk~+%4^2r%6TPYJFx^$28ve_tHKTkBpEmN-d4}WEp=OYpM!~= z#zWnFd?);FpqJ-XR?1l}d{s(U4`eUAR72=|+#_V7#ndw18f3*Ihv<^JUA99y-W^j~ z-tsa8s$aZ(;77lxyyNY+4Iw5E6WZBtTL=QYQXwhl2{jsSkxAw846jE zVwgadi1npw=WXGO3@rp{i^!UB=={k1ZkMnCtfSqNCe0rrmZ1C{!Ulz91H%Sx4*CJD zX3%zJL9lWm%N@01DT~B%Y;C!Q>$Ou241Wpf$_58-yZ6&y2-;whR>m(9>)tQb@HPQh znvTQ!7;d%pkaKe}g_BFq@R*vR%vs!!T$h0rD4_m@jUy{i1KFN~J-Z=(QAEJvCdCba zh3EggpB*@G;OzrHyQjYG4#W-|_T7bC^^bzDYg|vs;Cx|RWz=lCaDC$ zeuYpD(;2nV3LN2A&0vFNk#Sfaok5gRRVDERjD+ixN*E4wLgh;e!lC3C!iORk>tcif z4iyy@HRanNT)}$vU9eQjDmN74s|g_RvUvI@GgaK;<9_qYV5f z$CNY4gT^bDvVf>O7qkGd2w3O{1+X@i;E7K0iX8-d6TAo|^rwb)t?TYM;*M_tW5~_R zFRW_7D^=^vu7xb&$^@*k+J<{f!uoWCEYc|>_<~tqfcv{kS?tyjMH0w@Ig3&j*7ysg z3gi-s;L>M)!#(VV$2idTs~~@Uqj}yd9dq#H?9ZtP~VGwENXFXU-gy@rufzV8sm` zOM~%>%%aIX7O_^W*b7u;>Vq=1yLlZ~eajc_#R~3%mothx{Dz;auKE-uED}r0<;z~> z%yM8s!YXXIs~ILivTAJbK4LxPQrxmI*f4duKzr~w_M z?b~;J_KwyvE^%_tvODhhc6~2b?Tb1vPlbSEHiViw%-A4}r{e`BLSirgy<- zDcILBCk_EmBshHMbI6b)QXa%<3LEI8=)TsPs){Gk86>GF*MUXC#DN#jKL*fB4LGoP zetrnxqp@pn^@DiRmtN#*C$T0_nXqDg{h5RmXp`J01+8Q{<0hkF%cuu4r-zbpsst&k z6KRAdX1TNle&MDFUDg?J=dgUZ0E8QcG|tOGA5sbx75IqeMk=A?C^%y=7yj8Ld>I%Z zRo33j!NFJ|q|u!!p%lUxSmG6}@D46GV}$@IOEY$2`+HCfIS40YK{13qDh`a3MR<83 zd`KNwSDt(Ib-Xni7<=94846aExlok2q8sU}#w*HLB9^F?F+eCOi_2hHxO?RbFWnkV!PQ2u>CQ zkSIk_Kq$;D=1X*hC>%o!qjbg5L2mH}zjru}Lbh^dnITK#g^;sAGLq_d9pC%cNazx> zXnv11L$_toP-Mv3vH;o~ktO^%y=Kh9s|?}(P8-&F3>eOO;{5AJN3s4)AQoxGKwces z6%rOjEVwg>S2SQz(4vS%E0##b75lVmpW$ldiWjI2UOYA!*{-hQl2VO|JNZhfe5<Psl!O*%&M?@fO7g(LU>cQ5~Z-u zRT@1UU?%aN0IiN#vLGXggUXS`cM~E|9x!-Oo3W7Fe0}RZ5WWyJZirVx%9VkhSQNRi z#r)DRN(d`fY{-J){dXNN{!YZ|sD9)YTH}pcPz*U^hr}}bJGy){$96z|Md>z@3FeG$g63u_vobU?YVwzHiJ|Pf6u*rV6z>vLy5|?ODV*Bqpfs z&}2A~zK!@G#MnNrl7BAY>5P6gJeftq2|a^nv~%;4ql;H=XgaayNsx!rs5o~>0c^5C zC$wX!+N+6ZW2ePoIKTF&uLg})ss;{bmQlem^^%Q{Q^2ZK!ktB)pEUwlD9&{Mh)6$CZm&0M^96`84#wudSL0V9~N=u39v|Yr(7_XWd3ymUOS+n04*7TPR*3 zxO`<%@#sRwg`?e|6qaxp>3;pp`4PS?T4)omBw#_rl7uB*ogu7Dy7DPG!38TeUfsRo z>E~((=2k z(S<|_JPA&%({n>$@sNF=XXW+insJC@YJ{H39KW!TV)anN6zcUlm~L2z zsW~yPf{=B~-+bqHp9Zl0^>-bs{`Hn!02V1m{ZJba%ipmRYlacB99r|9Ja}XbvWO+j zh=$#2h_8u$9S-p4kMaeq#w%%%R1hIyo!NZ`8X;|1l&*vd zr!Bw!@+hGgVZbsGhFb>f)Q&Pcut&J^n68rCgpP{-G9e4J!f%x3-AkR^dU|L)aEQlf zOxRJYuJvsguOi~NZ#s`;7NZmcGHHC~bD`?sJYLQ2qz zfhE|~F8Mdmb@?^uJkR`J_9J26x%Zpcb16I|4^Sh4u0M?a{Q6)41i`0^j!@o)~%#gAI zv^ZXP?X~ypon^?9KA2DscOQCvw0me|^l10U$n^6gqXd>@F@Y;GVS!kVE19t(uTf#k zj96xEU->Hi+Rb=n`k=%;`nD2CS0P|%@HTn5%X+0`L5s1g^ebMmC=B!0);qBDwBSP_ z8L$en4hbnR3O>M84Kb)hVA1O6G6K8Hr5T6{>%7=eF46(E-lzW`_Wmw3vMkHN$`k%G;*?Vn=ia*W2^pUS4&X&lN@t?p$;uTR~TXrQ+2v3}r zybF;CpHb>4EOR?|lDp`TrLqVVk_Kyp`%V!erX{lw=giB_JaH~U4Zz|&RcA#uWi4~o zk$+fIy+#+MiG-unKuu(tdAS0rk;cFV373+Z9ZidZf3F#>`GzQJr&}txk^mXflVMR| zYO<4szpO$wOH~3bCD3wFX{^-0rmy?~RV)!eWgD-1z2(_~tG&dRq&dt2bDTK4H zD)19p5qxiY{s%vLgKvs*b0&p`gdt-YtBhNp96WhPfOY=mE`YW5*7%Sx5DU!uD%6r@ z^Y0&NV3^h0;j+k$xycjl5J*b_KwcL)eQu}{OrHZ#t5)@`iFoO96U6~ z0SnFqdW0#KTm(<%mkF_s#)Ad<09ULAnv}2wDWil#K!<3UwJe!aQ45A2<4oqAk_ZBn zJH(1_<*9O=87zx}Iu;e!iI;0cddJlU$FUi;VYX3+G*BB=Bh^kBJAaqr4DHkil+sff zQKCLQ=wl`LppAs0Y@k}W6_p9!-)W}Sd_A0e*oc|sF#;@)eO>7Y%V5mKtL|(Cx0FSe z3gdq0`>ltA~{KhevbEq zZbKlIO=H%~3^ydy_vtOFO zMUIt<@uD~d4zdc&?TOp0&Jr&#+=|r?&KQI!l!`{7lr7%A1?i%)gb7imtD?fOpgx_V z3Jc1V&|q&dEO0f?o|I|CA7KezW@A>vFX+U2V%se|BX-J7S=uVYc@43QcqxQy6hoGr zbG?n$sVKrZMUc*9UZr2Wz$rrvwTNuCx23!x5e3>7CRS&j6_4W^)@f~{4T79pyb=o& zAz4*Nicn2h6KXW_#_IyBJ&spbxj)i~Wxx`88L(u;uC!npct`w`h9;U%nOeN#5nv!# z0xr#DEzYv${SD@@@Z$t~yv6|wxLUk}ss{z4^g*hz-hO-bJ-+{GbB;%Yfmxqi1z>&k z6@c}@#ygvubWcmO#vuzaDT_cS6zijrNwKlqi5G9B0E?o>6m0|FATq&2!CC=p25_h7S870om&uy<)flxt! z;lR~jwL;-42^JJpOm4U$zsQyfQ;2~Bk3cdtIW=B>j_8Ca(PL9gX>~OuOo|Z-7_}?a z)l#)w+%6Xxh?<1s#9J*_N=_Vx^EUPnjjKV&^;N~Ph^mnZd1$gskvVS|P;I<~LZdpw zS54kQcxs^MhnziUA>3C(wdhv5473tYY5L<<1=qQp8CH zFHNn_F24OE9ikWWSvtza+X+YV6;oQ8@Dkl+Q6yWR-+uc~J`TLn{Vj7@Pje6^h83U%VzH*-&;IUzo_&Aih8CG5U1|2pc!j=pO$p_8?l<$r?FZ+*2PnNnz{-`%gUu$WgvgU#-zXR_4mKVcSir0GH9?kH z6h55U&NVk$+c8f~&QY>WZiI>&k}DAafM21wQ0;d6{qvSJms@Ot@pw@!Ep3ybF<+w z9n1g#AOJ~3K~z`Iqvceh94hqmMx5dVi0)anxzWx6TGWcw`h>cAg=Y7vx2E`s5*8^_ zh)dWqgbHs5DPU>lL1*XcpjQJWU7J|b&rIwz0G&W$ze-KjLct<02tEDi2nA%OCMJ<8 z*<^Xutrn}*8NH}s1KO@B5NrY~o_zP4-s3QW62mk@?!kT+87YuSn*22WyYntGz+LZx zMq3}A*4*pqbui1qmV_`x#UQo->y1T3tdOt*v6#~Oq`UjhS0D40FeEGhOCJdXtHKfv ze1EJjhOx;Ic?PzZ1QSzPBPr|O{+*UA+#oxD^SA%_pZ?Q-7GPy~g}2~J-v}*Xc?K(u z2eq`pB*ilS^k4oNN*Sb4G>rtYWzv=4N)V)7&L4T9yQ?H48xP7FWS|mUnLc_S#k_a5 z?;~CUW!ZSR!E2Y)W-l0UR99+D)$$?a>oP97g!5O66 zE2ZXc6GU+dDjyaPq;gG${wZ9jVz68-=4wy&cDh>|9SY5@9^alox9lQ!avGh$CtLme za(QZrQ!lvx4Bb|9`NkDk)j4hIWSQ-4fDM_@gF3PnUO^y;VKICJQvxwV6gHz4u>cQt z7VmGI_4^xJ%~i&ENPB$3p|II|E2Yxj#(Hb-GT%Jts9vb2(ALJu>06DB{$OLjoJNJp zZUjl0UBx8t1ZOFZHZ$+z#`aHnL?6 z4vO#*U?F7Pgsk@f0`S1-;a$-hto`EuF;wMXcoKMNuIlHUr<3r?pf&V2Vp+lxOnKTJ zBOvQ95wQOJA3|UI7+eKlB`6YHeau{Y$X0los8|51uQ7pzfR+BxbI|>G)gTP8gDjdDVzpUTZR5&;u~Am^hQH;3E6z;y++S zbLx|;N4p1Ghs%o(PS2{PRlUqh`Oa2%_mD%U3cT4TW@mK}RW=#~DoW*py?m~;if^9t zpLOYMv{qE4GiL~s@XCd2jya=16qQURZgDo~+HO0aKioL0YEZ~g4;mTX+ul~elCX05 ziK&TverZZaxo9-5IR;o`c$J~l@H!r*3arwz z-`OFj@9l0@+>yciM^pE{#yG*^gkA8)*YIHj(Rx5WGu2SDDzLkPvT zOg1E>+o8K7aaeQhyl*6h&CkE~fF-O_CkQ)CvO>7v)#PU%JPNC&%I0Q$x1GCJIX$iL zE;kbF^czpwrSfv?YU`l0{h+;f);-L34yvVA_q5xn^>?4_HS@Lev#s;>VyWKUx@hk< z1yhNJHOM?h*Hi;8d@SSis+E8!R9fFZJ8f_6Z;(wOQRcFCCZ9H<`jK9yc}y z^{wl2nF0civg<40H0C6tE5rO3lH1vOd3ihEY^|0q_qNUk%iEV{gR8CcdY^{nYI_4Z zxYpa+8Z5704OWVct9tqTXs~zMF6a9@jsEWL)=~ScRxWq8nng5`iUD}~MdAj~D&Fzp z7AONOTLn*dU?d!T`wK7%Y0A)q;lUz-I+emh!5fqC9w&1A&JW&Ld7nWaAmu?}AkzmQ ze|36p32XPw?k5SYbcyNruQ<8TOXG!CUYMnU;Rv+80kVGauYs!AvSZ9bQP!A?T|3e? zBfw&vyOlL~&OKH(X#Oe&gn#+x|MJg%{g+8!dtjkVz%hd>(1(>*AD{qvNJG>Lzl2+Y zEC{R;WPShrTLo{k)ttq|6r+IXas~r;fAH?&QrrQif9KeU?mJ`C<9B^$2?DXc1uVD& z=-@xVX@n#8F_a0>#NM}Ip~H zZLROz-`W`*o}LZPcMsO92fMw&-ot*rw*_EromCId&IU&tNA-&*o4v--{bs4RyWiQ| zXyq@yv)ArEJVF>GcVm%2D~$?`6ag#|N`%aUCe_;60a9eCy#8dbdazZ?RSq^06?ZxZ z8!aTPr>*Y{8W#_{gGz6sh7fq6BTZLVyBk|al|0jX39vF`vNQ8kAq0dOF_7;H$GPf8 zpKlD4Gn|;(+_-A*>;jb!w~o4Ron5rI&MJ+KjqBd-8Q8tsT-&%P7h1c`%GGYaef6-J zKRc*hZk_cmo4ZG=4>mVy*bs-w65f z$5#OD&c~U6HH0h!RxEM=1cVMDW%-LC3bX#r&;MT;WU;it+YK#oNrj&Ymqv=eM#TEN zY}u&6N)uR;vi|a4{`s%}?%%%u_Sn=_n!K`fWw7!#ocD}YL!``j=X8}ui zg@E-wGrS3Ow3&16?YAvcF?pqF1%8n32cO+%G|S;viQFc}g@!EMvu^=Qh!L0(7NN&D z*)2@r#~|fstCk<^uII~pdzHgZr_(Iu2OAA$w(I5k#(BP6%?);2`O13!^2u6rw_Pr+ zl`DH^<$Qgso-Yk{s~50y>3X-tY_UrL5eJ>;y*| z_D#gtPjCT(1c*fG#;X{o@@b*Qm~)chUuENTeRFHAB*0p$Q;r~fW3BnlAm7>@luE6w zcJA_FJqKdt+q)09s-?mHavE3~jZ}n-$v{k{DI_3NfvQyD7~I=0Z5O9!%H@TFy^~6% z|5oGrJMDaRW3!U)ZLAZVuWUZ7<(p61>qITLHUKPOwROJ-U{y;8o0anV-q}iRtG{xO zZ>SnvXibC`ttBBVAWE-$UhA(Gf1T#-$Wx*Z} zN&>s{qaVD@xN?eV%jHkL)Ld44Dg>E60KmRH=xPq@6Hm(rWNG@U`{wTE!8@mqH4{Ig z7#M0XRQc*Y2WKyeNY!toR3J3A)|`wWuYNSG=)29(3Px7nbJVctZfi zgsWx}`FH2bN9W$oG41F%D|SH>+o=S1n#%eXus|zy0sbIWCs=PV4nH zGf4uhqm8YNv-Qf^S+mvI9ptP1-HnSzu5r4{a4g?`a=6}ovbEDFRZh<;`S!!Dt*wpS zMi+j{!&rICRjCj|76rI4`;97)Rm6Z*d$@6Ww#mfQ#lyo&e&?W4&K2{%gWRI&Q^Z^tOBAPaNxToMoIxm5@@;j7yznF zh3R5c<69^a)@iv|G+>=(PR*f?oD1h5{qE9L6dR<(P!T;#hz>tVmS zb#-{wEfoz_S*z?A8R0DajhD`M?% zgZt3mH~}*aSO6w~g;3VGe-20oMnuRYW{In982AA| z02GHK+?!+KoM~ds$B#jl@QP_I`OGbu+q9Ku9Im{_kS#vaS+gkZfM^_gpXCc_Dl0@S z93OwMAqgwQE<+X|we`+dAAIoDE_)0|aHVw*f-J#Rw#Z?GSlP0y_gDVSA0cJEf>jw> zIRFvMb67$uqm?JGEMoonKm7VHfARMF@6V0|tUxPCOi8+8`1%RU+znI#Rh=i0L|%~$T9F5=@|u%G zCnzp~4jFC*-$wtyxrO5b5U>mI>~2*ASk*?O-r$qp?#9N(lRZ?5H+!dBjePBLA1UYZ z;bH#d@_cKf4q%DDdhP%BWvALbWtP6R+ftD($8ag@4Zw6{K0wmE;f_f{j{Iy>FyzTf4Ba0P|i1ZFI!AA z_1-#cKWQ|2rBeGXCb+gLVAN&4)Hy2ko**G~cU$E^$#I;_YLTwlMU@cUqWD7uITWWS zz`6vF@<-q4H1A)O8G`mpM;ioxfEZ4jQDWpawC8^+ojIKgIfO4-o}$=esiPF(6U?V?v?X{Cr72ttrO<3O0BmB ze6?$U>5b{Rsg>>CTbB%6?{D!bRnMxM5f3eW8$RJoArv-TWFf%HHJ@zqVUqc)O8=}@ zs$T6rJ^D^Pmn5vGhr8{`DlGc;x6XsSgUn(XA z$r=`#D}+xLs76d<*ox&1C_(0*AQ^y`J{StAM1mL*kevFas8|SMUCJ|1H`y zEv6AZJNvHo^iG#bEAL5jpT>m&T$*M7_=bc9g#E7v1b_VT#;MTlV-QP`JRdJ9i+$1A zsF2AaL6*dzvDNP!zRG#gH!v%GJ~U+gM%o&Ze&mE#9uNNJ*Z-DTd33dHiDka{tRC2f6tM!qejORSdjo`bmGK+pt$#caD45~karR|eBodYzyu zSE6uwvv9jC6btl1e0Ysbvq~7C5PxowC-v)Oqt9z~ao#)$MZa z?5xBDQEOwTzOgsh+&FCScH3uLRRF8Cv3GvDTd#B<@|AFNV}E~RC*Rn5vU9Mp(bTRP zb-VLdff=QOlhY7lyFO9o8;rYV=K-u8B&8WN6YZ_!Gqg{ROeA&Z18uYHg=56lWv_Zyp=yZ4Vk z-iK%XjVImG(e8e4>&>Im)kc*$EWSu=955Syb$_$GGC#Y$UEkR4Za&$1a$ZvA@vMd^ zK`zMtDbV7bi&t$X3&?1@yL)_lY)v0-ZS0%^`bQ7><{3l68iLiW2i*-zSo!{w&Hlz) z0<7Y_&)(cGZ|$w;E;bH8(9T;MhpVNc-qe2dJ%bh8k%X$u0lSEOw7Q*@3bAlhsDyOI z5qVnG03u0fl8+1sIMQ&CEz=gkG%3Hh$g=GiSPHF_;p{w%x=@{6SYi5I149W^!=F8p z@%YP)D@|XqXjJp=ju>!d*!nR8!;rFKDr*e01Y4#*`Kvz~KNT!wEP<8~3kgeG3C9M6 z`a<{*OkR!cau)uH#-ywF5Ckn+S&SOTEx}ie2@P2h$r6^Ns{%^m;${nPG{j>-IKf=i z9Q!WWQ4oFaSA{3p(cPzQ&O$4YD=;g7OCr{{lkSOgJum}33|96t|1xt0bO~4pI9|=w z`p7ik*2VQn@2FguoSvI$>|f@Pv(|e16_$1PKhIY>n^*gX`PR-_xw(0;$*g?if|c-3 zudlB7V3u#}vsnD1aU6L%>wrj=niU^cp_Py`u!OVW^K1QPi9Mp_(&fcTiIe({Ha7>A z;&z2=r^ooH)9rVzd!>c7-sUFLN#$mLv(?;efG|6oJ9T80Ub$4+KU#MFNIXIaqmt2t zax%a|&;d_ebl@0UDz;0_i-WzL)2ljy^E>rs_KfSA)Z&of_v=B#3gGj8zH2?0*x^JU}JlWU<`bxuQ2qfZzURm(FkQ)biUs z1h>}ydhMb)z1+U2uwlE#j47!ECt9Jjp5b!kWj%1)R@D1 zf0|b^!@+_cD@apO!XRma<+R6(S<3%t5OS`tBa^yVMERWTXEQPyj)gqZcJmeGR@IpZpWvI@vGWIzEI}C+^+Zt;MY%Mdu@JnX z20U$u9&@Ei^=YNvZ_&0&h0I(5PpXw!K6+f7IaYb)tF6QGiiT73B#=j$MI5O}7el5h z53r1jiXJX^SINMoV0x0}suh}4oGi?&%0d&}jB<_@arf>muguc+BF&|3Wm+iz(#-t5 z<>kA}EAz#i{1~PmX(x|%KI$dU)2~UJ0QBxa=YO)h>XxyL zs6la-ZdAH31p!b0iXjG{TUlPFm|W?Yg54D=5EPW1FM&&Q1a~&>@2}_-a!r{6m*u&Y z6## zwrlq@8=Paws9;GT<#D3QL&fOg5B_ie&vzw=X~5{T$}AR1PHhX_mbRDJm{9uR$8kKx zXjmxW3K!;AZ+`XhFMEpVEQ?u^vN#q@ zkabhO`Xg;6{58w4n79)C`Jeyh=TB#eKBN&^g#f2rgPh)FIWEJg>8#XO1E9%UeG3et^_=gf~<3<~ew9paN1V|wvjPRKD#>COzp zglKXp&deMeGbNm58Naqy_vr64;IpiAB3gDQ5~N8U;LU+F0n;WpVhI#n1zD$^$00%w z_^qHVcsY)aS2Ep6@^pr}{=RAeXNt`)C9$Rg01KhoHBc$ip&)+|xtig1yNSVTPCh{@ zT*c!OCIA)V%B3=O7ha5uw%!Ng`6e&xdw!YSlJZTZ+^~UgG1RWt!fttjaD*f@+u8E z4OwH$M3Z|YWZ8plI6ULoL#^A(ozrtGnx6Cd%~`J}G-B7L#HYZg2y@5TsyoL0;*rvI z$c!%FH8j+rzlYSx1Y^SN;vM5lmLNj_2{Y5v#Sv0Cf_pPKiS$Ywuu%vk!IkBst74~Q z!!hcO2*Vp6aRZftixU7y8F;1CJ`KL zPvKw=t$5ZbgS=KyZ52aXhKQ#UbH(G^(*Ty_9)!sWzygx6ABg2LiA?5L)sumib`Jr} zm3h^0LCo7bM~=3pza_G0p|s$Tz88^--1!HP(xWb)Vo`msaNi~HN)Ns&6^lp58ANO` z#2C##1z341N)uTcGomc(-M43BKmKa>{>JV*0M@c4t60%4{f?{O& z!#{cd-*Ch|+X~ZkR!CTXr=utS{2%`Nf0=a1WUCoSC(!vQo4Z0OgLXL&0ZV8_j7+Zb zHFFrPGrA;NP65v^Q`;V@~T9-2Y#_2WLbS*79b%xZUlnB#L^pxWHC_u z_A4R%sa|DzN_b(r+(7|W0T8zeXlN-Gb#f_!lgJpuZ6ON-*{TFAjk@HHa7Bj1xq(u? zZG`F3o#8gB98zfFJ(Zc+Mjly!t~}`R2w2EL=?ZFOj*kmbU;tAgq#qzl)q%SckvKJv zN|2SSf}vU%J_I2qTv=d5WznkOkJ9`kd1NN>(IoLp@>Z@iQcXqE3OWmW0hJAwE-VH* zvrNiT+F{+C(Ku)&EQ&aI)o%)y~(8e#hVu( z*Ts*&^!90sT7g(Zm%^-%Lt$37${`yTdQ2$c=}+GO*FXR7V=XBf99V{B5$n(Xftf5c zijI+SZd|xxB?Bw3G{h4Pp-P~ZkZTBCfmYxD{(C>1_46)viYGcfCDGtJEN9E~?Hj6e zAGis0Is<0i7JAC$r$(+Bw9jbyE~N2c#&l%=dJ>GQhKo@#HT<&;6aVC^2*(SxCdA&k zRRD{J4;Hjw0VW8PR`a!^8W`c%zsG+XB5JxT(ZT`~FOmh4M6fh@%P^6Oqp&DXWr}XP z!p|s^poYD{`A4c!t9)GWxQmRH_oPQ_`FypFLas5y5?~pq;A!$ujzSPyvg|X@5nwrl zT{8K@%XVjdb$gCa(kRIj!1Kw0r)YWtXi^&+=WDbvAYf+lSf07#>fpnPIUNcO$VDOJ z53nIB^B_3!v1>X)Ggnicnafvv56T5kXwPjw7_?BoH5u}jXRQRD7Apg@H2hPhVdy0x z@;%VpE)%>7vX(UAZln^pn1hgvVjfGp6XI2dSjbqMMirzn;oCp@Z@ob}ldTrn0WHXK z3~AMxr7UAMb@97^>S1N(t@J}s!Dux!Jox+aEhhzD3_VH45+bet+n*z5A!JFu`uWc}M3uQKPVagZuYjG=Sdh8)A2S*h z1sn}=%Ft!3l5{naus-_ehwt;;(m-)kdVtmaLEMD-SphebcwV-k&e#1AOu5t9cA4&n z-Wn#Zi>RF8P4g{a35POFGBZhrwU7Mib+ee`Ocsjy%Ux(=zlz#8zELqCk$z-GUhwKF zAJetphVNy3+lM{%j89p8GGc~?XGB_@)hHGNkC_QL4YAoS#K7UVVEOD zOrZ$M06QDIPj)wJE6c4%GjlWaM^R_g-(xxWjHcjotNF`~x`Z(F1fqoWSPH>b%V?J9 zlvcLyF$Ri)RPzx@jvD%8aHXh)ju)NNZfE0<^%CS#4(wtxKi{5xNL@X3x= zIehufSN%7?d<=Qas8tb?$V5zKef1@1l`V5Hz64|qrL6bg|F=K?_x~QH4J^X?^*{Wa zsVv}Xj8b%~VAs%6d7%LLJq->8S0foKp;iW0fn5P;%(Z*&3VDA6f>7^}9I5p5Kqs6s zv?&@t!m{8=1jkhXYtZ5zXeVP?z1Y!`u-q-wq0TST<@csos;2(Vd6bMq1&2teHCSjw z79cf(EAbDkFnph55wm0j9?6O!L}Z;6QWFpbYUwlLOw#D9Dfslk&{7qW6>=AlB`u^l zoExG=YN#5Qgg%7S*_9kR{>J9AG|~(D;LB5OgMO3cqhG$c^VR*YKKW`(qd~2ew|r$0 zOAE7Zo(g7oNf?x^en)4_zy7&Tj7B5YpE1?`Cu8!JG^{C{f`bG1u-V8J6PiWt_teRPS^4%^P~9T2S&xLkmH5KRk~WuL*rGT+C*xh|P|u zckd`XyFcF!2@MXz&JEathX4*E*pQJIm70f~ z^OM1#uqaKx{|>ZLfkBGEqlYTJ)fTFA*cRAayFBYRA5APbFPo@p|EyW-3>w=L3)RkL zqm90;QvLF>QCe7URvD?5TAh{@+?4Ab`XZb1Qq~3~aV=I=XCzI@a|lwl+Xn*?3khqZ z2?`FL>{qI-^=7luI;=En`GwFq8)5zpwQ z?bo>ZAp@zeA(khvgh7I=04zyXb92Qve(>(Q?=DWILkb-#Jd21L7P8<7bW_gYq5umc z@XALl>f0B39C**Y&-g1F6DGjI`It$0z8P*le*D#2J72ze{&?%1a{%ju$6tM=39YoI zRLiuO%L?W1F_je}k#Hzml_hcNPu~B_outy!V*$a36MfClR=Gc6LlTd5x_cn!mgY0=>;{~INjJOp*;aYQ`UeQ z9c)}aV%P8L;qG74Z0!M9l)G`(;*gC!_9FMF#3q2%M!&`0qlIEY2tph6`n6RCq-NVN zc7-3N%JwC?1vEcK!fI+U?!nm_MeLr{&w7Wa{Zf8?t5>?FN~d)OrU$6;X)+4eS!_ax zY}(ypLID{PqMHj^E|&WRYKI@k^m{CF5N@$f^y43&KiT>6;H|G7Z(M!3 z`*7#+j}N~3J?|;)kmWbgZec13GT7M zpz`_}UJ0}KlL1^YcjymH=_%FwNjJ_nVOsjHw5DCyUhZyHu6G;x!NWHC`SR;;^=cb?)$-M8 zt+o4kZf|eB(%(I-ouOx?%?{k|6PWw0e!jDNQQiSv22VQcPqymIT{K|!5AvneY!=J6 zIaNdRX97)14WDt-m6ZQ29`d7ym-S}%VLQK%TEWZR%j!Y5T07fXuRpx1<}cnHl>29; z)uXo>s~ih4mI)7$a&Ws`hHZ-A0_COWEXAQ05Z!tY-`wr<$zknmuu!a{sIUIcb?M@r z9uT&f>%DVSYVB^cs%QJ<>RG?ke3OmV%{O-{<;^!c)w7-a;Z-ZQT@92~tNER4G$nTF^$RwbZh~OuS*Sl*elt^PiO)qJ{5pQ|3N4)7}qMrfPm>CGg)$kRH8s_JI^zIvX-dNO( zd;pfBWMIX079BIXKnyA=4)lZ%xkfY74G?4J3b*ow*cXiirSYDor~;2Z=)Uvj{oOAg zcTc~1a<%#R%iV*kjjhLzKi)X=$kCuCDT{s4d@=O=lVl|=em7*Ly*jVpR5%T2V9`f0 z8gy!%-i4dN;EfUCxO^2*6&UvYAHMg|+bp0Nk{=^(njSgdYTg+Pp51T*mO9?L`9LB8 zlf)_C1@}MJn3?wtlFLLia#$Lc^152+RM9v;hmU>LE5?lilghwUS%6jB+pM?RC_Xtm zt+e0lTt4hITjx)j^vsqcF;~db5ebh~9Ua(s9~G z=S-(^wZ)M=!%QQ2$WUS!y$97op+aCoJa1m@5MF!{WKUmb2MMuVs-B|%Ab;4XH_?K; zvsJ6CpPtfE#*4j;R!QYcb21ueau-h;(t}C`_BxHHxoy5DibjCthuKghUtv`SShf$F z?^+0RW~7l&dyG)E+I-R}m1-Lox#sO5_)Q0c07hGQ{$P)yE%vwaH}G zCKhIT9pv{{wGs^P-EcPB(_cp6rTUVP`dl!}S-PYzt8C{|W2YaV2 z082QOe|oz4_h$pnir6{(`-8KmC0_servO%@I(mBlyuyCFdT9p{6n!eJ;5poXSTCc}xGit<4Xg^h*7At~R@yo7D~~|Ip`Cnc=Kk<3a{jAzo=fD7Z3Y1>=mF z0aDp}ULuwz-Gxz*u}X9A!XE~M1|h=bHYiED8VXps5+O~R z&9bF%`*!icd&o*@I!lt4VJOh(@t02?UVX6j<<;qrA9tUeoqoB2RtFCV4OU@zVCZS6 zgjgA5#bnk9vJzMst{gRkt27!EWPxPka3%Y27E3lG)<^Fz7lvR}NY8L;+2rKX9Tu_A zN<)J>Jr=+Tk_1q1yupO}2(WY?jOrkjj&$Vmby^Y!yw(&PYEYmb62r<2WC9i2%~O=Pm-=VbbpclI&3d`I zy8|Q}uqt~8d6ca0B6gzLw0i}1@sVLaNmz)bmCnW{r@ST+%Y`O%GDNx5F}Mm4Rn?+; zQ3+Ok39#5QIQY(fnX_n1l{Hi-ulBai-}x}NuY=YQzB>AX*nOx&ZeIl~30m-sW==FT z)CfZ?lF3=(7XOQxOvWjUaTgH8iO-Dn-cC5>MGmZMU{8)n_{2|mWx$e4Dzunh4-#8S z&%0478KAMcnKLW7jURm}DJ#f$g#lzS$G-98%g3kPt?mbpyBm)=*6@ruFAW6=Ov)b= zRdZRM${L%0kEyI7XkkeN>I?^i`ZV~ZrK^uT7&KlDAuHsm04c*(z}5F>SxT+v(Of8xMu-={5+QR@WU$Lt5XC-<`yb7Z4)&CgGwsQn+x-Z-#O>>dPQD1w&GLO>V zFin^q9okBl%eNqhhJ;V9F9$nMy4BLrR`c)MS9~7ad$PNhe|mP>`uqLv)7FzFgT&V1 z&PJ=YwK4en&cpNa0eUhGSm;CF-)KJVTs7A2qmv2|q_n@)sG(>eppnAOw%=p~fTO5YZdjIrQA7F%+%;CWML@14%y_ukwoS;9KlETMGtkcC>UqlZUNI~xhG zTD#pw{p$YZ)2lY}P!}|TFGVgmu6AdJ+b)N&lZQQU%f3APRAUAWq&w|)fASEx~jB$5f_LMDsp_u;y%_arN2 z0CnRkw92F_P1b+#2*2omwg1erJ=_MvViUM-|Og)v9YxBuY5G1IQk$(6Fqc|)TDLWLgodVULrOUI8ja{h%Jlfc3*Uxsh zHUSGHtTGe*d1jC{PP-e;wX2P@tG!J|ybV@)w%K0N-MB0b&d#>3(3nsFb3&p@ygIyS z_~$Un4Nq0kwNQ;y#V2O+&4+xSJ?+(`Hn~+Q>uj%bY42f&rC~IAh6}S>W zDF^>XCOWU;q11yZ(&L)$7LA$n;#j>Im~;=k5de*LMj4*yl8oqL&Uy5$hGd2tvFGxHKZoAaRSJ3P;z;#USm=A5SmoH%Lc77 zTlncoNR^8KJU9}AQ)M`9FP}ewf6HsF8cOskjrvKIf^#SJTB(MPz5EfgXe>`9y)ZzO zu*e=m!{`vDCu=-+k!12Xr>xZ?)UB?S^VRxcW$mO?Jt-ZpR;#R2t<_H|1Xmgjbo@~p zb}$w5C-gzBQd(VaaKw+EE_VnbbRR>Z8H(;$= zEEU%e%jLPnm0GJs_p0c8wN?^f0ZX8i=1wxO(vVQ!t3u3@O?bseEUUp90+tvD8oC8J zLM#kaCHv}Wt0ZGdm_i+?biiv(mVJ|y1+EFKNGY4dTG29}BR4j4I`=k3T>MjX}zYm0(MW1X&*#iP8kTAu9%S#-8+9 za0FLqF=ce9uY(e>zAjz`W+miOM(_P_nwxqPI=l|Yt(lmdLCG|&Q}<3!VW-z6GwF6n zrj^(P-N3B*DWA3-LN0<8Uo(>I6=;Qdv%J^PCB_)z)`S#vgnZ>Ph~U-|YKScGW9N%>90>pVj%(7>hWLBld` z$V-v6Qb?tgvysis7HG1f9l(BZ6o2 z_~QX!3BOFRj%f%|;Y@N>LaVv?J3l~esKCea5@y0ILDt;NcmKN|p=Kuh0>xs!-grkI zZ~Wj#?7A^TFF+HW(tL$HhCEv%J|10aTHV#nb@X$+0 zg=UJCz$-ykY>W2T(4v%J=sm$zOj`}X>JvTXOsU5Mvc^r#?n(X(A{u+yVq~bk(ha*&+Uw{LT!}@a z?=!BkZ}2XIFB1znVcUZ42!}9xT_XMk`i$ehI1_{?9ZgZU#Kp&lXB^Z39BHAoUgq>a zpK#$|akm&8m6;Q~OqJJ=R0EMO;{oy$We>+Nk}9Yr?8lLdo?E4zde*>!VlfBWvLze=lLjB7lwljp zo++S&X5kopd90dY_Yj-E=`dEx2V4a>VJ0pOZXKB_8`sdpF{*>26{$KuowCY~9Ks6p z3qlFnW&jVy9Y7ijYFCT2DnXQ9=|jW{pb}mQsz%EjXcV`IZOXb+G0_ybk|C90hTSC; z64FwJLYiQB3>^83IjmP9 z%R*T)v{3Z>-+zCGv4uKcPs!;0nsH0E(>vV;Zh#hEX|~GJl`bP-!hzE!_t00N6hFp; zGmEpD%hF>flOkVlqPzVn2X_n$azoj}!|lMTiTBZ~1P?!4PKYF?INTV0ltLtigOAG$ z6}g|s!a|-z-t#<{dL$LBB`cAA6lF6*tH3LQhhe@wBpk&sa484J$+GgJ;ZNj5RT;w0 zT4SAEb!vm>s#I-2z=rKg94JCw!$O_q&}mmh6kCD68fp=l8Wrd^E^4HwP4QPfiA5yY zU26qrL`JHCoLrM3i%1QMi=C>XE3d12Qgu&3j;gM3BE1w;FZc4OJb@OEI?yEC(o-)| zJp0GnUkel=vC!AZfE5UK_gyxM2zO$DmzFz#R6vvv$rDwYiXVzy@-i_hB8KDpBAI-h*`YAG@d1 zi(z_R8*Kor1WCh-x?^faDlNE)$=8pQUMze}ysP1)h}@!>*Vq(8=#fvPJ~w5ILNIosOuQMn7(x^?E0b$hZ1PGMgMvzudss1N8s)i` zM97MmporL=sDfFmmA2GH?5H~aj;^%98_Hi^Q6G1Er84rwFE*Y`=C=C-UkT_|g#Es#RC@{d)Toy_{4M*u~pay)8&jBp<7=HQWJoG$dAT`9T z7$Oc&1ruV$FEa&Lk3S)ck0o7&dDE2+@NRG~Be8({yBe-HfV)#~BOH|j{OLO)cWz>0Sk&uk z5oel%3>oSLyX?v1BNu)nyuu18jzSgNVlj>aF6{C2Nur5(nCXGE+u)~1GD;N;Wkotu z8K$vX4Ix!I=nH^T3r4cIV@0HT1OoBRDbOjXwJR+ZsK9R{V=M^!NsU z@Gx)(P;jK4mpDY5XdZ3MhJph243p>pZbP`{r|xJM`8eqw>8|K5;g3k_VWtawoeguS zjMNF(#JwSx2bct)WSwO8ajYSVg{$BgW2{F^;Sm=`cJ3ws03ZNKL_t(PjFHgrCO;Jd zDbWzKGT$ta#Ez2UDw+30yNVOzfR&XIQIuz5fFX0MNI??G^a~2HPj<>l7uk{v?}(R~ z&Q#A~Als;MBY1HX8O@{GAtui-;RS+_dREK=4s)kbk#Sz&5Mw)#Vr z`3Dv-55%G#4O=yll=+E6JSqfZLW&B&n$o8$gsY)sCG3(U20mGQ5=ezpXeAeG960Pt zHexK^&6b%O(VQeQ(=?7bGHa09s-E>12{l#6Xyi(tN-e37DEK!(2sTi5^_w(D5J z3bYzxR>CzebpW&U#gKyx4O$rfmuSVmMuR~gg@^@CAz^7z!#CsAM<2agh{>yX+QYm( zF~iH-6<%Uhhj7Ld2Oe_U2wbAOnddYtX%q-~(Sp?bAVq;n_DrL~l!>+w;zOSc0>2#+ z3Nd)p1uSCoaWWU%KSML$6S0MPXebHG$CEkAAwWSd8GOl?Ra}vgoLXze)f7dgJ01=J z#W&EXUaBeN^vYjE0$u#jdkpFb;f!E$yCRI@DuG-C7(N0+$R|p7s4*#JZI29L1Xzye zqFs>d;^g5>=2*>!K3J5SE>SD8!eJvKMZILFK15A*NL5whvB*xM+C*BJo;uMxK7E4o zhXOzTlCdn(B$f&pOAg68evu1}z#3gV{9}$>N=`C|{j(s$kw7T`3p}zsHHQ%K#+@W? z5%exI@k3XJaY8s{222Jg`Zb{Ht9{Hxy491@$jE@!ryp=C7$}7iXq7PO6BPSB){3q8 zPrl<930Y~80{|s5RN45LCGjE&R>{C>dSx9}$XP%9=)E5vOS+PLl@U)QcL8Vi404UAPdG5;o{+cMX(=rI_z2xpKWyQX>S92aH zAk0!Hgd0xFEYj{{|AZ4_80dF&7~rIb&ZI1c(U{ENeOBNiwV^K!zqhXi@05cH?CJ+-Zq_K*m zfWRssg=2Cw@e*G07s!Y#Ev2>XmahOH>9lOjDwfTw|GYIB*-59fiLFNKv@rsCd&Tqj0OX z1mkdpN9C%GYQivO7XNo#y%5VB#2mX{{d!}=2%5i=#SSxsn8PF{GGa+@4C0o@D)O-} zMuanU&Wwx!C}EYPCM^>+&Cb2?gCC$T>rM;}jab@LXwqm>QWr5{QkAOdv=PQeYxrC+ zH={ieJXw4(v?k?o(8B&$q^tbD3A5yH*~~irqzr=itcAyxsdPwiWf{wO6-eb7tg(UN zd*6Q>Ek!qpM_0E(G%>OG#$A06&+sbrVyLf&pJ6@d;|(#(q`V+V?l~>JvQ6Ef8AM+( zoKmAkMf5GgxLN*d=;G<8)n-&1=7*6p*&Jg8So)Tq?p?4oc_h3V@fPfu^(XgJR^Qkx z?<`DN+b%Zb=Wta>vF-2`dtB|Gg=Hz^PE=54q|P{4d5U2Dl%LB8z%r=1EJH)ULsmi* z9uaAPqK#$hY==H7fe2Z+uS%da87gIgL{ojBbcwQ4w6RQx<6MUs#LQxh5r=hgKF)h6 zQ`r>;fP}YR`7FnZH^1x&tn6X=%5WvfN&*&N^zJU+dE-uSk5DD>DxnrogY@+7yKEpd zG3ymDWxO)7%`GvN^`kekF(B8ZzagcVokd-NPC+z>GA~VK#wt#wXBSyW>bo^vU~D+9 zNg31$X-e0GRtc}dKY;3{>7gMLT3>=z+1!=oE6Z3(x&orI2`oXD=d-xJ_ui+sSBFDE zo>)D!x;t?XF=y`FU5dGOy$tku!=E_lYd!*|w}Bdqoezi1q!Y~2LH0AHH-&IX9}zRe z3UA#VY~KQw_!=@-jv!;`A#T&tB1XO8Sx~B^ie11UK6PA;nRpxGBL?Bo!$Ti``6(+= z%G3#>%*dOBHz_>GDW!=5;_)D+GB*Yu4|g@o1JX>K-ggB&m}O*vK?kB59fLl!6E~jib_3Fu9Qgh2v+4r5wi-UM9P?? z$~|Ll$FQ$)iJ??BcLX=Dv*=Pp9V znw~DOlAr1KF$@B#0x5Ll7`QEd7Z_m-Kmsx0RdlU3Q(9<3pD0R57w^)1d&Ts7dSA#Z zOOb|#0a(*Z;=b3KqWi^waJoQ5JP~Xn6Id{J;#D;Brd0!}&)^*H&qSaF$vKUW@gGdW zu~E}#A?L6wPJvLyj-vdsF<8d*sRB1IQ3K3G5lW#kgRiHWkf?;csE4BpOvKK?(5jlA zBR7vc2+=>GR4BII%2dPT70q@$8#;uvKp~Mbvh-@uf?l;LipmdEbM-_pXu?c40HD82t4hi?sqDh&yTIHdui91i^kIg7XnuE4BU z@XAwIABjAH6<-OHgoQfNA1<%PS4*Zhx+s`ZbDT^P3`?M@pd*(TNV1RzN}Yg$#G^(cZK)9y5luBV7Pz(~%u~R` z!~zSoqG$!mMkcB*CcE@drDYM(c`}O%UilP4ohj`WVMM!JoeX7EHQUp3Mw!Yso8*e@ zDNCt?$W2AN3i636s44|^0daO(z>xAKG*AZ%rLr+y9YI=r#T#)u)E5yG?tq7cRK~8b zgpU_E7|yg$CYS^MF+hbWZVD#y+!eqSu5pXdDwDq$IZn;Z%zxJ(1}#|4zss408AJhF z92%Xu04-K{r5shdU=tx_YEI3i`fdUj-xV}DfLNSY!Mf3asf154g_WQx3$aiY4y-X; z1h6s*>!y6=`77kBAmHk~5U~tdXh7DX=Jc^2dew!WZ&%cBip5n_Sd>=breU4dhHA3T zFM{aZFx}N}c=pO*o%Ov!)gN!X;iFU29nlsY$dm6OTIhzqwq$kR;C?@6#OcV}TW zS6N%DmSzAY?Vf`Q>aN?|z~!}Vcwq*&PBvXbaYF9+Hv3dQ?QCx!=PT6;D)wr5PE3|` zFNo7=syu?a=L>6V3$kE!CB_UgmnW-4S1Z+Oc@-YjVam(Za&sk@*N010kuR7F`Sps9 zOI?2?Y!NpzFCZ?1Z>1Ec+$e1mQJV`n=9E_!FEp|`&aKyVWa0LQ<%K{)NjCbYTrOCc zlq*#qmD%0Aa4WV-l62xWGGplx8ztFZTx6plu@UjqAkZ`qbjWICT|nyd0gWW1GJz`v zq&6dpiWmnhm1u|w5L4^yb$c>bepD-~|CSIU$+^IhgS5|!7Ur?3b&x^z4uF&u6Wo5SbAC~RH3YcC+0yHy(}R1 z4;XaWv@Dv-l*9;-Mxdlcpgf}*5Uay ztq@KGdT?+2guv~b^0&XU-|sCKOYC*g#^(i{BU;Ee*Yd6Na-3kVGYIpYHXEDK&M-g! zs9#xGJ#M!f2c_#K+BSt($G44?v=@XC1<~@=ooczr25IevW;gcK zJ#D_7Vjp(1FC`0=3(!;z){K%()qrP_`W4oDJLfx1+O=BXGreVjX*M#Ksu$J#@hXQB zauhVgA%GLxGaLZ4+$;%C=rKxWqj+(KM2xH0zB)4jo{PLu94=HDZmr4+Qg>4iyxs9! zK+WQ6tADZ6Z|Hz}AV*qtCV6^!<^{Yy7?M^hV-@X1qUi2J$kBQ5#RA|cHnJg$1tOEPXPRmp>LN7l9!%3HpKW@X=6}P5rVYwFmAKItVc<4`gXzX!+@;uw~B_kcNkb ztQ3{tSU{Ta3b4|O2GK_`gOyFWgH;|Kavsjt6t)LeVd_cI&7h)^Vnra%y?b<;J4W3n zvP@{ehOtsq?ygphMpCqCdHJYTHhc?Mh6d0{xFw+mn37E$6VHeM zt8#w0ynfMHEmte~@?m9Ra&@^@S}pgRxpGx|ou$=e9UWKAHpiA0R@axeYZsLj4h5?K zSe&O`Zd7w@?91nB)rFar;-`;_Kt`?H>EsPqQMij0v$}MEwc9UX&!OL?`hP+66x z7xdg6SJ#SDE0uf|z(RRcb$@LfuqafGHh&cJ=SS6YV;^-_YwO1|E6Wc)TrNzmu2u56 z^-{iaxO}{}*DU8sYoOOMn!j?ZhX-q*ISVU}OEpeF%U2&2r{*TBhs)E;%agaz(p4(0 z=W^@o3o1cH@e7{BC5zqoM#sx6=GObIN~L*KWh-#4a*JX1qe`K;Qmn26UYye$K;j9 zf*MnZ9mEs5Z`8|Gp^CI#qisp4`uGR*gF;?qMhIOOkR{Mc!jlk5pDVIq_Y@QF>iBFK zT*y@bRyMIkj=+@!togflz6C4;gfQZkKctykxF_Zr4BL*2mHkI6+k-*9cY1l)@9wN` z*Sc3bwf(b$=K4TqIB(WUgR9L>zB4GI#ct=IzXo8f@7FFlBm%%HpC4?sfRoDp!Dc<* z=^dPPwoARui=)mhF{uk54ht=G%ag(dSl6X|{i57y9WM{oT7&hy`p#azfiTz1*Lvmh zb-mZwKih1!y62lcbYraydV8%$SEv1QuDQ24C{_2XD8$O|*MT$y#cFf!;5zqc=e*z9 z$yfWE`+Web;7TO!(1nI0NY<{Z|N#u zS9{IU;Cz!~Tl=S1b;gQ?V)+_R4q`mr**z{ zRB!HYUgytGw=N5n?m>5XLArn7e?9WzE3udPi}7P76^P3Mt^glNT;>{aoP{32Q$`?^ z6!GB?)_`MztPGUU<$xV|QZS`Z3r%y(S%G+Ov&2EGwzBE>SmO{r1~O8xJ@{RuQDLMw z7=$%!396(SiVNMv_d@mY=+o@8t5MtsrqWex>)2?^`82aNpcJ}Idh&60fH;KQ(XaI#T+3% zc&DXT#89L=p06^pNv={d2Uy&7jvfupEZ$k1`c}P+KuPz(|3lEgiHA)w?@DFARcrJQ zn^%qHW^1`U$nSKjgJ!kcT(0d``t9;%vo@$4?vy%%?Q-dovs>zG7l++et~~&-+O677 zrP)NnX|zktoqW50Snsc2?pF@`oqQoiq?YegXd>VfW(Kfwk2bH5x}W6-9ie9P`svFnb>mJs+o$67)+J02oZ-7zda;4P1ES-0& z&HdKZVRff{c+jl2`sLnbxpTFi&yMafRAuG!5^wfVI>Gtyt)1%HMXP+;Ebq4;ovznA zRgVAbRW2XZkg(eO)x*t3@9OYyZ@mGOFjY2r`@@||qgB~!RrZf+2hGZ$(>f|{U$@pa zIji}c%xZ-=RrLm7x#VG=#~XZdJActBu9kAmox{^k`Esw)Ya?%#d*_u_zrq1J<;G^Y z(aD_;D$V{{uU*QYH#=voa=Tk=oUio<%a>hr4l-T|QA$`P6c`a9f+zD?$X6M+WFr}K znBdCNlxCqqsxnT=AB(U{-khv%Sqv`+i&y8^1C6PZ6}8N#c?nBG%iiGqvQA z@G27t1yfVAv&`XPVo!Dv+%7>cW@zK>6RfQ?7_7DVkg*|JT5Ko@AsIBY7Ut7xxDNhJ?Jw;DX;eH z`PzA-%L18vuF*N#EL{#52iCiTda2e$;3{3V8!)#Rx5-ECe9^32acpTX zpFii&zH$%I=3vn7ojy3cyzJM@=hgP$x^;Ne*uSptcaAtXvEHxm=gX~rwO2i^?9}ol z4#H3!^bAJRsRDpi@0aw2GItHuHjncCO1^ni?bDL#PNm)-aB9t7qulLZwy!!Dm-&@` zqt*wn0IZej{&lC)IHeZ-%L^0rN zgw1$mFDqESgTxi2*{iTg+M1J2hqu$*nS~5VdJ+oLM+#5BsiP*5v4AXnlh(j6LDBC( ztMDGi(XO0Wh&49p4q8dJ%CO6b1zas5US(hv&m$iIe6zxs<;#RVWvGUhRt-G{8qigJ z6f&0jLY-=2wXBvl3^7cymjaYbIRRWrz;$$m2+WkmqNh1yyjHK9J>yWJLNa^w1j)+YIvMYYvDxs_vA_$N3z9wbrZez@;3%*J||30M<%5x7O)4Yu&+SC4V_+ z^Z~5=Npt6jNtjN*B?+rpsPq6VPEu&*Sm%`i7KKr4A%$^rPExk^aNN3 z>#c4HelH%?_gmKt4ELL5Mq&o6%Y3EWYnAGoje7mCcG0O{*DL$XdsQD)dq;z2=b!=V z<`267)^@88(atuyXyzS^(DVnPR00JRW@3s;_l=`C>i~V3h%^9)~s$TCG+!SIi##;h>Ol z&lq627RVEG`O9m>ynL_S*v}Ui_L}`B>B~oT0aoSH^-7)!9hEmv7-F}M+AH+N<^FMg zua17^^{Ym!)mT{w0V~FWMyhcUOYFdpC0VG5fhn?Ay=PFwA`*6dgv->T4xbVbB@ze) zZZTa>G?p(2+CrdG97o6&YT3Pr4E1&l13lYryowcCciw*EjeskOA;F)LTLh+AXXz>- z3&NL2B%d#QgvJF+Q2|Y_n%QtM^AEgAGgt|u0(h&bX`#8NcZ;IDd4+M}z)a zQyDcM^p|h7j%v-y)4fARxb<>pfBB$U9`veDJBK|^6zezE`)j532H!!~I+erywSz{b z);v6@RXWYqeiekSomY;VM<>-*C9e;9*&0zl{}S#dw5UQAp$6Dx%xsr;S{1$!lpAE% zI$i5Et2GYdspkMJmbFgSC~Bv?FSFJ@uO42tE_s0r_A4islvq9NEH^&Y;$F>S`;yQ~ zg~mumFL++;`grQsyqV5#^Gpy(SCq_ghJ+kL3Q0-`a|d;z^GgyY7}_PQO2U?K>mE_; zTx7ag3*WUo$wR`Jd|&ivGRsczC(^};Wy}(8u`VUL3n6Qo$3@dwAH~2hgQRb|j!Rgv zvf;+mmFCMPG+;HuQIB!hetm6FYMdYKAJ%$DM+{Or>{4x99Q6*@Ins2{xV${PSnbp+M}z&( zIdZ14kEPtKFDwsEs)M86QLB^z76nm_anRBuQYbF0?OgZ3q?6ut`{<-~$ufmXulI+n zNm}n7<}Z<11})Y!)az~7w8^9n-y}Y#G3(mwAE$_uQ75JVXy zg99lU=^+M&#;Pz7F|T{q*K4`M&7&Sg){YnhmO71m_4#4GhN+EE^GK-v~p*GF*XE7OpGL9!BIzoSh2S$1TFPR zbW}2j-K4%{IJh_rOH|j*J$=n}kaQi0IoP z&qM{4$CI~LmZzsV+X`8$R5__kPLx^W#Iy}|=C;-=m}RXg#a-AgAFq~?%5s$jkg9xg z!m$%GGo&RFixSF(iSh{}GM^aef?S{gE6G`QQ-M`-tCaGS6^bRJTqVa+iWP=AtJUd= zmC7x$rv~JTS>B$zS1C_$*wsmeGAMu)d?e#JDB@8m0lgO2{HIwf9!;Rc4CElt--c(+bC|m0>GdB>5`1eBAU>Q!|N1HbKFB zW*zb0kOzaE(r0*@5+q!ig%dNka4F`k3|JDnEIA3iVtRfNc=Lh=Ll#RO*mFoz6f=xu z$}RZRkX7j9+oBCH$)?u}f|ich`Tk=K4FC7gH_c!ftR!SEv3BIU$?Z3+*F7QjCJfib*xzAycoXr zv2>5wXcnQ|+n(Mof&$x1OWQ1!Vy0RXmD?-0r*1E>R1$W-y|i?DvXm2UOx-hDv3Q8A zXSNxu4Uagz+5avWe&&kE1{mcgwmFr?AGB{R=wO`brTKe&d77Wl@-7%yR1{+@&Mn0` zWZ`?v0X7heC^-_Vc)T>fvchrGY_&LME$h8FQ(OA|8%@+`L=2p$(#R`?Vi)l&5rirXvqSV790 za<05mO8BUPpx{FlXuH@#eg-tw{v6Ze5Ho~jop!Io!?XkH7KijeQ*(l9-4C{GQc-5x(TP0LcgFW5niR*EOSy%xiPU09@i3& z1pj<8{Jxix{#PJtY{p%a?wM$X1+d~D@#>=`?(saeLQ(}Iz}5!F&6 z(A=Fj<`S}`5ggvkm(y1aA>X*0Aj&U*;ak8-hn-7Ls%M>XG+s|HK88oERPObr;8gAl zI0Y5r68A~yC04eKh266&1$OU=;198;SwNk-G|ko-!T>DptoS0p@3w3@uYrL-al9Rx zI4VKU1rLHbRZb@$B-Md}VO#I25!&%4V+24E5c>&TCeN_mhGI^atKFhh>9&v)PuTjF zUJ09W(4X{$pb-9%3ioh5s z=VX7Q_9eOFr4P@|Wup*6tvD$F%A-NuuVDHFTV^KsMfLJKTwkd)2Mmvd5D=_ot_c>> z;w*8P;AfsK&Tku&Fbr7o1$=}{9uwjp7=*tM*I^cZZvGy2t(Yg)qGs|_^bxiNV0qlB zs;J+DQhMBc!HUp0FZXSIH00g*{iIU#@$aKF=|22MDAaoIBZw=u_ukiSrYl8y5Pc8g zW?)h(?`-#=9!OAB_#z+@sHAgG-I=PdECO>@B%rd7{&62guO?F|i9~mjj|m+W@(K87 zC4({|7kM&sw&aSv&PL+XKndNXL}puyTAmFT=O|EYoA?wC)8k^p79&(*;YhB$Ccp<> zf-fVz%Mp*7%$1oVyBBinVF?f;v5F!W+<_5Mu02v3O=N3wSrNy`&zbAy8Vk>Y^!VxN zw`){kY%!Nabk~|l!i}i3S_+NIRc%I}yY)=*WRb1nM`x&dx4~^ac?xr($`NRy%9gNH z2ia0b5faT;3?$PSO$eTq8M#sQEVHaI#6Q(sfGKEK97RgyVfTMDS$(3W6G#k?YNFl} zuS9;Sn}>qQvUk4G$NU9%!GTP}F9uL0gdsvKe7DHNOqJxNkepsWmr9QIiE`v6A8n$RP@^Y_0YL%Gz>~nS>eyzGGT z%q0XQc`AFDWK?j3ivd8?PgTT-Bv~=3lTyZ>{c-uKhtNtC zHG=hIHwT&%%|F5mp-XTVCN7Ca&|Q{X-PJB-bC=^Os)lueM{~1pOTAx+Sw(sj7f{MX3bIR6X&-pFy3* zOWv45o|k2Or#9#_gd}E3{*p98rG^!j%RZ^5LVSS~j0lu*5hvO$JQQjL z%Za;0W=Vq*wwXEfk#aaiNC+tyf0G3xHlV~|JK++F0Z1AZDh?^wboegINbNReS^m=O zdk`7~7gcD)CV`+pl{K`YjgZEq#xeI^@CU=(tsiEK+8=)d#o0MPQ-)U-vA`@o4aR6t z{bvqHj{+BUuF9cnTnW{I?$H*0ZDhi4Udk;*G%Id0-S5c4xI5fIM>BZYUlF5Sx|7C0 z$+VD7f>4BuUz=&~+&>}<`>6x$=mt5YW9n1~S zpei9|&(stmsyJSTdgvxWa}g0}g8PIirpa4cfJw#N46%Wm8EwrRsa6g&qioL<8HWH^ zG@M>LcFXm!Pw;_XF$6VO(27NIp3LIxZF%bfkJ5Z2Jcor>8Vg2us#isU0=_sM32BFl z$>2&HW+pS5a8U7`JFNKB+h3e%IVcQL07-xkpW{7Am0?`MApsN<_VZJB7tyl37>Fei z3sMv(50G~8VThTjk%^f~RgzZeCz6Eaek|O|6|x;WkD*M$@>O$OuY4o~r;J&jy!U>3 zQS%Gq^aZ*J9imuRdeF{r>Oj7M{RrqWs| zNW%K8TIEBTm{K#-Or5|s39m}6b!L3yF2I4}TPLRbrz1{rO>Axm5u1&{l%G3l5Kj$Y zSa5Af&#jeCETKfMQk{f{1xV&mWoCX&MQPSY_nHW|Y7fA-@*0Y5B=~3|KID%mQ;(y8 z!w?Ywpy)DsB!ZvwUq=|@Q5I* zfPxtpo6E1PP_8kD4mY=%y=4oF%#7Isv4n1FmN1U|=s8+W9}Z1hDOtlg@gMWSNLflI z9t%`a2&9XpC2U@;V5qXc0cn1QlVZF%Sc~2zrwN}xD+3m(iG@4mq#UCnlq0!sdKLv# z35osY(QC|r4`?wzP-2ten8K{bW0VGj$X7!Vi|tEIn00{asgBEN=DVoMarLRVURFvJn1nY%l$_~RHy#LJEv7v55c`{ByhzLp zud|WZ#h0;ukXz3HFvTPhLd`-Bg-laZ+bhMxQ}z+AmeCZ|UFK^#Jd!)UHOXs&?exWC zGit9}&zI1WDF)WmOKx?w5MSZvP#h(;demj9!fFw=mBsa_+iKN9FU~dT}0QN$`N)-70Gwqp~q{G~cgw)XS7w-OYpE zx^#}Qeq*g)>9H+wWxKet-v1O&vf;j%fUE*u^ zR%KbbB8k8XB1l8SC@)=7HKYk%6;i!fTo8z?{$x}rL5oE=R+wd>DwD8=p!H1>77N?+ zj3`IMGpNTR{e<&;0A%`15~#+bm{gxSxPF4xu%#Nx-@$V;+NLw?KW%+Vr0%1AaE;%q zK$!$pVVz}kW0|5RtO`)$-h4YG%+O(Uw`2>E3%o$B0IR7y&MQ^WS%>nN+LhLR*7qw_ zwgcz1Y!k{AW|p>#tE})8_1D-jQC^*y*)Eo6fH9VDt`?V34mGh{K}I3fT3=!k3ptP3 ztXIla%H9`Gu@djHI@yV%0AiGu(Q3suVE!v8AXr}mKpzN#@@Q_zHG1ffDOaS$4((kO zHceevS-C`wdaZo9geID5N!p{9so{c}vfQt05-ui?KoAugAfksKJM}nTscui+T2;=4 z$zo-hMz5$2Qf;*iOj8t}(+^oay7~YV864&A&1^rQdbLV^HCHX8Yj67jJ#^G2hg`nj zVBIGjK+eLWD09?U+gy*Zq0+RN>s-~V)!u+bYb;^SukTdO*?`V^+|qi#y1WeJv(Xck ziA5HAp`?tW>lb+xze>U3%<^2ZOmS=$mOzym>55x2mM$5IWdvK2WnqyFvEWLxnYk1G zTjXqt5Wa{ttt}-4D=>fssY*H>;9?_>@yCWe6pv{gZ%|PZK#5gZOm=}-3ey)ud4@g9 zF-yvsetcMTbtF~>2~fZmdK9vC64lo4zc(BYK2DTYVQB_yC}1%reD8e@a~^;G>3$*B zPzIeqMVC~d4oA+6|J@@R39Bd6LGd3QrQYBpUv}nD#6_CQEEW{?B~aZgtWs|iXdw%4 zU4z1=J3%}(cf6jjrCq!MlfXkE+Ncx!vcbQ=nngB&9A1{nol14Td&K6C!TI4P`_>M3 zPWK!Ae+{nc?VYbxdi~ym{NQqD?RKHn>uuIM-NEs3quagA zuO9B~w0CmLgB|w8TwZV12AAFQbq@?x_^={a;A%VyrB>&<%l_eZ=X`A$JzDGe&Sie> zVsjr6uif8A^UdA`N*ucFGOt&1M|;&}r`unj*dBBT{Q#_XU&o!*f z8^Wo8iMZ;immhLn?V@{L&9R-h+bkAZ-9B6NfS>l@yx$<>QvS1@{$RCwT{&#GyS;LK z@2Xc_+u1pPQ0~;qZ7R05UAgX`Kgu6n_xh-Q={Halv(xrOSiHR{{1r;|(S^mXxyojX z1?%XcUT*JPd}hEpDz*AMo&5TKv(M)9;-mgfdv&4HW|t6MUa4Lj>>oB;hn*aok8<^k zok6*n7P)&2=qW57e6b^@Szc3mmakw7PpAm5M2TzS8hC{AxoiuxLuWV^lx@HUEW-`w zrn2uwvXW3nxHEz*Y*ULqX-ED;LQ#WM#0DxUsUS=4Q3lQg54Idjj1w8L#Kme#AeGPx z(z^i6djBISf4@PmEF2YDee%QU8)&5`klwe1tIYT$Id=!0?Sc#N*^8kJ>XMK$uoh-z zy_MjLGoaZwIHVM+y3?USHQC;HE zL78%UtF_KvXGPvTU%x)69$i%XmnfskwNZ<8U264eXy&Z;)|RGMF3{68Slb&^k9OGX zS81N2@U&DrxU3xQ=i5hRq@<&x3c6qp>dVIgRDvg3KQ@Jgi`D(5K_@pDF#KF^Y_8D( zjsA`RYrk9VoHnbQoyumtdfHjvthR9WFH1*9Y-Mbhj(X+udZpW5x!%cjdeyy6X(%0V-y`7}g33XG|LxFhTS3_Z<(lSPyWBC(=@5Ui|sYim2z^XqEAQSBdA z`}@`U-db(5g)*Dc^=V_dbImTxd~2Ud9MyJ~i-SS6ThCoI(Ps^x4Y%eAjo#qQ8z;pM3u|(iMp1 zN8YCH1UXn%3n7aSl8Bz_CL}9QxVv9~E9#R8LumYp-iZ3maw3kPiMqP`+>u03-J?GZ zLiD)40)j>M9A2DP>Q!Ysyg9EmSQ(bMJ-%HT$LIyaEW7U-lOm{L>YX7v&B{7$(a-^k>pcEtNH=6L7UCNexuuJ zb@r;HWshJ3y)Wm3dX*hCrD~(Tf4;U;Dj^D@%mIZf8WNsYiffyti*~EEv)0*ft*uly zYq??}wR(gX;h_f>rS8>6>#~;vk4xu=Q~}MWmF04NA1yXJ)%<0oK*Dp}sP)9+;0BP(H_^!8iTCM$k&BsAPNrPk(@KRk;s|lQ( zTzMLRMUxxF(h*8c0j%X(y>Zc5-{HGOZ_v5Umk!U?2fQd~c)MHrjC!^Q<@09se65Z$ znxms!sR(liPMN7gu!hkmV~R(QicGmLgI*_yr!jAOtlND0G7 z1oM`ns6K>e0Na`pbjE5=s%)j@s?cW%t8Ueb7fY-S!09U@lgV%e}wfY@h>gwX=V` zytkGgv@g+twRYNS=SsDHWvA2ZG|M}6bndO^509A0Ur4Vxv#hFxlqY7MJVwsRRl92( z{?P2^%lUq@jov_#H>*9q(dA0@qm?qMr_PzDT1E%Nes7JLoWm|E`pT=l&M|;>U0$j5 zw|54hWU1WjZ5~!P519cP2Z>}iVgo0|?efu})9#_bFIVmzUNd*p*axt3`=}%ausZGa zi*~a=sBW&K{dD{C90<#kqItyQ09NPxvb|HeZm(|F0IbH~f=V~ohH0X}Bw>B6 z8qw}z2_cRlVX0c|t}PeZ=sK;OU)Odnn>(HL3r-6f^qQ9?blTSjtz&A?Io~YR&jGCV zakGDTT_IYh)40XPCW%tXe3h|NNU)B+4_emZm2NQtZV5hwe=JdD+$q>d_+bdKei>|O zGI&bJZ*1KGJ#ZLW&XQr z{_efvPIY~AjR}{hr~+j|T7Y#>gN>T|FwFC`yp?)ysVSD7W0Il=^5frDFN>-U)1r z6nBoIyUiw(m{5>_7INYagvYv_=b38Ye`k3`qw)SqK2%Rw0V z%bjHu7Xnx)xdE_{9P>z6n`=l|K$9e_8eZ-F(vbnHaZ%!PX&njcqRhY*6@Ti01{$-* z$cQ|ge^)(Jm0&m~-O-9n(|0OeQ1hbYuY{d_I=yqEFR|SY9iDHV7Ll;3{gZqLz)~L% z@|A9{gH(r{yS7k9JYYyep-fh31)Art%-AtJG?oQo8K?9z7hIX?U>h^qENU8L7gE{6 z7|p1XOzDWh2dI%ppiP+U9JIRj5TFb{`kG2aHiS#hj8>CkD0M)RXRzdn(?iC4bMK-( zSxHjPs)l%;$tB4@G|rHvrG9Fd`;V0;eCo*Ozt3D&>@!Rfmd~L0P! zXUj26kd;6izXdG6QbMfBtY#f<9=A`3!3VglTCTTqoWDG8cMsP#*YoS$YHhFH+9@qx zRIAr$;e{Ey`D(Y5Zyp@&G)wp9Z|^fJzTal13#Q`xesjMlz+wzFK%G>z)ZQQL_t7$Z zv_B{ru-0>j3|xjo!l+Anen8OG+~vXGs9US)?lTDMgI-6yE7S#-)^>WA=dFBg|7gEg8SJz<#^QRXwZd%eu$a-> zQ9Z!IYE%%m_j@2RnA$i#M+KHA-S<1iPpL`ga;?kPgf`d=U>!3yYwfhx2iNWM{ql87 z5>{is*xotX0kAfEN9ba{Xq0>Vy{o!EPR1TW1M;W};vAPARbZh4Sbcqdaaf`y`_~l? zPrDwR?9ds5>cz$2yjSLBam3e00Bd`2KG^A&Yu)Sm;0TbrI$13Z_8Ej$Hyarr!;4Tr zRoIg|6Tt*sAeUd}*fMV6s>3BRb~QJd@q!1#M90jy)2t^36nr5dv3SA335OzT0F;3! z#(raA|;>%5c^PE0U*7OCasGgu0U4Sdjm@vMp{P9kj*H_HpSA~dt1K0#anWW`} z!{qv8m?aPr-y~KCMcd$w*PB8P9+`g8i~tLrP>+hYswZeVCt zgftpbh_%j8uUy=I^m(JqBRI3RQY;>}IAn{@`vBI1wTbOV<>N|)w2dl5oJQk>z_nJR zl3#zYom*d7EwASaerojOa7Xm?*w8bVL)CJvzCLk}G7y|vtTehrj;Pgj)L4x&=eKM1 zauwCXT2oPJ9G#(|3epIfm-MaPQB%gcKD3?Dw zJb9E`W5%p}@4M^8a=mr3R$gB}Y*C@LGV)z>4Y@JOp>4y`MwX0sR5h(BTBF?K?G<|K zL5aiF)~mUbR^#a!+P>;76qA)3t+nGx>;G!iPY$Ip+rhE3|F zL|VcI5oat*R)X9O0M4TMI$kOT(!y_-H6%tcMr7}q?A{TE$XrC+Dk2YXc#H4=07CB* zD}TLGloeU_MAb3tN>>Wo>S$hiOH4L-M3i=6;wn~3R<+lKAi~7^TyWQ z0yPM*8Uj{S4Yn=h5gE`MDorX2WKqhuHd%^^R=XnGX}1|y%-$={tz>m^jbuB>i*1DT_$y8TAfxY6}H+nZb?s?%gYvwak+xYAkQf=U9=JN0T9>B8NpqOT)}= zf*46uAO$K@=g`b|Z*Hoz&2m&_k|!%_gw88BY#~Z(V08&aIR`%8pE#GFv6rzbx2}PdAEXVYwTi$2!O7s1O1;C_;>}?`5QkNyX@^%${ zN@U46*@{J#>2i^PF)|J&ht=fJfj51q5)ps3MC3(cVtu}QRU4|%=H+`5MxfM~hjD5MUBHy&3KRD?z$yV3 zl`tEHTqQR2SV_W!0GdE$zX}Zwj>l`EF$0 zGL2>%cLP06)~VTQ;0Sr5xhgrc(Nt;$ys2(uWW>q*Bw1(bP2vzQVgRwQ1;b!5|KPTdCcnAI;@lwkcgO@{4ET}sEVaz!0>hX0;|hG@ zInac<$WA3vF;I3PqF{4~R?0H!bBo=)W^PwOum>=(xG1}`+*Tg1iKw6iE0`M6_a5Vg z78VxBH`Uo?W-T3Fql9R<>f~xGlo|=Jlot&V+7*B@TzbcfvxySj;zEf&>>J8WZFeyl zKTv@fiw*%xJ>fFd8N`iWV7aRuWebJWD`W)p5-iaVDn!#&NkJ*!`hp*+oT{wyelMvN zUn8>*tQ9Z);7c>27&2Hgg3QGkixPsu7%?q(hu__|y^sNP3dB-UL07zHu*jLP%uz_F zBaWk_Iqj-bQUR8ehG8ts(8FA=XF%1Fk=iOjQSE2Ljvxy;%lp8Xe4vMUCKN3l9wuwn zMuc z%VH^SM~xWCRGGFS-YAmMj4BAOq*YDBnKaW%39bal0?Cv46H^KQI=n;l{|;N zN5SJoYwROku-a%DJ&i??#iNOWVMm!{{zNh>XBS;ZWE2+a>7_3T!_XBN6gZUl&mw_X z84APTgQOvFu@`3`n5-HhD!y4V`IGS zO2XX6kcpW&PuaycQSd7Dta=K%UC?cbZqb_4=nHj@*4H{G^@boY5C$)hhsiaZ!?`E* z3Z$k}BdcYQE!9b*K3i>4Z#fK10ji|*w(%6=TnT=K$eywVWgs0l_S-ou-$^)5?{w~9 z2sOHuA_Z#U14v=(4bBvb!A)Wj@vO#bj1}!kyb(E;pN_iIlNIGO*Hh3?zv~ zHKLlzg7PtxD5D$5shYWVZkysejpRBZla(>ha)V{cph&y$QFX+I3dE7+Zcs8Sj(NG$ zQj7q$j9Fcb*i<+r=>qvtEG9Caj(AZ_703{wiOCc_&<7by5F-wUYXvunGQ1IBX%COD z8tiE}ND3%jd<--zuOwL^Tj6gpO!-*SVpdF1sYq6OR8)Y4*F8pqNKcZxP2LtQ;Nm40 zx6ijR0)+&^H`>llBaSjto*rLXz6rqgL1+O%QKHLHL_25MIOxG(1j;+rO#L@TN)}ZW z3dMr0RKi$9gPqeEKBJ#?bNpn#&W5=HL&Tj7p3yB0XU0V1fTf8V@#ZZ>^DT!pJwFvn zr~D`&;shfHL#2rHcswIRt~ZZH@n+G?Dt2{+l80Rhvc&cQE~-Hg>}urTg3Lj6R8_BhAkd1@nDL}RlVvvS#DkRC0sl4QcOE4ycp_VC3cqR4FL+8+9iOIc20Zg`g z=~agQ!&s4Law?*_T6gGMz%nNR1bW~@nu2dc!8vh-Eku%VG$6~dxFFa^_ncmwDBN1` zH^c=olRwcoDq8Qv#UY+3rh8qSseH3v#-pRFD?qR!*;feUskTvOdfEh(nt_%t^UnGn zpw;Wg=qC_3SUQ1UNh{>=_-<54*rF1Ot9Y&&0i;&2l4O4J;GnbOZKjP7WZZB8VKh82 zOR%#oy;#U$UIXi5l~YC(B&+M>*}?PyC}&4blFsV|KnV*cujzAaH5`IHIjzw z7+7_NS}ep0Ns|mYuq8l6cj%kQOq~UY8%(;PV2^P~vvk;nS8|U;00|Sb^C67M4BiUx zFz-&Wl0hH%18QQ_L?qQHLnhXB8?YjZd_&?2KA*XR_GBw(u_&cT7Oi~I(oDHB4i~Bm zWT?o@97q=PJ*hoe3)9v2I(iHrV;U_WE)S@1Sgnn`bPW_<;#effoDhClxoWmxolkrs zc}EY}Da3NM!WCia&g@09q$Vg({bxZcD~_vjOU+Zs8lSs4demQQ5*LbJ%t_`ZY@)=2mlSY?Sc_u~2MDhfdzgcktvpl~np_w9N`4kwF9vm>h@f2VuJCyp{j3 zR7$d4m=ZOyEHbQtQxHdDQz0Y_J$taN`JJ zgwiOI(PIxgsio=-k-iu%h$sAQ|C)X_h4!5DUp^jw8;d<))62CbOI! zg>W@WM0wZ+HD11|ic7wtSzhhnyPJ%3uW=EqW~tGRg_`()6}4m3UX=u1;iYb%#3|A$01J3otZ}#`6h*<81Njbj5{n9-SXMVvEEKeqljQ_CG0)64zLNzh)PsW2zzddN zt(1Ex?F_JjgDJ-4hk-pYt1j_#c<^xIefh_uhdhy%b_pp3T|j21Ia$5_^xizDxJ%I< zL%0doA{sbW+R&=pN0~~X3UbkeWTb8?qwR&VfC!#&Etg;^g&MA+S**p{sP*15YrTZn zu8&5EuM&lgGmwH+2UB*nL$S7t^>%x&*QQ(pmZZn2ZPW$M(!^sA#E)6$#_}>`1C}`i zZaeB~?x?lG0`U=8-6$7^CI3-itjIF+>dTZN$_y_+3RfmTn5`@+_^qD+%j_%`W7U|L zI-~^gcTnPLflM0x38pf8nxs<7yKE{91R$=r5i5lQCkuFlRJotQnKKq~W05<`VU z<9!|CzkFh_Xpr{Tg=tRJU<9jnk{T0;2!N718~vu1Mgd`>^(smn1DO;)s^dsD6|}qi zgnVP;Y)Vm&K`9?eiy|)3{g$vMUTf(}jW=hct5{QRF99G3L=kogtzxhOLabJr9dyK% zs+|^_3#&yo5Ej-uEjGQKqv)#BDouP^Yqaad?OLtbd2on2t<`+(vXRTt&9K3Z#De!4idc1g1uYt2q|b#=LU`Dkvgb=a)rKJ0v$%Rj2MF4uF7tMmHp zallfJrkh+WFOWw+jW#7;N$xP$V!|&_$Xn(ixCov$pPP#mI-;4SwRIFA8&ako{NaPe zz?q1EZ$cW`0=EoBb~3%rxN!W~d%QV|!nw)Hth$gT>N2X2Z1Uq@h&N6Ys98Ze z8cbA?iZ|*(<(){j)c+O)sr0viWd?CKh-Wf(36zpg)Xf4Yv^soc>H zYFpO(=e_QEzP{P+9795+&$ks&vSgVGf)v(W+0XQWF~9G$(kCW z!exdn6B7VdrM$n>{qXwg{Ge4j-$SopuC_DiUaoFlU0-ZgS9kj7XN~RCvwpR;c}?eE zpZ3nX>z%XB&H~B?hS;da-H@_Izy&WDwIpFN9P{a`Vp{k~Y(3(q;3Wr`)d`g-0&>Mz zXJ+be?%%(^*}K}?>z;4jzkkZSvLVX}&5Vhe@qUHa0X@sym-e=dLNqgd!=2D!e&w(J z574dn!jQq1@oLxz+JL~r$4FxoIHfijuo%J_BXJ2kG(JmUB3#Eh!WsdMo0ml}U_}&p zIi(CT=PPQ0`e9^s;?RL5!>u&q?&#kFRuZj}03~cPuUMqABXK!)82UDB*fTxbR=VqLQ@Tpr9UkWp<+0<31fa^70+*U(~KS>ONc5xQp@kMe^~nLW}{ zkMLOyEq|5XQS+?2*2t4h08^IRjjN<7JjBjfacZwg7XARN!g0BKjgp=mM+mRT-9MB}I-ZCo4l}YGLAaSt&{a$d-d#cwbX4@5BJvxz2iK(?Dt!% zdNZ3#DOUja4U|Pd!h)APS0V)R43*i-vKAaX#!zNpBAKmqCzjjcTp~mZN5B7_sccZq!0XvXpcaj+mgzMxP`VQSGo$yYL9-&^HT3^Pk@XdKYAV zV{%vmYs;~&Sn6h>EKKlvQ+n%b%1WFRtYo{{C%n}~;;Ccw!W@;#wTt|Izt`)c+~x3S zuztGVJL&^ihv#f^8?>9fe5G>rsC|j9m2&xV9|7q4d?!C>mCM(tD>!5aq1fNq!^|#0 zhW>{It0Lm&h~}CpjGujx^!5)?_tIYLRZ5l1>!Zy^v%Rg&gm7>5V!hu%`+WXl^ZMw# zT|M7FI?S`l#(51hbot2`iE-HE2U|xC%;omeXTQP<3cm8qi{);obCEBWOV=%&`;|V^ z;yblk@BFB`wg)WdbM1>tcl~(zYMtGDsSt9B!qY@P=om1mi$Y@j>)5!3kodDYy@cmq4kJS1^e5~7C8WtKKj5lsdLRp#?x3m+DRrSA#mRQ-oID{L=7~$2}FmNo2SAN)?I@L8&(qT$^ z(e0C;^OQWsPZjpPdA-q!)(Zf{BY_nogb3bB{zJgZFjVK1v z$dhTRrF^Aq{-S|C_e%h4wYl?j{k&1{l~EpnAXfyiI9euGty~zpyF!8nd%sxu~z7te4A`_4d))L6uW4 zq|vy$woo}(r(6~5)=-RWfkct3kR*8z%Sk>_Fo2aeVC_HJK19QgB&^RCmQhwyUTvr+_uY-c{D%a(?FuUa8 zvdznxp=-o;Bv4d$>e&#Nf< zYhTh%4neD5wVK^t1r>&s)7s%+L0BMwh?138a>xg3WSte7~~JhV2Pf75?+|7-=kg5>@~Fh7k^ z;@LXfynp{c{pwf$;myne zcn$6LBNPcsRZ0z@uEqoBlmNuIo0CJmL8B(w9E#Imw zaK37;e$=WCmJ8+~GKOQL6gVm&qd7L16@DF)a2yb!8WOe#N9Yr6mRA`Pwl5p`N9c^N zPOcpds+W~q>l(Ft`35?U%a!)g(P8Pb{<{E6Il4MRl_Y4%C!rJ^oJF{GT)u1__3BJs zNntYbWT|=7?w~Wib2Mn=*V?^7b$w7qQ#6{D%Ya3BP-z@3kb`nohWghvyvP_=3R`QebvfwOiwjhvRbOqdFHKe3*GG?X zO@zE=BVX$^^MgjTP8qA%L}LyZ$MfxiETL8gRJv-?$BbfjOPHkBy(I^6l6j1MD;$6< z_L^TD+;0Y-$z0k#+tO9Mym;rWhs?l#`Zu3VO%?yQUK0sx{ck=4vwqTid;k9R9o91~ zJ?Qj)qPXuid(FGsfAeIw*_@w$AjkatpEkeu;3wY|XhAWDbpx<6yt8H=1|15zJuB9oC*-ltI~z+0$w#-3wfGQrjPAr#wa zQkXd|p;yqFqgW1AM$a85Ck_i!e#+W)$ch9U#Kc-7CI1v^i(^X=y2X+%TAIsM`}L9+ zThVl>yP?H2pVN7Y7yO=autm+ddJNUd>&#N-JpiIxbTdYenGz)Pyl#x9u(B=>9oorRlH~fz>!_$qglh z@)f55DtToW;S=Q(5d4Ho?|k7FKCm@w53E3$;Qjl5IFzplj7h9mLG_&{aBA!R=F*=RLoA1njCdbBqGyjwOXAkdph6_oD z64u}T>TfM!DfWN(&9B}9uzn-^KmO`B|LOky6#9$XTB9ELKx0C_Vgq34rLyqjrY%2v z{>95Lo*x!zp~o4|u*j_43~Q)X#odkb0S^=T&18QJ)`H zD=L_@60_##fBFdhY?*YW{-h5HouB{ZGY+_L%&!|6oN^Tdyw+rX34?wR4{_m#P5mNw z_$3EhQN*!qbM^?U$V@caT+qm**kA{M)ytQQFn2*d9*$_gh&TEXN&9FD0M_p#iWN_b z%em^8C<7Pv&y_h!jDx|zK{n?U(PKc?R6>{|%^}3F-Y9q)jN!Yamr^8naF)tB%a^M} zE8OB=Xe_`%xQ!oLs){DQ+Ue1%z9dl)`tyoXNhPgdoWac0#=Yv!)zx)Q$CfP=Sksn` z1tlv+yIe^(PmLTaYviEOF3_>m4Xzf8Z$Th$4$Bgj1S$;)1yXdC!Yb!qA3WM=B*0RgkmUQXXCZdab;F?CW~ zp1JkKFN?LgsqfaNrmEG#i|yHylc~Ad$@cW^-ySZ_+^Z?x+~Kpi!xz8&<#zQ1U^@9( z_4&yIY*QyEhcEuw&!(1^f2OP#|JB;Pxsxwm{_Mfh^uMYtv*@^X?_`+(UPRwL{ENmj zwrroQ-6KC_yyb+gdKnn(VnDdGWUe%4y{3loN#LaKg!)S)nMQbJGxbflfS%-5WHFPH z*h?D>7nZAew(KN7T_Vg8HE{;d#*}UMMQZRAuQ4ba|j zponLi-D(pNWskIuBO^hStSU-<=*Vh-YQ!~ibg*=A-C9^%4s{MrbJGB`K}-8Zdt@r3 zsL{yJwveT)lSS@uf>^B8f9Kx8{r}J6zR>3W|2Dt$litJo5AMFX`|je~YfDSJySL}=zWL^- zOYgq3JNuLSTWQ&-XX1wv)~kT^W*QRS0IXl!_8`rIk}C7;i{HL{UY-B^x6huvcsYIY zd}aBCz~khLm0uEa__Hr=-FyDqmoL_ipB)yT{cPo*|Mkk$%U`a%Sb6lKdh&uaOVeNc z#r8jc{_^>=m8tocKV5$L;^oVg&tFd8`{Ijd&z}!{#)M#vs@pTNkafiFb|nuNV2@!vLY#?JOT$zKtVnnZy_Et&b9$tT zN+%yigGD+=XcORITgpjx5m^}zBTJd7{LBMq#FWK@%9PAVrnKBHX+I70QwCX51u4Ij zz$j%I(l!3wfaPEt39x(to*>~8qd@Txu9$`)n9(2uK=BqK3Y>lLPJ$@M>D=!{UH`=74e-(uRG1*cCo z=I7V%Z_F><-n~EHM9Q*o<@H(LC}F+%n_vCv$u~<_`XC3a3b8=V?GjTV#;59bKA9C272VKLsKqGTdh+66)0Yai=bzF0aqY|j(iDZRq>_;32 zjyP(}Hk2%e3}$AFe8=KB2Loxcr7$-k%bu&4b;P}?fv#XmU}%uX(9;${lH?c&rVW0V zSQDfGY+=eP&`F6*wnS`}#9KouNyPnG3>6spJ8wx?qAd8;s{<7uLCn#z$o6x-QOj2o zCbtSF$*=;hi|X@r0(i0sED2XckdM8FFL%wpr(vNGORz;Gtq*6E7?|Yi%+&e)oljvl z`!%2JVmE;`-+2OHgoMSH!mgGzT--mn-=1A!(tVK#yHC~@PwziieE8(S{2%t$=XZDU zeE8O<^K17v?)`+ZqyYy5`kfM%M}f#|Hzh2v)?lTiVAiwx+|=j)V(IgjD@#kvSbg`! z^Hl{rJN((R()P=rf=I7c@D`?H3E#G zztRgdMzP0JMYfnin@A&v@^&?pio!{&ar6dG+M}!=EHy2{sxMdJgL+_uskb z-`BYC5ANT8=Uq!!;KlUrTkW0u_jkau)BUac&H1hS{hcWsJ7-MABVi@9;es;K_tUb5 z@gbo{mNDu6>Ks-esAvD@7MGv>a%%eJ=QE$boS!f7A@47~czyy%%s%^PCtoaWKdY}i zU;2yZYhcc;-~J2<>e0*c^TU@*D=$8OR=oH5v&yaKlCY+K`*L~Z#nQ_E_;PCL782I% zAHSS>`EqK$@Zx0Y!HeY=-$fF8K%!r6H=f;kUX#R$gtavN@+B+QpVvw+W~PhBz<%kk zkB*R{m5n(nRCNEqe*F|J|C3s4M)Ei(mlCF|>lCjd7h6Gr`F-US1EQA>gm2dz> z0<55;jpky9tvQ|9sg3(v=bvh&5@Rq;a?J>^rX*p_pTBc|Yv=woUlvdAcUiTSB&^>3 z`+Jw~>`r}p_167&khwZf?%)5zKb2$i0drU+R90j%hiZjv9o9DhmX|fWDq$tWVv*P4 z;{3D5%>3v7V)1_hXVzX+wx6H;^ov{Mjg0jCb0(S?1tRiHfAP?Om;spS{zl9irUrw?D;TKeLIDZMXFrjXZ`eu+#~`|Ik`(z7p~NqDPHJ$O-= ze)(+a<;#0ZFMo=3wXpQdFN#YiFG|z=(|i1wv6}wk89;V#>W{xD{ql?DrJp@hkcpn< zDoIQK!B>9DUr!?dE9-{rDiCnUuv3f+BbRZ)_!ddviDBTF#efxgDMSAV76;joMNIWI za-3jJg=KMuDG}W=j?Id54N@(>mfwHfV~n>Amj;%sTqk#dS!Hj840F#~m^=hnShJc& zGXyw+WLaJjdzhoW0Twl1NfjU?`YjUK>(z9_930)DDY=UTKOw=WX=uR({MavDGM^c# zHU*hr9$kaI%t@Y75hF?d(tNz|NQgE2+3t6~xA?}!#&_rEueBnJD0myNWX{a5%mO=0 z-~GwkZ@+z)fWFqnvk+cDG=Jx_&lqA7ZTi!nJm9*-1@BK=Z1~tpTl5^(fBAP1 zfc5WK-R`f1|0(m}`X7+MhM|AuYN#Sss)d9#cklC;w?F^lIpe+}BSXnq^HY@<)s=t# z`S$1kthlty-1@WUYo9;=<*m>E`rhQ{fBj$znW*%|=YR3yB@^qV&!7LZ&tJS`M!otR zS#*UJSAY7)FK3sZyw-S~gYxBH#J@`EsAzTRovKSU+ zJe?Kz09$84ScF1$hTqVxAd$TbGQ(ld;4ZVJ+`*kgr@g`zXq6JnKQc|F3`@49K$wKE zz#iwS6i`YOj#tbP$16b0K8j##@)`G!7-JDrTZsxRr6o`yH7WHlPb^BrPc{XlvXU!C zdai#8iTEkiD7KOf6DNm4B}>U^QVDp0L|lzchOVJqh=h0cmC)#fk8lY)%))e43=ji= zw5CW{WZ?4KAHWJR>koIIu>D5!l3+C=L>Ra)P-p2bD^35fzw_qaO429gZ90p@ zCW3!5hHK%6R(vfhX%1_gvSkh9ej__ub12)p6J7qw_WaD;^z>7YmFrRqD!m?cVn7>08U>#GvrxcisGgGXb z6zJ6z&dV)MstUlAZ-vK$axbN)T|D%f63?+(9+$wQtMxlyg~|6Qgko#m(GWFvR@DM;0F?zStNs9FTcRLM@Jz{n!&tne9{ zjyiN@mNYJuGje+suz*t#EL+~5a7>pBu&mzzo)I!7*5MMvKl4ultn~UfG|fNSVw_ z^ou2xmzC@*c)}o##dC52C5FM3+A~%aoB%-jGiYeG9uht~3i?MaIO3dP<=xD`(z^C& zs49*2LRL~8@>NiYh{^$y3WpTWGz~tfQ{AufnUoBb#UKIhC_8$c5b{w(G0$sFW{G&h z>4yw=#=E2---JAxMF$2HtTYjgiyiW?AK@v;UmKO8kR?gUf*Tbt<5LBU&?KRRJ#AMJ zn*D-EMTP}4sS6y{BPujjRxo|W&o^?-pg@6|za5HI~ZETZAa63aWevI4@(Nk*B4XXKK}SRrnWAjwcQl&?nqV`yao zOX5`;5sIPAWw91Z{KV4t#8%>^;AT)^@zGBJtf{Hb?q9PSDaZf>*Xb%{=gD^#%}}x$ z5)2DjNQ$cHH;K`sOIn)#pT{U|eg>_^JjblRK-S49L6>q~`{ixrFQ1G!seAjL(L=x- ztrDQBh2TckN_hxJ1SJY_@?kbV`|an&IYUjpZEj{wSBzSR83=!vMzZfo38sSugrqps^%~Hr$K6b-DDNLN?lo2j-NKUU{ z(iD5as|ya(&}Kip&GusAZ2p;mZzNYIxEqt`5i4CrN$|+(G4za?b0-`6 zrR2zTDXTF#2ZSKlmAV;U4NM6mLKe-{kTI;7tfQYo9GZL`9}oMf?Mb$j$4yu=l!aHU zX^2^@ zCMkk0c*)FcilIHxxG95w9bkL=7U#|L&24OWIE@z?_2YSoM+PlY(@TcE(^ifA5}hlrb=_t*F0M?2$|o82%3fidskS|y55BSz-5mwgiVrD*m_tTbZ0keB>K z*$^LR33Qcb^5eO*hbofQz(sflEh3LqGK02pE>|RzzqQFWM3nHC<N8Jq-vWm#aE- zs(w!OwUiNJ?}!m;3^q5i%u+_inTy!3)^8Lf33lXC#&$)K$stdzoB*-1s9yuDn8w08 zgsF6OG+`J+MZuEE?|C7V8P!;Ye=rgj_(}l|m#i`K=>xI<8rl~^^f2?vD_~*F6Tv3} z1xP74fGzw}pi*)`E4Y$@O|W$`#{i3ObKgi>CGT8ZU@A4d04dy2sqv~gAA^fJ0U*)B zSp$=6g*!;g^|;9LppkvXkRyCWQA2jzH`b zpuE$cYBH)8G34QhSy96@$s#BigPBpDuST?cESIS5c&x~0+y}c;gb`>lmc>}qA(G&i z>M*KG7Whh1wQUrAEVE=Cj~+93nkS>dgd3j%wG=y>ln=lPn98IquHud%V#%cejaVr- z2Zlmtrv)vuGTaG!4MmK^&;o(P#Q2DhV>B3io+5!3IzGmLm8Ba`CO?6VbQlNO$K0G5 z(|`2~{`Al1z;7ZxO$wA$g;bEURJO19Df1xOW0VM}pz-v8AjrVvE5M?tsX*E3mq=`X z9O|9uHDzNlN*$>rTPhW$sj?0K8K^nL>2)p<@rrh}2m;T*`kGsvMkZ z98&CIw94>6>9c|()Hy0qL>Z5m)z?wNAY!1wm|sdM9|w;IjoZhvPQ8*Eu2d;-7$7hzt42 zCUV9xn`Bp{O{^Ay0*kPT&1I93uDHyHcH)WKSty4T+nz(n8J4055ed`WN>ZnmI|8|= zxKtgvq8w~WAr?1{Y>web!%6bUe3VBd$xLVQy8^RFTs^XN(}tcT%~FqN5M#knMThZ6 z7FT^(cVm-~Nq}WCOewktjLB0MV^$U`ldxc!#93St9O#-vFvJ343>Q4Wj^g8+Xp>yJ zWRPK=7JrYxLo?LD=l0hKYeW%Xph^CM7f2jELajwP?O`0t;7ZrAl2xWj*YHn1SwI9k zFB!v@gCqpGc}pzwNbOXOvR|akAWV{ypvRaMz303TsdP;RXyPmSO&)q7L<+%u*c3T# z$hUxH2+-qeeksU?bqGz^BSgU|5*GL&G1(|IF&vkI<2ox0^NwY$$V?zePAIekP|d4n)y-@w(thEgeT#-FCGfBie-91~QrXni&_{rk z$xtKwLabt8mU%~PhCN{xa3;+E<(h@naZ`FqaLg=5cnMn$VcMa&`tIPCZlzS*!7<0d845{L=5 zlJw;viSSCo6##`Hmr1gMg|cv(qh(n8rtr$Y_`r`hJegsJaVL<(URu~b=EN_-OH6LV zy%Eh|W$ZzAVk%xLZiG$Xm7EL!wd%@#VM{4TXhlB8iBv=csL}zXfg^wp0HanVFb)T9 zRU>Py28VXb5TVOZV8_1@3&WrlsK(N{5Y7||B#*_N@CE_=9IQmdAVPSi9MgqR z;@yfsB`QR=Smla~yzOwbluZPY_}E#cxWg1mT~HGfIbbZbfQC|)%vjPD%i?|0l^CW` zeQw605%$P3QZb{VGGF}Yiem~*9i|#O+9>WQU+On<+^~I9>>CkA4w`Rd8u<)mtRn2A zFq;Xm#B^h%P{My7y%H?e6(?tlL^B50)nPKUu8NcGBc_~j`oxR}hjQFAWElcN3UMlH z#PX`F`PuFHmHBO8if@PpMy1lKD$agZT#*WNp(-f6ehojY!=%ZI2ex5wME*;%B~&N88{y&QA#IITf~RUbe&rS zkyH{V(X!HcEvM&t=tb^&)+sFtw{w)j`emgnazw+V$>Q{Gky_;f%|oQPk8NY8P3v1u|@DD!x@DCc_Yc%)`|2}Ns_2KtKfAGD=hoV0)$-}P3_dZMX zz0dU5aAfE3nVqC>e5hEB&&XD!Kuki1B-g0a%kb=lABH}3z)%Xuo?{T7@SsBDs zlDLpuO;PIa`8SrkVu?PqsgfW?B4hQ5{{EoxN>TJfM9;GOgAc!_-pM?(zEBnQPj>1C zWveQf@X+5l)p6jbkOnQx@*~^GfkIM6x%ytH2WTr}EDThvJE{;BbwZpM~8?{)tSxhv`N!Q^d?8 z$`~sl0zSjX*gvy2>K`M z=$;R3ifv9K7lTCtUQd)7YqbF@iBp+(0x`+Ccol9fa3+jTY0(ihzmtl&qE3_{=CRN8 zQbZjmlhG>)@m^i!#4l%zf%}yhH&RCpTn+n2TzrQ_ZYi^&S6CD^%UdlOC#6Z00(3MN z4d&l879n}8LSvb@BF;W5JylK7RdQTj>5F0DSWe-m=(35jO3+j4D^rAUc#nEnQHQZp zNV;&CP(~VvWWJf7uB*i&hwU6|qOedXLNeunSC|gb?AkFg9jj1uOd?Mzg-H`>woG77 zMgSLkM$XECDLUmKQY3}SD%#%mB{ODFR}h54mm&@(d{7>YZGzu0FpE^=D+2b3$pXP& z4;_n!m2zDs^NOm8tKk?5U{a3=%1Zu>Nr|sEap4!Sl}b$^q6q&8B|GIn_YfTA*iuw1 zB^i;sLdhHu-S1FEWolj1>jEurP?Rmce8}rtz|tV!L;W--Ac%@#Vj-^TL_b=(OM2FP zU$7}4{IKX27x|4-+yhTVLyjl7m8s#}7}Q8SHw*^_yhgnF8&l%sAc9JfhUpf-tV37Th(Sa(Xl7!2I77QFh7~!0NK_kB zk#vC^n5^NIs-Ywb^k;NgZc>^XXYx5_rRPS$@u`kkY0ZRtN_%A7yBGF*bN6H&y5yT2 zqsZT6BN;Rs7cx;gO#f%zijZQA;*R_j#!tCNHjZzPaEHIcWxPU;6Uh}(p>EAABu5rx ze|co&z1W#!boED3JDK-amqGa1Hs_^gxQEdlnr8ip#I4p>RKBBXE=z%47ZINpnX&&C zun?jwM;WgSQIfNOthgj8OOD?|5j!Hlu2@25i%j%+E{lPWKP_tNG|{ju!fcPU1v!+C zs92S`>!_53_=11OLC}gayi6x zRFKJ$B9Uuy!!wH#;Z7|h%QbmKEKDg}2uH#~rL#w*Nx?>`2y&H0Y0E!Dp^7|RzQZm#*MKgnYRm6nW_<d*_VW~;kCCfws z`s|oiBdE9NG7C!TS5{WpLo?|5&t3<%;-fybCq^KaVarC`7mHcn0+zX3AN9>8#u;Hl zUqydqi3*tw64 z6f5QI*chsdJ_d~d4o~s3g5qii&U77Jg7K}VCChviIE=6Sv*1XP5JS~X9!h3M_>9$Y zEW;btu_!4GIHLOgf7^S%*to7cO^|;?N=j0>6_#3I<~BP_wm98gQW$yy&V#4Xt;KYN zR%6!NXe{N3fWQQ>q2^#Egk;c!QKAPBg`q+{_(2lT25N;B#fLl)0!GYs47(+wLCD0y z2n>VfgDfuzkbYPoO|y5ef2x%-nzvW z3-^aM{u|G+jOnZa>WD!5CUXoEK|Lo+)Z*ig1gzk0!FdS;@^`px^o$kVJDSC!Y0IFihFch-be;A7hZb*)7W0audW`N}g77=;8 z@()uHr-)jFDU}9TnoeSrAsTT>P{&!u1PZ4ds6m7u7d#y-GQW6cYrOc2bTwT33XbS` zNV?Qf1~3w}F)NY;VV0(2`XrmKT$xRuBqk~y4izI%pH+x?6RwmjvZCuk5k}FJO_!sm z9umps-HsI(5duJ-9B0y(qUAJPBiCCd0C0~D#rA;`UM^HbP%Geym+=D$ZC`Pv*$^r* z0+jJ!*I9Ef-wI@@8ZQSx7ChxiXaSKN&6n^JIf|YRqC1(33BHhd%%ZomDSyj+I-r8k z0CZnE?2x3RQ5GvD!2AmEawE+xKC#zXh1&GnixoIP8VFH;$Pl+f5AwPYY1(U!&mYo2H zSl)%6=@J(-FKoCfd=HpFpA~dzIkwl-z)kBDOcZG*Pp9b&_6RfV!Q9h2u39?|aR2}y z07*naRC84|X@jFeVnr=aFmioP4Lyzl20hwRW`=Edq`?q%(8!R*X+?!IWQDgH@iDfn zWkU~Ap^{02&d_I$ZB}xmSW9(2Eu>8{S_y-ej&F-hO2j6w0i2o=;5($#hun%#Eu)aC zBzKdm!q0Lc6&rji9se6r&hb5pPzo*|z(mLqODfpHVh{{~nPWE(!6IG5C}}bC$w8NI zvdl&r_ZmyEE}mKP3Ir=2zD)*!h&7f5NSY~394I7`r#k2c`e-o#vyTGK0`Z^Wm4TMC zY+)EQ>>TKVeU>vJfv#;iE}L>Xt7JIyRC6R;fqGupQ9Tj9WK}r2b>-qZGQ>m0L|C|n zC$O2N;NBFY)u4#Bxv){a3TXs24{XwasOPg(mocHCZlen1OhF@fk_C<+m)t>$ma(#0 zBurHu0%$=%6>u!P0$Ynl&vz=?*RKPq1{8BB<{K#m3^wt^## zTj*jyrAZ+ep`y9s%(2D)&|oD1a6pg0%%Q7L2O`cMZ41IcWmA0brQv( z8v77CcI-f*zniibvsRQtJzznMUS2Vb&Wu_PeGVobc#x;<%pyk+x9YUQKfyz>wjGkiZy> zOB7$_uthv!0c#GWTup^R5g7UCDqcdWJImOCE#@Mqk!5BfUSYi`*g_U0RT0(JlDO>s zdu8^=uL!T?DMT>QSnv~{phbt3)4_WK!NC_?8~#n$FehgLZzsT6HO>*F8PkXXWIUkA z3^B-(;K(m?H+dl3MML{RDo?D(nV;6>Bo zfG7^7C}IGGQnTmg4|Uk&Br?Mv{!`ZNd(npGHxA5rRX_8I*SDaFFy&m1fMp(S+gh9? zuo{wFwt@O20xj*UNhU@G*K3pmS$>Fxolrmnv$4shn1;Btp{^YCi50uEF`b4LQeli9R+8Hx@Ev)gmd!^y0=P z-v>+{uzb5|NxuR^AM7sJa-Z_%MB0zRZZly^Q379vLU)tiu}7f8g0WMUYzN*1NQISeq454TjDJ4nZ_%0+@n~K#IqT zWD*RT0)lb)m@=*WICos<5yCYqimj-}HtCo{F_00kgi~%Hpl}vViVdo%Wd$#(XFloT zHh{3XfXlgeQ~?u^_L(6A3J5qMz6zx=HKS!xa&h)=Bwt`y2A?Dwks>x)!ijv7JWuvj zQvAbP#t(>LZ}0OqWLOPqus_G4McEB-JDY}O=Wk=Q` zu(Gyt;uJ8$FX&TeE9X#X2|Xh-qcUfMFv}c~>&^%=qJB-=hTsgDIVUJJ*>?umiOhwJCX7ir zKO9hu>XB3g;tV7x4nALW%zo4)8OhjwKq43x8AM401TyT|dPPzeLfP7nu7#S#1|ret z=yG}qmh&Qd9B3$z(Vfki;edGF0FNlZ7Xc^qZ;xCesf_@JQU*x@n4GA4LY!o&6O#;# z96I5VaVC=8gQjd4Q@ycsnrG*sum&N*=&E_h01Z!Qb#{ssMRtHAcWgR9cZ}4+pI{6X zHwUiNlz^-MniZ)!A;&c)hh#TNRg+arJ|inmH~L0qPjw0Jb_hdEzGOX&kwpE)T+&>dV1z`SI1!$RgMukC z4D$@ed@k5hBdZClY*FYx>#YQhZbb+)?_z{Sr$d4VTI{4Jp^WBoh&T`dfi*q7E~Wz~ zUq=%O7(^sdPV93u79OBb0?Td5h$!;oy)igU?I7x70P*B_>c7* zb@4WLx2z(BUudMq7RezrA@klOz_O2i0hat$9ty8x5^}gY z9g=SAG82#xfkohAG`hCwDp~^I5wVP77WwTQlQn!IQdx3nCZ>s4?`D#geF`y-Ix{Ik z1;@uBT8Fd&%WUWfDWOd&ii89taaKrzASTFtZIf*wnS^Zyi9UEf7gMWvOMT+NB!QCh z>@0&U);QNLHF(1_N02MPTXKs!0|xjKT$fkA&5AFLi`>zT>++&+k?G;V(;CYnNU+OM zh*@W{u1S%A4mp38GI>QBGXDn624Ey7FG(+;ew~IJ2vv+7PSCOA70hi6B{udbYi}&!0RBYbeYz5mS&ZGcsCRy4ozh z!i2hMwt^st#0|yR!n0Y=O{4Q~%!Ji=8tn2fHkqB={5SB)-CrW7BJunw&GEB_6S9Fj zHJ)^)qH<>0d7u2=x`b3o0gAlP`$Ed!*c}q{w$Kqmn3?d=r&Vj@Izr zDe}b&nQ6qjz6)|l#~%z^ZY1`@woeiR4Mxd96GfK3_7^e&f+?b6-OCEzcO`j}q+>kg ze9zd6eLjHYkyE|H+_n4wk#q3-3o)(J!J!HyjdrQ`wo8GVT>9IOvF!xg2`aXEE9-0fB;xp9^%TE zh+{dvWW^D%(LeS`bQ7ewpbPOoKl15STErkIIPtaaKBj)<|8r(vZfsvl%ar=F>F5V# zKTF+1-x|UTM=_n4RL;3!7H8PSSRKzJtjKHNXqMnE+0F`l0{Dgdc6?t`rwhDV+WFcj zc#0HUfx7vkGo!W>Fu{yrvU41`BJU?OR(98d{QH`9-HSl2pmY0WJLSQx7g~& z2{zRTMzUjcB&vE%p@F6-$n!vo6o6R=C2sgebIQSn!>O$8jhjXGpjsHE2qYsJDB(SS zg_^pw7smmw7-1nZDI1B^F&4s6(P=(P|Uxz%LiqM%1oDU-gB?|ve$OG9Ii{wQ>0+hWTD2ckq5iRa3t7tU6ZT> zVrep2uJDmBLdz#d@N#%xnyMCT0%(lEwK86D#&@Mz(u>fb+wP9YoewbE(RHbxCi5<<2uUsJ*lK((QPm zNk?}3%qX(EV%por+LD{jl%a-uR0(q2{YHX3d9Il~+GURzFhHRIGga8TI}I3`K$(=a6(w8)=6I^7A=-2`=(w;wuMdzT?;W{p|;9tl{QFH~o>U;Rk%F4Za4=?p&f``8S&IYm~l`xZqy)ZP+-%ZeopS^)$<(9myN8xXcM^uimDoqL+OhWMq? z|Gh~JAXKg5J)JF?V@1b>Hfb0@t@^^F$B!Pn^hoLP<466qpiG|I2^=FTX7E?aWnG`-ND(UsqDk24ed4x$_w3Qz}G44bBT` zW^^(nx_4)1*Vnp5R#R&j+LWy141Or?JsBQPMd1s5o-Gdw^id)i1q`TsE_srXNYjlx zs~Qo#f#I zF%>kXHsv`rm>iVIn8ay2`$sK$TO#?CV1`8GX8rl5yIe&VI~>C~j=2wA5+puGT5KtG zJ^c0Jr=Kn^-oL-n(|i8Y`9-Grous7wCHkC__bHE9q{EY#If*6(*+!NqS{h3eNs=fd zgQyrzNS!U{(FvJqh3=Q$*;%|lzuHB*;YuC}=-)hYrihbOvziIH+y&SD)ka;DYLF=l=HA^Nepc1(t89XGS|_)kAZdiSTl zOp@b2eV6s0{&Em2WA?8<+#e*q5$GJ)g_0hDBsWrpu0>Dr?&3;MvKYa6ApncM#a4(2 zXaosFkial#BPhu~nUTkw8QXv$Bg>fk8n6c|u>7+H3UnM`xrZ32$3$D92gXK16IB$S zF_^L;uqz!5MO=b0S#cpEK~u&wI!S4`94|Yv{{`qeRTEA5Fe*ZV|*>g6|-7f}iM#1%4qUO6FuChmd(CoV@GBZu&6WG(j6mXn1#~=L;)9 zVSplCw{=el)2fcR;kZ)e%8f~nVWFgPD}*q5Y?O~;QBAv0>Ks*K5_+Q%vtdUBOV*Qm zgd7HnOve0kSE6!Y0$XSkV<~T9VjI5VAYq>bmuwhppjV=ulA=-6*fsz2ApFOL>xFWq zv)}5X3d1qVFxez}6yxRhOeb9TF*LwwT{7211M9)BpMSXW>lX@Xe_CvPczB}93j+g)B<9C0FAFEIwlrnGV;Q?5B?|zHn9bb00*cLI@mi=htG!UC4)2tVRmZW;2TBu zfc^mr>kts`Xd19m6eRjsj(R!(B0Gd!>`2Va5DSL@J4irH;S`_EH?}@lG4DQM)HKmH z^kR!XD=;D^S6D->?CN`lYjiex08>$UoE1xjcd)j3gWZdZ zpDylnB-r2ekkH;)#ZNZTwebfdW|S_tXA(A2#ml!ks1b?XbZ3>VVZS zq^trW8MRXX;z~=g%1azR(a~1K{fT0=*xS0YsE0GyD-W#=vs7(kuvO)@cYUHUC6jN( zEu_W=CFZftQ9l`=+RUTbk>sEp~J*gB5Mck9J=3-vY7%h(MH?Q*8o_o8@VyhF1ly5M*qXb z+Hmw*oN3Ke9PC)R|F7Tq^<&(yh9~~v&irt-dZ42{IllPG@lO_UzmSL}1MTpXBq`9@ z?Wp#yyhkk55b+D@nxzCk_19KRx`^%U$?VFuuad}) z+u%01ggsfkMe=AXbZalB2(bQ_UVNiJX=y$F?z_iZ5dOBbbiDlTyF3%tJ*Mcu;Z_`N zRo z)^)Wq=%EHvsaE;m&F{D12haH2gMf(p=!}JEzVvvzg|Kw66~2C;D}h}ov3tCj-NjZ% zj(oNMrM1?Bhtp%jgdGgBc4-YLPw`~wQk%tYorii>dRm1y40qxLd!6`(U}yJ@md>Px zo=e|d6XI02F5!nw5nlCnt*t)j=7d;?gzGcGy$nW9u*HLcR{QX!mezzD^MxBXx-d8G z!&^t8!59CfTdP~GN05kFow&Mj25={)Zk}2ZVF3hjc>Ie}XzF5qrZc(7-ZOyRq`|?J z`$G?Z{aBwh{rx-hL;Nf#4)!hX^zJO;aR=>U;hHbCpBSH*m^f8&2qr)DUPs@f*G36l z6Sx#ep*mRbkBA}?NQ*6l6BCIZouD0{CJh`MeRM=VM2PZrUgTccFBljjoCa#vt<$)_B1uTek zIl_h+#eu3?)aL~btZ;Dz{tO{4Je`obWM*y7<6!#BkKcW{-|l_49)Fp@RcI*`i+}U+ zzsEg8gJ~XY->DBTj#SXGFal4h*ok4F0TkemG){~Up1afCi61frI%s%ph!;7Lgw7~2 z#NaZhlS@K^0FMx1Ws6Ww_yPdZFDq8dADk*3Zu`Z}l#4Yj&(Kq`{Nr11rX_?NrBVxi zu(i~QIE3F1RM)lbjsD`H!)?P4Du)gfmzI(ef2EYYAeK2u08l!*x^}3urDyXbehHAT zX-HOZKd5#L;>qe#TGE40rP8HWe$rdDMHvUpl_-Cql{J{eyBfB)3Z-M0@R3tnTTNO! zu~yhzORK`8OB*}eWk?@73_QXDyV(79xrSfUED5m=z)J6-p4A&k_f`RVrPT*XS}GNe zZS);J!e2M6ZQb8mtA3S(J;({JC2MO5KGM)LCJgp)bSfFT@a}(|6+@0-bxWFZk z&wQkC>7yFv1Ke7%uyX%L04ywZIy#DfxO0DK5GSlwJOaRCgjFJ3a6YTa$mQF!Gh@r= z_#jZ4ro5kCs-}pzN>zNu<2>P+B<%6j(sYm>Rw4_42+=ex-_209jV(a^#eHFo%QvAuuz@#B{sE-pS!E5CVfai#ir{^wnX_(@IJzyncd zmKP>3j7^?|(ZQ~+!BW@2*tMiu?JuWk;rdwGQc7#Mi%>W>wlH;jY-F%J{^B5>qDsqE zIB69FsGYcY*3bkq#7PQs#z}-L9a`K;u*$!^vx_ zrVNoHz-lR^g@6C?yZwmiII@mniUNp*^uK=mpD`4SmayMa7`QUFygW9070y;ISBsbl zor1yAsf%a(`;Vf}^7MsteC%wwuL=x<$M#nH`@64U-f({Ut2sv^V(C6y*SGLkgCef> z;=mi-T}1^D2wPbj0_`s2a!;ilH zl_Li`Zm#!KONH(AT6_P^;o+XI++6!fsXX^!b$A$nb@Ngo89thnFAZ0y9y zdue#ByH+dTxLGX?4G#}L!lJT!b-1v$x_z@dd9-%3t5!&F3~#OtA8jjj4-ao`+?=aX z2fv{`v^HGpIsX}kQRrEFR4pFBkcQh1^slWaJ^wU+bNFa^ccByB0 z6J|Sm)*c@PnmxW*Dh;phpr7>8+R<9qaNo@vRbUjR+9E7nv6xJp;QEAf`i!UGb9pS_ zMUMn-tz;3_w{Zc%3#vQ!kLxGt3w@swu;8YG1YE1t(z(%d1FxQ$xqa0fb`Z}zm*BdC zMZiEiR$aK=h$MH$!1G(26AtEfVG2z-)Lf zCyv3*3-8>2_X<{x(L%s*-oN^l#aR2mq)eWp@5H@aMLc#;gBs6dUD z30SRM4HnYM^6ghEuP#re17oMa0XHdO3j(Qd?(#rEW5784NH8E96XFU6oz+rubcoWA z`;ZL}wH`iF+*v$$1hdCmgT$h#v4P5~nBxOtirhXu~H#Pun5ofJ<_&{N>d;+JWKtN9vMrEEv#6p-Nz!J5+ zSbgC<5DTAI9leJS9_ju5Teog~Uito;x2`5XdGjA{eSWgUrB!Fk_uqQ+tzY%`|2Y7w z^yaM(K2PR8|NPbmmGsS9w>~H%965NfwDsBg=4$8G=EmyV$=2rP`ciHEKdo;rC6_kW zKe|yWKG?VfvE;!P@V$TYg(P|K=`N6Db@S~~>F1jp54Mu^-JQ*2$>zlLp7qt;?E^iVtGk=sM@w%n6-ZvM^sH>Yog_Cm z*LVNjquuV(vCZMt&o){(*19boZAOJ~3K~zV$ z`KUy|Y9D%`h0~c$uB(xvEn1%4XFI{~7-5AAzkW6lVWlhg{}d5cskeyr1)_x^Zt@h0 zUtiog_{m}wy9O4-bXL<-qvtB+WMK4qk`8>heCI_(yk{@Y-WfDlp0Qn`5U+VZtZ;o|7n^tr;^l?zu+CL@!Vr>+g$8!x11ucJMfoVs>q z^1?`p8*KICLtAkJhWS_Xs}CRU%)ir%U6?}U(bs=AzrwW!7AH8@9i4^oZ;X^Hm2~3r zNcrMKlAOFaP`P-jt9)we!gvLMRj!UKpF=z~Fms_YP#zdKF@1S*dLTVDx%^?JaAJDo z&c$;VesJMhA503bJYs1?fTDJ+wcguF%BA$Z`L(3DHNVrBeDD6^pZ0#`2&Rc}&;2Vv zQ93{4BH_|8MX90}5UAyzs#U2p|9FcM)cBH4eN= z3ujJWL{yiYn&@jE7+=0}0<$}Q=EBsOWa9SesqxCSk%(hkC&4(({J>* zUYj^Oefh%06Uo`@ljD_A6$?7}kXDpjSE12s5028o+KVm8+4DnPT%!Z8zS{kdKTO_# zD{U#h|2p9AgFjAMg;#BbTYsM1JlX&C*WN5tzke$&fBxgw-QimwY81%qs>D9)-Uy^k2X?#xYV}Sla|e`Wb32K`gQ`$OV@vn513OFiwvsk1L|4@(IXNtg;Na?UKizVSTy87TTnzO*GF_poa1xZVd5VGVT+;>$<$Q&+UeOl z3k$Q;GnYpaggO@&rYcu2k4@hl`!Kx%z#17?n7O!o`|896c*nrx4Ax8wS1yc>B-c+b zUzr^}mzJ>I(vW!L4e`a}`JErNJi5Qydj#IpUMM|WT>TG)!CDvBLJ%lbCr3||`>UlB zqgMt-ucXPT(W?Wa)ScVYg%8KdBV*G8xQ*C<@f*`4SIf!Osmm9pPL5ojyfZdg zIrW3l?9`Q>Q#_ULW@Cq?OM+8{yShAfs-`B#8Apq9gKb}lpzg0=o z_g_bV_W2*DdV^JGYvrxEa#}igu)B>`#=1TZ@u~ctsis8=PR9C z8^!*OwZf&%mb9g98#_bE?ywuc|2T65fsXzJI z+vRczr~%4adULnDaWh#%gf*P5eb&P#x{|dAm7a28b*r3gZ?9h3TH9VphBr@?3gz7; zT-yMw7D7sCb7^Q}4LI5U(q?bDb_22xZf+uS#v*g$65_dkN=xfY$$vVLVqibp?mJq# zvC&sT7>bdWKN?QfJ}MvEIJ-NX)__~BZO68M{@$hatpcUjxBClg>*dnYgJgFt#q9xp z05HOGfaNv|iCIyKuDAv_cuv3!Aehh|*4h94*WW7Cx(e92QiO#a+!7uf{o79#`>`FN zJ6Kpd7EX;~C6^|5XVWV)C)1NN3+2hNfpp;7SpXK6B2)0dQ`qRbmYy7)u3T6~ATc&_ zb@XB-y*^v6T$oDJxes4W=5F6BoLV?ju1wx8-yOS}R3?`Pt^ur0-oBV%`=%jj6RxXp zX>svihI)7I{~O-c>8%$2YH{&L@DICz38*cVm&YnqYyc08O%04)Nz+qfCo5y)$;{ny zdgfkoee~SIoibvF!~FwyM@Pq|PCyXR&6#_Q$3q$)WFEYU@1m)g44wcz6?t4;LyF2v}+Q;t%f5ja`|$J)Km}4Pa8r z<#QvI%Xj(;=SELrZJnGrQfS$z!~guX8t?EO?ko|oik%1he)VRd^uza)^gn)n zl7RKvYoEV9H&=n?!6W@!ACOr)>#K&03p*qC4aj6lhWMd-EF+m>kIH$t$ZHQW*`uC4d<)zUxPt|cp5 z>nDD`2Gcw1h@BZ>wU?@En@M4NJL%gz29xW@YNfT0T8l?Fw;ye7U;3y*!1~jTVXW?! z27#01-Aji%+WU52!oq%S;}8I=2y=ZO%_VF9u0P#Gy_D>3b+xSRJ|143Lr8^f{bcp+ z5*Cm>>DD#?i+6#>Os8PM*GY0#QyfK2xbIPs5MO*C!`O#{nj1((>fY!0eTzoQy17y*4&i zsa*JwfK@kOYuAd^)mP^Ketu_uxyz>#LuWd_ zaLXckY}8aDMoW*=uPs zetIs&YPx*+P8p%+$@19f@<@t3v)gyzi@uL}r?oIZhbg!5Eco=Pgoy_tdQ z7s^1xaqMBurRfZ|*3#+8WE{{~DUVKY1)WY^89V{N8kiZKyl`RkVxh_{7d|IS=VGjd zJ**e`T|zltTTA!(H+cIEKRa^>4;{Sq=1)F&3qAfdmxOQrb&)Gd+{>$d{$}#yU-a}} z{p(`wCvR0Mw_Znt)%D}o20oZeUK_ye!ovpUF@@Egy_0=B4 zHS6mscA|z$wWV#`IZWQ(?kd+FefHAQXKVenrLDA-Y;Pvrh_Grm5MeD{3hBr0`s>QX< zwyvIy$3vTMmv^_*rLCmrvm0eZZGCIIbA6k`rH-y+n=QSarAwa;mvFaaYb60j9euFd z2Z%h6Cu!EVTd+h;mo|TNV`FG|_eaTt^>nDbyVisIkh^O(Z@f#$2+K`k6S#W*)g1cW z{uqs0UdhV+;q$M24R^d+YU$T^?w{4QbQI5FA;K!+`?l~y#twzT8Q=^YVc~89Pb{Yw zzjA0Z_9N%#Q7hu1QFnA*UA6SiADpVz z{$k|R>5BuScgqDtSOKugSae<(`w-6S4UGJYHTgq6Ol z3k0lzq&$n&aymu8dbLuii~+FD^%bVBBqs@2w->HlnZ7$x1RBAj!Z=w5WO=}1Ki%hF z#B)`IF@VmI1AU)={@1tqUVHQN58f{%b02*0S{EJ$J8<~u94I%BzV`VCpTAc4<2T>@ zVPWpClk`{LNBzIPU%^8qorhbN)(`cqueFtazW$)2IIzCHm12i{cerf{8}Qv7>9Ger zwaNoNiBN&_A36jCTfwIL?)vKbr9x$W_wAPLwdB%v`Nr<*)^_*$+p7-%)!XYmhk!M^ z4~EjE_4TFl&%2i{Z7pF7tc35(-&oz{X81Z*o7y}iEu_6hWfa4VTx-(70CiLBhReMx5!5mps|rQn#8=%zP|xJcXIS)VyB7dCaN zwZ;f*=;15h?!e-jr?8&6GFwSsUA|qJ zx;>Cou3f$Njgcgsoi2~h8ek#9s?089$9?40la~ot3zY#zSa&X;Oilu@PGKpSPA;d@ z3j=9#Ww~;l5!NL3^7YVHJVfDb5m10l*|czee&-Jn=@ri7*@pg9%OwdzsxWxw2a{)$ zQws~Drv}C@l(7Ih0l-Rb-$~Px_tNX50~2FsV559>_AdPR?(Knrv5BO7VG^Ll204zpW5a44JSoQSc0YOYosj%~2f`|C|*?@rP00668D32`6md|3> zY@(7}{lUeF%M(d@Z=y0f1qd0vdJ+p!EYL>IBozdi3m4PnsY?0PnP~!6;l$~Qs}pz( z1d(c?z-QojCG)u_A=cmES*$|ZQN)7{z189`|M}ye9!I|(u<)STz}W4pX)-rCbMo#e zHeaSEE7zAR6#y2VWSA?Y_>91P%*k~8^u08l7(F$@kzKfxzPfNOEicdVoShhS&yEqX z)Oj6X^_{gb0kHr~ZNGZ0^8V*|WT9NfYAPvLQiOZNvO|?Q+(+)~D_5$61(NanR!fT0 zSDE8IQr=`d+VjH>|qV{lnx&L)8U@Zj#jR1yO)x*tz~Gd=O7;a z+#3GTXKVPZEcf7kOaDN*>18Jc>?XD!nzP6*) z{&ekF!b7PY>M6AzD3|+6gGo=Cwp1T);*p1rQV%|b3Ikt*58d#*ZF!-<|dimUp&OeA4 nH6OWZ?FySuv(5+Ch8)Y{rtN!weF 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 BzL5X` diff --git a/brand.json b/brand.json index d4a5e9e..2584682 100644 --- a/brand.json +++ b/brand.json @@ -1,6 +1,6 @@ { "name": "TidyFactor Doc", - "version": "1.7.0", + "version": "1.8.0", "publisher": "TidyFactor Ecosystem", "partner": "Alwkala Digital Agency (https://alwkala.com)", "contact": { diff --git a/brand.yaml b/brand.yaml index 379465f..a112602 100644 --- a/brand.yaml +++ b/brand.yaml @@ -1,5 +1,5 @@ name: "TidyFactor Doc" -version: "1.6.0" +version: "1.8.0" publisher: "TidyFactor Ecosystem" partner: "Alwkala Digital Agency (https://alwkala.com)" contact: diff --git a/manifest.json b/manifest.json index 3862006..6ec5a9c 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,7 @@ "tools": [ { "name": "audit_docs", - "description": "Audits documentation files under /docs for sensitive data leaks, banned absolute URLs, relative link integrity, and Docsify/MkDocs compliance.", + "description": "Audits documentation files under /docs, root README.md, and CHANGELOG.md for sensitive data leaks, banned absolute URLs, relative link integrity, and Keep a Changelog compliance.", "entrypoint": { "runtime": "python3", "script": "scripts/audit_docs.py" @@ -38,7 +38,7 @@ "isolation_recommended": false, "dependencies": [] }, - "invoked_by_commands": ["generate", "site", "mkdocs", "docsify", "audit"] + "invoked_by_commands": ["generate", "site", "vitepress", "mkdocs", "docsify", "audit"] } ], "decision_gates": [ @@ -68,10 +68,15 @@ "key": "doc_engine", "description": "Target documentation publishing engine (D2)", "type": "enum", - "options": ["mkdocs_material", "docsify_spa", "static_markdown"], - "default": "mkdocs_material", + "options": ["vitepress_ssg", "mkdocs_material", "docsify_spa", "static_markdown"], + "default": "vitepress_ssg", "priority": 2, "discovery": [ + { + "source": "local_file", + "path": "docs/.vitepress/config.mjs", + "track_staleness": true + }, { "source": "local_file", "path": "mkdocs.yml", diff --git a/package.json b/package.json index 9f3ec71..2512e65 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tidyfactor/doc", - "version": "1.7.0", - "description": "TidyFactor Doc — Code Documentation Builder & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", + "version": "1.8.0", + "description": "TidyFactor Doc — Code Documentation Builder, Changelog Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", "main": "SKILL.md", "bin": { "tidyfactor-doc": "bin/add-skill.js", diff --git a/references/commands/audit.md b/references/commands/audit.md new file mode 100644 index 0000000..ef23bca --- /dev/null +++ b/references/commands/audit.md @@ -0,0 +1,15 @@ +# Command: audit + +Runtime entry point for "audit docs quality" / "scan documentation hygiene" / "check broken doc links" / "verify changelog structure." + +## Dispatch steps + +1. Identify the target path to audit (defaults to `docs/` and root `README.md`, `CHANGELOG.md` if not explicitly specified). +2. Load `../workflows/audit.md` — the step-by-step documentation quality audit sequence. +3. Run the workflow. + +## Does NOT + +- Does not rewrite or author documentation files automatically without user review. +- Does not publish documentation sites (that's `site` / `mkdocs` / `docsify` / `vitepress`). +- Does not modify code or package configurations. diff --git a/references/commands/generate.md b/references/commands/generate.md index f0a2c91..4b1bde8 100644 --- a/references/commands/generate.md +++ b/references/commands/generate.md @@ -4,17 +4,18 @@ Runtime entry point for "write API docs" / "generate a README" / "add inline com ## Dispatch steps -1. **Identify the doc type.** If not obvious from the request, ask: - > "Which one — API reference, README, inline code comments, or a technical guide (setup/architecture/workflow)?" -2. **Identify the stack** (PHP / JS / TS / React / Vue / Next). If not obvious from the project, ask or detect from file extensions / config files (`composer.json`, `package.json` + `tsconfig.json`, framework config files). +1. **Identify the doc type.** If not obvious from the request, ask or detect: + - API reference, README, CHANGELOG, inline code comments, or a technical guide (setup/architecture/workflow). +2. **Identify the stack** (PHP / JS / TS / React / Vue / Next). If not obvious from the project, ask or detect from file extensions / config files (`composer.json`, `package.json` + `tsconfig.json`, framework config files). (Note: CHANGELOG and README are stack-agnostic). 3. Load the matching workflow — exactly one: - API reference → `../workflows/generate-api.md` - README → `../workflows/generate-readme.md` + - CHANGELOG → `../workflows/generate-changelog.md` - Inline comments → `../workflows/generate-inline.md` - Guide → `../workflows/generate-guide.md` -4. Load `../memory/doc-templates.md`. -5. Load the matching stack file under `../memory/stacks/` — `php.md`, `js-ts.md`, or `react-vue-next.md`. Never load more than the stacks actually present in the target. -6. Confirm `collect` has already run for this target (check for `docs/.collected/.md`). If it hasn't, and the user hasn't supplied equivalent detail inline, stop and say so — do not generate from assumption. See constraint 2 in `SKILL.md`. +4. Load `../memory/doc-templates.md` (and `../memory/changelog-rules.md` if generating a CHANGELOG). +5. Load the matching stack file under `../memory/stacks/` — `php.md`, `js-ts.md`, or `react-vue-next.md` (if stack-dependent). Never load more than the stacks actually present in the target. +6. For code/API docs, confirm `collect` has already run for this target (check for `docs/.collected/.md`). For CHANGELOG, read git commit history (`git log`) and current `package.json` / version configs. If required detail is missing, stop and say so — do not generate from assumption. See constraint 2 in `SKILL.md`. 7. Run the loaded workflow. ## Does NOT diff --git a/references/memory/changelog-rules.md b/references/memory/changelog-rules.md new file mode 100644 index 0000000..80d0829 --- /dev/null +++ b/references/memory/changelog-rules.md @@ -0,0 +1,58 @@ + +# Memory: changelog-rules + +Codified rules and governance standards for maintaining `CHANGELOG.md` as the Single Source of Truth (SSOT) across all software and skill repositories. + +## 1. Authoritative Standards + +1. **Keep a Changelog v1.1.0**: + - Humans read changelogs, machines read git logs. Changelogs are curated summaries of user-facing and architectural value, not raw commit dumps. + - Guiding principles: + - Group changes by version and release date. + - Group changes within a release by type. + - Newest release always appears at the top (reverse chronological). + - Each version must have a release date formatted as `YYYY-MM-DD`. + +2. **Semantic Versioning (SemVer 2.0.0)**: + - Given a version number `MAJOR.MINOR.PATCH`: + - **`MAJOR` (x.0.0)**: Incompatible API changes, breaking architectural shifts, or removed features. + - **`MINOR` (0.x.0)**: Backward-compatible new functionality, new commands, or new workflows. + - **`PATCH` (0.0.x)**: Backward-compatible bug fixes, link repairs, or documentation corrections. + +## 2. Standard Change Sections + +Always classify changes into one of these 6 standardized buckets: + +| Section | Icon | Purpose | +|---|---|---| +| `Added` | 🚀 | New features, commands, workflows, or platform engines | +| `Changed` | 🔄 | Modifications in existing functionality, refactors, or UI polish | +| `Deprecated` | ⚠️ | Soon-to-be removed features that remain functional for now | +| `Removed` | 🗑️ | Features, endpoints, or deprecated code deleted in this release | +| `Fixed` | 🐛 | Any bug fixes, broken link repairs, or error corrections | +| `Security` | 🔒 | Vulnerability fixes, credential redactions, or auth hardening | + +## 3. Conventional Commit Mapping + +When parsing `git log`, automatically map commit prefixes to changelog sections: + +| Git Commit Prefix | Changelog Section | SemVer Impact | +|---|---|---| +| `feat:` / `feat(*):` | `Added` | MINOR | +| `refactor:` / `style:` / `perf:` | `Changed` | MINOR or PATCH | +| `deprecate:` | `Deprecated` | MINOR | +| `remove:` / `drop:` | `Removed` | MAJOR (if breaking) or MINOR | +| `fix:` / `bug:` / `patch:` | `Fixed` | PATCH | +| `sec:` / `security:` | `Security` | PATCH or MINOR | +| `BREAKING CHANGE:` / `feat!:` | Any (`Added`/`Changed`) with breaking note | MAJOR | +| `docs:` / `chore:` / `test:` | `Changed` or `Fixed` (or omitted if purely internal) | PATCH | + +## 4. Invariants & Hygiene + +- **Zero Undocumented Drift**: No production code or skill modification may be released without a corresponding dated entry in `CHANGELOG.md`. +- **Atomic Metadata Synchronization**: When updating `CHANGELOG.md`, update all corresponding metadata files synchronously: + - `package.json` (`"version": "x.y.z"`) + - `.tidyfactor` (`"version": "x.y.z"`) + - `brand.yaml` / `brand.json` (`"version": "x.y.z"`) + - `README.md` / `README.ar.md` (Title banners) +- **Zero Sensitive Data**: Never leak internal server paths, local absolute paths (`file:///C:`), or real API keys in changelogs. diff --git a/references/memory/doc-templates.md b/references/memory/doc-templates.md index 8bb810d..50799a9 100644 --- a/references/memory/doc-templates.md +++ b/references/memory/doc-templates.md @@ -1,4 +1,4 @@ - + # Memory: doc-templates Shapes for each doc type `generate` produces. Templates, not prose — fill in from `collect` findings. @@ -72,3 +72,31 @@ Full reference: [`/docs`](./docs/README.md) ## Related ``` + +## CHANGELOG (project root `CHANGELOG.md`) + +```markdown +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### 🚀 Added +- + +### 🐛 Fixed +- + +## [1.0.0] - 2026-09-09 + +### 🚀 Added +- Initial production release. +- + +--- +``` + diff --git a/references/workflows/audit.md b/references/workflows/audit.md new file mode 100644 index 0000000..cd1f305 --- /dev/null +++ b/references/workflows/audit.md @@ -0,0 +1,42 @@ +# Workflow: audit + +One outcome: a deterministic documentation quality & hygiene audit report verifying zero credential leaks, zero banned machine paths, 100% relative link integrity, and valid CHANGELOG formatting. + +## Steps + +1. **Determine the target path**: + - If user specified a file or folder (e.g. `docs/`, `README.md`, `CHANGELOG.md`), audit that target. + - Otherwise, default to full documentation sweep: `docs/`, `README.md`, `README.ar.md`, `CHANGELOG.md`. + +2. **Run deterministic auditor**: + - Execute the native Python auditing tool: + ```bash + python scripts/audit_docs.py docs/ + python scripts/audit_docs.py README.md + python scripts/audit_docs.py CHANGELOG.md + ``` + - For machine-readable output or CI pipeline integration: + ```bash + python scripts/audit_docs.py docs/ --json + ``` + +3. **Analyze findings**: + - **Critical issues (Score -30 each)**: Plaintext secrets, leaked API keys, database passwords, or private tokens. + - **High issues (Score -15 each)**: Banned absolute workstation paths (`file:///C:`, `\wamp64\www\`), broken relative markdown links pointing to missing files, missing CHANGELOG headers. + - **Low issues**: Non-standard changelog version headers or minor formatting irregularities. + +4. **Remediate detected issues**: + - Redact any sensitive tokens into safe RFC placeholders (`EXAMPLE_KEY_1234567890ABCDEFGH`). + - Fix broken relative links to point to valid paths or update link targets. + - Convert absolute filesystem URLs to clean relative markdown paths (`./docs/README.md`). + +5. **Re-run verification**: + - Re-execute the auditor until a clean score of **100/100 [PASS]** is achieved. + +## Validation checklist + +- [ ] All target documentation files scanned by `scripts/audit_docs.py` +- [ ] Overall score is 100/100 (`passed: true`) with 0 critical and 0 high issues +- [ ] Zero sensitive tokens or credentials present across all scanned files +- [ ] All relative links verified to exist on disk (zero broken relative links) +- [ ] CHANGELOG.md conforms to Keep a Changelog v1.1.0 standard headers diff --git a/references/workflows/generate-changelog.md b/references/workflows/generate-changelog.md new file mode 100644 index 0000000..fc64f79 --- /dev/null +++ b/references/workflows/generate-changelog.md @@ -0,0 +1,52 @@ +# Workflow: generate-changelog + +One outcome: a project-root `CHANGELOG.md` created or updated strictly conforming to **Keep a Changelog v1.1.0** and **SemVer 2.0.0**. Along with `README.md`, this is the authoritative Single Source of Truth (SSOT) for version releases, changes, and migration notes. + +## Steps + +1. **Locate or initialize `CHANGELOG.md`**: + - Check if `CHANGELOG.md` exists at the project root. + - If missing, load the Keep a Changelog template from `../memory/doc-templates.md` and initialize with standard header, description, and link definitions. + +2. **Extract change history & commit deltas**: + - Inspect git commit history: + ```bash + git log --oneline --no-merges -n 50 + # Or between tags: + git log ..HEAD --oneline + ``` + - Parse Conventional Commits (`feat:`, `fix:`, `refactor:`, `docs:`, `perf:`, `chore:`, `sec:`). + - If non-git or manual changes are provided, align them with the verified codebase changes. + +3. **Categorize entries into Keep a Changelog standard sections**: + - `### 🚀 Added`: For new features, commands, or capabilities. + - `### 🔄 Changed`: For changes in existing functionality, refactors, or UX enhancements. + - `### ⚠️ Deprecated`: For once-stable features slated for removal in upcoming releases. + - `### 🗑️ Removed`: For features, deprecated APIs, or obsolete assets removed in this release. + - `### 🐛 Fixed`: For any bug fixes, link repairs, or error resolutions. + - `### 🔒 Security`: In case of vulnerability patches or credential hardening. + +4. **Determine SemVer version bump**: + - Load `../memory/changelog-rules.md`. + - `MAJOR` (X.0.0): Any breaking change or incompatible API/workflow modification. + - `MINOR` (0.X.0): Backward-compatible new features, commands, or workflows. + - `PATCH` (0.0.X): Backward-compatible bug fixes, link corrections, or documentation polish. + +5. **Format the version entry**: + - Structure: `## [X.Y.Z] - YYYY-MM-DD` (e.g. `## [1.8.0] - 2026-09-09`). + - If drafting work-in-progress, record changes under `## [Unreleased]`. + - Maintain strict reverse-chronological order (newest release at the top). + +6. **Validate & update metadata**: + - Run `python scripts/audit_docs.py CHANGELOG.md` to guarantee zero absolute machine URLs or credential leaks. + - Ensure atomic synchronization with `package.json`, `.tidyfactor`, `brand.yaml`, `brand.json`, and `README.md`. + +## Validation checklist + +- [ ] `CHANGELOG.md` exists at project root and follows Keep a Changelog v1.1.0 format +- [ ] Version header strictly matches `## [X.Y.Z] - YYYY-MM-DD` or `## [Unreleased]` +- [ ] All entries classified under valid sections (`Added`, `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security`) +- [ ] Entries are organized in reverse chronological order +- [ ] SemVer bump is fully justified by the logged changes (Breaking → Major, Feat → Minor, Fix → Patch) +- [ ] Zero sensitive data, API tokens, passwords, or absolute workstation paths (`file:///`) present +- [ ] Audited with `python scripts/audit_docs.py CHANGELOG.md` and passed cleanly diff --git a/scripts/audit_docs.py b/scripts/audit_docs.py index 6a933bf..cb26a90 100644 --- a/scripts/audit_docs.py +++ b/scripts/audit_docs.py @@ -35,7 +35,11 @@ (r"[a-zA-Z]:\\wamp64\\www\\", "Banned internal workstation local path"), ] -def audit_doc_file(file_path: Path) -> list: +# Standard Keep a Changelog v1.1.0 sections +VALID_CHANGELOG_SECTIONS = {"Added", "Changed", "Deprecated", "Removed", "Fixed", "Security"} +CHANGELOG_VERSION_PATTERN = re.compile(r"^##\s+\[(?:\d+\.\d+\.\d+|Unreleased)\](?:\s+-\s+\d{4}-\d{2}-\d{2})?$") + +def audit_doc_file(file_path: Path, check_links: bool = True) -> list: issues = [] try: content = file_path.read_text(encoding="utf-8", errors="replace") @@ -43,6 +47,7 @@ def audit_doc_file(file_path: Path) -> list: return [{"file": str(file_path), "severity": "high", "type": "read_error", "message": str(e)}] lines = content.splitlines() + is_changelog = file_path.name.lower().startswith("changelog") for idx, line in enumerate(lines, start=1): # 1. Check for sensitive data leaks @@ -61,13 +66,62 @@ def audit_doc_file(file_path: Path) -> list: # 2. Check for banned absolute workstation paths & file:/// URLs for pattern, desc in BANNED_URL_PATTERNS: if re.search(pattern, line): - issues.append({ - "file": str(file_path), - "line": idx, - "severity": "high", - "type": "banned_absolute_path", - "message": f"Banned workstation-specific path detected: {desc}. Use clean relative links or public URLs." - }) + # Ignore lines explaining the ban, rule definitions, or dummy placeholders + if not re.search(r"(?i)(prohibit|banned|prevent|never|don't|no\s+|avoid|clean relative|mandate|your_|example|redacted|\.\.\.|placeholder|<.+>|dummy)", line): + issues.append({ + "file": str(file_path), + "line": idx, + "severity": "high", + "type": "banned_absolute_path", + "message": f"Banned workstation-specific path detected: {desc}. Use clean relative links or public URLs." + }) + + # 3. Check relative link integrity (strip code spans first to avoid flagging examples) + if check_links: + # Remove inline code backticks before checking active markdown links + line_no_code = re.sub(r"`[^`]*`", "", line) + # Match markdown links: [text](path) + for match in re.finditer(r"\[(?:[^\]]*)\]\(([^)]+)\)", line_no_code): + target_url = match.group(1).strip() + # Skip external, anchor-only, mailto, tel + if re.match(r"^(?:https?://|mailto:|tel:|#)", target_url, re.IGNORECASE): + continue + # Strip anchor or query params + clean_target = target_url.split("#")[0].split("?")[0].strip() + if not clean_target: + continue + # Resolve relative path + resolved = (file_path.parent / clean_target).resolve() + if not resolved.exists(): + issues.append({ + "file": str(file_path), + "line": idx, + "severity": "high", + "type": "broken_relative_link", + "message": f"Broken relative link '{target_url}' — target '{clean_target}' does not exist on disk." + }) + + # 4. CHANGELOG.md specific structure validation + if is_changelog: + version_headers = [l.strip() for l in lines if l.startswith("## ")] + if not version_headers: + issues.append({ + "file": str(file_path), + "line": 1, + "severity": "high", + "type": "invalid_changelog_format", + "message": "CHANGELOG.md lacks standard release headers (expected format: '## [x.y.z] - YYYY-MM-DD' or '## [Unreleased]')." + }) + else: + for vh in version_headers: + if not CHANGELOG_VERSION_PATTERN.match(vh): + issues.append({ + "file": str(file_path), + "line": 1, + "severity": "low", + "type": "non_standard_version_header", + "message": f"Changelog version header '{vh}' does not strictly match Keep a Changelog SemVer pattern '## [X.Y.Z] - YYYY-MM-DD'." + }) return issues From 79b365e557a768be5440bd684e582da66aa71756 Mon Sep 17 00:00:00 2001 From: alwkala Date: Wed, 9 Sep 2026 06:12:15 +0300 Subject: [PATCH 3/4] =?UTF-8?q?feat(doc):=20release=20v1.9.0=20=E2=80=94?= =?UTF-8?q?=20add=20ADR=20generator,=20deep=20docblock=20scraping,=20proje?= =?UTF-8?q?ct=20mindmap,=20orphan=20asset=20cleaner=20&=20tone=20of=20voic?= =?UTF-8?q?e=20policy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tidyfactor | 4 +- CHANGELOG.md | 23 +++ README.ar.md | 13 +- README.md | 5 +- SKILL.md | 6 +- brand.json | 2 +- brand.yaml | 2 +- manifest.json | 55 ++++++- package.json | 4 +- references/commands/adr.md | 25 ++++ references/memory/adr-template.md | 84 +++++++++++ references/memory/git-doc-sync-hook.md | 54 +++++++ references/memory/naming-conventions.md | 40 +++++ references/memory/project-mindmap.md | 66 +++++++++ references/memory/tone-of-voice.md | 31 ++++ references/workflows/collect.md | 6 +- references/workflows/generate-adr.md | 41 ++++++ scripts/clean_orphaned_assets.py | 185 ++++++++++++++++++++++++ 18 files changed, 623 insertions(+), 23 deletions(-) create mode 100644 references/commands/adr.md create mode 100644 references/memory/adr-template.md create mode 100644 references/memory/git-doc-sync-hook.md create mode 100644 references/memory/naming-conventions.md create mode 100644 references/memory/project-mindmap.md create mode 100644 references/memory/tone-of-voice.md create mode 100644 references/workflows/generate-adr.md create mode 100644 scripts/clean_orphaned_assets.py diff --git a/.tidyfactor b/.tidyfactor index 2a1e15c..38fd0b3 100644 --- a/.tidyfactor +++ b/.tidyfactor @@ -1,8 +1,8 @@ { "name": "tidyfactor-doc", - "version": "1.8.0", + "version": "1.9.0", "category": "development", - "description": "TidyFactor Doc — Code Documentation Builder, Changelog Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", + "description": "TidyFactor Doc — Code Documentation Builder, ADR Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", "repository": "https://github.com/TidyFactor/Doc", "npm": "@alwkala/tidyfactor-doc", "compatibility": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index 83c1365..0c61b39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,29 @@ All notable changes to `tidyfactor-doc` will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). +## [1.9.0] - 2026-09-09 + +### 🚀 Added — Architectural Decision Records (ADR), Deep Docblock Scraping, Project Mindmaps & Asset Hygiene +- **Architectural Decision Record Generator (`references/commands/adr.md`, `references/workflows/generate-adr.md`)**: + - Added dedicated `adr` command with Context-Aware prompts to record technical choices, problem context, decision drivers, and consequences. + - Standardized on MADR (Markdown Architectural Decision Records) schema with index generation (`docs/adr/README.md`). +- **Deep Code Parsing in Collect Workflow (`references/workflows/collect.md`)**: + - Enriched Step 1 with automated scraping for PHPDoc (`@param`, `@return`, `@throws`, `@deprecated`) and JSDoc/TSDoc (`@param`, `@returns`, `@typedef`, `@template`) annotations. + - Mapped AST interface types and class properties directly to documentation templates. +- **Operational Memory Expansion**: + - Added `references/memory/adr-template.md`: Authoritative MADR record structure and master table of contents. + - Added `references/memory/project-mindmap.md`: Mermaid AST schemas for architecture layering, component topologies, and execution flows. + - Added `references/memory/naming-conventions.md`: Uniform naming conventions across PHP (PSR-1/PSR-12), TypeScript, Python, and doc slugs. + - Added `references/memory/tone-of-voice.md`: Non-negotiable technical writing rules (direct, action-oriented, zero marketing fluff). + - Added `references/memory/git-doc-sync-hook.md`: Pre-commit hook specification enforcing documentation updates alongside core code changes. +- **Automated Asset Hygiene & Orphan Detection (`scripts/clean_orphaned_assets.py`)**: + - Added script to scan all `.md` files for image references, identify unreferenced assets in `assets/`, detect duplicate files via SHA-256 hashes, and calculate WebP compression savings. +- **Unified Tooling Manifest (`manifest.json`)**: + - Registered `clean_orphaned_assets` tool with portable CLI patterns. + - Registered `adr` command in tool invocation mappings and decision gate options. + +--- + ## [1.8.0] - 2026-09-09 ### 🚀 Added — Documentation Hygiene Auditor, Keep a Changelog Architecture & Asset Optimization diff --git a/README.ar.md b/README.ar.md index f57ef69..3d3dc70 100644 --- a/README.ar.md +++ b/README.ar.md @@ -1,6 +1,6 @@

-# 📚 TidyFactor Doc `v1.6.0` +# 📚 TidyFactor Doc `v1.9.0` ### محرك استقراء الأكواد البرمجية، وتوليد مراجع الـ API، ومنصة النشر المزدوجة (MkDocs Material و Docsify) **بناء توثيقات فنية دقيقة، مستدامة، آمنة، وقابلة للتصفح لعصر التعاون بين المطورين ووكلاء الذكاء الاصطناعي.** @@ -81,16 +81,7 @@ graph LR | **"إعداد بوابة MkDocs Material"** / "Python SSG" | `mkdocs` | `workflows/mkdocs.md`
`memory/mkdocs-config.md` | ملف `mkdocs.yml` و `docs/stylesheets/extra.css` | | **"تحويل التوثيقات إلى موقع Docsify"** / "deploy portal" | `docsify` | `workflows/docsify.md`
`memory/docsify-config.md` | ملفات `docs/index.html` و`docs/_sidebar.md` (موقع تفاعلي فوري) | | **"تدقيق جودة الوثائق والروابط"** / "audit docs" | `audit` | `workflows/audit.md`
`scripts/audit_docs.py` | تقرير تدقيق AST آلي (فحص الروابط والبيانات الحساسة وسجل التغييرات) | - ----|---|---|---| -| **"تأصيل سياق التوثيق، الاستجواب أو المناظرة المعمارية"** / "brief" / "debate" | `brief` | `workflows/brief.md`
`memory/decision-points.md` | وثيقة `.tidyfactor/doc-brief.snapshot.yaml` و `docs/architectural_debate_synthesis.md` | -| **"تجهيز وهيكلة مجلد التوثيق"** / "scaffold /docs" | `init` | `workflows/init-docs.md`
`memory/doc-tree.md` | مجلد `/docs`، ملف `docs/.doc-manifest.json`، وصفحة `docs/README.md` | -| **"استقراء وفحص الكود والمشروع"** / "gather facts" | `collect` | `workflows/collect.md`
`memory/collection-sources.md` | تقرير `docs/.collected/.md` (تحليل منظم بالأبعاد الخمسة) | -| **"كتابة مرجع واجهة برمجة (API)"** / "API reference" | `generate` | `workflows/generate-api.md`
`memory/doc-templates.md`
`memory/stacks/*.md` | ملف `docs/api/.md` (جداول المعاملات، القيم المرجعة، الأخطاء) | -| **"كتابة دليل إعداد وتشغيل"** / "setup guide" | `generate` | `workflows/generate-guide.md`
`memory/doc-templates.md` | ملف `docs/guides/.md` (دليل متخصص محدد الغرض) | -| **"توليد أو تحديث README الرئيسي"** / "generate readme" | `generate` | `workflows/generate-readme.md`
`memory/doc-templates.md` | ملف `README.md` في جذر المشروع (نظرة عامة، التثبيت، المتغيرات) | -| **"إضافة تعليقات برمجية للكود"** / "inline docblocks" | `generate` | `workflows/generate-inline.md`
`memory/stacks/*.md` | تعديل مباشر للملفات المصدرية بتعليقات PHPDoc / JSDoc / TSDoc | -| **"تحويل التوثيقات إلى موقع Docsify"** / "deploy portal" | `docsify` | `workflows/docsify.md`
`memory/docsify-config.md` | ملفات `docs/index.html` و`docs/_sidebar.md` (موقع تفاعلي متكامل) | +| **"توثيق قرار معماري"** / "generate ADR" | `adr` | `workflows/generate-adr.md`
`memory/adr-template.md`
`memory/tone-of-voice.md` | ملف `docs/adr/NNNN-.md` وفهرس `docs/adr/README.md` | --- diff --git a/README.md b/README.md index 0b53cc0..63037fe 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
-# 📚 TidyFactor Doc `v1.8.0` -### Codebase Interview, API Generator, Changelog Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) +# 📚 TidyFactor Doc `v1.9.0` +### Codebase Interview, API Generator, ADR Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) **Building accurate, maintainable, secure, and browsable documentation for the era of Human-Agent Collaboration.** @@ -74,6 +74,7 @@ graph LR | **"Document this codebase"** / "gather facts for module X" | `collect` | `workflows/collect.md`
`memory/collection-sources.md` | `docs/.collected/.md` (5-dimensional structured analysis) | | **"Write API reference"** / "generate docs for endpoints" | `generate` | `workflows/generate-api.md`
`memory/doc-templates.md`
`memory/stacks/*.md` | `docs/api/.md` (parameter tables, returns, errors, examples) | | **"Generate CHANGELOG"** / "update release history" | `generate` | `workflows/generate-changelog.md`
`memory/doc-templates.md`
`memory/changelog-rules.md` | Root `CHANGELOG.md` (Keep a Changelog v1.1.0, SemVer 2.0.0) | +| **"Record architectural decision"** / "generate ADR" | `adr` | `workflows/generate-adr.md`
`memory/adr-template.md`
`memory/tone-of-voice.md` | `docs/adr/NNNN-.md` & `docs/adr/README.md` index | | **"Write setup guide"** / "create architecture runbook" | `generate` | `workflows/generate-guide.md`
`memory/doc-templates.md` | `docs/guides/.md` (focused, single-purpose guide) | | **"Generate project README"** / "update root README" | `generate` | `workflows/generate-readme.md`
`memory/doc-templates.md` | Root `README.md` (overview, install, env vars, quick start) | | **"Add inline docblocks"** / "document public functions" | `generate` | `workflows/generate-inline.md`
`memory/stacks/*.md` | Direct source code edit with PHPDoc / JSDoc / TSDoc comments | diff --git a/SKILL.md b/SKILL.md index 27c90d2..c23639d 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: tidyfactor-doc -description: "Code documentation builder and triple-engine publishing platform (VitePress, MkDocs Material, and Docsify). Generates API references, READMEs, changelogs, inline docblocks, and guides. Trigger on commands 'brief', 'init', 'collect', 'generate', 'site', 'vitepress', 'mkdocs', 'docsify', 'audit', or requests like 'document this codebase', 'create changelog', 'audit docs', or 'set up VitePress'." +description: "Code documentation builder, ADR generator, and triple-engine publishing platform (VitePress, MkDocs Material, and Docsify). Generates API references, READMEs, changelogs, ADRs, inline docblocks, and guides. Trigger on commands 'brief', 'init', 'collect', 'generate', 'adr', 'site', 'vitepress', 'mkdocs', 'docsify', 'audit', or requests like 'document this codebase', 'generate ADR', 'create changelog', 'audit docs', or 'set up VitePress'." --- # TidyFactor Doc @@ -13,6 +13,7 @@ A command dispatcher. This file does not do the work itself — it routes to the | "Establish documentation context / interview / debate codebase architecture" / "brief" / "debate" | `references/commands/brief.md` | `workflows/brief.md` + `memory/decision-points.md` | | "Set up docs for this project" / "scaffold /docs" | `references/commands/init.md` | `workflows/init-docs.md` + `memory/doc-tree.md` | | "Document this codebase" / "gather what's needed to document X" | `references/commands/collect.md` | `workflows/collect.md` + `memory/collection-sources.md` | +| "Record architectural decision / generate ADR" / "adr" | `references/commands/adr.md` | `workflows/generate-adr.md` + `memory/adr-template.md` + `memory/tone-of-voice.md` | | "Write API docs" / "generate a README" / "create CHANGELOG" / "add inline comments" / "write a guide" | `references/commands/generate.md` | `workflows/generate-api.md` (or `generate-readme.md` / `generate-changelog.md` / `generate-inline.md` / `generate-guide.md`) + `memory/doc-templates.md` + `memory/changelog-rules.md` + matching `memory/stacks/*.md` | | "Publish documentation portal" / "turn /docs into a doc site" (Interactive) | `references/commands/site.md` | `memory/site-engines.md` + interactive selection (`workflows/vitepress.md`, `workflows/mkdocs.md`, or `workflows/docsify.md`) | | "Set up VitePress" / "build modern Vue-powered doc portal" | `references/commands/vitepress.md` | `workflows/vitepress.md` + `memory/vitepress-config.md` | @@ -44,6 +45,7 @@ Read only the command file that matches the request. Do not read all commands si - **Execution Tools**: - `audit_docs` (`scripts/audit_docs.py`): Sub-second AST scanner for documentation under `/docs`, root `README.md`, and `CHANGELOG.md`. Audits credential leaks, machine-specific paths, broken relative links, and Keep a Changelog formatting. + - `clean_orphaned_assets` (`scripts/clean_orphaned_assets.py`): Scans markdown documents for image references, detects unreferenced orphan assets in `assets/`, detects duplicate assets via SHA-256 hashing, and reports WebP compression opportunities. - **Contract & Schema**: Portably declared in `manifest.json` with `"skill_root_anchor": "self"`. - **Invocability**: Executable via direct CLI or through `tidyfactor-brain` MCP `run_skill_tool`. @@ -54,4 +56,4 @@ Read only the command file that matches the request. Do not read all commands si ## Sequencing -`brief` (optional, architectural alignment & debate) → `init` → `collect` → `generate` (repeatable, once per doc target) → `site` / `vitepress` / `mkdocs` / `docsify` → `audit` (quality & link verification before release). +`brief` (optional, architectural alignment & debate) → `init` → `collect` → `adr` (record technical decisions) → `generate` (repeatable, once per doc target) → `site` / `vitepress` / `mkdocs` / `docsify` → `audit` (quality, links & orphan verification before release). diff --git a/brand.json b/brand.json index 2584682..85427ae 100644 --- a/brand.json +++ b/brand.json @@ -1,6 +1,6 @@ { "name": "TidyFactor Doc", - "version": "1.8.0", + "version": "1.9.0", "publisher": "TidyFactor Ecosystem", "partner": "Alwkala Digital Agency (https://alwkala.com)", "contact": { diff --git a/brand.yaml b/brand.yaml index a112602..19c1fac 100644 --- a/brand.yaml +++ b/brand.yaml @@ -1,5 +1,5 @@ name: "TidyFactor Doc" -version: "1.8.0" +version: "1.9.0" publisher: "TidyFactor Ecosystem" partner: "Alwkala Digital Agency (https://alwkala.com)" contact: diff --git a/manifest.json b/manifest.json index 6ec5a9c..9b630b7 100644 --- a/manifest.json +++ b/manifest.json @@ -38,7 +38,60 @@ "isolation_recommended": false, "dependencies": [] }, - "invoked_by_commands": ["generate", "site", "vitepress", "mkdocs", "docsify", "audit"] + "invoked_by_commands": ["generate", "site", "vitepress", "mkdocs", "docsify", "audit", "adr"] + }, + { + "name": "clean_orphaned_assets", + "description": "Scans markdown files for image references, identifies unreferenced orphan assets in assets/, detects duplicate assets via SHA-256 hashing, and evaluates WebP compression savings.", + "entrypoint": { + "runtime": "python3", + "script": "scripts/clean_orphaned_assets.py" + }, + "invocation": { + "cli_pattern": "{runtime} {skill_root}/{script} {repo_root} {flags}", + "args": [ + { + "name": "repo_root", + "type": "path", + "required": false, + "default": ".", + "description": "Root directory of repository or skill" + }, + { + "name": "assets_dir", + "type": "string", + "required": false, + "default": "assets", + "flag": "--assets-dir", + "description": "Relative path to assets folder" + }, + { + "name": "delete_orphans", + "type": "boolean", + "required": false, + "default": false, + "flag": "--delete-orphans", + "description": "Delete unreferenced assets on disk" + }, + { + "name": "json", + "type": "boolean", + "required": false, + "default": false, + "flag": "--json", + "description": "Output pure JSON report" + } + ] + }, + "output": { + "format": "json", + "channel": "stdout" + }, + "runtime_requirements": { + "isolation_recommended": false, + "dependencies": [] + }, + "invoked_by_commands": ["audit", "site"] } ], "decision_gates": [ diff --git a/package.json b/package.json index 2512e65..10d5a70 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tidyfactor/doc", - "version": "1.8.0", - "description": "TidyFactor Doc — Code Documentation Builder, Changelog Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", + "version": "1.9.0", + "description": "TidyFactor Doc — Code Documentation Builder, ADR Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", "main": "SKILL.md", "bin": { "tidyfactor-doc": "bin/add-skill.js", diff --git a/references/commands/adr.md b/references/commands/adr.md new file mode 100644 index 0000000..2cafd2c --- /dev/null +++ b/references/commands/adr.md @@ -0,0 +1,25 @@ +# Command: adr + +Runtime entry point for "Generate Architectural Decision Record (ADR)" / "وثق قرار معماري" / "قم بتوليد سجل قرار معماري يشرح سبب اختيار التقنية [X]". + +## Context-Aware Prompts & Auto-Sensing + +1. **Auto-Sense Project Context**: + - Inspect package manifests (`composer.json`, `package.json`, `go.mod`, `Cargo.toml`) and framework configs. + - Identify active language, runtime version, and primary dependencies. + - Check `docs/adr/` to discover existing records and determine the next sequence number (`NNNN`). + +2. **Extract Decision Parameters**: + - Technology / Decision subject: e.g. `[VitePress]`, `[Medoo ORM]`, `[SQLite Storage]`, `[TailAdmin]`. + - If not provided in the user prompt, evaluate recent commit history (`git log -n 10`) or prompt the user via the native modal question tool. + +3. **Dispatch to Workflow**: + - Load `../workflows/generate-adr.md` — the MADR decision-making workflow. + - Load `../memory/adr-template.md` — the authoritative Markdown ADR schema. + - Load `../memory/tone-of-voice.md` — technical objectivity and zero fluff policy. + - Run the workflow. + +## Does NOT + +- Does not guess technical justifications: facts must trace to actual codebase constraints, benchmarks, or requirements. +- Does not edit application code: ADRs are purely architectural documentation saved under `docs/adr/`. diff --git a/references/memory/adr-template.md b/references/memory/adr-template.md new file mode 100644 index 0000000..1ae7b8c --- /dev/null +++ b/references/memory/adr-template.md @@ -0,0 +1,84 @@ + +# Memory: adr-template + +Authoritative MADR (Markdown Architectural Decision Records) schema for capturing significant architectural choices. + +## 1. Single Record Shape (`docs/adr/NNNN-.md`) + +```markdown +# ADR [NNNN]: [Short Title of Solved Problem and Decision] + +- **Status**: [Proposed | Accepted | Rejected | Deprecated | Superseded by ADR-XXXX] +- **Date**: YYYY-MM-DD +- **Decision-Makers**: [Architect / Agent / Team] +- **Technical Story / Issue**: [Issue # or Feature Link] + +## Context and Problem Statement + +[Describe the context and problem statement, e.g., in free form or using 2-3 sentences. What forces are at play, what constraints must be satisfied?] + +## Decision Drivers + +- [Driver 1, e.g. sub-second build times] +- [Driver 2, e.g. strict RTL and Arabic typography support] +- [Driver 3, e.g. zero external runtime dependencies] + +## Considered Options + +- **Option 1**: [Name of Option 1] +- **Option 2**: [Name of Option 2] +- **Option 3**: [Name of Option 3] + +## Pros and Cons of the Options + +### Option 1: [Name] + +- Good, because [argument a] +- Good, because [argument b] +- Bad, because [argument c] + +### Option 2: [Name] + +- Good, because [argument a] +- Bad, because [argument b] +- Bad, because [argument c] + +## Decision Outcome + +**Chosen Option**: "[Option 1]", because [justification: e.g. it resolves Driver 1 and 2 while maintaining Driver 3]. + +### Positive Consequences + +- [e.g. 80% reduction in asset footprint] +- [e.g. Unified documentation deployment without Node.js runtime] + +### Negative Consequences / Trade-offs + +- [e.g. Requires manual markdown authoring instead of automated GUI] +- [Mitigation: Automated pre-commit linting and link auditing] + +## Pros and Cons Matrix + +| Option | Performance | RTL Support | Maintenance Overhead | Ecosystem Maturity | +|---|---|---|---|---| +| Option 1 | High | Native | Low | High | +| Option 2 | Medium | Partial | High | Very High | + +## References & Links + +- [Official Documentation](https://example.com) +- [Related PR / Commit](https://github.com/org/repo/pull/1) +``` + +## 2. ADR Master Index Shape (`docs/adr/README.md`) + +```markdown +# Architectural Decision Records (ADRs) + +This directory documents all significant architectural and technical decisions made in this project. + +| Number | Date | Title | Status | +|---|---|---|---| +| [0001](./0001-record-architecture-decisions.md) | 2026-09-09 | Record Architecture Decisions | Accepted | +| [0002](./0002-triple-engine-publishing.md) | 2026-09-09 | Triple-Engine Publishing Platform | Accepted | +``` diff --git a/references/memory/git-doc-sync-hook.md b/references/memory/git-doc-sync-hook.md new file mode 100644 index 0000000..222f73c --- /dev/null +++ b/references/memory/git-doc-sync-hook.md @@ -0,0 +1,54 @@ + +# Memory: git-doc-sync-hook + +Specification and configuration guide for pre-commit documentation synchronization hooks. + +## 1. Objective + +Prevent drift between code changes and documentation by verifying that when core functions, endpoints, or public APIs are modified in staged git commits, their corresponding documentation files in `/docs` or root `README.md` / `CHANGELOG.md` are also staged. + +## 2. Husky / Git Hook Implementation (`.husky/pre-commit` or `.git/hooks/pre-commit`) + +```bash +#!/usr/bin/env bash +# TidyFactor Doc Pre-Commit Guard +set -e + +# 1. Check staged files +STAGED_CODE=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(php|ts|js|py|go|rs)$' || true) +STAGED_DOCS=$(git diff --cached --name-only --diff-filter=ACM | grep -E '(^docs/|README\.md|CHANGELOG\.md)' || true) + +# 2. If core code changed, verify documentation activity or bypass flag +if [ -n "$STAGED_CODE" ]; then + # Check if core services / interfaces were modified + CORE_CHANGES=$(echo "$STAGED_CODE" | grep -E '(Core/|Services/|Controllers/|api/|interfaces/)' || true) + + if [ -n "$CORE_CHANGES" ] && [ -z "$STAGED_DOCS" ]; then + if [ "$DOC_OVERRIDE" != "1" ]; then + echo "" + echo "❌ [TidyFactor Doc Guard] Core code modified without documentation update!" + echo "Staged core files:" + echo "$CORE_CHANGES" + echo "" + echo "Please update corresponding files under /docs or CHANGELOG.md." + echo "To bypass intentionally for hotfixes, run: DOC_OVERRIDE=1 git commit -m '...'" + echo "" + exit 1 + fi + fi +fi + +# 3. Run audit_docs on staged docs +if [ -n "$STAGED_DOCS" ]; then + echo "🔍 [TidyFactor Doc Guard] Auditing staged documentation quality..." + python scripts/audit_docs.py docs/ +fi + +exit 0 +``` + +## 3. Benefits + +- Enforces the Single Source of Truth rule. +- Eliminates stale documentation where APIs evolve but docs remain outdated. +- Runs sub-second link and secret checks before commit creation. diff --git a/references/memory/naming-conventions.md b/references/memory/naming-conventions.md new file mode 100644 index 0000000..feaca69 --- /dev/null +++ b/references/memory/naming-conventions.md @@ -0,0 +1,40 @@ + +# Memory: naming-conventions + +Authoritative naming conventions across supported code stacks and documentation files. + +## 1. Documentation File System Conventions + +| Element | Format | Example | Anti-Pattern | +|---|---|---|---| +| Guide Slugs | `kebab-case.md` | `setup-guide.md` | `Setup_Guide.MD` | +| ADR Records | `NNNN-kebab-case.md` | `0001-database-choice.md` | `1_db.md` | +| Localized Guides | `[slug].[locale].md` | `architecture.ar.md` | `architecture_arabic.md` | +| API References | `[component-or-class].md` | `user-service.md` | `UserServiceAPI.md` | +| Internal Findings | `docs/.collected/[target].md` | `docs/.collected/auth.md` | `docs/.collected/Auth-Module.md` | + +## 2. Multi-Language Code Symbol Conventions + +### PHP (PSR-1 / PSR-12) +- **Namespaces**: `PascalCase` (`App\Core\Registry`, `App\Modules\Blog`) +- **Classes / Interfaces / Traits**: `PascalCase` (`AuthService`, `ModuleInterface`) +- **Methods**: `camelCase` (`validateSession()`, `getUserById()`) +- **Constants**: `UPPER_SNAKE_CASE` (`DEFAULT_TIMEOUT`, `MAX_RETRIES`) +- **Variables / Properties**: `camelCase` (`$userId`, `$databaseConnection`) + +### TypeScript & JavaScript (ESM) +- **Files & Modules**: `kebab-case.ts` (`auth-service.ts`) or `PascalCase.tsx` for React components (`UserProfile.tsx`) +- **Types / Interfaces / Enums**: `PascalCase` (`UserSession`, `ApiResponse`, `LogLevel`) +- **Functions / Methods**: `camelCase` (`parseManifest()`, `fetchUserData()`) +- **Constants**: `UPPER_SNAKE_CASE` (`API_BASE_URL`, `TOKEN_EXPIRATION`) + +### Python (PEP 8) +- **Modules / Packages**: `snake_case` (`audit_docs.py`, `clean_orphaned_assets.py`) +- **Classes**: `PascalCase` (`DocumentationAuditor`, `MarkdownLinkScanner`) +- **Functions / Methods**: `snake_case` (`scan_file()`, `check_relative_links()`) +- **Constants**: `UPPER_SNAKE_CASE` (`SENSITIVE_PATTERNS`, `DEFAULT_SCORE`) + +## 3. REST API & Route Conventions + +- **Resource URIs**: Lowercase `kebab-case` plural nouns (`/api/v1/user-profiles`, `/api/v1/projects`). +- **Query Parameters**: `snake_case` or `camelCase` (must be uniform per project, e.g. `page_size` or `pageSize`). diff --git a/references/memory/project-mindmap.md b/references/memory/project-mindmap.md new file mode 100644 index 0000000..8b98ea2 --- /dev/null +++ b/references/memory/project-mindmap.md @@ -0,0 +1,66 @@ + +# Memory: project-mindmap + +Codified guidelines and Mermaid AST templates for generating clear, interactive architectural mind maps and component topology diagrams in documentation. + +## 1. Top-Level Architectural Layering (Mermaid C4 / Graph) + +```mermaid +graph TD + Client["Client Layer (Browser / Agents)"] + Gateway["API & Router Layer"] + Core["Core Domain & Business Logic"] + Storage["Data Layer (SQLite / MySQL / Files)"] + + Client -->|HTTP / JSON-RPC| Gateway + Gateway --> Core + Core --> Storage +``` + +## 2. Component Topology & Responsibility Mind Map + +```mermaid +mindmap + root((System Architecture)) + Presentation Layer + VitePress SSG + Docsify SPA + MkDocs Material + Core Logic + Command Dispatcher + Workflow Engine + Operational Memory + Execution Tooling + Link Integrity Auditor + AST Docblock Parser + Asset Hygiene Cleaner + Data & Context + Single Source of Truth + Brain Context Layer + Local File Snapshots +``` + +## 3. Data Flow & Execution Sequence Diagram + +```mermaid +sequenceDiagram + autonumber + actor Dev as Developer / Agent + participant Dispatcher as SKILL.md Dispatcher + participant Workflow as Workflow Engine + participant Collector as Codebase Collector + participant Target as /docs Surface + + Dev->>Dispatcher: Issue Command (brief / collect / generate) + Dispatcher->>Workflow: Load Matching Workflow & Memory + Workflow->>Collector: Scrape Signatures & Env Context + Collector-->>Workflow: Return 5-Dimension Findings + Workflow->>Target: Write Clean Markdown Artifacts + Workflow->>Dev: Emit Success Checklist & Audit Score +``` + +## 4. Usage Guidelines + +1. Place overarching mind maps in `docs/README.md` or `docs/guides/architecture.md`. +2. Do not use raw image screenshots when Mermaid diagrams can represent topology directly in text. +3. Keep node labels concise (≤ 4 words) to maintain high readability across mobile and desktop viewports. diff --git a/references/memory/tone-of-voice.md b/references/memory/tone-of-voice.md new file mode 100644 index 0000000..e7bf1b5 --- /dev/null +++ b/references/memory/tone-of-voice.md @@ -0,0 +1,31 @@ + +# Memory: tone-of-voice + +Authoritative tone of voice and technical writing standards for all documentation produced by `tidyfactor-doc`. + +## 1. Core Principles + +1. **Direct & Action-Oriented**: + - Start sentences with verbs where possible: *"Install dependencies with `npm install`"*, not *"You may want to proceed by running npm install"*. + - Eliminate filler words: avoid *"clearly"*, *"obviously"*, *"simply"*, *"just"*, *"as you know"*. + +2. **Zero Marketing Fluff**: + - Technical documentation is not promotional copywriting. + - Do NOT use exaggerated marketing adjectives like *"revolutionary"*, *"best-in-class"*, *"magical"*, *"effortless"*. + - State engineering facts, constraints, and verifiable trade-offs objectively. + +3. **Semantic Density & Token Efficiency**: + - Use structured tables for parameters, configuration options, and error codes rather than paragraphs of running text. + - Favor short, concise bullet points (≤ 15 words) over dense narrative prose. + +4. **Clarity Over Cleverness**: + - Code examples must be minimal, self-contained, and working out of the box. + - Always document error cases and expected exceptions, not just happy paths. + +## 2. Bilingual English & Arabic Standards + +- **English**: Concise technical register (Imperative mood, active voice). +- **Arabic**: + - Clear Modern Standard Arabic (فصحى معاصرة رصينة ومباشرة). + - Use established technical terminology (e.g. "التوثيق البرمجي", "نقاط النهاية API", "سجل القرارات المعمارية ADR", "المزامنة الذرية"). + - Preserve English code symbols and keyword references within markdown inline code blocks (`code`). diff --git a/references/workflows/collect.md b/references/workflows/collect.md index 0f576b2..bcf787e 100644 --- a/references/workflows/collect.md +++ b/references/workflows/collect.md @@ -25,7 +25,11 @@ $$\text{Unknowns} = \text{Required Decisions} - (\text{Discovered Facts} \cup \t Run all five collection dimensions from `memory/collection-sources.md` against the target: -1. **Code parsing**: Extract existing docblocks/comments, function/method/class signatures, exported types, and public surface area directly from source. Flag anything already documented inline. +1. **Code parsing & Docblock Scraping**: + - **For PHP**: Scan for standard PHPDoc annotations (`@param [type] $var [description]`, `@return [type]`, `@throws [exception]`, `@deprecated`, `@var`). Extract class properties, public method signatures, interface implementations, and parameter typehints (`string`, `int`, `array`, `?callable`). + - **For JavaScript / TypeScript**: Scan for JSDoc / TSDoc annotations (`@param {type} name description`, `@returns {type}`, `@typedef`, `@template`, `@async`, `@example`). For TypeScript, extract exported interfaces, types, enums, and React/Vue component prop types directly from AST definitions. + - Cross-reference with `memory/stacks/php.md` or `memory/stacks/js-ts.md` to ensure exact standard compliance. + - Flag undocumented public surface area or stale docblocks where signature types diverge from comments. 2. **Commit history**: Read `git log` and available PR descriptions for target files. Pull out *why* behind non-obvious code (tradeoffs, rationale, bug fixes). 3. **Runtime & environment**: Enumerate required environment variables, config files, software dependencies (with version constraints), and resource limits. **MANDATORY**: Scrub and redact any actual secrets, production server IPs, database passwords, or private API tokens—record only variable names and generic placeholders. 4. **User persona tracing**: Identify who reads docs for this target (API consumers, internal maintainers, end-users) and map facts accordingly. diff --git a/references/workflows/generate-adr.md b/references/workflows/generate-adr.md new file mode 100644 index 0000000..84fdb4b --- /dev/null +++ b/references/workflows/generate-adr.md @@ -0,0 +1,41 @@ +# Workflow: generate-adr + +One outcome: an Architectural Decision Record saved to `docs/adr/NNNN-.md` and indexed in `docs/adr/README.md`, adhering to the MADR (Markdown Architectural Decision Records) standard. + +## Steps + +1. **Initialize ADR Directory & Determine Sequence**: + - Ensure `docs/adr/` exists. + - Scan existing files matching `docs/adr/NNNN-*.md`. + - Calculate next number: `0001` if empty, or increment highest existing number (e.g. `0002`, `0003`). + +2. **Establish Context & Problem Statement**: + - State the technical context clearly: What engineering problem or architectural need forced a decision? + - Identify Decision Drivers: Performance, developer experience, zero-runtime overhead, license compatibility, RTL support, security. + +3. **Formulate Considered Options**: + - List at least 2–3 viable alternatives (e.g. VitePress vs. MkDocs Material vs. Docsify; Medoo vs. Doctrine vs. Eloquent). + - For every option, provide an objective Pros & Cons analysis based on verifiable engineering facts. + +4. **Document Decision Outcome & Rationale**: + - Selected option: `Chosen option: [Option Name], because [positive arguments]`. + - Explain why alternatives were rejected without emotional bias. + +5. **Map Consequences & System Impact**: + - **Positive consequences**: Capabilities gained, performance improvements, simplified maintenance. + - **Negative consequences / Trade-offs**: Learning curve, dependencies introduced, migration effort. + - **Mitigation plan**: How trade-offs will be handled. + +6. **Write ADR & Update Index**: + - Write file `docs/adr/NNNN-.md` using `memory/adr-template.md`. + - Update `docs/adr/README.md` table of contents with status, title, and date. + - Run `python scripts/audit_docs.py docs/adr/` to verify link and credential hygiene. + +## Validation checklist + +- [ ] ADR file exists at `docs/adr/NNNN-.md` with 4-digit sequential numbering. +- [ ] Conforms strictly to MADR structure in `memory/adr-template.md`. +- [ ] At least two realistic alternatives were evaluated with pros/cons. +- [ ] Tone conforms to `memory/tone-of-voice.md` (objective, technical, zero marketing fluff). +- [ ] `docs/adr/README.md` index includes the new record. +- [ ] Audited with `python scripts/audit_docs.py docs/adr/` and passed 100/100. diff --git a/scripts/clean_orphaned_assets.py b/scripts/clean_orphaned_assets.py new file mode 100644 index 0000000..dc772e7 --- /dev/null +++ b/scripts/clean_orphaned_assets.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +""" +TidyFactor Asset Hygiene & Orphan Cleaner +Scans documentation markdown files for referenced image assets, detects orphaned files +in assets/ directory, detects duplicate assets via SHA-256 hashing, and evaluates +potential WebP compression savings. +""" + +import sys +import os +import re +import json +import hashlib +import argparse +from pathlib import Path + +# Ensure UTF-8 output on Windows console +if sys.stdout and hasattr(sys.stdout, "reconfigure"): + sys.stdout.reconfigure(encoding="utf-8", errors="replace") +if sys.stderr and hasattr(sys.stderr, "reconfigure"): + sys.stderr.reconfigure(encoding="utf-8", errors="replace") + +IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg", ".bmp", ".ico"} + +def get_file_hash(file_path: Path) -> str: + hasher = hashlib.sha256() + try: + with open(file_path, "rb") as f: + while chunk := f.read(65536): + hasher.update(chunk) + return hasher.hexdigest() + except Exception: + return "" + +def scan_markdown_image_references(root_dir: Path) -> set: + referenced_filenames = set() + md_files = [] + + for f in root_dir.rglob("*.md"): + if any(part in f.parts for part in [".git", "node_modules", "vendor", "dist"]): + continue + md_files.append(f) + + for md_file in md_files: + try: + content = md_file.read_text(encoding="utf-8", errors="replace") + except Exception: + continue + + # 1. Match standard markdown image syntax: ![alt](path) + for match in re.finditer(r"!\[(?:[^\]]*)\]\(([^)]+)\)", content): + raw_url = match.group(1).strip().split("?")[0].split("#")[0] + if raw_url.startswith(("http://", "https://", "data:")): + continue + referenced_filenames.add(Path(raw_url).name.lower()) + + # 2. Match HTML img tags: + for match in re.finditer(r"""]+src=["']([^"']+)["']""", content, re.IGNORECASE): + raw_url = match.group(1).strip().split("?")[0].split("#")[0] + if raw_url.startswith(("http://", "https://", "data:")): + continue + referenced_filenames.add(Path(raw_url).name.lower()) + + return referenced_filenames + +def analyze_assets(repo_root: Path, assets_dir: Path, delete_orphans: bool = False) -> dict: + if not assets_dir.exists() or not assets_dir.is_dir(): + return {"error": f"Assets directory not found: {assets_dir}", "passed": True, "assets": []} + + referenced_names = scan_markdown_image_references(repo_root) + + asset_files = [] + for f in assets_dir.iterdir(): + if f.is_file() and f.suffix.lower() in IMAGE_EXTENSIONS: + asset_files.append(f) + + # 1. Detect duplicates via SHA-256 + hash_map = {} + duplicates = [] + orphaned_files = [] + webp_candidates = [] + total_size = 0 + + for f in asset_files: + size = f.stat().st_size + total_size += size + f_hash = get_file_hash(f) + f_name_lower = f.name.lower() + + if f_hash in hash_map: + duplicates.append({ + "file": str(f.relative_to(repo_root)), + "duplicate_of": str(hash_map[f_hash]["path"].relative_to(repo_root)), + "size_bytes": size, + "sha256": f_hash + }) + else: + hash_map[f_hash] = {"path": f, "size": size} + + # Check orphan status + is_referenced = f_name_lower in referenced_names + if not is_referenced: + orphaned_files.append({ + "file": str(f.relative_to(repo_root)), + "size_bytes": size, + "deleted": False + }) + + # Check WebP optimization candidate (PNG/JPG > 50KB) + if f.suffix.lower() in {".png", ".jpg", ".jpeg"} and size > 51200: + estimated_webp_size = int(size * 0.25) # ~75% reduction + webp_candidates.append({ + "file": str(f.relative_to(repo_root)), + "current_size_bytes": size, + "estimated_webp_bytes": estimated_webp_size, + "estimated_savings_bytes": size - estimated_webp_size + }) + + # Execute deletion if requested + if delete_orphans and orphaned_files: + for item in orphaned_files: + try: + target_to_del = repo_root / item["file"] + target_to_del.unlink() + item["deleted"] = True + except Exception as e: + item["delete_error"] = str(e) + + passed = len(orphaned_files) == 0 and len(duplicates) == 0 + + return { + "repo_root": str(repo_root), + "assets_dir": str(assets_dir), + "total_assets_scanned": len(asset_files), + "total_size_bytes": total_size, + "orphaned_count": len(orphaned_files), + "orphaned_files": orphaned_files, + "duplicates_count": len(duplicates), + "duplicates": duplicates, + "webp_optimization_candidates": webp_candidates, + "passed": passed + } + +def main(): + parser = argparse.ArgumentParser(description="TidyFactor Asset Hygiene & Orphan Cleaner") + parser.add_argument("repo_root", nargs="?", default=".", help="Root directory of the skill or repo (default: .)") + parser.add_argument("--assets-dir", default="assets", help="Relative path to assets directory (default: assets)") + parser.add_argument("--delete-orphans", action="store_true", help="Delete orphaned asset files directly") + parser.add_argument("--json", action="store_true", help="Output pure JSON format") + + args = parser.parse_args() + root_path = Path(args.repo_root).resolve() + assets_path = (root_path / args.assets_dir).resolve() + + result = analyze_assets(root_path, assets_path, delete_orphans=args.delete_orphans) + + if args.json: + print(json.dumps(result, indent=2, ensure_ascii=False)) + else: + status_str = "[PASS]" if result.get("passed") else "[WARN]" + print(f"\n{status_str} Asset Hygiene & Orphan Scanner — Scanned: {result.get('total_assets_scanned', 0)} assets ({result.get('total_size_bytes', 0):,} bytes)") + print(f"Orphaned Assets: {result.get('orphaned_count', 0)} | Duplicate Assets: {result.get('duplicates_count', 0)}\n") + + if result.get("duplicates"): + print(" ⚠️ Duplicate Assets Found:") + for d in result["duplicates"]: + print(f" - {d['file']} (Duplicate of {d['duplicate_of']}, size: {d['size_bytes']:,} B)") + + if result.get("orphaned_files"): + print(" ⚠️ Orphaned Assets (Not linked in any .md):") + for o in result["orphaned_files"]: + del_str = " [DELETED]" if o.get("deleted") else "" + print(f" - {o['file']} ({o['size_bytes']:,} B){del_str}") + + if result.get("webp_optimization_candidates"): + print("\n 💡 WebP Optimization Recommendations (>50KB PNG/JPG):") + for w in result["webp_optimization_candidates"]: + print(f" - {w['file']} (Current: {w['current_size_bytes']:,} B -> Est. WebP: {w['estimated_webp_bytes']:,} B, Save: ~{w['estimated_savings_bytes']:,} B)") + + print() + + sys.exit(0 if result.get("passed") else 1) + +if __name__ == "__main__": + main() From 581b18c98163ddf3836529a4ff5e3e18e6dcbbca Mon Sep 17 00:00:00 2001 From: alwkala Date: Thu, 10 Sep 2026 19:03:23 +0300 Subject: [PATCH 4/4] =?UTF-8?q?feat(doc):=20release=20v1.10.0=20=E2=80=94?= =?UTF-8?q?=20add=20llms.txt=20standard=20generator=20&=20discovery=20head?= =?UTF-8?q?ers=20for=20AI=20agents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tidyfactor | 4 +- CHANGELOG.md | 14 ++++ README.ar.md | 4 +- README.md | 4 +- SKILL.md | 5 +- brand.json | 2 +- brand.yaml | 2 +- manifest.json | 2 +- package.json | 4 +- references/commands/llms.md | 28 +++++++ references/memory/llmstxt-spec.md | 95 ++++++++++++++++++++++++ references/workflows/generate-llmstxt.md | 56 ++++++++++++++ 12 files changed, 207 insertions(+), 13 deletions(-) create mode 100644 references/commands/llms.md create mode 100644 references/memory/llmstxt-spec.md create mode 100644 references/workflows/generate-llmstxt.md diff --git a/.tidyfactor b/.tidyfactor index 38fd0b3..e3173d1 100644 --- a/.tidyfactor +++ b/.tidyfactor @@ -1,8 +1,8 @@ { "name": "tidyfactor-doc", - "version": "1.9.0", + "version": "1.10.0", "category": "development", - "description": "TidyFactor Doc — Code Documentation Builder, ADR Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", + "description": "TidyFactor Doc — Code Documentation Builder, ADR Architect, llms.txt Standard Generator, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", "repository": "https://github.com/TidyFactor/Doc", "npm": "@alwkala/tidyfactor-doc", "compatibility": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c61b39..28dff19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to `tidyfactor-doc` will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). +## [1.10.0] - 2026-09-10 + +### 🚀 Added — llms.txt & llms-full.txt Standard Generator for AI Agents +- **llms.txt Generator Command & Workflow (`references/commands/llms.md`, `references/workflows/generate-llmstxt.md`)**: + - Added dedicated `llms` command to generate and maintain `/llms.txt` (curated index) and `/llms-full.txt` (consolidated plain markdown bundle) conforming to the community standard ([llmstxt.org](https://llmstxt.org/)). + - Automated crawling of `/docs`, single `# H1` requirement, blockquote summary generation, and annotated markdown link lists. + - Injected discovery `` headers across VitePress, MkDocs Material, and Docsify engines. +- **Operational Memory Specification (`references/memory/llmstxt-spec.md`)**: + - Codified the canonical specification for `llms.txt` and `llms-full.txt` syntax, sectioning (`## H2`), annotated descriptions, and HTTP discovery headers. +- **Unified Tooling Manifest (`manifest.json`)**: + - Integrated `llms` command into `audit_docs` and documentation lifecycle workflows. + +--- + ## [1.9.0] - 2026-09-09 ### 🚀 Added — Architectural Decision Records (ADR), Deep Docblock Scraping, Project Mindmaps & Asset Hygiene diff --git a/README.ar.md b/README.ar.md index 3d3dc70..d7a4f92 100644 --- a/README.ar.md +++ b/README.ar.md @@ -1,7 +1,7 @@
-# 📚 TidyFactor Doc `v1.9.0` -### محرك استقراء الأكواد البرمجية، وتوليد مراجع الـ API، ومنصة النشر المزدوجة (MkDocs Material و Docsify) +# 📚 TidyFactor Doc `v1.10.0` +### محرك استقراء الأكواد البرمجية، وتوليد مراجع الـ API، ومعيار llms.txt، ومنصة النشر الثلاثية (VitePress و MkDocs Material و Docsify) **بناء توثيقات فنية دقيقة، مستدامة، آمنة، وقابلة للتصفح لعصر التعاون بين المطورين ووكلاء الذكاء الاصطناعي.** diff --git a/README.md b/README.md index 63037fe..01ef508 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
-# 📚 TidyFactor Doc `v1.9.0` -### Codebase Interview, API Generator, ADR Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) +# 📚 TidyFactor Doc `v1.10.0` +### Codebase Interview, API Generator, ADR Architect, llms.txt Standard, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) **Building accurate, maintainable, secure, and browsable documentation for the era of Human-Agent Collaboration.** diff --git a/SKILL.md b/SKILL.md index c23639d..ae6b556 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: tidyfactor-doc -description: "Code documentation builder, ADR generator, and triple-engine publishing platform (VitePress, MkDocs Material, and Docsify). Generates API references, READMEs, changelogs, ADRs, inline docblocks, and guides. Trigger on commands 'brief', 'init', 'collect', 'generate', 'adr', 'site', 'vitepress', 'mkdocs', 'docsify', 'audit', or requests like 'document this codebase', 'generate ADR', 'create changelog', 'audit docs', or 'set up VitePress'." +description: "Code documentation builder, ADR generator, llms.txt standard generator, and triple-engine publishing platform (VitePress, MkDocs Material, and Docsify). Generates API references, READMEs, changelogs, ADRs, llms.txt, inline docblocks, and guides. Trigger on commands 'brief', 'init', 'collect', 'generate', 'adr', 'site', 'vitepress', 'mkdocs', 'docsify', 'audit', 'llms', or requests like 'document this codebase', 'generate ADR', 'create changelog', 'audit docs', 'generate llms.txt', or 'set up VitePress'." --- # TidyFactor Doc @@ -20,6 +20,7 @@ A command dispatcher. This file does not do the work itself — it routes to the | "Set up MkDocs Material" / "compile static documentation" | `references/commands/mkdocs.md` | `workflows/mkdocs.md` + `memory/mkdocs-config.md` | | "Set up Docsify" / "build lightweight zero-build doc SPA" | `references/commands/docsify.md` | `workflows/docsify.md` + `memory/docsify-config.md` | | "Audit docs quality / scan credential leaks / verify links & changelog" / "audit" | `references/commands/audit.md` | `workflows/audit.md` + `scripts/audit_docs.py` | +| "Generate llms.txt & llms-full.txt / AI agent documentation index" / "llms" | `references/commands/llms.md` | `workflows/generate-llmstxt.md` + `memory/llmstxt-spec.md` | Read only the command file that matches the request. Do not read all commands simultaneously. @@ -56,4 +57,4 @@ Read only the command file that matches the request. Do not read all commands si ## Sequencing -`brief` (optional, architectural alignment & debate) → `init` → `collect` → `adr` (record technical decisions) → `generate` (repeatable, once per doc target) → `site` / `vitepress` / `mkdocs` / `docsify` → `audit` (quality, links & orphan verification before release). +`brief` (optional, architectural alignment & debate) → `init` → `collect` → `adr` (record technical decisions) → `generate` (repeatable, once per doc target) → `site` / `vitepress` / `mkdocs` / `docsify` → `llms` (AI agent indexing) → `audit` (quality, links & orphan verification before release). diff --git a/brand.json b/brand.json index 85427ae..95c5e60 100644 --- a/brand.json +++ b/brand.json @@ -1,6 +1,6 @@ { "name": "TidyFactor Doc", - "version": "1.9.0", + "version": "1.10.0", "publisher": "TidyFactor Ecosystem", "partner": "Alwkala Digital Agency (https://alwkala.com)", "contact": { diff --git a/brand.yaml b/brand.yaml index 19c1fac..d69c18d 100644 --- a/brand.yaml +++ b/brand.yaml @@ -1,5 +1,5 @@ name: "TidyFactor Doc" -version: "1.9.0" +version: "1.10.0" publisher: "TidyFactor Ecosystem" partner: "Alwkala Digital Agency (https://alwkala.com)" contact: diff --git a/manifest.json b/manifest.json index 9b630b7..28629db 100644 --- a/manifest.json +++ b/manifest.json @@ -38,7 +38,7 @@ "isolation_recommended": false, "dependencies": [] }, - "invoked_by_commands": ["generate", "site", "vitepress", "mkdocs", "docsify", "audit", "adr"] + "invoked_by_commands": ["generate", "site", "vitepress", "mkdocs", "docsify", "audit", "adr", "llms"] }, { "name": "clean_orphaned_assets", diff --git a/package.json b/package.json index 10d5a70..6011186 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tidyfactor/doc", - "version": "1.9.0", - "description": "TidyFactor Doc — Code Documentation Builder, ADR Architect, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", + "version": "1.10.0", + "description": "TidyFactor Doc — Code Documentation Builder, ADR Architect, llms.txt Standard Generator, Link Auditor & Triple-Engine Publishing Platform (VitePress, MkDocs Material & Docsify) for AI Coding Agents", "main": "SKILL.md", "bin": { "tidyfactor-doc": "bin/add-skill.js", diff --git a/references/commands/llms.md b/references/commands/llms.md new file mode 100644 index 0000000..b02d02b --- /dev/null +++ b/references/commands/llms.md @@ -0,0 +1,28 @@ +# Command: llms + +Runtime entry point for generating and maintaining `/llms.txt` and `/llms-full.txt` files per the [llmstxt.org](https://llmstxt.org/) standard. + +--- + +## Dispatch steps + +1. Load `../memory/llmstxt-spec.md` — Authoritative syntax rules (Single H1, blockquote summary, annotated link items). +2. Load `../workflows/generate-llmstxt.md` — Crawling docs, building categorized index, concatenating full bundle, and wiring discovery links. +3. Run the workflow. + +--- + +## What It Does + +1. Inspects `/docs` and existing markdown files. +2. Extracts concise summaries and logical hierarchy. +3. Produces `docs/llms.txt` (lightweight index for AI model discovery). +4. Produces `docs/llms-full.txt` (single concatenated markdown archive for context injection). +5. Configures discovery `` headers for VitePress, MkDocs Material, or Docsify. + +--- + +## Does NOT + +- Does not author brand-new documentation content from scratch (run `generate` first). +- Does not inject binary or base64 assets into text files. diff --git a/references/memory/llmstxt-spec.md b/references/memory/llmstxt-spec.md new file mode 100644 index 0000000..d98b2c4 --- /dev/null +++ b/references/memory/llmstxt-spec.md @@ -0,0 +1,95 @@ +# Memory: llmstxt-spec + + + +Technical specification and authoring standards for `/llms.txt` and `/llms-full.txt` files per the community standard ([llmstxt.org](https://llmstxt.org/)). + +--- + +## 1. Overview & Purpose + +`llms.txt` is an advisory, machine-readable Markdown file placed at the project or documentation root (`/llms.txt` or `/docs/llms.txt`). +It provides AI models, autonomous agents, and inference systems with a structured map of curated information, eliminating the need to crawl and parse bloated HTML structures. + +- **`/llms.txt`**: Fast, lightweight index containing the title, concise summary, and annotated markdown links to core sections. +- **`/llms-full.txt`**: Consolidated bundle containing the complete, unabridged text of all documentation pages concatenated into a single plain-text markdown file. + +--- + +## 2. File Format Specification (`/llms.txt`) + +Every `llms.txt` file must adhere strictly to the following syntax rules: + +### A. Single H1 Header (Mandatory) +The file must start with exactly one `# H1` heading representing the project or library name: +```markdown +# Project Name +``` + +### B. Blockquote Summary (Mandatory) +Immediately beneath the `# H1`, a blockquote (`> ...`) must describe the project, its core value proposition, tech stack, and audience in 1–3 concise sentences: +```markdown +> A lightweight modular architecture platform for building AI-agent-compatible web services and applications. +``` + +### C. H2 Categorized Sections +Group documentation links into logical `## H2` categories (e.g., `## Core Concepts`, `## API Reference`, `## Guides`, `## Optional`): +```markdown +## Documentation + +- [Getting Started](https://example.com/docs/intro.md): Quickstart guide to install and configure the platform in under 5 minutes. +- [Architecture](https://example.com/docs/architecture.md): Overview of Kernel contracts, Module interfaces, and dependency isolation. + +## API Reference + +- [Core API](https://example.com/docs/api/core.md): Detailed parameter and return type references for runtime controllers. +``` + +### D. Annotated Link Conventions +- Format: `- [Link Title](url): Brief description of content and scope`. +- All URLs should be canonical absolute URLs (or clean root-relative links if self-hosted within the repo). +- Descriptions should explain *what* the document covers and *when* an LLM should retrieve it. + +--- + +## 3. File Format Specification (`/llms-full.txt`) + +The consolidated version bundles the actual markdown content of all referenced docs: +1. Starts with the exact same `# H1` and `> Summary` as `llms.txt`. +2. Appends each documentation file separated by standard horizontal markdown dividers (`---`). +3. Each section includes a reference header indicating its source route: + ```markdown + # Project Name + > Summary ... + + --- + + # Getting Started + Source: https://example.com/docs/intro.md + + [Full Markdown content here...] + + --- + + # Architecture + Source: https://example.com/docs/architecture.md + + [Full Markdown content here...] + ``` + +--- + +## 4. HTML Discovery Tags & Headers + +To ensure web crawlers and autonomous agents discover the `llms.txt` file without blind guessing, inject discovery links: + +### HTML `` tag: +```html + + +``` + +### HTTP Response Header: +```http +Link: ; rel="describedby"; type="text/markdown" +``` diff --git a/references/workflows/generate-llmstxt.md b/references/workflows/generate-llmstxt.md new file mode 100644 index 0000000..1d2a698 --- /dev/null +++ b/references/workflows/generate-llmstxt.md @@ -0,0 +1,56 @@ +# Workflow: generate-llmstxt + +One outcome: An authoritative, valid `/llms.txt` index file and `/llms-full.txt` bundle generated under `/docs` (or project root) conforming to the [llmstxt.org](https://llmstxt.org/) standard. + +--- + +## Steps + +### 1. Identify Project Identity & Summary +1. Read project root metadata (`package.json`, `composer.json`, `brand.yaml`, or root `README.md`). +2. Extract the canonical project name for the required single `# H1` header. +3. Formulate a dense 1-3 sentence blockquote summary (`> ...`) stating the project's purpose, key capabilities, and architecture. + +### 2. Crawl and Categorize Documentation +1. Scan `/docs` (or existing documentation tree) for markdown files (`*.md`). +2. Exclude internal files (`.doc-manifest.json`, changelog drafts, or raw collection dumps). +3. Group discovered documents into clear `## H2` categories: + - `## Core Documentation` (Overview, Quickstart, Installation). + - `## Architecture & Governance` (ADRs, design patterns, invariants). + - `## API References` (endpoints, interfaces, contracts). + - `## Guides & Workflows` (how-tos, tutorials). + +### 3. Generate `/llms.txt` Index +1. Format each entry as an annotated markdown item: + `- [Page Title](relative_or_canonical_url): Concise description of what this doc provides.` +2. Ensure descriptions explicitly inform AI models when to load the page. +3. Write the output to `docs/llms.txt` (and create a symlink or root copy at `llms.txt` if requested). + +### 4. Generate `/llms-full.txt` Bundle +1. Concatenate the full markdown content of each categorized file in logical order. +2. Separate each document with horizontal rules (`---`). +3. Strip heavy base64 encoded images or redundant navigational chrome, retaining pure semantic markdown. +4. Write the output to `docs/llms-full.txt`. + +### 5. Inject Discovery Headers +1. If VitePress is used (`docs/.vitepress/config.mjs`), inject the `` tag into `head`: + ```javascript + head: [ + ['link', { rel: 'alternate', type: 'text/markdown', href: '/llms.txt', title: 'LLM Overview' }], + ['link', { rel: 'alternate', type: 'text/markdown', href: '/llms-full.txt', title: 'Full LLM Documentation' }] + ] + ``` +2. If MkDocs is used (`mkdocs.yml`), register in extra head or include in template. +3. If Docsify is used (`docs/index.html`), inject `` into ``. + +--- + +## Validation checklist + +- [ ] Single unique `# H1` header present at line 1 +- [ ] Blockquote summary (`> ...`) immediately follows the H1 header +- [ ] All documented links use annotated format `- [Title](url): Description` +- [ ] Grouped logically under `## H2` categories +- [ ] Generated `docs/llms.txt` and `docs/llms-full.txt` without syntax errors +- [ ] No local machine absolute drive paths (`file:///C:/...` or `c:\...`) included in output +- [ ] Discovery links (``) documented or configured for the active doc engine